<修改> 1、webserver增加在数据中心选择信号直接add,在out界面省去一个个添加;2、增加配置直接远程调试rk3568

This commit is contained in:
ypc 2026-06-26 17:47:46 +08:00
parent 19a2f2a3c0
commit 392fadcdb0
9 changed files with 1089 additions and 438 deletions

View File

@ -1,7 +1,7 @@
{ {
"configurations": [ "configurations": [
{ {
"name": "Linux", "name": "Linux (x86)",
"includePath": [ "includePath": [
"${workspaceFolder}/**", "${workspaceFolder}/**",
"${workspaceFolder}/src/protocol/libicp67/inc", "${workspaceFolder}/src/protocol/libicp67/inc",
@ -13,6 +13,22 @@
"cStandard": "c17", "cStandard": "c17",
"cppStandard": "gnu++17", "cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-x64" "intelliSenseMode": "linux-gcc-x64"
},
{
"name": "ARM (RK3568)",
"includePath": [
"${workspaceFolder}/**",
"${workspaceFolder}/src/protocol/libicp67/inc",
"${workspaceFolder}/src/system/libiec61850m/inc",
"${workspaceFolder}/src/protocol/libmms_m/inc",
"/opt/atk-dlrk356x-toolchain/aarch64-buildroot-linux-gnu/sysroot/usr/include",
"/opt/atk-dlrk356x-toolchain/include"
],
"defines": ["RK356x"],
"compilerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc",
"cStandard": "c17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-arm64"
} }
], ],
"version": 4 "version": 4

68
.vscode/launch.json vendored
View File

@ -6,7 +6,6 @@
"type": "cppdbg", "type": "cppdbg",
"request": "launch", "request": "launch",
"program": "${workspaceFolder}/test/RTU", "program": "${workspaceFolder}/test/RTU",
// "program": "${workspaceFolder}/release/x86/exe/FTU_cfg_parse",
"args": [], "args": [],
"stopAtEntry": false, "stopAtEntry": false,
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
@ -22,7 +21,7 @@
}, },
{ {
"description": "Set default output to hex", "description": "Set default output to hex",
"text": "set output-radix 16", // 16 10 "text": "set output-radix 16",
"ignoreFailures": true "ignoreFailures": true
} }
] ]
@ -50,6 +49,71 @@
"ignoreFailures": true "ignoreFailures": true
} }
] ]
},
{
"name": "ARM 编译+部署+调试 (RK3568)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/release/arm/exe/RTU",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb",
"miDebuggerServerAddress": "198.120.0.100:2345",
"preLaunchTask": "deploy-to-rk",
"sourceFileMap": {
"/home/ypc/RTU/RTU": "${workspaceFolder}"
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set default output to hex",
"text": "set output-radix 16",
"ignoreFailures": true
},
{
"description": "Set sysroot for ARM libs",
"text": "set sysroot /opt/atk-dlrk356x-toolchain/aarch64-buildroot-linux-gnu/sysroot",
"ignoreFailures": true
}
]
},
{
"name": "ARM 调试 (不编译, RK3568)",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/release/arm/exe/RTU",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb",
"miDebuggerServerAddress": "198.120.0.100:2345",
"preLaunchTask": "start-gdbserver",
"sourceFileMap": {
"/home/ypc/RTU/RTU": "${workspaceFolder}"
},
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set default output to hex",
"text": "set output-radix 16",
"ignoreFailures": true
}
]
} }
] ]
} }

40
.vscode/tasks.json vendored
View File

@ -13,6 +13,46 @@
"isDefault": true "isDefault": true
} }
}, },
{
"label": "build-arm",
"type": "shell",
"command": "${workspaceFolder}/release/build.sh arm",
"problemMatcher": [
"$gcc"
],
"group": "build"
},
{
"label": "deploy-to-rk",
"type": "shell",
"command": "sshpass -p 'root' scp -o StrictHostKeyChecking=no ${workspaceFolder}/release/arm/exe/RTU root@198.120.0.100:/mnt/RTU/ && echo 'Deploy OK' && sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null; killall RTU 2>/dev/null; sleep 1; nohup gdbserver 0.0.0.0:2345 /mnt/RTU/RTU > /tmp/rtu_output.log 2>&1 &' && echo 'gdbserver started on :2345 | RTU output → /tmp/rtu_output.log'",
"problemMatcher": [],
"dependsOn": ["build-arm"],
"group": "build",
"detail": "Build ARM binary, deploy to RK3568, start gdbserver, RTU output→/tmp/rtu_output.log"
},
{
"label": "start-gdbserver",
"type": "shell",
"command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null; killall RTU 2>/dev/null; sleep 1; nohup gdbserver 0.0.0.0:2345 /mnt/RTU/RTU > /tmp/rtu_output.log 2>&1 &' && echo 'gdbserver started on :2345 | RTU output → /tmp/rtu_output.log'",
"problemMatcher": [],
"group": "build"
},
{
"label": "tail-rtu-output",
"type": "shell",
"command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'tail -f /tmp/rtu_output.log'",
"problemMatcher": [],
"group": "build",
"isBackground": true
},
{
"label": "stop-gdbserver",
"type": "shell",
"command": "sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'killall gdbserver 2>/dev/null' && echo 'gdbserver stopped'",
"problemMatcher": [],
"group": "build"
},
{ {
"type": "cppbuild", "type": "cppbuild",
"label": "C/C++: aarch64-linux-gnu-g++ 生成活动文件", "label": "C/C++: aarch64-linux-gnu-g++ 生成活动文件",

View File

@ -43,9 +43,12 @@ src/
| 命令 | 说明 | | 命令 | 说明 |
|------|------| |------|------|
| `./release/build.sh` | 本地 x86 编译 | | `./release/build.sh` | 本地 x86 编译 |
| `./release/build.sh arm` | ARM 交叉编译 | | `./release/build.sh arm` | ARM 交叉编译 `release/arm/exe/RTU` |
| `make -C release` | 在 release 目录执行 make | | `make -C release` | 在 release 目录执行 make |
| `./test/RTU` | 运行编译产物 | | `./test/RTU` | 运行 x86 编译产物 |
| VS Code Task `build-arm` | Ctrl+Shift+B 中选择 ARM 交叉编译 |
| VS Code Task `deploy-to-rk` | 编译+部署到 RK3568 `/mnt/RTU/` |
| VS Code F5 "ARM 编译+部署+调试" | 一键编译→部署→gdbserver→远程调试 |
## 📐 代码规范 ## 📐 代码规范
@ -87,15 +90,39 @@ src/
| 构建配置 | [release/linux.mk](release/linux.mk) | | 构建配置 | [release/linux.mk](release/linux.mk) |
| 公共头文件目录 | [release/inc/](release/inc/) | | 公共头文件目录 | [release/inc/](release/inc/) |
| 模块分析文档生成技能 | [mimo/skills/模块分析文档生成/SKILL.md](mimo/skills/模块分析文档生成/SKILL.md) | | 模块分析文档生成技能 | [mimo/skills/模块分析文档生成/SKILL.md](mimo/skills/模块分析文档生成/SKILL.md) |
| RK3568 MCP 服务 | [../rk-mcp/src/index.ts](../rk-mcp/src/index.ts) |
| VS Code 调试配置 | [.vscode/launch.json](.vscode/launch.json) / [.vscode/tasks.json](.vscode/tasks.json) |
| Gitea Git 服务记忆 | [/memories/repo/gitea-config.md](/memories/repo/gitea-config.md) |
## ⚙️ 开发环境
- **环境类型**: WSL 2 (Ubuntu 24.04),与 Windows 共享固定 IP `198.120.10.240`
- **Gitea Git 服务**: `http://127.0.0.1:3000` | 局域网 `http://192.168.1.54:3000` | 管理员 `admin`/`admin123`
- **交叉编译器**: `/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-*` (GCC 10.3.0, Buildroot 2018.02)
- **RK3568 目标机**: `root@198.120.0.100` (密码 `root`),目标路径 `/mnt/RTU/`
### RK3568 远程调试 (MCP 服务)
| 项目 | 值 |
|---|---|
| MCP 服务路径 | `/home/ypc/RTU/rk-mcp/dist/index.js` (Node.js) |
| MCP 配置 | `.vscode/mcp.json``rk-mcp` 服务 |
| 可用工具 | `rk_check` `rk_deploy` `rk_gdbserver_start` `rk_gdbserver_stop` `rk_shell` |
| SSH 包装 | `~/.ssh/rk_ssh` `~/.ssh/rk_scp` (sshpass 封装) |
**调试流程**: `./release/build.sh arm` → F5 选 "ARM 编译+部署+调试 (RK3568)" → 自动 scp → gdbserver :2345 → GDB 连接
**launch.json 提供 4 个调试配置**: 本地 x86编译/不编译、ARM 远程(编译+部署/纯调试)
## ⚠️ 注意事项 ## ⚠️ 注意事项
1. **交叉编译依赖**: `release/linux.mk` 引用了本地交叉工具链路径(`GCCLIB_PATH`),不同主机可能需要调整 1. **交叉编译依赖**: `release/linux.mk` 引用 `/opt/atk-dlrk356x-toolchain/bin`,需保证工具链存在
2. **Web 资源打包**: 构建流程中的 `pack_web.sh` 会打包 web 资源到可执行文件中,不可跳过 2. **Web 资源打包**: 构建流程中的 `pack_web.sh` 会打包 web 资源到可执行文件中,不可跳过
3. **代码风格严格**: 修改代码时必须遵循上述规范Tab/Allman/Yoda否则可能导致审查问题 3. **代码风格严格**: 修改代码时必须遵循上述规范Tab/Allman/Yoda否则可能导致审查问题
4. **多线程安全**: 大量使用多线程9 个应用线程),修改时需注意竞态条件 4. **多线程安全**: 大量使用多线程9 个应用线程),修改时需注意竞态条件
5. **C 风格内存管理**: 使用 `malloc`/`free`,需注意空指针检查和释放时机 5. **C 风格内存管理**: 使用 `malloc`/`free`,需注意空指针检查和释放时机
6. **第三方依赖**: mongoose、cJSON、mosquitto、tinyxml2、libiec61850 是关键依赖 6. **第三方依赖**: mongoose、cJSON、mosquitto、tinyxml2、libiec61850 是关键依赖
7. **RK3568 使用 dropbear SSH**,不支持 OpenSSH 密钥认证;使用 `sshpass -p 'root' ssh` 连接
## 🔄 工作流程规则 ## 🔄 工作流程规则

View File

@ -0,0 +1,96 @@
# RTU 远程调试 RK3568 环境迁移指南
> 将当前 WSL 环境中的 RTU 远程调试体系迁移到另一台电脑。
---
## 零、哪些是必须的?
| 组件 | 必要性 | F5 调试用到? |
|------|--------|---------------|
| ARM 交叉工具链 `/opt/atk-dlrk356x-toolchain/` | 🔴 必须 | ✅ 编译 + GDB 连接 |
| `sshpass` (`apt install sshpass`) | 🔴 必须 | ✅ tasks.json 的 sshpass 命令 |
| RTU 项目代码 | 🔴 必须 | ✅ 编译源码 + launch.json 指向 |
| `.vscode/launch.json` `.vscode/tasks.json` | 🔴 必须 | ✅ preLaunchTask + GDB 配置 |
| **rk-mcp** | 🟢 非必须 | ❌ 仅 Copilot AI 诊断用F5 调试完全不走它 |
| `mcp.json` | 🟢 非必须 | ❌ 无 rk-mcp 则删掉此文件即可 |
| Node.js | 🟢 非必须 | ❌ 仅 rk-mcp 依赖它 |
| `~/.ssh/rk_ssh` `~/.ssh/rk_scp` | 🟢 非必须 | ❌ tasks.json 直接用 sshpass不依赖这两个脚本 |
**结论:你只需要 工具链 + sshpass + 代码 + .vscode/ 就能在新电脑上 F5 远程调试。**
---
## 一、最小安装步骤(共 4 步)
### 1. 安装 sshpass
```bash
sudo apt update && sudo apt install sshpass
```
### 2. 安装 ARM 交叉工具链
```bash
# 旧电脑上打包
cd /opt
tar czf atk-dlrk356x-toolchain.tar.gz atk-dlrk356x-toolchain/
# 传到新电脑后解压
sudo tar xzf atk-dlrk356x-toolchain.tar.gz -C /opt/
# 验证
/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc --version
/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gdb --version
```
### 3. 克隆 RTU 项目
```bash
mkdir -p ~/RTU && cd ~/RTU
git clone <RTU_REPO_URL> RTU
cd RTU
```
### 4. 验证
```bash
# 测试编译
./release/build.sh arm
# 测试 RK 连接
sshpass -p 'root' ssh -o StrictHostKeyChecking=no root@198.120.0.100 'echo OK'
# VS Code 中 F5 → "ARM 编译+部署+调试 (RK3568)"
# Ctrl+Shift+P → Run Task → "tail-rtu-output" 查看实时打印
```
---
## 二、可选:安装 rk-mcp让 Copilot 帮诊断 RK
```bash
# 1. 安装 Node.js
nvm install 20 && nvm use 20
# 2. 克隆 rk-mcp和 RTU 平级目录)
cd ~/RTU
git clone <rk-mcp_REPO_URL> rk-mcp
cd rk-mcp
npm install && npm run build
# 3. 确保 ~/RTU/RTU/.vscode/mcp.json 存在即可
```
---
## 三、硬编码路径速查
| 文件 | 关键路径 | 何时需改 |
|------|----------|----------|
| `launch.json` → miDebuggerPath | `/opt/atk-dlrk356x-toolchain/bin/...` | 工具链路径变化时 |
| `launch.json` → miDebuggerServerAddress | `198.120.0.100:2345` | RK IP 变化时 |
| `launch.json` → sourceFileMap | `/home/ypc/RTU/RTU` | 用户名变化时 |
| `tasks.json` → sshpass 命令 | `root@198.120.0.100` | RK IP 变化时 |
| `mcp.json` | `/home/ypc/RTU/...` | 用户名变化时(无 rk-mcp 可删) |
| `tasks.json` 其他 | `${workspaceFolder}` | ✅ 无需改动 |

View File

@ -2,6 +2,44 @@
--- ---
## 2026-06-26: 远程调试 gdbserver 未自动启动 & RTU 打印信息查看问题
**问题**F5 选择 "ARM 编译+部署+调试 (RK3568)" 后无法断点调试。
**根因**`deploy-to-rk` 任务只做了编译+scp 传输,没有自动启动 gdbserver。VS Code GDB 尝试连接 `198.120.0.100:2345` 时端口无监听。
**修复**
1. 修改 `deploy-to-rk` 任务scp 传输后自动 `killall gdbserver` + 启动新 gdbserver
2. 修改 `start-gdbserver` 任务:统一用 `>/tmp/rtu_output.log 2>&1` 重定向 gdbserver+RTU 输出
3. 新增 `tail-rtu-output` 任务:一键 `tail -f /tmp/rtu_output.log` 实时查看 RTU printf 输出
**原理**RTU 作为 gdbserver 的子进程,继承 gdbserver 重定向后的 fd 1/2所以 printf/LOG_I/LOG_E 全部进入 `/tmp/rtu_output.log`
**涉及文件**`.vscode/tasks.json`
**注意事项**RTU 的 stdin 被 gdbserver 接管,无法在 tail 窗口输入 CLI 命令。交互式命令测试需单独 `ssh root@198.120.0.100 /mnt/RTU/RTU`
**验证**GDB 连接→continue→tail 文件成功看到所有 LOG_I/LOG_E 输出。
### 补充修复 (2026-06-26): "ARM 调试 (不编译)" preLaunchTask 卡住
**问题**F5 选 "ARM 调试 (不编译, RK3568)" 不工作,且后续引入复合任务后 "ARM 编译+部署+调试" 也失效。
**根因**:尝试用 `dependsOrder: "sequence"/"parallel"` + `isBackground: true` 复合任务作为 preLaunchTask。VS Code preLaunchTask 需要子任务明确完成信号,复合任务+后台子任务组合行为不可靠exit code 异常、卡住)。
**最终修复**
1. 删除所有复合任务 (`deploy-with-tail`, `start-gdbserver-with-tail`)
2. `deploy-to-rk` = scp + gdbserver同步preLaunchTask 可靠)
3. `start-gdbserver` = gdbserver同步preLaunchTask 可靠)
4. `tail-rtu-output` = 手动 `tail -f`(独立任务,不参与 preLaunchTask
5. `stopAtEntry` 改为 `false`RTU 直接运行不需手动按继续
**涉及文件**`.vscode/tasks.json`、`.vscode/launch.json`
**tail 使用方式**F5 启动调试后,`Ctrl+Shift+P` → Run Task → `tail-rtu-output` 查看实时打印。
---
## 2026-06-18: X-Macro 应用模块注册表 — 名称大小写匹配修复 ## 2026-06-18: X-Macro 应用模块注册表 — 名称大小写匹配修复
**问题**X-Macro 生成 g_vec_app 名称时使用 `"app_" #name`(如 `app_SYS`),但配置文件 `app_config.json` 使用小写 `app_sys`,导致名称不匹配,所有线程被 "skipped (disabled by config)"。 **问题**X-Macro 生成 g_vec_app 名称时使用 `"app_" #name`(如 `app_SYS`),但配置文件 `app_config.json` 使用小写 `app_sys`,导致名称不匹配,所有线程被 "skipped (disabled by config)"。

View File

@ -969,7 +969,66 @@ static const unsigned char v3[] = {
59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, 32, 118, 97, 114, // ;. color: var 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, 32, 118, 97, 114, // ;. color: var
40, 45, 45, 116, 101, 120, 116, 45, 109, 117, 116, 101, 100, 41, 59, 10, // (--text-muted);. 40, 45, 45, 116, 101, 120, 116, 45, 109, 117, 116, 101, 100, 41, 59, 10, // (--text-muted);.
32, 32, 32, 32, 109, 97, 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, // margin-left: 32, 32, 32, 32, 109, 97, 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, // margin-left:
32, 97, 117, 116, 111, 59, 10, 125, 10, 0 // auto;.}. 32, 97, 117, 116, 111, 59, 10, 125, 10, 10, 47, 42, 32, 61, 61, 61, // auto;.}../* ===
32, 230, 149, 176, 230, 141, 174, 228, 184, 173, 229, 191, 131, 32, 233, 128, // ............ ..
137, 230, 139, 169, 230, 183, 187, 229, 138, 160, 230, 160, 143, 32, 61, 61, // ............. ==
61, 32, 42, 47, 10, 46, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, // = */..dc-sel-bar
32, 123, 10, 32, 32, 32, 32, 98, 97, 99, 107, 103, 114, 111, 117, 110, // {. backgroun
100, 58, 32, 35, 101, 56, 102, 53, 101, 57, 59, 10, 32, 32, 32, 32, // d: #e8f5e9;.
98, 111, 114, 100, 101, 114, 58, 32, 49, 112, 120, 32, 115, 111, 108, 105, // border: 1px soli
100, 32, 35, 97, 53, 100, 54, 97, 55, 59, 10, 32, 32, 32, 32, 98, // d #a5d6a7;. b
111, 114, 100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 118, 97, // order-radius: va
114, 40, 45, 45, 114, 97, 100, 105, 117, 115, 41, 59, 10, 32, 32, 32, // r(--radius);.
32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 49, 48, 112, 120, 32, 50, // padding: 10px 2
48, 112, 120, 59, 10, 32, 32, 32, 32, 109, 97, 114, 103, 105, 110, 45, // 0px;. margin-
98, 111, 116, 116, 111, 109, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, // bottom: 16px;.
32, 32, 100, 105, 115, 112, 108, 97, 121, 58, 32, 102, 108, 101, 120, 59, // display: flex;
10, 32, 32, 32, 32, 97, 108, 105, 103, 110, 45, 105, 116, 101, 109, 115, // . align-items
58, 32, 99, 101, 110, 116, 101, 114, 59, 10, 32, 32, 32, 32, 103, 97, // : center;. ga
112, 58, 32, 52, 112, 120, 59, 10, 32, 32, 32, 32, 102, 108, 101, 120, // p: 4px;. flex
45, 119, 114, 97, 112, 58, 32, 119, 114, 97, 112, 59, 10, 32, 32, 32, // -wrap: wrap;.
32, 97, 110, 105, 109, 97, 116, 105, 111, 110, 58, 32, 100, 99, 83, 108, // animation: dcSl
105, 100, 101, 68, 111, 119, 110, 32, 48, 46, 50, 115, 32, 101, 97, 115, // ideDown 0.2s eas
101, 45, 111, 117, 116, 59, 10, 125, 10, 64, 107, 101, 121, 102, 114, 97, // e-out;.}.@keyfra
109, 101, 115, 32, 100, 99, 83, 108, 105, 100, 101, 68, 111, 119, 110, 32, // mes dcSlideDown
123, 10, 32, 32, 32, 32, 102, 114, 111, 109, 32, 123, 32, 111, 112, 97, // {. from { opa
99, 105, 116, 121, 58, 32, 48, 59, 32, 116, 114, 97, 110, 115, 102, 111, // city: 0; transfo
114, 109, 58, 32, 116, 114, 97, 110, 115, 108, 97, 116, 101, 89, 40, 45, // rm: translateY(-
54, 112, 120, 41, 59, 32, 125, 10, 32, 32, 32, 32, 116, 111, 32, 123, // 6px); }. to {
32, 111, 112, 97, 99, 105, 116, 121, 58, 32, 49, 59, 32, 116, 114, 97, // opacity: 1; tra
110, 115, 102, 111, 114, 109, 58, 32, 116, 114, 97, 110, 115, 108, 97, 116, // nsform: translat
101, 89, 40, 48, 41, 59, 32, 125, 10, 125, 10, 46, 100, 99, 45, 115, // eY(0); }.}..dc-s
101, 108, 45, 108, 97, 98, 101, 108, 32, 123, 10, 32, 32, 32, 32, 102, // el-label {. f
111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, 52, 112, 120, 59, 10, // ont-size: 14px;.
32, 32, 32, 32, 102, 111, 110, 116, 45, 119, 101, 105, 103, 104, 116, 58, // font-weight:
32, 54, 48, 48, 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, // 600;. color:
32, 35, 50, 101, 55, 100, 51, 50, 59, 10, 125, 10, 46, 100, 99, 45, // #2e7d32;.}..dc-
115, 101, 108, 45, 98, 97, 114, 32, 108, 97, 98, 101, 108, 32, 123, 10, // sel-bar label {.
32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, 49, // font-size: 1
51, 112, 120, 59, 10, 32, 32, 32, 32, 99, 111, 108, 111, 114, 58, 32, // 3px;. color:
118, 97, 114, 40, 45, 45, 116, 101, 120, 116, 45, 115, 101, 99, 111, 110, // var(--text-secon
100, 97, 114, 121, 41, 59, 10, 125, 10, 46, 100, 99, 45, 115, 101, 108, // dary);.}..dc-sel
45, 98, 97, 114, 32, 115, 101, 108, 101, 99, 116, 32, 123, 10, 32, 32, // -bar select {.
32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 52, 112, 120, 32, 56, // padding: 4px 8
112, 120, 59, 10, 32, 32, 32, 32, 98, 111, 114, 100, 101, 114, 58, 32, // px;. border:
49, 112, 120, 32, 115, 111, 108, 105, 100, 32, 118, 97, 114, 40, 45, 45, // 1px solid var(--
98, 111, 114, 100, 101, 114, 41, 59, 10, 32, 32, 32, 32, 98, 111, 114, // border);. bor
100, 101, 114, 45, 114, 97, 100, 105, 117, 115, 58, 32, 52, 112, 120, 59, // der-radius: 4px;
10, 32, 32, 32, 32, 102, 111, 110, 116, 45, 115, 105, 122, 101, 58, 32, // . font-size:
49, 51, 112, 120, 59, 10, 32, 32, 32, 32, 98, 97, 99, 107, 103, 114, // 13px;. backgr
111, 117, 110, 100, 58, 32, 35, 102, 102, 102, 59, 10, 125, 10, 46, 100, // ound: #fff;.}..d
99, 45, 115, 101, 108, 45, 98, 97, 114, 32, 46, 98, 116, 110, 32, 123, // c-sel-bar .btn {
10, 32, 32, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 54, 112, // . padding: 6p
120, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 102, 111, 110, 116, // x 16px;. font
45, 115, 105, 122, 101, 58, 32, 49, 51, 112, 120, 59, 10, 125, 10, 35, // -size: 13px;.}.#
100, 99, 45, 99, 98, 45, 97, 108, 108, 44, 32, 46, 100, 99, 45, 99, // dc-cb-all, .dc-c
98, 45, 114, 111, 119, 32, 123, 10, 32, 32, 32, 32, 119, 105, 100, 116, // b-row {. widt
104, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 104, 101, 105, // h: 16px;. hei
103, 104, 116, 58, 32, 49, 54, 112, 120, 59, 10, 32, 32, 32, 32, 99, // ght: 16px;. c
117, 114, 115, 111, 114, 58, 32, 112, 111, 105, 110, 116, 101, 114, 59, 10, // ursor: pointer;.
32, 32, 32, 32, 97, 99, 99, 101, 110, 116, 45, 99, 111, 108, 111, 114, // accent-color
58, 32, 118, 97, 114, 40, 45, 45, 112, 114, 105, 109, 97, 114, 121, 41, // : var(--primary)
59, 10, 125, 10, 0 // ;.}.
}; };
static const unsigned char v4[] = { static const unsigned char v4[] = {
60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, // <!DOCTYPE html>. 60, 33, 68, 79, 67, 84, 89, 80, 69, 32, 104, 116, 109, 108, 62, 10, // <!DOCTYPE html>.
@ -4265,318 +4324,471 @@ static const unsigned char v7[] = {
61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 32, 42, // ============== * 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 32, 42, // ============== *
47, 10, 118, 97, 114, 32, 68, 97, 116, 97, 99, 101, 110, 116, 101, 114, // /.var Datacenter 47, 10, 118, 97, 114, 32, 68, 97, 116, 97, 99, 101, 110, 116, 101, 114, // /.var Datacenter
80, 97, 103, 101, 32, 61, 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, // Page = (function 80, 97, 103, 101, 32, 61, 32, 40, 102, 117, 110, 99, 116, 105, 111, 110, // Page = (function
40, 41, 32, 123, 10, 32, 32, 32, 32, 118, 97, 114, 32, 97, 108, 108, // () {. var all 40, 41, 32, 123, 10, 9, 118, 97, 114, 32, 97, 108, 108, 68, 97, 116, // () {..var allDat
68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, 32, 32, 32, 118, // Data = {};. v 97, 32, 61, 32, 123, 125, 59, 10, 9, 118, 97, 114, 32, 97, 99, 116, // a = {};..var act
97, 114, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 39, // ar activeTab = ' 105, 118, 101, 84, 97, 98, 32, 61, 32, 39, 111, 117, 116, 39, 59, 10, // iveTab = 'out';.
111, 117, 116, 39, 59, 10, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, // out';. var se 9, 118, 97, 114, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, // .var searchText
97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 10, // archText = '';.. 61, 32, 39, 39, 59, 10, 9, 118, 97, 114, 32, 115, 101, 108, 101, 99, // = '';..var selec
32, 32, 32, 32, 118, 97, 114, 32, 67, 79, 76, 85, 77, 78, 83, 32, // var COLUMNS 116, 101, 100, 83, 101, 116, 32, 61, 32, 123, 125, 59, 32, 32, 32, 32, // tedSet = {};
61, 32, 91, 39, 105, 100, 39, 44, 32, 39, 115, 97, 100, 100, 114, 39, // = ['id', 'saddr' 32, 32, 32, 32, 47, 47, 32, 123, 115, 97, 100, 100, 114, 58, 32, 116, // // {saddr: t
44, 32, 39, 100, 101, 115, 99, 39, 44, 32, 39, 230, 149, 176, 230, 141, // , 'desc', '..... 114, 117, 101, 125, 10, 10, 9, 118, 97, 114, 32, 67, 79, 76, 85, 77, // rue}...var COLUM
174, 231, 177, 187, 229, 158, 139, 39, 44, 32, 39, 99, 116, 114, 108, 95, // .......', 'ctrl_ 78, 83, 32, 61, 32, 91, 39, 39, 44, 32, 39, 105, 100, 39, 44, 32, // NS = ['', 'id',
116, 121, 112, 101, 39, 44, 32, 39, 108, 105, 110, 107, 95, 115, 97, 100, // type', 'link_sad 39, 115, 97, 100, 100, 114, 39, 44, 32, 39, 100, 101, 115, 99, 39, 44, // 'saddr', 'desc',
100, 114, 115, 39, 93, 59, 10, 10, 32, 32, 32, 32, 102, 117, 110, 99, // drs'];.. func 32, 39, 230, 149, 176, 230, 141, 174, 231, 177, 187, 229, 158, 139, 39, 44, // '............',
116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, // tion renderTable 32, 39, 99, 116, 114, 108, 95, 116, 121, 112, 101, 39, 44, 32, 39, 108, // 'ctrl_type', 'l
40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // () {. var 105, 110, 107, 95, 115, 97, 100, 100, 114, 115, 39, 93, 59, 10, 10, 9, // ink_saddrs'];...
32, 100, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, 91, // data = allData[ 102, 117, 110, 99, 116, 105, 111, 110, 32, 103, 101, 116, 86, 105, 115, 105, // function getVisi
97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, 93, // activeTab] || [] 98, 108, 101, 68, 97, 116, 97, 40, 41, 32, 123, 10, 9, 9, 118, 97, // bleData() {...va
59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 98, // ;. var tb 114, 32, 100, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, // r data = allData
111, 100, 121, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, // ody = document.g 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, // [activeTab] || [
101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, // etElementById('d 93, 59, 10, 9, 9, 105, 102, 32, 40, 33, 115, 101, 97, 114, 99, 104, // ];...if (!search
99, 45, 116, 98, 111, 100, 121, 39, 41, 59, 10, 32, 32, 32, 32, 32, // c-tbody');. 84, 101, 120, 116, 41, 32, 114, 101, 116, 117, 114, 110, 32, 100, 97, 116, // Text) return dat
32, 32, 32, 105, 102, 32, 40, 33, 116, 98, 111, 100, 121, 41, 32, 114, // if (!tbody) r 97, 59, 10, 9, 9, 118, 97, 114, 32, 115, 116, 32, 61, 32, 115, 101, // a;...var st = se
101, 116, 117, 114, 110, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, // eturn;.. 97, 114, 99, 104, 84, 101, 120, 116, 46, 116, 111, 76, 111, 119, 101, 114, // archText.toLower
105, 102, 32, 40, 100, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 32, // if (data.length 67, 97, 115, 101, 40, 41, 59, 10, 9, 9, 114, 101, 116, 117, 114, 110, // Case();...return
61, 61, 61, 32, 48, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // === 0) {. 32, 100, 97, 116, 97, 46, 102, 105, 108, 116, 101, 114, 40, 102, 117, 110, // data.filter(fun
32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, 110, 110, 101, 114, // tbody.inner 99, 116, 105, 111, 110, 40, 105, 116, 101, 109, 41, 32, 123, 10, 9, 9, // ction(item) {...
72, 84, 77, 76, 32, 61, 32, 39, 60, 116, 114, 32, 99, 108, 97, 115, // HTML = '<tr clas 9, 114, 101, 116, 117, 114, 110, 32, 40, 105, 116, 101, 109, 46, 115, 97, // .return (item.sa
115, 61, 34, 101, 109, 112, 116, 121, 45, 114, 111, 119, 34, 62, 60, 116, // s="empty-row"><t 100, 100, 114, 32, 38, 38, 32, 105, 116, 101, 109, 46, 115, 97, 100, 100, // ddr && item.sadd
100, 32, 99, 111, 108, 115, 112, 97, 110, 61, 34, 54, 34, 62, 230, 154, // d colspan="6">.. 114, 46, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 40, 41, 46, // r.toLowerCase().
130, 230, 151, 160, 230, 149, 176, 230, 141, 174, 60, 47, 116, 100, 62, 60, // ..........</td>< 105, 110, 100, 101, 120, 79, 102, 40, 115, 116, 41, 32, 33, 61, 61, 32, // indexOf(st) !==
47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // /tr>';. 45, 49, 41, 10, 9, 9, 9, 9, 124, 124, 32, 40, 105, 116, 101, 109, // -1).....|| (item
32, 32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, // document.getE 46, 100, 101, 115, 99, 32, 38, 38, 32, 105, 116, 101, 109, 46, 100, 101, // .desc && item.de
108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, // lementById('dc-c 115, 99, 46, 116, 111, 76, 111, 119, 101, 114, 67, 97, 115, 101, 40, 41, // sc.toLowerCase()
111, 117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, 116, 101, // ount').textConte 46, 105, 110, 100, 101, 120, 79, 102, 40, 115, 116, 41, 32, 33, 61, 61, // .indexOf(st) !==
110, 116, 32, 61, 32, 39, 48, 39, 59, 10, 32, 32, 32, 32, 32, 32, // nt = '0';. 32, 45, 49, 41, 59, 10, 9, 9, 125, 41, 59, 10, 9, 125, 10, 10, // -1);...});..}..
32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, // return;. 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 111, 110, 83, 101, 108, 101, // .function onSele
32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, // }.. 99, 116, 65, 108, 108, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, // ctAll() {...var
32, 118, 97, 114, 32, 114, 111, 119, 115, 32, 61, 32, 100, 97, 116, 97, // var rows = data 118, 105, 115, 105, 98, 108, 101, 32, 61, 32, 103, 101, 116, 86, 105, 115, // visible = getVis
59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, // ;. if (se 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, 59, 10, 9, 9, 118, 97, // ibleData();...va
97, 114, 99, 104, 84, 101, 120, 116, 41, 32, 123, 10, 32, 32, 32, 32, // archText) {. 114, 32, 99, 98, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, // r cb = document.
32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 116, 32, 61, // var st = 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, // getElementById('
32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 46, 116, 111, 76, 111, // searchText.toLo 100, 99, 45, 99, 98, 45, 97, 108, 108, 39, 41, 59, 10, 9, 9, 105, // dc-cb-all');...i
119, 101, 114, 67, 97, 115, 101, 40, 41, 59, 10, 32, 32, 32, 32, 32, // werCase();. 102, 32, 40, 99, 98, 32, 38, 38, 32, 99, 98, 46, 99, 104, 101, 99, // f (cb && cb.chec
32, 32, 32, 32, 32, 32, 32, 114, 111, 119, 115, 32, 61, 32, 100, 97, // rows = da 107, 101, 100, 32, 38, 38, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, // ked && visible.l
116, 97, 46, 102, 105, 108, 116, 101, 114, 40, 102, 117, 110, 99, 116, 105, // ta.filter(functi 101, 110, 103, 116, 104, 32, 62, 32, 48, 41, 32, 123, 10, 9, 9, 9, // ength > 0) {....
111, 110, 40, 105, 116, 101, 109, 41, 32, 123, 10, 32, 32, 32, 32, 32, // on(item) {. 102, 111, 114, 32, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, // for (var i = 0;
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, // retur 105, 32, 60, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, 103, // i < visible.leng
110, 32, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 32, 38, 38, // n (item.saddr && 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 9, 115, // th; i++) {.....s
32, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 46, 116, 111, 76, 111, // item.saddr.toLo 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, // electedSet[visib
119, 101, 114, 67, 97, 115, 101, 40, 41, 46, 105, 110, 100, 101, 120, 79, // werCase().indexO 108, 101, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 32, 61, 32, 116, // le[i].saddr] = t
102, 40, 115, 116, 41, 32, 33, 61, 61, 32, 45, 49, 41, 10, 32, 32, // f(st) !== -1). 114, 117, 101, 59, 10, 9, 9, 9, 125, 10, 9, 9, 125, 32, 101, 108, // rue;....}...} el
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 115, 101, 32, 123, 10, 9, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // se {....for (var
32, 32, 124, 124, 32, 40, 105, 116, 101, 109, 46, 100, 101, 115, 99, 32, // || (item.desc 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 118, 105, 115, 105, // i = 0; i < visi
38, 38, 32, 105, 116, 101, 109, 46, 100, 101, 115, 99, 46, 116, 111, 76, // && item.desc.toL 98, 108, 101, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, // ble.length; i++)
111, 119, 101, 114, 67, 97, 115, 101, 40, 41, 46, 105, 110, 100, 101, 120, // owerCase().index 32, 123, 10, 9, 9, 9, 9, 100, 101, 108, 101, 116, 101, 32, 115, 101, // {.....delete se
79, 102, 40, 115, 116, 41, 32, 33, 61, 61, 32, 45, 49, 41, 59, 10, // Of(st) !== -1);. 108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, 108, // lectedSet[visibl
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 41, 59, 10, // });. 101, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 59, 10, 9, 9, 9, // e[i].saddr];....
32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, // }. 125, 10, 9, 9, 125, 10, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, // }...}...renderTa
32, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, // document.getEl 98, 108, 101, 40, 41, 59, 10, 9, 9, 117, 112, 100, 97, 116, 101, 83, // ble();...updateS
101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, 111, // ementById('dc-co 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, 9, // electionBar();..
117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, 116, 101, 110, // unt').textConten 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 111, 110, 84, // }...function onT
116, 32, 61, 32, 114, 111, 119, 115, 46, 108, 101, 110, 103, 116, 104, 32, // t = rows.length 111, 103, 103, 108, 101, 82, 111, 119, 40, 115, 97, 100, 100, 114, 41, 32, // oggleRow(saddr)
43, 32, 39, 32, 47, 32, 39, 32, 43, 32, 100, 97, 116, 97, 46, 108, // + ' / ' + data.l 123, 10, 9, 9, 105, 102, 32, 40, 115, 101, 108, 101, 99, 116, 101, 100, // {...if (selected
101, 110, 103, 116, 104, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ength;.. 83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 41, 32, 123, 10, 9, 9, // Set[saddr]) {...
105, 102, 32, 40, 114, 111, 119, 115, 46, 108, 101, 110, 103, 116, 104, 32, // if (rows.length 9, 100, 101, 108, 101, 116, 101, 32, 115, 101, 108, 101, 99, 116, 101, 100, // .delete selected
61, 61, 61, 32, 48, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // === 0) {. 83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 59, 10, 9, 9, 125, 32, // Set[saddr];...}
32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, 110, 110, 101, 114, // tbody.inner 101, 108, 115, 101, 32, 123, 10, 9, 9, 9, 115, 101, 108, 101, 99, 116, // else {....select
72, 84, 77, 76, 32, 61, 32, 39, 60, 116, 114, 32, 99, 108, 97, 115, // HTML = '<tr clas 101, 100, 83, 101, 116, 91, 115, 97, 100, 100, 114, 93, 32, 61, 32, 116, // edSet[saddr] = t
115, 61, 34, 101, 109, 112, 116, 121, 45, 114, 111, 119, 34, 62, 60, 116, // s="empty-row"><t 114, 117, 101, 59, 10, 9, 9, 125, 10, 9, 9, 114, 101, 110, 100, 101, // rue;...}...rende
100, 32, 99, 111, 108, 115, 112, 97, 110, 61, 34, 54, 34, 62, 230, 151, // d colspan="6">.. 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 9, 9, 117, 112, 100, 97, // rTable();...upda
160, 229, 140, 185, 233, 133, 141, 231, 187, 147, 230, 158, 156, 60, 47, 116, // .............</t 116, 101, 83, 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, // teSelectionBar()
100, 62, 60, 47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, // d></tr>';. 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, // ;..}...function
32, 32, 32, 32, 32, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, // return;. 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, 100, 67, 111, 117, 110, 116, // getSelectedCount
32, 32, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 32, 32, 32, // }.. 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, 99, 111, 117, 110, 116, // () {...var count
32, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, 39, 39, 59, 10, // var html = '';. 32, 61, 32, 48, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // = 0;...for (var
32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, 114, // for (var 32, 107, 32, 105, 110, 32, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, // k in selectedSe
32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 114, 111, 119, 115, // i = 0; i < rows 116, 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 115, 101, 108, 101, // t) {....if (sele
46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, // .length; i++) {. 99, 116, 101, 100, 83, 101, 116, 46, 104, 97, 115, 79, 119, 110, 80, 114, // ctedSet.hasOwnPr
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // var 111, 112, 101, 114, 116, 121, 40, 107, 41, 41, 32, 99, 111, 117, 110, 116, // operty(k)) count
105, 116, 101, 109, 32, 61, 32, 114, 111, 119, 115, 91, 105, 93, 59, 10, // item = rows[i];. 43, 43, 59, 10, 9, 9, 125, 10, 9, 9, 114, 101, 116, 117, 114, 110, // ++;...}...return
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 104, 116, 109, 108, // html 32, 99, 111, 117, 110, 116, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, // count;..}...fun
32, 43, 61, 32, 39, 60, 116, 114, 62, 39, 10, 32, 32, 32, 32, 32, // += '<tr>'. 99, 116, 105, 111, 110, 32, 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, // ction getSelecte
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, // + '<t 100, 73, 116, 101, 109, 115, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, // dItems() {...var
100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, // d>' + fmtVal(ite 32, 114, 101, 115, 117, 108, 116, 32, 61, 32, 91, 93, 59, 10, 9, 9, // result = [];...
109, 46, 105, 100, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, // m.id) + '</td>'. 118, 97, 114, 32, 102, 117, 108, 108, 68, 97, 116, 97, 32, 61, 32, 97, // var fullData = a
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 108, 108, 68, 97, 116, 97, 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, // llData[activeTab
43, 32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, // + '<td>' + fmtVa 93, 32, 124, 124, 32, 91, 93, 59, 10, 9, 9, 102, 111, 114, 32, 40, // ] || [];...for (
108, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 41, 32, 43, 32, // l(item.saddr) + 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 102, // var i = 0; i < f
39, 60, 47, 116, 100, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, // '</td>'. 117, 108, 108, 68, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 59, 32, // ullData.length;
32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 100, 62, 39, // + '<td>' 105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 115, 101, // i++) {....if (se
32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 100, // + fmtVal(item.d 108, 101, 99, 116, 101, 100, 83, 101, 116, 91, 102, 117, 108, 108, 68, 97, // lectedSet[fullDa
101, 115, 99, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 32, // esc) + '</td>'. 116, 97, 91, 105, 93, 46, 115, 97, 100, 100, 114, 93, 41, 32, 123, 10, // ta[i].saddr]) {.
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, // + 9, 9, 9, 9, 114, 101, 115, 117, 108, 116, 46, 112, 117, 115, 104, 40, // ....result.push(
32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, // '<td>' + fmtVal 102, 117, 108, 108, 68, 97, 116, 97, 91, 105, 93, 41, 59, 10, 9, 9, // fullData[i]);...
40, 105, 116, 101, 109, 46, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, // (item.type) + '< 9, 125, 10, 9, 9, 125, 10, 9, 9, 114, 101, 116, 117, 114, 110, 32, // .}...}...return
47, 116, 100, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // /td>'. 114, 101, 115, 117, 108, 116, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, // result;..}...fun
32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 100, 62, 39, 32, 43, // + '<td>' + 99, 116, 105, 111, 110, 32, 117, 112, 100, 97, 116, 101, 83, 101, 108, 101, // ction updateSele
32, 102, 109, 116, 86, 97, 108, 40, 67, 84, 82, 76, 95, 84, 89, 80, // fmtVal(CTRL_TYP 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 32, 123, 10, 9, 9, 118, // ctionBar() {...v
69, 95, 77, 65, 80, 91, 105, 116, 101, 109, 46, 99, 116, 114, 108, 95, // E_MAP[item.ctrl_ 97, 114, 32, 98, 97, 114, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, // ar bar = documen
116, 121, 112, 101, 93, 32, 124, 124, 32, 105, 116, 101, 109, 46, 99, 116, // type] || item.ct 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, // t.getElementById
114, 108, 95, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, 47, 116, 100, // rl_type) + '</td 40, 39, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, 39, 41, 59, 10, // ('dc-sel-bar');.
62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // >'. 9, 9, 105, 102, 32, 40, 33, 98, 97, 114, 41, 32, 114, 101, 116, 117, // ..if (!bar) retu
32, 32, 32, 43, 32, 39, 60, 116, 100, 32, 115, 116, 121, 108, 101, 61, // + '<td style= 114, 110, 59, 10, 9, 9, 118, 97, 114, 32, 99, 111, 117, 110, 116, 32, // rn;...var count
34, 109, 97, 120, 45, 119, 105, 100, 116, 104, 58, 50, 48, 48, 112, 120, // "max-width:200px 61, 32, 103, 101, 116, 83, 101, 108, 101, 99, 116, 101, 100, 67, 111, 117, // = getSelectedCou
59, 111, 118, 101, 114, 102, 108, 111, 119, 58, 104, 105, 100, 100, 101, 110, // ;overflow:hidden 110, 116, 40, 41, 59, 10, 9, 9, 105, 102, 32, 40, 99, 111, 117, 110, // nt();...if (coun
59, 116, 101, 120, 116, 45, 111, 118, 101, 114, 102, 108, 111, 119, 58, 101, // ;text-overflow:e 116, 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 98, 97, // t === 0) {....ba
108, 108, 105, 112, 115, 105, 115, 59, 119, 104, 105, 116, 101, 45, 115, 112, // llipsis;white-sp 114, 46, 115, 116, 121, 108, 101, 46, 100, 105, 115, 112, 108, 97, 121, 32, // r.style.display
97, 99, 101, 58, 110, 111, 119, 114, 97, 112, 34, 32, 116, 105, 116, 108, // ace:nowrap" titl 61, 32, 39, 110, 111, 110, 101, 39, 59, 10, 9, 9, 125, 32, 101, 108, // = 'none';...} el
101, 61, 34, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, // e="' + fmtVal(it 115, 101, 32, 123, 10, 9, 9, 9, 98, 97, 114, 46, 115, 116, 121, 108, // se {....bar.styl
101, 109, 46, 108, 105, 110, 107, 95, 115, 97, 100, 100, 114, 115, 41, 32, // em.link_saddrs) 101, 46, 100, 105, 115, 112, 108, 97, 121, 32, 61, 32, 39, 102, 108, 101, // e.display = 'fle
43, 32, 39, 34, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // + '">' + fmtVal( 120, 39, 59, 10, 9, 9, 9, 98, 97, 114, 46, 113, 117, 101, 114, 121, // x';....bar.query
105, 116, 101, 109, 46, 108, 105, 110, 107, 95, 115, 97, 100, 100, 114, 115, // item.link_saddrs 83, 101, 108, 101, 99, 116, 111, 114, 40, 39, 46, 100, 99, 45, 115, 101, // Selector('.dc-se
41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 32, 32, 32, 32, // ) + '</td>'. 108, 45, 108, 97, 98, 101, 108, 39, 41, 46, 116, 101, 120, 116, 67, 111, // l-label').textCo
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, // + '< 110, 116, 101, 110, 116, 32, 61, 32, 39, 229, 183, 178, 233, 128, 137, 32, // ntent = '......
47, 116, 114, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, // /tr>';. } 39, 32, 43, 32, 99, 111, 117, 110, 116, 32, 43, 32, 39, 32, 228, 184, // ' + count + ' ..
10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 98, 111, 100, 121, 46, 105, // . tbody.i 170, 228, 191, 161, 229, 143, 183, 39, 59, 10, 9, 9, 125, 10, 9, 125, // .......';...}..}
110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, // nnerHTML = html; 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 100, 111, 65, 100, // ...function doAd
10, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 102, 117, 110, 99, // . }.. func 100, 83, 101, 108, 101, 99, 116, 101, 100, 40, 41, 32, 123, 10, 9, 9, // dSelected() {...
118, 97, 114, 32, 105, 116, 101, 109, 115, 32, 61, 32, 103, 101, 116, 83, // var items = getS
101, 108, 101, 99, 116, 101, 100, 73, 116, 101, 109, 115, 40, 41, 59, 10, // electedItems();.
9, 9, 105, 102, 32, 40, 105, 116, 101, 109, 115, 46, 108, 101, 110, 103, // ..if (items.leng
116, 104, 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 97, // th === 0) {....a
108, 101, 114, 116, 40, 39, 232, 175, 183, 229, 133, 136, 229, 139, 190, 233, // lert('..........
128, 137, 232, 166, 129, 230, 183, 187, 229, 138, 160, 231, 154, 132, 228, 191, // ................
161, 229, 143, 183, 39, 41, 59, 10, 9, 9, 9, 114, 101, 116, 117, 114, // ....');....retur
110, 59, 10, 9, 9, 125, 10, 10, 9, 9, 118, 97, 114, 32, 116, 121, // n;...}....var ty
112, 101, 76, 97, 98, 101, 108, 115, 32, 61, 32, 123, 32, 111, 117, 116, // peLabels = { out
58, 39, 230, 179, 168, 229, 134, 140, 39, 44, 32, 105, 110, 58, 39, 233, // :'......', in:'.
147, 190, 230, 142, 165, 230, 179, 168, 229, 134, 140, 39, 44, 32, 121, 107, // ...........', yk
58, 39, 233, 129, 165, 230, 142, 167, 39, 44, 32, 97, 111, 58, 39, 229, // :'......', ao:'.
143, 130, 230, 149, 176, 39, 44, 32, 112, 97, 114, 97, 109, 58, 39, 229, // .....', param:'.
174, 154, 229, 128, 188, 39, 32, 125, 59, 10, 9, 9, 118, 97, 114, 32, // .....' };...var
108, 97, 98, 101, 108, 32, 61, 32, 116, 121, 112, 101, 76, 97, 98, 101, // label = typeLabe
108, 115, 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, // ls[activeTab] ||
32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 59, 10, 10, 9, 9, 105, // activeTab;....i
102, 32, 40, 33, 99, 111, 110, 102, 105, 114, 109, 40, 39, 231, 161, 174, // f (!confirm('...
229, 174, 154, 229, 176, 134, 32, 39, 32, 43, 32, 105, 116, 101, 109, 115, // ...... ' + items
46, 108, 101, 110, 103, 116, 104, 32, 43, 32, 39, 32, 228, 184, 170, 228, // .length + ' ....
191, 161, 229, 143, 183, 230, 183, 187, 229, 138, 160, 229, 136, 176, 32, 39, // .............. '
32, 43, 32, 108, 97, 98, 101, 108, 32, 43, 32, 39, 239, 188, 159, 39, // + label + '...'
41, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, 10, 9, 9, 118, 97, // )) return;....va
114, 32, 115, 117, 99, 99, 32, 61, 32, 48, 59, 10, 9, 9, 102, 111, // r succ = 0;...fo
114, 32, 40, 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, // r (var i = 0; i
60, 32, 105, 116, 101, 109, 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, // < items.length;
105, 43, 43, 41, 32, 123, 10, 9, 9, 9, 118, 97, 114, 32, 111, 107, // i++) {....var ok
32, 61, 32, 87, 115, 67, 108, 105, 101, 110, 116, 46, 115, 101, 110, 100, // = WsClient.send
40, 123, 10, 9, 9, 9, 9, 115, 97, 100, 100, 114, 58, 32, 105, 116, // ({.....saddr: it
101, 109, 115, 91, 105, 93, 46, 115, 97, 100, 100, 114, 44, 10, 9, 9, // ems[i].saddr,...
9, 9, 115, 105, 103, 110, 97, 108, 95, 116, 121, 112, 101, 58, 32, 97, // ..signal_type: a
99, 116, 105, 118, 101, 84, 97, 98, 44, 10, 9, 9, 9, 9, 99, 117, // ctiveTab,.....cu
114, 100, 58, 32, 39, 97, 100, 100, 39, 44, 10, 9, 9, 9, 9, 115, // rd: 'add',.....s
101, 116, 116, 105, 110, 103, 95, 122, 111, 110, 101, 58, 32, 39, 48, 39, // etting_zone: '0'
44, 10, 9, 9, 9, 9, 115, 105, 103, 110, 97, 108, 95, 100, 97, 116, // ,.....signal_dat
97, 58, 32, 39, 39, 10, 9, 9, 9, 125, 41, 59, 10, 9, 9, 9, // a: ''....});....
105, 102, 32, 40, 111, 107, 41, 32, 115, 117, 99, 99, 43, 43, 59, 10, // if (ok) succ++;.
9, 9, 125, 10, 9, 9, 97, 108, 101, 114, 116, 40, 39, 229, 183, 178, // ..}...alert('...
229, 143, 145, 233, 128, 129, 32, 39, 32, 43, 32, 115, 117, 99, 99, 32, // ...... ' + succ
43, 32, 39, 47, 39, 32, 43, 32, 105, 116, 101, 109, 115, 46, 108, 101, // + '/' + items.le
110, 103, 116, 104, 32, 43, 32, 39, 32, 228, 184, 170, 32, 97, 100, 100, // ngth + ' ... add
32, 232, 175, 183, 230, 177, 130, 229, 136, 176, 32, 39, 32, 43, 32, 108, // ......... ' + l
97, 98, 101, 108, 41, 59, 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, // abel);..}...func
116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, // tion renderHeade 116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, // tion renderHeade
114, 115, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, // rs() {. v 114, 115, 40, 41, 32, 123, 10, 9, 9, 118, 97, 114, 32, 116, 104, 101, // rs() {...var the
97, 114, 32, 116, 104, 101, 97, 100, 32, 61, 32, 100, 111, 99, 117, 109, // ar thead = docum 97, 100, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // ad = document.ge
101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, // ent.getElementBy
73, 100, 40, 39, 100, 99, 45, 116, 104, 101, 97, 100, 39, 41, 59, 10, // Id('dc-thead');.
32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, 116, 104, 101, // if (!the
97, 100, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, 32, 32, 32, 32, // ad) return;.
32, 32, 32, 32, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, 39, // var html = '
39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 102, 111, 114, 32, 40, // ';. for (
118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 67, // var i = 0; i < C
79, 76, 85, 77, 78, 83, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, // OLUMNS.length; i
43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ++) {.
32, 32, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 116, 104, 62, 39, // html += '<th>'
32, 43, 32, 67, 79, 76, 85, 77, 78, 83, 91, 105, 93, 32, 43, 32, // + COLUMNS[i] +
39, 60, 47, 116, 104, 62, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, // '</th>';.
32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 116, 104, 101, 97, 100, // }. thead
46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, // .innerHTML = htm
108, 59, 10, 32, 32, 32, 32, 125, 10, 10, 32, 32, 32, 32, 102, 117, // l;. }.. fu
110, 99, 116, 105, 111, 110, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, // nction renderTab
115, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, // s() {. va
114, 32, 116, 121, 112, 101, 115, 32, 61, 32, 91, 39, 111, 117, 116, 39, // r types = ['out'
44, 32, 39, 105, 110, 39, 44, 32, 39, 121, 107, 39, 44, 32, 39, 97, // , 'in', 'yk', 'a
111, 39, 44, 32, 39, 112, 97, 114, 97, 109, 39, 93, 59, 10, 32, 32, // o', 'param'];.
32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 108, 97, 98, 101, 108, 115, // var labels
32, 61, 32, 123, 32, 111, 117, 116, 58, 32, 39, 230, 179, 168, 229, 134, // = { out: '.....
140, 32, 40, 111, 117, 116, 41, 39, 44, 32, 105, 110, 58, 32, 39, 233, // . (out)', in: '.
147, 190, 230, 142, 165, 230, 179, 168, 229, 134, 140, 32, 40, 105, 110, 41, // ........... (in)
39, 44, 32, 121, 107, 58, 32, 39, 233, 129, 165, 230, 142, 167, 32, 40, // ', yk: '...... (
121, 107, 41, 39, 44, 32, 97, 111, 58, 32, 39, 229, 143, 130, 230, 149, // yk)', ao: '.....
176, 32, 40, 97, 111, 41, 39, 44, 32, 112, 97, 114, 97, 109, 58, 32, // . (ao)', param:
39, 229, 174, 154, 229, 128, 188, 32, 40, 112, 97, 114, 97, 109, 41, 39, // '...... (param)'
32, 125, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, // };. var
101, 108, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // el = document.ge
116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, // tElementById('dc 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, // tElementById('dc
45, 116, 97, 98, 45, 98, 97, 114, 39, 41, 59, 10, 32, 32, 32, 32, // -tab-bar');. 45, 116, 104, 101, 97, 100, 39, 41, 59, 10, 9, 9, 105, 102, 32, 40, // -thead');...if (
32, 32, 32, 32, 105, 102, 32, 40, 33, 101, 108, 41, 32, 114, 101, 116, // if (!el) ret 33, 116, 104, 101, 97, 100, 41, 32, 114, 101, 116, 117, 114, 110, 59, 10, // !thead) return;.
117, 114, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // urn;. var 9, 9, 118, 97, 114, 32, 118, 105, 115, 105, 98, 108, 101, 32, 61, 32, // ..var visible =
32, 104, 116, 109, 108, 32, 61, 32, 39, 39, 59, 10, 32, 32, 32, 32, // html = '';. 103, 101, 116, 86, 105, 115, 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, // getVisibleData()
32, 32, 32, 32, 102, 111, 114, 32, 40, 118, 97, 114, 32, 105, 32, 61, // for (var i = 59, 10, 9, 9, 118, 97, 114, 32, 97, 108, 108, 67, 104, 101, 99, 107, // ;...var allCheck
32, 48, 59, 32, 105, 32, 60, 32, 116, 121, 112, 101, 115, 46, 108, 101, // 0; i < types.le 101, 100, 32, 61, 32, 118, 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, // ed = visible.len
110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 32, 32, 32, // ngth; i++) {. 103, 116, 104, 32, 62, 32, 48, 59, 10, 9, 9, 102, 111, 114, 32, 40, // gth > 0;...for (
32, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 116, 32, 61, // var t = 118, 97, 114, 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 118, // var i = 0; i < v
32, 116, 121, 112, 101, 115, 91, 105, 93, 59, 10, 32, 32, 32, 32, 32, // types[i];. 105, 115, 105, 98, 108, 101, 46, 108, 101, 110, 103, 116, 104, 32, 38, 38, // isible.length &&
32, 32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 99, 108, 115, 32, 61, // var cls = 32, 97, 108, 108, 67, 104, 101, 99, 107, 101, 100, 59, 32, 105, 43, 43, // allChecked; i++
32, 116, 32, 61, 61, 61, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, // t === activeTab 41, 32, 123, 10, 9, 9, 9, 105, 102, 32, 40, 33, 115, 101, 108, 101, // ) {....if (!sele
32, 63, 32, 39, 100, 99, 45, 116, 97, 98, 32, 97, 99, 116, 105, 118, // ? 'dc-tab activ 99, 116, 101, 100, 83, 101, 116, 91, 118, 105, 115, 105, 98, 108, 101, 91, // ctedSet[visible[
101, 39, 32, 58, 32, 39, 100, 99, 45, 116, 97, 98, 39, 59, 10, 32, // e' : 'dc-tab';. 105, 93, 46, 115, 97, 100, 100, 114, 93, 41, 32, 97, 108, 108, 67, 104, // i].saddr]) allCh
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 104, 116, 109, 108, 32, // html 101, 99, 107, 101, 100, 32, 61, 32, 102, 97, 108, 115, 101, 59, 10, 9, // ecked = false;..
43, 61, 32, 39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, // += '<span class= 9, 125, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, 32, // .}...var html =
34, 39, 32, 43, 32, 99, 108, 115, 32, 43, 32, 39, 34, 32, 100, 97, // "' + cls + '" da 39, 60, 116, 104, 32, 115, 116, 121, 108, 101, 61, 34, 119, 105, 100, 116, // '<th style="widt
116, 97, 45, 116, 97, 98, 61, 34, 39, 32, 43, 32, 116, 32, 43, 32, // ta-tab="' + t + 104, 58, 51, 54, 112, 120, 34, 62, 60, 105, 110, 112, 117, 116, 32, 116, // h:36px"><input t
39, 34, 62, 39, 32, 43, 32, 108, 97, 98, 101, 108, 115, 91, 116, 93, // '">' + labels[t] 121, 112, 101, 61, 34, 99, 104, 101, 99, 107, 98, 111, 120, 34, 32, 105, // ype="checkbox" i
32, 43, 32, 39, 60, 47, 115, 112, 97, 110, 62, 39, 59, 10, 32, 32, // + '</span>';. 100, 61, 34, 100, 99, 45, 99, 98, 45, 97, 108, 108, 34, 39, 32, 43, // d="dc-cb-all"' +
32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, // }. 32, 40, 97, 108, 108, 67, 104, 101, 99, 107, 101, 100, 32, 63, 32, 39, // (allChecked ? '
101, 108, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, // el.innerHTML = h 32, 99, 104, 101, 99, 107, 101, 100, 39, 32, 58, 32, 39, 39, 41, 32, // checked' : '')
116, 109, 108, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 118, 97, 114, // tml;. var 43, 32, 39, 62, 60, 47, 116, 104, 62, 39, 59, 10, 9, 9, 102, 111, // + '></th>';...fo
32, 116, 97, 98, 115, 32, 61, 32, 101, 108, 46, 113, 117, 101, 114, 121, // tabs = el.query 114, 32, 40, 118, 97, 114, 32, 106, 32, 61, 32, 49, 59, 32, 106, 32, // r (var j = 1; j
83, 101, 108, 101, 99, 116, 111, 114, 65, 108, 108, 40, 39, 46, 100, 99, // SelectorAll('.dc 60, 32, 67, 79, 76, 85, 77, 78, 83, 46, 108, 101, 110, 103, 116, 104, // < COLUMNS.length
45, 116, 97, 98, 39, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // -tab');. 59, 32, 106, 43, 43, 41, 32, 123, 10, 9, 9, 9, 104, 116, 109, 108, // ; j++) {....html
102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, 48, 59, 32, // for (var k = 0; 32, 43, 61, 32, 39, 60, 116, 104, 62, 39, 32, 43, 32, 67, 79, 76, // += '<th>' + COL
107, 32, 60, 32, 116, 97, 98, 115, 46, 108, 101, 110, 103, 116, 104, 59, // k < tabs.length; 85, 77, 78, 83, 91, 106, 93, 32, 43, 32, 39, 60, 47, 116, 104, 62, // UMNS[j] + '</th>
32, 107, 43, 43, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, // k++) {. 39, 59, 10, 9, 9, 125, 10, 9, 9, 116, 104, 101, 97, 100, 46, 105, // ';...}...thead.i
32, 32, 32, 32, 116, 97, 98, 115, 91, 107, 93, 46, 111, 110, 99, 108, // tabs[k].oncl 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, // nnerHTML = html;
105, 99, 107, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, // ick = function() 10, 10, 9, 9, 118, 97, 114, 32, 99, 98, 65, 108, 108, 32, 61, 32, // ....var cbAll =
32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // {. 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, // document.getElem
32, 32, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 116, // activeTab = t 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 99, 98, 45, 97, // entById('dc-cb-a
104, 105, 115, 46, 103, 101, 116, 65, 116, 116, 114, 105, 98, 117, 116, 101, // his.getAttribute 108, 108, 39, 41, 59, 10, 9, 9, 105, 102, 32, 40, 99, 98, 65, 108, // ll');...if (cbAl
40, 39, 100, 97, 116, 97, 45, 116, 97, 98, 39, 41, 59, 10, 32, 32, // ('data-tab');. 108, 41, 32, 99, 98, 65, 108, 108, 46, 111, 110, 99, 104, 97, 110, 103, // l) cbAll.onchang
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, // se 101, 32, 61, 32, 111, 110, 83, 101, 108, 101, 99, 116, 65, 108, 108, 59, // e = onSelectAll;
97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 32, // archText = '';. 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 114, // ..}...function r
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 100, // d 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 32, 123, 10, 9, // enderTable() {..
111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, // ocument.getEleme 9, 118, 97, 114, 32, 100, 97, 116, 97, 32, 61, 32, 103, 101, 116, 86, // .var data = getV
110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 115, 101, 97, 114, 99, // ntById('dc-searc 105, 115, 105, 98, 108, 101, 68, 97, 116, 97, 40, 41, 59, 10, 9, 9, // isibleData();...
104, 39, 41, 46, 118, 97, 108, 117, 101, 32, 61, 32, 39, 39, 59, 10, // h').value = '';. 118, 97, 114, 32, 116, 98, 111, 100, 121, 32, 61, 32, 100, 111, 99, 117, // var tbody = docu
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, // ment.getElementB
114, 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, 10, 32, 32, // renderTabs();. 121, 73, 100, 40, 39, 100, 99, 45, 116, 98, 111, 100, 121, 39, 41, 59, // yId('dc-tbody');
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, // re 10, 9, 9, 105, 102, 32, 40, 33, 116, 98, 111, 100, 121, 41, 32, 114, // ...if (!tbody) r
110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 32, // nderHeaders();. 101, 116, 117, 114, 110, 59, 10, 10, 9, 9, 118, 97, 114, 32, 102, 117, // eturn;....var fu
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, // r 108, 108, 68, 97, 116, 97, 32, 61, 32, 97, 108, 108, 68, 97, 116, 97, // llData = allData
101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 32, 32, // enderTable();. 91, 97, 99, 116, 105, 118, 101, 84, 97, 98, 93, 32, 124, 124, 32, 91, // [activeTab] || [
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, 59, 10, 32, 32, 32, // };. 93, 59, 10, 9, 9, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, // ];...document.ge
32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 10, 32, 32, // }. }.. 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, // tElementById('dc
32, 32, 114, 101, 116, 117, 114, 110, 32, 123, 10, 32, 32, 32, 32, 32, // return {. 45, 99, 111, 117, 110, 116, 39, 41, 46, 116, 101, 120, 116, 67, 111, 110, // -count').textCon
32, 32, 32, 114, 101, 110, 100, 101, 114, 58, 32, 102, 117, 110, 99, 116, // render: funct 116, 101, 110, 116, 32, 61, 32, 100, 97, 116, 97, 46, 108, 101, 110, 103, // tent = data.leng
105, 111, 110, 40, 99, 111, 110, 116, 97, 105, 110, 101, 114, 41, 32, 123, // ion(container) { 116, 104, 32, 43, 32, 39, 32, 47, 32, 39, 32, 43, 32, 102, 117, 108, // th + ' / ' + ful
10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 97, 108, 108, // . all 108, 68, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, 59, 10, 10, 9, // lData.length;...
68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, 32, 32, 32, 32, // Data = {};. 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 108, 101, 110, 103, 116, 104, // .if (data.length
32, 32, 32, 32, 32, 32, 32, 97, 99, 116, 105, 118, 101, 84, 97, 98, // activeTab 32, 61, 61, 61, 32, 48, 41, 32, 123, 10, 9, 9, 9, 116, 98, 111, // === 0) {....tbo
32, 61, 32, 39, 111, 117, 116, 39, 59, 10, 32, 32, 32, 32, 32, 32, // = 'out';. 100, 121, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 39, // dy.innerHTML = '
32, 32, 32, 32, 32, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, // searchText 60, 116, 114, 32, 99, 108, 97, 115, 115, 61, 34, 101, 109, 112, 116, 121, // <tr class="empty
32, 61, 32, 39, 39, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // = '';. 45, 114, 111, 119, 34, 62, 60, 116, 100, 32, 99, 111, 108, 115, 112, 97, // -row"><td colspa
32, 32, 32, 99, 111, 110, 116, 97, 105, 110, 101, 114, 46, 105, 110, 110, // container.inn 110, 61, 34, 39, 32, 43, 32, 67, 79, 76, 85, 77, 78, 83, 46, 108, // n="' + COLUMNS.l
101, 114, 72, 84, 77, 76, 32, 61, 32, 39, 39, 10, 32, 32, 32, 32, // erHTML = ''. 101, 110, 103, 116, 104, 32, 43, 32, 39, 34, 62, 230, 154, 130, 230, 151, // ength + '">.....
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, // + '< 160, 230, 149, 176, 230, 141, 174, 60, 47, 116, 100, 62, 60, 47, 116, 114, // .......</td></tr
100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 112, 97, 103, 101, 45, // div class="page- 62, 39, 59, 10, 9, 9, 9, 114, 101, 116, 117, 114, 110, 59, 10, 9, // >';....return;..
104, 101, 97, 100, 101, 114, 34, 62, 60, 104, 50, 62, 230, 149, 176, 230, // header"><h2>.... 9, 125, 10, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, 61, // .}....var html =
141, 174, 228, 184, 173, 229, 191, 131, 60, 47, 104, 50, 62, 60, 112, 62, // ........</h2><p> 32, 39, 39, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, 32, // '';...for (var
230, 159, 165, 231, 156, 139, 230, 137, 128, 230, 156, 137, 228, 191, 161, 229, // ................ 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 100, 97, 116, 97, 46, // i = 0; i < data.
143, 183, 230, 149, 176, 230, 141, 174, 239, 188, 140, 230, 140, 137, 231, 177, // ................ 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, 10, 9, // length; i++) {..
187, 229, 158, 139, 229, 136, 134, 232, 161, 168, 239, 188, 140, 230, 148, 175, // ................ 9, 9, 118, 97, 114, 32, 105, 116, 101, 109, 32, 61, 32, 100, 97, 116, // ..var item = dat
230, 140, 129, 230, 144, 156, 231, 180, 162, 60, 47, 112, 62, 60, 47, 100, // .........</p></d 97, 91, 105, 93, 59, 10, 9, 9, 9, 118, 97, 114, 32, 99, 104, 101, // a[i];....var che
105, 118, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // iv>'. 99, 107, 101, 100, 32, 61, 32, 33, 33, 115, 101, 108, 101, 99, 116, 101, // cked = !!selecte
32, 32, 32, 32, 32, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, // + '<div cla 100, 83, 101, 116, 91, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 93, // dSet[item.saddr]
115, 115, 61, 34, 100, 97, 116, 97, 99, 101, 110, 116, 101, 114, 45, 116, // ss="datacenter-t 59, 10, 9, 9, 9, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 116, // ;....html += '<t
111, 111, 108, 98, 97, 114, 34, 62, 39, 10, 32, 32, 32, 32, 32, 32, // oolbar">'. 114, 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, 60, // r>'.....+ '<td><
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 32, 32, 39, 60, // + '< 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, 34, 99, 104, 101, 99, // input type="chec
100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, 116, 97, // div class="dc-ta 107, 98, 111, 120, 34, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, // kbox" class="dc-
98, 45, 98, 97, 114, 34, 32, 105, 100, 61, 34, 100, 99, 45, 116, 97, // b-bar" id="dc-ta 99, 98, 45, 114, 111, 119, 34, 39, 32, 43, 32, 40, 99, 104, 101, 99, // cb-row"' + (chec
98, 45, 98, 97, 114, 34, 62, 60, 47, 100, 105, 118, 62, 39, 10, 32, // b-bar"></div>'. 107, 101, 100, 32, 63, 32, 39, 32, 99, 104, 101, 99, 107, 101, 100, 39, // ked ? ' checked'
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 43, // + 32, 58, 32, 39, 39, 41, 32, 43, 32, 39, 32, 100, 97, 116, 97, 45, // : '') + ' data-
32, 32, 32, 39, 60, 105, 110, 112, 117, 116, 32, 116, 121, 112, 101, 61, // '<input type= 115, 97, 100, 100, 114, 61, 34, 39, 32, 43, 32, 102, 109, 116, 86, 97, // saddr="' + fmtVa
34, 116, 101, 120, 116, 34, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // "text" class="dc 108, 40, 105, 116, 101, 109, 46, 115, 97, 100, 100, 114, 41, 32, 43, 32, // l(item.saddr) +
45, 115, 101, 97, 114, 99, 104, 34, 32, 105, 100, 61, 34, 100, 99, 45, // -search" id="dc- 39, 34, 62, 60, 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, // '"></td>'.....+
115, 101, 97, 114, 99, 104, 34, 32, 112, 108, 97, 99, 101, 104, 111, 108, // search" placehol 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // '<td>' + fmtVal(
100, 101, 114, 61, 34, 230, 144, 156, 231, 180, 162, 32, 115, 97, 100, 100, // der="...... sadd 105, 116, 101, 109, 46, 105, 100, 41, 32, 43, 32, 39, 60, 47, 116, 100, // item.id) + '</td
114, 32, 230, 136, 150, 32, 100, 101, 115, 99, 46, 46, 46, 34, 62, 39, // r ... desc...">' 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, 39, 32, // >'.....+ '<td>'
10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // . 43, 32, 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 115, 97, // + fmtVal(item.sa
32, 43, 32, 32, 32, 39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, // + '<span clas 100, 100, 114, 41, 32, 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 9, // ddr) + '</td>'..
115, 61, 34, 100, 99, 45, 99, 111, 117, 110, 116, 34, 32, 105, 100, 61, // s="dc-count" id= 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, // ...+ '<td>' + fm
34, 100, 99, 45, 99, 111, 117, 110, 116, 34, 62, 48, 60, 47, 115, 112, // "dc-count">0</sp 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 100, 101, 115, 99, 41, 32, // tVal(item.desc)
97, 110, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // an>'. 43, 32, 39, 60, 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, // + '</td>'.....+
32, 32, 32, 32, 32, 43, 32, 39, 60, 47, 100, 105, 118, 62, 39, 10, // + '</div>'. 39, 60, 116, 100, 62, 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, // '<td>' + fmtVal(
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 105, 116, 101, 109, 46, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, 47, // item.type) + '</
43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 116, // + '<div class="t 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, 62, // td>'.....+ '<td>
97, 98, 108, 101, 45, 99, 97, 114, 100, 34, 62, 60, 100, 105, 118, 32, // able-card"><div 39, 32, 43, 32, 102, 109, 116, 86, 97, 108, 40, 67, 84, 82, 76, 95, // ' + fmtVal(CTRL_
99, 108, 97, 115, 115, 61, 34, 116, 97, 98, 108, 101, 45, 119, 114, 97, // class="table-wra 84, 89, 80, 69, 95, 77, 65, 80, 91, 105, 116, 101, 109, 46, 99, 116, // TYPE_MAP[item.ct
112, 112, 101, 114, 34, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, // pper">'. 114, 108, 95, 116, 121, 112, 101, 93, 32, 124, 124, 32, 105, 116, 101, 109, // rl_type] || item
32, 32, 32, 32, 32, 32, 32, 32, 43, 32, 39, 60, 116, 97, 98, 108, // + '<tabl 46, 99, 116, 114, 108, 95, 116, 121, 112, 101, 41, 32, 43, 32, 39, 60, // .ctrl_type) + '<
101, 32, 99, 108, 97, 115, 115, 61, 34, 115, 105, 103, 110, 97, 108, 45, // e class="signal- 47, 116, 100, 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 116, 100, // /td>'.....+ '<td
116, 97, 98, 108, 101, 34, 62, 60, 116, 104, 101, 97, 100, 62, 60, 116, // table"><thead><t 32, 115, 116, 121, 108, 101, 61, 34, 109, 97, 120, 45, 119, 105, 100, 116, // style="max-widt
114, 32, 105, 100, 61, 34, 100, 99, 45, 116, 104, 101, 97, 100, 34, 62, // r id="dc-thead"> 104, 58, 50, 48, 48, 112, 120, 59, 111, 118, 101, 114, 102, 108, 111, 119, // h:200px;overflow
60, 47, 116, 114, 62, 60, 47, 116, 104, 101, 97, 100, 62, 60, 116, 98, // </tr></thead><tb 58, 104, 105, 100, 100, 101, 110, 59, 116, 101, 120, 116, 45, 111, 118, 101, // :hidden;text-ove
111, 100, 121, 32, 105, 100, 61, 34, 100, 99, 45, 116, 98, 111, 100, 121, // ody id="dc-tbody 114, 102, 108, 111, 119, 58, 101, 108, 108, 105, 112, 115, 105, 115, 59, 119, // rflow:ellipsis;w
34, 62, 60, 47, 116, 98, 111, 100, 121, 62, 60, 47, 116, 97, 98, 108, // "></tbody></tabl 104, 105, 116, 101, 45, 115, 112, 97, 99, 101, 58, 110, 111, 119, 114, 97, // hite-space:nowra
101, 62, 39, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // e>'. 112, 34, 32, 116, 105, 116, 108, 101, 61, 34, 39, 32, 43, 32, 102, 109, // p" title="' + fm
32, 32, 32, 32, 43, 32, 39, 60, 47, 100, 105, 118, 62, 60, 47, 100, // + '</div></d 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 108, 105, 110, 107, 95, 115, // tVal(item.link_s
105, 118, 62, 39, 59, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // iv>';.. 97, 100, 100, 114, 115, 41, 32, 43, 32, 39, 34, 62, 39, 32, 43, 32, // addrs) + '">' +
32, 32, 32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, // renderTabs(); 102, 109, 116, 86, 97, 108, 40, 105, 116, 101, 109, 46, 108, 105, 110, 107, // fmtVal(item.link
10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, // . ren 95, 115, 97, 100, 100, 114, 115, 41, 32, 43, 32, 39, 60, 47, 116, 100, // _saddrs) + '</td
100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 32, 32, // derHeaders();. 62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 47, 116, 114, 62, 39, // >'.....+ '</tr>'
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, 100, 101, 114, // render 59, 10, 9, 9, 125, 10, 9, 9, 116, 98, 111, 100, 121, 46, 105, 110, // ;...}...tbody.in
84, 97, 98, 108, 101, 40, 41, 59, 10, 10, 32, 32, 32, 32, 32, 32, // Table();.. 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, 59, 10, // nerHTML = html;.
32, 32, 32, 32, 32, 32, 118, 97, 114, 32, 115, 101, 97, 114, 99, 104, // var search 10, 9, 9, 47, 47, 32, 231, 187, 145, 229, 174, 154, 232, 161, 140, 229, // ...// ..........
73, 110, 112, 117, 116, 32, 61, 32, 100, 111, 99, 117, 109, 101, 110, 116, // Input = document 164, 141, 233, 128, 137, 230, 161, 134, 228, 186, 139, 228, 187, 182, 10, 9, // ................
46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, 40, // .getElementById( 9, 118, 97, 114, 32, 99, 98, 115, 32, 61, 32, 116, 98, 111, 100, 121, // .var cbs = tbody
39, 100, 99, 45, 115, 101, 97, 114, 99, 104, 39, 41, 59, 10, 32, 32, // 'dc-search');. 46, 113, 117, 101, 114, 121, 83, 101, 108, 101, 99, 116, 111, 114, 65, 108, // .querySelectorAl
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 115, 101, // if (se 108, 40, 39, 46, 100, 99, 45, 99, 98, 45, 114, 111, 119, 39, 41, 59, // l('.dc-cb-row');
97, 114, 99, 104, 73, 110, 112, 117, 116, 41, 32, 123, 10, 32, 32, 32, // archInput) {. 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, // ...for (var k =
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 115, 101, 97, // sea 48, 59, 32, 107, 32, 60, 32, 99, 98, 115, 46, 108, 101, 110, 103, 116, // 0; k < cbs.lengt
114, 99, 104, 73, 110, 112, 117, 116, 46, 111, 110, 105, 110, 112, 117, 116, // rchInput.oninput 104, 59, 32, 107, 43, 43, 41, 32, 123, 10, 9, 9, 9, 99, 98, 115, // h; k++) {....cbs
32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, // = function() {. 91, 107, 93, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, 32, 102, 117, // [k].onclick = fu
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 110, 99, 116, 105, 111, 110, 40, 101, 41, 32, 123, 10, 9, 9, 9, 9, // nction(e) {.....
32, 32, 32, 32, 115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, // searchText = 101, 46, 115, 116, 111, 112, 80, 114, 111, 112, 97, 103, 97, 116, 105, 111, // e.stopPropagatio
32, 116, 104, 105, 115, 46, 118, 97, 108, 117, 101, 59, 10, 32, 32, 32, // this.value;. 110, 40, 41, 59, 10, 9, 9, 9, 9, 111, 110, 84, 111, 103, 103, 108, // n();.....onToggl
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 101, 82, 111, 119, 40, 116, 104, 105, 115, 46, 103, 101, 116, 65, 116, 116, // eRow(this.getAtt
32, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, // renderTable();. 114, 105, 98, 117, 116, 101, 40, 39, 100, 97, 116, 97, 45, 115, 97, 100, // ribute('data-sad
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // 100, 114, 39, 41, 41, 59, 10, 9, 9, 9, 125, 59, 10, 9, 9, 125, // dr'));....};...}
125, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 125, // };. } 10, 9, 125, 10, 10, 9, 102, 117, 110, 99, 116, 105, 111, 110, 32, 114, // ..}...function r
10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 44, 10, 10, 32, 32, 32, // . },.. 101, 110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 32, 123, 10, 9, 9, // enderTabs() {...
32, 32, 32, 32, 32, 111, 110, 69, 110, 116, 101, 114, 58, 32, 102, 117, // onEnter: fu 118, 97, 114, 32, 116, 121, 112, 101, 115, 32, 61, 32, 91, 39, 111, 117, // var types = ['ou
110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 32, 32, 32, 32, 32, // nction() {. 116, 39, 44, 32, 39, 105, 110, 39, 44, 32, 39, 121, 107, 39, 44, 32, // t', 'in', 'yk',
32, 32, 32, 125, 44, 10, 10, 32, 32, 32, 32, 32, 32, 32, 32, 111, // },.. o 39, 97, 111, 39, 44, 32, 39, 112, 97, 114, 97, 109, 39, 93, 59, 10, // 'ao', 'param'];.
110, 76, 101, 97, 118, 101, 58, 32, 102, 117, 110, 99, 116, 105, 111, 110, // nLeave: function 9, 9, 118, 97, 114, 32, 108, 97, 98, 101, 108, 115, 32, 61, 32, 123, // ..var labels = {
40, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // () {. 32, 111, 117, 116, 58, 32, 39, 230, 179, 168, 229, 134, 140, 32, 40, 111, // out: '...... (o
32, 97, 108, 108, 68, 97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 32, // allData = {};. 117, 116, 41, 39, 44, 32, 105, 110, 58, 32, 39, 233, 147, 190, 230, 142, // ut)', in: '.....
32, 32, 32, 32, 32, 32, 32, 125, 44, 10, 10, 32, 32, 32, 32, 32, // },.. 165, 230, 179, 168, 229, 134, 140, 32, 40, 105, 110, 41, 39, 44, 32, 121, // ....... (in)', y
32, 32, 32, 111, 110, 68, 97, 116, 97, 58, 32, 102, 117, 110, 99, 116, // onData: funct 107, 58, 32, 39, 233, 129, 165, 230, 142, 167, 32, 40, 121, 107, 41, 39, // k: '...... (yk)'
105, 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, 32, 32, 32, 32, // ion(data) {. 44, 32, 97, 111, 58, 32, 39, 229, 143, 130, 230, 149, 176, 32, 40, 97, // , ao: '...... (a
32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 33, 100, 97, 116, // if (!dat 111, 41, 39, 44, 32, 112, 97, 114, 97, 109, 58, 32, 39, 229, 174, 154, // o)', param: '...
97, 32, 124, 124, 32, 116, 121, 112, 101, 111, 102, 32, 100, 97, 116, 97, // a || typeof data 229, 128, 188, 32, 40, 112, 97, 114, 97, 109, 41, 39, 32, 125, 59, 10, // ... (param)' };.
32, 33, 61, 61, 32, 39, 111, 98, 106, 101, 99, 116, 39, 41, 32, 114, // !== 'object') r 9, 9, 118, 97, 114, 32, 101, 108, 32, 61, 32, 100, 111, 99, 117, 109, // ..var el = docum
101, 116, 117, 114, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // eturn;. 101, 110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, // ent.getElementBy
32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, 116, 41, // if (data.out) 73, 100, 40, 39, 100, 99, 45, 116, 97, 98, 45, 98, 97, 114, 39, 41, // Id('dc-tab-bar')
32, 97, 108, 108, 68, 97, 116, 97, 46, 111, 117, 116, 32, 61, 32, 100, // allData.out = d 59, 10, 9, 9, 105, 102, 32, 40, 33, 101, 108, 41, 32, 114, 101, 116, // ;...if (!el) ret
97, 116, 97, 46, 111, 117, 116, 59, 10, 32, 32, 32, 32, 32, 32, 32, // ata.out;. 117, 114, 110, 59, 10, 9, 9, 118, 97, 114, 32, 104, 116, 109, 108, 32, // urn;...var html
32, 32, 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 105, 110, // if (data.in 61, 32, 39, 39, 59, 10, 9, 9, 102, 111, 114, 32, 40, 118, 97, 114, // = '';...for (var
41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 105, 110, 32, 61, 32, 100, // ) allData.in = d 32, 105, 32, 61, 32, 48, 59, 32, 105, 32, 60, 32, 116, 121, 112, 101, // i = 0; i < type
97, 116, 97, 46, 105, 110, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // ata.in;. 115, 46, 108, 101, 110, 103, 116, 104, 59, 32, 105, 43, 43, 41, 32, 123, // s.length; i++) {
32, 32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 121, 107, 41, // if (data.yk) 10, 9, 9, 9, 118, 97, 114, 32, 116, 32, 61, 32, 116, 121, 112, 101, // ....var t = type
115, 91, 105, 93, 59, 10, 9, 9, 9, 118, 97, 114, 32, 99, 108, 115, // s[i];....var cls
32, 61, 32, 116, 32, 61, 61, 61, 32, 97, 99, 116, 105, 118, 101, 84, // = t === activeT
97, 98, 32, 63, 32, 39, 100, 99, 45, 116, 97, 98, 32, 97, 99, 116, // ab ? 'dc-tab act
105, 118, 101, 39, 32, 58, 32, 39, 100, 99, 45, 116, 97, 98, 39, 59, // ive' : 'dc-tab';
10, 9, 9, 9, 104, 116, 109, 108, 32, 43, 61, 32, 39, 60, 115, 112, // ....html += '<sp
97, 110, 32, 99, 108, 97, 115, 115, 61, 34, 39, 32, 43, 32, 99, 108, // an class="' + cl
115, 32, 43, 32, 39, 34, 32, 100, 97, 116, 97, 45, 116, 97, 98, 61, // s + '" data-tab=
34, 39, 32, 43, 32, 116, 32, 43, 32, 39, 34, 62, 39, 32, 43, 32, // "' + t + '">' +
108, 97, 98, 101, 108, 115, 91, 116, 93, 32, 43, 32, 39, 60, 47, 115, // labels[t] + '</s
112, 97, 110, 62, 39, 59, 10, 9, 9, 125, 10, 9, 9, 101, 108, 46, // pan>';...}...el.
105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 104, 116, 109, 108, // innerHTML = html
59, 10, 9, 9, 118, 97, 114, 32, 116, 97, 98, 115, 32, 61, 32, 101, // ;...var tabs = e
108, 46, 113, 117, 101, 114, 121, 83, 101, 108, 101, 99, 116, 111, 114, 65, // l.querySelectorA
108, 108, 40, 39, 46, 100, 99, 45, 116, 97, 98, 39, 41, 59, 10, 9, // ll('.dc-tab');..
9, 102, 111, 114, 32, 40, 118, 97, 114, 32, 107, 32, 61, 32, 48, 59, // .for (var k = 0;
32, 107, 32, 60, 32, 116, 97, 98, 115, 46, 108, 101, 110, 103, 116, 104, // k < tabs.length
59, 32, 107, 43, 43, 41, 32, 123, 10, 9, 9, 9, 116, 97, 98, 115, // ; k++) {....tabs
91, 107, 93, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, 32, 102, 117, // [k].onclick = fu
110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 10, 9, 9, 9, 9, 97, // nction() {.....a
99, 116, 105, 118, 101, 84, 97, 98, 32, 61, 32, 116, 104, 105, 115, 46, // ctiveTab = this.
103, 101, 116, 65, 116, 116, 114, 105, 98, 117, 116, 101, 40, 39, 100, 97, // getAttribute('da
116, 97, 45, 116, 97, 98, 39, 41, 59, 10, 9, 9, 9, 9, 115, 101, // ta-tab');.....se
97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, 10, 9, // archText = '';..
9, 9, 9, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 32, 61, // ...selectedSet =
32, 123, 125, 59, 10, 9, 9, 9, 9, 100, 111, 99, 117, 109, 101, 110, // {};.....documen
116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, 100, // t.getElementById
40, 39, 100, 99, 45, 115, 101, 97, 114, 99, 104, 39, 41, 46, 118, 97, // ('dc-search').va
108, 117, 101, 32, 61, 32, 39, 39, 59, 10, 9, 9, 9, 9, 114, 101, // lue = '';.....re
110, 100, 101, 114, 84, 97, 98, 115, 40, 41, 59, 10, 9, 9, 9, 9, // nderTabs();.....
114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, 41, 59, // renderHeaders();
10, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, 98, 108, 101, // .....renderTable
40, 41, 59, 10, 9, 9, 9, 9, 117, 112, 100, 97, 116, 101, 83, 101, // ();.....updateSe
108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, 9, 9, // lectionBar();...
9, 125, 59, 10, 9, 9, 125, 10, 9, 125, 10, 10, 9, 114, 101, 116, // .};...}..}...ret
117, 114, 110, 32, 123, 10, 9, 9, 114, 101, 110, 100, 101, 114, 58, 32, // urn {...render:
102, 117, 110, 99, 116, 105, 111, 110, 40, 99, 111, 110, 116, 97, 105, 110, // function(contain
101, 114, 41, 32, 123, 10, 9, 9, 9, 97, 108, 108, 68, 97, 116, 97, // er) {....allData
32, 61, 32, 123, 125, 59, 10, 9, 9, 9, 97, 99, 116, 105, 118, 101, // = {};....active
84, 97, 98, 32, 61, 32, 39, 111, 117, 116, 39, 59, 10, 9, 9, 9, // Tab = 'out';....
115, 101, 97, 114, 99, 104, 84, 101, 120, 116, 32, 61, 32, 39, 39, 59, // searchText = '';
10, 9, 9, 9, 115, 101, 108, 101, 99, 116, 101, 100, 83, 101, 116, 32, // ....selectedSet
61, 32, 123, 125, 59, 10, 9, 9, 9, 99, 111, 110, 116, 97, 105, 110, // = {};....contain
101, 114, 46, 105, 110, 110, 101, 114, 72, 84, 77, 76, 32, 61, 32, 39, // er.innerHTML = '
39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, // '.....+ '<div cl
97, 115, 115, 61, 34, 112, 97, 103, 101, 45, 104, 101, 97, 100, 101, 114, // ass="page-header
34, 62, 60, 104, 50, 62, 230, 149, 176, 230, 141, 174, 228, 184, 173, 229, // "><h2>..........
191, 131, 60, 47, 104, 50, 62, 60, 112, 62, 229, 139, 190, 233, 128, 137, // ..</h2><p>......
228, 191, 161, 229, 143, 183, 229, 144, 142, 231, 130, 185, 229, 135, 187, 34, // ..............."
230, 183, 187, 229, 138, 160, 229, 136, 176, 34, 229, 141, 179, 229, 143, 175, // ........."......
230, 183, 187, 229, 138, 160, 232, 135, 179, 229, 175, 185, 229, 186, 148, 233, // ................
133, 141, 231, 189, 174, 233, 161, 181, 32, 124, 32, 230, 159, 165, 231, 156, // ........ | .....
139, 230, 137, 128, 230, 156, 137, 228, 191, 161, 229, 143, 183, 230, 149, 176, // ................
230, 141, 174, 239, 188, 140, 230, 140, 137, 231, 177, 187, 229, 158, 139, 229, // ................
136, 134, 232, 161, 168, 239, 188, 140, 230, 148, 175, 230, 140, 129, 230, 144, // ................
156, 231, 180, 162, 60, 47, 112, 62, 60, 47, 100, 105, 118, 62, 39, 10, // ....</p></div>'.
9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, // ....+ '<div clas
115, 61, 34, 100, 97, 116, 97, 99, 101, 110, 116, 101, 114, 45, 116, 111, // s="datacenter-to
111, 108, 98, 97, 114, 34, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, // olbar">'.....+
32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // '<div class="dc
45, 116, 97, 98, 45, 98, 97, 114, 34, 32, 105, 100, 61, 34, 100, 99, // -tab-bar" id="dc
45, 116, 97, 98, 45, 98, 97, 114, 34, 62, 60, 47, 100, 105, 118, 62, // -tab-bar"></div>
39, 10, 9, 9, 9, 9, 43, 32, 32, 32, 39, 60, 105, 110, 112, 117, // '.....+ '<inpu
116, 32, 116, 121, 112, 101, 61, 34, 116, 101, 120, 116, 34, 32, 99, 108, // t type="text" cl
97, 115, 115, 61, 34, 100, 99, 45, 115, 101, 97, 114, 99, 104, 34, 32, // ass="dc-search"
105, 100, 61, 34, 100, 99, 45, 115, 101, 97, 114, 99, 104, 34, 32, 112, // id="dc-search" p
108, 97, 99, 101, 104, 111, 108, 100, 101, 114, 61, 34, 230, 144, 156, 231, // laceholder="....
180, 162, 32, 115, 97, 100, 100, 114, 32, 230, 136, 150, 32, 100, 101, 115, // .. saddr ... des
99, 46, 46, 46, 34, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, 32, // c...">'.....+
39, 60, 115, 112, 97, 110, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, // '<span class="dc
45, 99, 111, 117, 110, 116, 34, 32, 105, 100, 61, 34, 100, 99, 45, 99, // -count" id="dc-c
111, 117, 110, 116, 34, 62, 48, 60, 47, 115, 112, 97, 110, 62, 39, 10, // ount">0</span>'.
9, 9, 9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, 39, 10, 9, // ....+ '</div>'..
9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, // ...+ '<div class
61, 34, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, 34, 32, 105, 100, // ="dc-sel-bar" id
61, 34, 100, 99, 45, 115, 101, 108, 45, 98, 97, 114, 34, 32, 115, 116, // ="dc-sel-bar" st
121, 108, 101, 61, 34, 100, 105, 115, 112, 108, 97, 121, 58, 110, 111, 110, // yle="display:non
101, 34, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, 32, 39, 60, 115, // e">'.....+ '<s
112, 97, 110, 32, 99, 108, 97, 115, 115, 61, 34, 100, 99, 45, 115, 101, // pan class="dc-se
108, 45, 108, 97, 98, 101, 108, 34, 62, 229, 183, 178, 233, 128, 137, 32, // l-label">......
48, 32, 228, 184, 170, 228, 191, 161, 229, 143, 183, 60, 47, 115, 112, 97, // 0 .........</spa
110, 62, 39, 10, 9, 9, 9, 9, 43, 32, 32, 32, 39, 60, 98, 117, // n>'.....+ '<bu
116, 116, 111, 110, 32, 99, 108, 97, 115, 115, 61, 34, 98, 116, 110, 32, // tton class="btn
98, 116, 110, 45, 112, 114, 105, 109, 97, 114, 121, 34, 32, 105, 100, 61, // btn-primary" id=
34, 100, 99, 45, 98, 116, 110, 45, 97, 100, 100, 34, 32, 115, 116, 121, // "dc-btn-add" sty
108, 101, 61, 34, 109, 97, 114, 103, 105, 110, 45, 108, 101, 102, 116, 58, // le="margin-left:
49, 54, 112, 120, 34, 62, 230, 183, 187, 229, 138, 160, 229, 136, 176, 233, // 16px">..........
133, 141, 231, 189, 174, 233, 161, 181, 60, 47, 98, 117, 116, 116, 111, 110, // ........</button
62, 39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, // >'.....+ '</div>
39, 10, 9, 9, 9, 9, 43, 32, 39, 60, 100, 105, 118, 32, 99, 108, // '.....+ '<div cl
97, 115, 115, 61, 34, 116, 97, 98, 108, 101, 45, 99, 97, 114, 100, 34, // ass="table-card"
62, 60, 100, 105, 118, 32, 99, 108, 97, 115, 115, 61, 34, 116, 97, 98, // ><div class="tab
108, 101, 45, 119, 114, 97, 112, 112, 101, 114, 34, 62, 39, 10, 9, 9, // le-wrapper">'...
9, 9, 43, 32, 39, 60, 116, 97, 98, 108, 101, 32, 99, 108, 97, 115, // ..+ '<table clas
115, 61, 34, 115, 105, 103, 110, 97, 108, 45, 116, 97, 98, 108, 101, 34, // s="signal-table"
62, 60, 116, 104, 101, 97, 100, 62, 60, 116, 114, 32, 105, 100, 61, 34, // ><thead><tr id="
100, 99, 45, 116, 104, 101, 97, 100, 34, 62, 60, 47, 116, 114, 62, 60, // dc-thead"></tr><
47, 116, 104, 101, 97, 100, 62, 60, 116, 98, 111, 100, 121, 32, 105, 100, // /thead><tbody id
61, 34, 100, 99, 45, 116, 98, 111, 100, 121, 34, 62, 60, 47, 116, 98, // ="dc-tbody"></tb
111, 100, 121, 62, 60, 47, 116, 97, 98, 108, 101, 62, 39, 10, 9, 9, // ody></table>'...
9, 9, 43, 32, 39, 60, 47, 100, 105, 118, 62, 60, 47, 100, 105, 118, // ..+ '</div></div
62, 39, 59, 10, 10, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, // >';.....renderTa
98, 115, 40, 41, 59, 10, 9, 9, 9, 114, 101, 110, 100, 101, 114, 72, // bs();....renderH
101, 97, 100, 101, 114, 115, 40, 41, 59, 10, 9, 9, 9, 114, 101, 110, // eaders();....ren
100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 10, 9, 9, 9, // derTable();.....
118, 97, 114, 32, 115, 101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 32, // var searchInput
61, 32, 100, 111, 99, 117, 109, 101, 110, 116, 46, 103, 101, 116, 69, 108, // = document.getEl
101, 109, 101, 110, 116, 66, 121, 73, 100, 40, 39, 100, 99, 45, 115, 101, // ementById('dc-se
97, 114, 99, 104, 39, 41, 59, 10, 9, 9, 9, 105, 102, 32, 40, 115, // arch');....if (s
101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 41, 32, 123, 10, 9, 9, // earchInput) {...
9, 9, 115, 101, 97, 114, 99, 104, 73, 110, 112, 117, 116, 46, 111, 110, // ..searchInput.on
105, 110, 112, 117, 116, 32, 61, 32, 102, 117, 110, 99, 116, 105, 111, 110, // input = function
40, 41, 32, 123, 10, 9, 9, 9, 9, 9, 115, 101, 97, 114, 99, 104, // () {......search
84, 101, 120, 116, 32, 61, 32, 116, 104, 105, 115, 46, 118, 97, 108, 117, // Text = this.valu
101, 59, 10, 9, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 72, 101, // e;......renderHe
97, 100, 101, 114, 115, 40, 41, 59, 10, 9, 9, 9, 9, 9, 114, 101, // aders();......re
110, 100, 101, 114, 84, 97, 98, 108, 101, 40, 41, 59, 10, 9, 9, 9, // nderTable();....
9, 125, 59, 10, 9, 9, 9, 125, 10, 10, 9, 9, 9, 118, 97, 114, // .};....}.....var
32, 97, 100, 100, 66, 116, 110, 32, 61, 32, 100, 111, 99, 117, 109, 101, // addBtn = docume
110, 116, 46, 103, 101, 116, 69, 108, 101, 109, 101, 110, 116, 66, 121, 73, // nt.getElementByI
100, 40, 39, 100, 99, 45, 98, 116, 110, 45, 97, 100, 100, 39, 41, 59, // d('dc-btn-add');
10, 9, 9, 9, 105, 102, 32, 40, 97, 100, 100, 66, 116, 110, 41, 32, // ....if (addBtn)
97, 100, 100, 66, 116, 110, 46, 111, 110, 99, 108, 105, 99, 107, 32, 61, // addBtn.onclick =
32, 100, 111, 65, 100, 100, 83, 101, 108, 101, 99, 116, 101, 100, 59, 10, // doAddSelected;.
9, 9, 125, 44, 10, 10, 9, 9, 111, 110, 69, 110, 116, 101, 114, 58, // ..},....onEnter:
32, 102, 117, 110, 99, 116, 105, 111, 110, 40, 41, 32, 123, 125, 44, 10, // function() {},.
10, 9, 9, 111, 110, 76, 101, 97, 118, 101, 58, 32, 102, 117, 110, 99, // ...onLeave: func
116, 105, 111, 110, 40, 41, 32, 123, 10, 9, 9, 9, 97, 108, 108, 68, // tion() {....allD
97, 116, 97, 32, 61, 32, 123, 125, 59, 10, 9, 9, 9, 115, 101, 108, // ata = {};....sel
101, 99, 116, 101, 100, 83, 101, 116, 32, 61, 32, 123, 125, 59, 10, 9, // ectedSet = {};..
9, 125, 44, 10, 10, 9, 9, 111, 110, 68, 97, 116, 97, 58, 32, 102, // .},....onData: f
117, 110, 99, 116, 105, 111, 110, 40, 100, 97, 116, 97, 41, 32, 123, 10, // unction(data) {.
9, 9, 9, 105, 102, 32, 40, 33, 100, 97, 116, 97, 32, 124, 124, 32, // ...if (!data ||
116, 121, 112, 101, 111, 102, 32, 100, 97, 116, 97, 32, 33, 61, 61, 32, // typeof data !==
39, 111, 98, 106, 101, 99, 116, 39, 41, 32, 114, 101, 116, 117, 114, 110, // 'object') return
59, 10, 9, 9, 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, // ;....if (data.ou
116, 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 111, 117, 116, 32, 61, // t) allData.out =
32, 100, 97, 116, 97, 46, 111, 117, 116, 59, 10, 9, 9, 9, 105, 102, // data.out;....if
32, 40, 100, 97, 116, 97, 46, 105, 110, 41, 32, 97, 108, 108, 68, 97, // (data.in) allDa
116, 97, 46, 105, 110, 32, 61, 32, 100, 97, 116, 97, 46, 105, 110, 59, // ta.in = data.in;
10, 9, 9, 9, 105, 102, 32, 40, 100, 97, 116, 97, 46, 121, 107, 41, // ....if (data.yk)
32, 97, 108, 108, 68, 97, 116, 97, 46, 121, 107, 32, 61, 32, 100, 97, // allData.yk = da 32, 97, 108, 108, 68, 97, 116, 97, 46, 121, 107, 32, 61, 32, 100, 97, // allData.yk = da
116, 97, 46, 121, 107, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, // ta.yk;. 116, 97, 46, 121, 107, 59, 10, 9, 9, 9, 105, 102, 32, 40, 100, 97, // ta.yk;....if (da
32, 32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 97, 111, 41, 32, // if (data.ao) 116, 97, 46, 97, 111, 41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 97, // ta.ao) allData.a
97, 108, 108, 68, 97, 116, 97, 46, 97, 111, 32, 61, 32, 100, 97, 116, // allData.ao = dat 111, 32, 61, 32, 100, 97, 116, 97, 46, 97, 111, 59, 10, 9, 9, 9, // o = data.ao;....
97, 46, 97, 111, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, // a.ao;. 105, 102, 32, 40, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 41, 32, // if (data.param)
32, 32, 105, 102, 32, 40, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, // if (data.param 97, 108, 108, 68, 97, 116, 97, 46, 112, 97, 114, 97, 109, 32, 61, 32, // allData.param =
41, 32, 97, 108, 108, 68, 97, 116, 97, 46, 112, 97, 114, 97, 109, 32, // ) allData.param 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 59, 10, 9, 9, 9, 105, // data.param;....i
61, 32, 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 59, 10, 32, 32, // = data.param;. 102, 32, 40, 100, 97, 116, 97, 46, 111, 117, 116, 32, 124, 124, 32, 100, // f (data.out || d
32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 105, 102, 32, 40, 100, 97, // if (da 97, 116, 97, 46, 105, 110, 32, 124, 124, 32, 100, 97, 116, 97, 46, 121, // ata.in || data.y
116, 97, 46, 111, 117, 116, 32, 124, 124, 32, 100, 97, 116, 97, 46, 105, // ta.out || data.i 107, 32, 124, 124, 32, 100, 97, 116, 97, 46, 97, 111, 32, 124, 124, 32, // k || data.ao ||
110, 32, 124, 124, 32, 100, 97, 116, 97, 46, 121, 107, 32, 124, 124, 32, // n || data.yk || 100, 97, 116, 97, 46, 112, 97, 114, 97, 109, 41, 32, 123, 10, 9, 9, // data.param) {...
100, 97, 116, 97, 46, 97, 111, 32, 124, 124, 32, 100, 97, 116, 97, 46, // data.ao || data. 9, 9, 114, 101, 110, 100, 101, 114, 72, 101, 97, 100, 101, 114, 115, 40, // ..renderHeaders(
112, 97, 114, 97, 109, 41, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, // param) {. 41, 59, 10, 9, 9, 9, 9, 114, 101, 110, 100, 101, 114, 84, 97, 98, // );.....renderTab
32, 32, 32, 32, 32, 32, 32, 32, 32, 114, 101, 110, 100, 101, 114, 84, // renderT 108, 101, 40, 41, 59, 10, 9, 9, 9, 9, 117, 112, 100, 97, 116, 101, // le();.....update
97, 98, 108, 101, 40, 41, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, // able();. 83, 101, 108, 101, 99, 116, 105, 111, 110, 66, 97, 114, 40, 41, 59, 10, // SelectionBar();.
32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, // }. }. 9, 9, 9, 125, 10, 9, 9, 125, 10, 9, 125, 59, 10, 125, 41, 40, // ...}...}..};.})(
32, 32, 32, 32, 125, 59, 10, 125, 41, 40, 41, 59, 10, 0 // };.})();. 41, 59, 10, 10, 0 // );..
}; };
static const unsigned char v8[] = { static const unsigned char v8[] = {
47, 42, 42, 10, 32, 42, 32, 119, 115, 45, 99, 108, 105, 101, 110, 116, // /**. * ws-client 47, 42, 42, 10, 32, 42, 32, 119, 115, 45, 99, 108, 105, 101, 110, 116, // /**. * ws-client
@ -4860,11 +5072,11 @@ static const unsigned char v8[] = {
}; };
const struct mg_mem_file mg_packed_files[] = { const struct mg_mem_file mg_packed_files[] = {
{"/css/style.css", v3, sizeof(v3) - 1, 1782283693}, {"/css/style.css", v3, sizeof(v3) - 1, 1782465409},
{"/index.html", v4, sizeof(v4) - 1, 1781250466}, {"/index.html", v4, sizeof(v4) - 1, 1782440107},
{"/js/app.js", v5, sizeof(v5) - 1, 1782283151}, {"/js/app.js", v5, sizeof(v5) - 1, 1782440107},
{"/js/monitor.js", v6, sizeof(v6) - 1, 1781250466}, {"/js/monitor.js", v6, sizeof(v6) - 1, 1782440107},
{"/js/pages.js", v7, sizeof(v7) - 1, 1782284424}, {"/js/pages.js", v7, sizeof(v7) - 1, 1782466738},
{"/js/ws-client.js", v8, sizeof(v8) - 1, 1781746272}, {"/js/ws-client.js", v8, sizeof(v8) - 1, 1782440107},
{NULL, NULL, 0, 0} {NULL, NULL, 0, 0}
}; };

View File

@ -694,3 +694,47 @@ body.login-page #main-content { margin-left: 0; display: flex; align-items: cent
color: var(--text-muted); color: var(--text-muted);
margin-left: auto; margin-left: auto;
} }
/* === 数据中心 选择添加栏 === */
.dc-sel-bar {
background: #e8f5e9;
border: 1px solid #a5d6a7;
border-radius: var(--radius);
padding: 10px 20px;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 4px;
flex-wrap: wrap;
animation: dcSlideDown 0.2s ease-out;
}
@keyframes dcSlideDown {
from { opacity: 0; transform: translateY(-6px); }
to { opacity: 1; transform: translateY(0); }
}
.dc-sel-label {
font-size: 14px;
font-weight: 600;
color: #2e7d32;
}
.dc-sel-bar label {
font-size: 13px;
color: var(--text-secondary);
}
.dc-sel-bar select {
padding: 4px 8px;
border: 1px solid var(--border);
border-radius: 4px;
font-size: 13px;
background: #fff;
}
.dc-sel-bar .btn {
padding: 6px 16px;
font-size: 13px;
}
#dc-cb-all, .dc-cb-row {
width: 16px;
height: 16px;
cursor: pointer;
accent-color: var(--primary);
}

View File

@ -981,134 +981,248 @@ var TerminalPage = (function() {
* 数据中心页面 * 数据中心页面
* ======================================================================== */ * ======================================================================== */
var DatacenterPage = (function() { var DatacenterPage = (function() {
var allData = {}; var allData = {};
var activeTab = 'out'; var activeTab = 'out';
var searchText = ''; var searchText = '';
var selectedSet = {}; // {saddr: true}
var COLUMNS = ['id', 'saddr', 'desc', '数据类型', 'ctrl_type', 'link_saddrs']; var COLUMNS = ['', 'id', 'saddr', 'desc', '数据类型', 'ctrl_type', 'link_saddrs'];
function renderTable() { function getVisibleData() {
var data = allData[activeTab] || []; var data = allData[activeTab] || [];
var tbody = document.getElementById('dc-tbody'); if (!searchText) return data;
if (!tbody) return; var st = searchText.toLowerCase();
return data.filter(function(item) {
return (item.saddr && item.saddr.toLowerCase().indexOf(st) !== -1)
|| (item.desc && item.desc.toLowerCase().indexOf(st) !== -1);
});
}
if (data.length === 0) { function onSelectAll() {
tbody.innerHTML = '<tr class="empty-row"><td colspan="6">暂无数据</td></tr>'; var visible = getVisibleData();
document.getElementById('dc-count').textContent = '0'; var cb = document.getElementById('dc-cb-all');
return; if (cb && cb.checked && visible.length > 0) {
} for (var i = 0; i < visible.length; i++) {
selectedSet[visible[i].saddr] = true;
}
} else {
for (var i = 0; i < visible.length; i++) {
delete selectedSet[visible[i].saddr];
}
}
renderTable();
updateSelectionBar();
}
var rows = data; function onToggleRow(saddr) {
if (searchText) { if (selectedSet[saddr]) {
var st = searchText.toLowerCase(); delete selectedSet[saddr];
rows = data.filter(function(item) { } else {
return (item.saddr && item.saddr.toLowerCase().indexOf(st) !== -1) selectedSet[saddr] = true;
|| (item.desc && item.desc.toLowerCase().indexOf(st) !== -1); }
}); renderTable();
} updateSelectionBar();
document.getElementById('dc-count').textContent = rows.length + ' / ' + data.length; }
if (rows.length === 0) { function getSelectedCount() {
tbody.innerHTML = '<tr class="empty-row"><td colspan="6">无匹配结果</td></tr>'; var count = 0;
return; for (var k in selectedSet) {
} if (selectedSet.hasOwnProperty(k)) count++;
}
return count;
}
var html = ''; function getSelectedItems() {
for (var i = 0; i < rows.length; i++) { var result = [];
var item = rows[i]; var fullData = allData[activeTab] || [];
html += '<tr>' for (var i = 0; i < fullData.length; i++) {
+ '<td>' + fmtVal(item.id) + '</td>' if (selectedSet[fullData[i].saddr]) {
+ '<td>' + fmtVal(item.saddr) + '</td>' result.push(fullData[i]);
+ '<td>' + fmtVal(item.desc) + '</td>' }
+ '<td>' + fmtVal(item.type) + '</td>' }
+ '<td>' + fmtVal(CTRL_TYPE_MAP[item.ctrl_type] || item.ctrl_type) + '</td>' return result;
+ '<td style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="' + fmtVal(item.link_saddrs) + '">' + fmtVal(item.link_saddrs) + '</td>' }
+ '</tr>';
}
tbody.innerHTML = html;
}
function renderHeaders() { function updateSelectionBar() {
var thead = document.getElementById('dc-thead'); var bar = document.getElementById('dc-sel-bar');
if (!thead) return; if (!bar) return;
var html = ''; var count = getSelectedCount();
for (var i = 0; i < COLUMNS.length; i++) { if (count === 0) {
html += '<th>' + COLUMNS[i] + '</th>'; bar.style.display = 'none';
} } else {
thead.innerHTML = html; bar.style.display = 'flex';
} bar.querySelector('.dc-sel-label').textContent = '已选 ' + count + ' 个信号';
}
}
function renderTabs() { function doAddSelected() {
var types = ['out', 'in', 'yk', 'ao', 'param']; var items = getSelectedItems();
var labels = { out: '注册 (out)', in: '链接注册 (in)', yk: '遥控 (yk)', ao: '参数 (ao)', param: '定值 (param)' }; if (items.length === 0) {
var el = document.getElementById('dc-tab-bar'); alert('请先勾选要添加的信号');
if (!el) return; return;
var html = ''; }
for (var i = 0; i < types.length; i++) {
var t = types[i];
var cls = t === activeTab ? 'dc-tab active' : 'dc-tab';
html += '<span class="' + cls + '" data-tab="' + t + '">' + labels[t] + '</span>';
}
el.innerHTML = html;
var tabs = el.querySelectorAll('.dc-tab');
for (var k = 0; k < tabs.length; k++) {
tabs[k].onclick = function() {
activeTab = this.getAttribute('data-tab');
searchText = '';
document.getElementById('dc-search').value = '';
renderTabs();
renderHeaders();
renderTable();
};
}
}
return { var typeLabels = { out:'注册', in:'链接注册', yk:'遥控', ao:'参数', param:'定值' };
render: function(container) { var label = typeLabels[activeTab] || activeTab;
allData = {};
activeTab = 'out';
searchText = '';
container.innerHTML = ''
+ '<div class="page-header"><h2>数据中心</h2><p>查看所有信号数据,按类型分表,支持搜索</p></div>'
+ '<div class="datacenter-toolbar">'
+ '<div class="dc-tab-bar" id="dc-tab-bar"></div>'
+ '<input type="text" class="dc-search" id="dc-search" placeholder="搜索 saddr 或 desc...">'
+ '<span class="dc-count" id="dc-count">0</span>'
+ '</div>'
+ '<div class="table-card"><div class="table-wrapper">'
+ '<table class="signal-table"><thead><tr id="dc-thead"></tr></thead><tbody id="dc-tbody"></tbody></table>'
+ '</div></div>';
renderTabs(); if (!confirm('确定将 ' + items.length + ' 个信号添加到 ' + label + '')) return;
renderHeaders();
renderTable();
var searchInput = document.getElementById('dc-search'); var succ = 0;
if (searchInput) { for (var i = 0; i < items.length; i++) {
searchInput.oninput = function() { var ok = WsClient.send({
searchText = this.value; saddr: items[i].saddr,
renderTable(); signal_type: activeTab,
}; curd: 'add',
} setting_zone: '0',
}, signal_data: ''
});
if (ok) succ++;
}
alert('已发送 ' + succ + '/' + items.length + ' 个 add 请求到 ' + label);
}
onEnter: function() { function renderHeaders() {
}, var thead = document.getElementById('dc-thead');
if (!thead) return;
var visible = getVisibleData();
var allChecked = visible.length > 0;
for (var i = 0; i < visible.length && allChecked; i++) {
if (!selectedSet[visible[i].saddr]) allChecked = false;
}
var html = '<th style="width:36px"><input type="checkbox" id="dc-cb-all"' + (allChecked ? ' checked' : '') + '></th>';
for (var j = 1; j < COLUMNS.length; j++) {
html += '<th>' + COLUMNS[j] + '</th>';
}
thead.innerHTML = html;
onLeave: function() { var cbAll = document.getElementById('dc-cb-all');
allData = {}; if (cbAll) cbAll.onchange = onSelectAll;
}, }
onData: function(data) { function renderTable() {
if (!data || typeof data !== 'object') return; var data = getVisibleData();
if (data.out) allData.out = data.out; var tbody = document.getElementById('dc-tbody');
if (data.in) allData.in = data.in; if (!tbody) return;
if (data.yk) allData.yk = data.yk;
if (data.ao) allData.ao = data.ao; var fullData = allData[activeTab] || [];
if (data.param) allData.param = data.param; document.getElementById('dc-count').textContent = data.length + ' / ' + fullData.length;
if (data.out || data.in || data.yk || data.ao || data.param) {
renderTable(); if (data.length === 0) {
} tbody.innerHTML = '<tr class="empty-row"><td colspan="' + COLUMNS.length + '">暂无数据</td></tr>';
} return;
}; }
var html = '';
for (var i = 0; i < data.length; i++) {
var item = data[i];
var checked = !!selectedSet[item.saddr];
html += '<tr>'
+ '<td><input type="checkbox" class="dc-cb-row"' + (checked ? ' checked' : '') + ' data-saddr="' + fmtVal(item.saddr) + '"></td>'
+ '<td>' + fmtVal(item.id) + '</td>'
+ '<td>' + fmtVal(item.saddr) + '</td>'
+ '<td>' + fmtVal(item.desc) + '</td>'
+ '<td>' + fmtVal(item.type) + '</td>'
+ '<td>' + fmtVal(CTRL_TYPE_MAP[item.ctrl_type] || item.ctrl_type) + '</td>'
+ '<td style="max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="' + fmtVal(item.link_saddrs) + '">' + fmtVal(item.link_saddrs) + '</td>'
+ '</tr>';
}
tbody.innerHTML = html;
// 绑定行复选框事件
var cbs = tbody.querySelectorAll('.dc-cb-row');
for (var k = 0; k < cbs.length; k++) {
cbs[k].onclick = function(e) {
e.stopPropagation();
onToggleRow(this.getAttribute('data-saddr'));
};
}
}
function renderTabs() {
var types = ['out', 'in', 'yk', 'ao', 'param'];
var labels = { out: '注册 (out)', in: '链接注册 (in)', yk: '遥控 (yk)', ao: '参数 (ao)', param: '定值 (param)' };
var el = document.getElementById('dc-tab-bar');
if (!el) return;
var html = '';
for (var i = 0; i < types.length; i++) {
var t = types[i];
var cls = t === activeTab ? 'dc-tab active' : 'dc-tab';
html += '<span class="' + cls + '" data-tab="' + t + '">' + labels[t] + '</span>';
}
el.innerHTML = html;
var tabs = el.querySelectorAll('.dc-tab');
for (var k = 0; k < tabs.length; k++) {
tabs[k].onclick = function() {
activeTab = this.getAttribute('data-tab');
searchText = '';
selectedSet = {};
document.getElementById('dc-search').value = '';
renderTabs();
renderHeaders();
renderTable();
updateSelectionBar();
};
}
}
return {
render: function(container) {
allData = {};
activeTab = 'out';
searchText = '';
selectedSet = {};
container.innerHTML = ''
+ '<div class="page-header"><h2>数据中心</h2><p>勾选信号后点击"添加到"即可添加至对应配置页 | 查看所有信号数据,按类型分表,支持搜索</p></div>'
+ '<div class="datacenter-toolbar">'
+ '<div class="dc-tab-bar" id="dc-tab-bar"></div>'
+ '<input type="text" class="dc-search" id="dc-search" placeholder="搜索 saddr 或 desc...">'
+ '<span class="dc-count" id="dc-count">0</span>'
+ '</div>'
+ '<div class="dc-sel-bar" id="dc-sel-bar" style="display:none">'
+ '<span class="dc-sel-label">已选 0 个信号</span>'
+ '<button class="btn btn-primary" id="dc-btn-add" style="margin-left:16px">添加到配置页</button>'
+ '</div>'
+ '<div class="table-card"><div class="table-wrapper">'
+ '<table class="signal-table"><thead><tr id="dc-thead"></tr></thead><tbody id="dc-tbody"></tbody></table>'
+ '</div></div>';
renderTabs();
renderHeaders();
renderTable();
var searchInput = document.getElementById('dc-search');
if (searchInput) {
searchInput.oninput = function() {
searchText = this.value;
renderHeaders();
renderTable();
};
}
var addBtn = document.getElementById('dc-btn-add');
if (addBtn) addBtn.onclick = doAddSelected;
},
onEnter: function() {},
onLeave: function() {
allData = {};
selectedSet = {};
},
onData: function(data) {
if (!data || typeof data !== 'object') return;
if (data.out) allData.out = data.out;
if (data.in) allData.in = data.in;
if (data.yk) allData.yk = data.yk;
if (data.ao) allData.ao = data.ao;
if (data.param) allData.param = data.param;
if (data.out || data.in || data.yk || data.ao || data.param) {
renderHeaders();
renderTable();
updateSelectionBar();
}
}
};
})(); })();