@feng3d/ctc 0.0.19 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/admin-server.d.ts +6 -0
  2. package/dist/admin-server.d.ts.map +1 -1
  3. package/dist/admin-server.js +19 -0
  4. package/dist/admin-server.js.map +1 -1
  5. package/dist/app.d.ts +17 -0
  6. package/dist/app.d.ts.map +1 -0
  7. package/dist/app.js +97 -0
  8. package/dist/app.js.map +1 -0
  9. package/dist/cli.d.ts +1 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +152 -253
  12. package/dist/cli.js.map +1 -1
  13. package/dist/config.d.ts +1 -5
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +0 -8
  16. package/dist/config.js.map +1 -1
  17. package/dist/controller.d.ts.map +1 -1
  18. package/dist/controller.js +8 -0
  19. package/dist/controller.js.map +1 -1
  20. package/dist/daemon-entry.d.ts +8 -0
  21. package/dist/daemon-entry.d.ts.map +1 -0
  22. package/dist/daemon-entry.js +15 -0
  23. package/dist/daemon-entry.js.map +1 -0
  24. package/dist/daemon.d.ts +32 -0
  25. package/dist/daemon.d.ts.map +1 -0
  26. package/dist/daemon.js +370 -0
  27. package/dist/daemon.js.map +1 -0
  28. package/dist/forward-proxy.js +1 -1
  29. package/dist/forward-proxy.js.map +1 -1
  30. package/dist/index.d.ts +16 -14
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +14 -326
  33. package/dist/index.js.map +1 -1
  34. package/dist/ipc-handler.d.ts +76 -4
  35. package/dist/ipc-handler.d.ts.map +1 -1
  36. package/dist/ipc-handler.js +221 -26
  37. package/dist/ipc-handler.js.map +1 -1
  38. package/dist/process-utils.d.ts +31 -0
  39. package/dist/process-utils.d.ts.map +1 -0
  40. package/dist/process-utils.js +87 -0
  41. package/dist/process-utils.js.map +1 -0
  42. package/dist/proxy-manager.d.ts.map +1 -1
  43. package/dist/proxy-manager.js +45 -0
  44. package/dist/proxy-manager.js.map +1 -1
  45. package/package.json +7 -3
package/dist/index.js CHANGED
@@ -1,339 +1,27 @@
1
1
  /**
2
2
  * @module @feng3d/ctc
3
3
  *
4
- * 穿透(Chuantou)内网穿透客户端主入口模块。
4
+ * 穿透(Chuantou)内网穿透客户端库。
5
5
  *
6
- * 该模块提供了客户端的核心功能导出和独立运行入口。
7
- * 作为库使用时,可以导入 {@link Config}、{@link Controller}、{@link ProxyManager} 等核心类;
8
- * 作为独立程序运行时,会自动加载配置、连接服务器并注册代理隧道。
9
- */
10
- import { Config } from './config.js';
11
- import { Controller } from './controller.js';
12
- import { ProxyManager } from './proxy-manager.js';
13
- import { AdminServer } from './admin-server.js';
14
- import { IpcHandler } from './ipc-handler.js';
15
- import { logger } from '@feng3d/chuantou-shared';
16
- import { join } from 'path';
17
- import { homedir } from 'os';
18
- import { ForwardProxy } from './forward-proxy.js';
19
- import { writeFile, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'fs';
20
- /** 客户端目录 */
21
- const CLIENT_DIR = join(homedir(), '.chuantou', 'client');
22
- /** PID 文件 */
23
- const PID_FILE = join(CLIENT_DIR, 'client.pid');
24
- /**
25
- * 读取 PID 文件
26
- */
27
- function readPidFile() {
28
- try {
29
- return JSON.parse(readFileSync(PID_FILE, 'utf-8'));
30
- }
31
- catch {
32
- return null;
33
- }
34
- }
35
- /**
36
- * 写入 PID 文件
37
- */
38
- function writePidFile(info) {
39
- mkdirSync(CLIENT_DIR, { recursive: true });
40
- writeFileSync(PID_FILE, JSON.stringify(info, null, 2));
41
- }
42
- /**
43
- * 检查指定 PID 的进程是否存活
44
- */
45
- function isProcessAlive(pid) {
46
- try {
47
- process.kill(pid, 0); // 发送信号 0 检查进程是否存在
48
- return true;
49
- }
50
- catch {
51
- return false;
52
- }
53
- }
54
- /**
55
- * 单实例检查
56
- * @returns true 表示应该继续启动,false 表示已有实例在运行,应该退出
57
- */
58
- function checkSingleInstance(serverUrl, adminPort) {
59
- const info = readPidFile();
60
- if (!info) {
61
- // PID 文件不存在,创建新的
62
- writePidFile({
63
- pid: process.pid,
64
- serverUrl,
65
- adminPort,
66
- startedAt: Date.now(),
67
- });
68
- return true;
69
- }
70
- // 检查记录的进程是否存活
71
- if (isProcessAlive(info.pid)) {
72
- // 进程存活,检查是否是同一个配置
73
- if (info.serverUrl === serverUrl && info.adminPort === adminPort) {
74
- logger.log('客户端已在运行中,退出当前启动');
75
- logger.log(` 现有实例 PID: ${info.pid}`);
76
- logger.log(` 服务器: ${info.serverUrl}`);
77
- logger.log(` 管理页面: http://127.0.0.1:${info.adminPort}`);
78
- return false;
79
- }
80
- // 配置不同,记录警告但继续启动(覆盖旧实例)
81
- logger.warn(`检测到不同配置的实例 (PID: ${info.pid}),将替换为新配置`);
82
- }
83
- // 旧进程不存在或配置不同,更新 PID 文件
84
- writePidFile({
85
- pid: process.pid,
86
- serverUrl,
87
- adminPort,
88
- startedAt: Date.now(),
89
- });
90
- return true;
91
- }
92
- /**
93
- * 更新配置文件中的代理列表
6
+ * 提供客户端核心功能的纯库导出,可作为依赖引入使用。
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { Controller, ProxyManager } from '@feng3d/ctc';
11
+ *
12
+ * const controller = new Controller({
13
+ * serverUrl: 'ws://localhost:9000',
14
+ * token: 'your-token',
15
+ * });
16
+ * await controller.connect();
17
+ * ```
94
18
  */
95
- async function updateConfigProxies(proxies) {
96
- const config = await Config.load();
97
- config.proxies = proxies;
98
- const configPath = join(homedir(), '.chuantou', 'client', 'config.json');
99
- writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8', (err) => {
100
- if (err) {
101
- logger.error('更新配置文件失败:', err);
102
- }
103
- else {
104
- logger.log('配置文件已更新');
105
- }
106
- });
107
- }
108
19
  /**
109
- * 导出核心类和类型,供作为库使用时引用。
20
+ * 核心类导出
110
21
  */
111
22
  export { Config } from './config.js';
112
23
  export { Controller } from './controller.js';
113
24
  export { ProxyManager } from './proxy-manager.js';
114
- export { AdminServer } from './admin-server.js';
115
25
  export { UnifiedHandler } from './handlers/unified-handler.js';
116
- export { IpcHandler } from './ipc-handler.js';
117
26
  export { ForwardProxy } from './forward-proxy.js';
118
- /**
119
- * 客户端主入口函数(独立运行模式)。
120
- *
121
- * 执行以下步骤:
122
- * 1. 从配置文件或命令行参数加载配置
123
- * 2. 验证配置合法性
124
- * 3. 创建控制器并连接服务器
125
- * 4. 认证成功后注册所有代理隧道
126
- * 5. 启动本地 HTTP 管理页面服务器
127
- * 6. 监听进程信号实现优雅关闭
128
- *
129
- * @returns 无返回值的 Promise
130
- */
131
- async function main() {
132
- logger.log('正在启动穿透客户端...');
133
- // 加载配置(从用户目录 .chuantou/client.json 或命令行参数)
134
- const config = await Config.load();
135
- // 单实例检查:防止多个客户端实例同时运行
136
- if (!checkSingleInstance(config.serverUrl, config.adminPort)) {
137
- process.exit(0);
138
- }
139
- // 验证配置
140
- config.validate();
141
- logger.log('配置已加载:');
142
- logger.log(` 服务器地址: ${config.serverUrl}`);
143
- logger.log(` 代理数量: 已配置 ${config.proxies.length} 个`);
144
- for (const proxy of config.proxies) {
145
- logger.log(` - :${proxy.remotePort} -> ${proxy.localHost || 'localhost'}:${proxy.localPort}`);
146
- }
147
- // 记录启动时间
148
- const startTime = Date.now();
149
- // 创建控制器
150
- const controller = new Controller(config);
151
- // 创建代理管理器
152
- const proxyManager = new ProxyManager(controller);
153
- // 创建正向穿透代理
154
- const forwardProxy = new ForwardProxy(controller);
155
- // 已注册的代理配置列表(用于管理页面)
156
- const registeredProxies = [];
157
- let nextProxyIndex = 1;
158
- for (const p of config.proxies) {
159
- registeredProxies.push({ ...p, index: nextProxyIndex++ });
160
- }
161
- // 创建管理页面服务器
162
- const adminServerConfig = { port: config.adminPort, host: '127.0.0.1' };
163
- // 获取状态回调
164
- const getStatusCallback = () => {
165
- // 获取实际在 ProxyManager 中注册的端口
166
- const actualRegisteredPorts = proxyManager.getRegisteredPorts();
167
- // 返回所有配置的代理(去重),并标记注册状态
168
- const actualRegisteredProxies = registeredProxies
169
- .filter((p, index, self) => {
170
- // 去重:只保留第一次出现的端口
171
- return index === self.findIndex(other => other.remotePort === p.remotePort);
172
- })
173
- .map(p => ({ ...p, registered: actualRegisteredPorts.includes(p.remotePort) }));
174
- const status = {
175
- running: true,
176
- serverUrl: config.serverUrl,
177
- connected: controller.isConnected(),
178
- authenticated: controller.isAuthenticated(),
179
- uptime: Date.now() - startTime,
180
- proxies: actualRegisteredProxies,
181
- reconnectAttempts: controller.getReconnectAttempts(),
182
- };
183
- // 添加正向穿透相关信息
184
- try {
185
- const forwardProxies = forwardProxy.getProxies();
186
- status.forwardProxies = forwardProxies;
187
- status.isRegistered = true; // 假设已注册(实际应从 Controller 获取)
188
- status.clientId = controller.getClientId();
189
- }
190
- catch (e) {
191
- // 如果获取失败,返回基础状态
192
- }
193
- return status;
194
- };
195
- // 添加代理回调
196
- const addProxyCallback = async (proxy) => {
197
- await proxyManager.registerProxy(proxy);
198
- registeredProxies.push({ ...proxy, index: nextProxyIndex++ });
199
- // 同步更新配置文件
200
- await updateConfigProxies(registeredProxies.map(p => ({ remotePort: p.remotePort, localPort: p.localPort, localHost: p.localHost })));
201
- };
202
- // 删除代理回调
203
- const removeProxyCallback = async (remotePort) => {
204
- await proxyManager.unregisterProxy(remotePort);
205
- const index = registeredProxies.findIndex(p => p.remotePort === remotePort);
206
- if (index !== -1) {
207
- registeredProxies.splice(index, 1);
208
- }
209
- // 同步更新配置文件
210
- await updateConfigProxies(registeredProxies);
211
- };
212
- // 添加正向穿透回调
213
- const addForwardProxyCallback = async (entry) => {
214
- await forwardProxy.addProxy(entry);
215
- };
216
- // 删除正向穿透回调
217
- const removeForwardProxyCallback = async (localPort) => {
218
- await forwardProxy.removeProxy(localPort);
219
- };
220
- // 注册客户端回调
221
- const registerClientCallback = async (description) => {
222
- return await forwardProxy.registerAsClient(description);
223
- };
224
- // 获取客户端列表回调
225
- const getClientListCallback = async () => {
226
- return await forwardProxy.getClientList();
227
- };
228
- // 重连回调
229
- const reconnectCallback = async () => {
230
- logger.log('收到手动重连请求');
231
- // 先断开现有连接
232
- controller.disconnect();
233
- // 然后重新连接
234
- await controller.connect();
235
- };
236
- // 创建管理页面服务器
237
- const adminServer = new AdminServer(adminServerConfig, getStatusCallback, addProxyCallback, removeProxyCallback, addForwardProxyCallback, removeForwardProxyCallback, registerClientCallback, getClientListCallback, undefined, // sendMessage 会在后面设置
238
- reconnectCallback);
239
- // 设置发送消息回调(用于正向穿透向服务端发送消息)
240
- adminServer.setSendMessageCallback(async (message) => {
241
- return await controller.sendRequest(message);
242
- });
243
- // 监听控制器事件
244
- controller.on('connected', () => {
245
- logger.log('已连接到服务器');
246
- });
247
- controller.on('disconnected', () => {
248
- logger.log('已断开与服务器的连接');
249
- });
250
- controller.on('authenticated', async () => {
251
- logger.log('已认证,正在注册代理...');
252
- // 获取实际在 ProxyManager 中注册的端口
253
- const actualRegisteredPorts = proxyManager.getRegisteredPorts();
254
- // 注册所有代理(只注册尚未实际注册的)
255
- for (const proxyConfig of config.proxies) {
256
- if (actualRegisteredPorts.includes(proxyConfig.remotePort)) {
257
- logger.log(`代理 :${proxyConfig.remotePort} 已注册,跳过`);
258
- continue;
259
- }
260
- try {
261
- await proxyManager.registerProxy(proxyConfig);
262
- }
263
- catch (error) {
264
- const errorMessage = error instanceof Error ? error.message : String(error);
265
- logger.error(`注册代理失败: ${errorMessage}`);
266
- }
267
- }
268
- });
269
- // 设置 IPC 请求监听(用于处理 CLI 添加代理的请求)
270
- const ipcHandler = new IpcHandler({
271
- requestDir: join(homedir(), '.chuantou', 'proxy-requests'),
272
- controller,
273
- proxyManager,
274
- registeredProxies,
275
- });
276
- ipcHandler.start();
277
- // 启动管理页面服务器(立即启动,不等待认证)
278
- try {
279
- await adminServer.start();
280
- }
281
- catch (error) {
282
- logger.error('管理页面启动失败:', error);
283
- }
284
- // 优雅关闭
285
- const shutdown = async () => {
286
- ipcHandler.stop();
287
- logger.log('\n正在关闭...');
288
- await adminServer.stop();
289
- await proxyManager.destroy();
290
- controller.disconnect();
291
- // 清理 PID 文件(只有当前进程是 PID 文件中的进程时才清理)
292
- const pidInfo = readPidFile();
293
- if (pidInfo && pidInfo.pid === process.pid) {
294
- try {
295
- unlinkSync(PID_FILE);
296
- }
297
- catch {
298
- // ignore
299
- }
300
- }
301
- process.exit(0);
302
- };
303
- process.on('SIGINT', shutdown);
304
- process.on('SIGTERM', shutdown);
305
- // 未捕获异常处理 - 崩溃时记录退出码
306
- process.on('uncaughtException', (error) => {
307
- logger.error('未捕获异常:', error);
308
- // 写入非零退出码,让父进程知道是异常退出
309
- process.exit(1);
310
- });
311
- process.on('unhandledRejection', (reason, promise) => {
312
- logger.error('未处理的 Promise 拒绝:', reason);
313
- // 写入非零退出码
314
- process.exit(1);
315
- });
316
- // 连接到服务器(不会抛出连接失败的异常,会自动重连)
317
- await controller.connect();
318
- }
319
- // 检查是否作为主模块运行
320
- // 使用更简单的方式:通过检查是否直接运行此文件
321
- const isMainModule = process.argv[1] && process.argv[1].endsWith('index.js');
322
- if (isMainModule) {
323
- main().catch((error) => {
324
- logger.error('启动客户端失败:', error);
325
- // 注意:main() 内部已经处理了资源清理
326
- process.exit(1);
327
- });
328
- }
329
- /**
330
- * 导出运行函数供 CLI 使用。
331
- *
332
- * 该函数是 {@link main} 的公开包装,用于被 CLI 模块调用以启动客户端。
333
- *
334
- * @returns 无返回值的 Promise
335
- */
336
- export async function run() {
337
- return main();
338
- }
339
27
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;GAEG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -4,11 +4,41 @@
4
4
  * IPC 请求处理模块。
5
5
  *
6
6
  * 通过文件系统实现进程间通信(IPC),允许 CLI 向运行中的客户端进程
7
- * 发送添加代理请求。请求通过 JSON 文件传递,响应通过 .resp 文件返回。
7
+ * 发送管理请求。请求通过 JSON 文件传递,响应通过 .resp 文件返回。
8
+ *
9
+ * 支持的请求类型:
10
+ * - get-status: 获取客户端状态
11
+ * - add-proxy: 添加反向代理
12
+ * - remove-proxy: 删除反向代理
13
+ * - clear-proxies: 清除所有代理
14
+ * - forward-list: 正向穿透列表
15
+ * - forward-add: 添加正向穿透
16
+ * - forward-remove: 删除正向穿透
17
+ * - forward-clients: 在线客户端列表
18
+ * - forward-register: 注册为可发现客户端
8
19
  */
9
- import { ProxyConfig } from '@feng3d/chuantou-shared';
20
+ import { ProxyConfig, type ForwardProxyEntry } from '@feng3d/chuantou-shared';
10
21
  import { Controller } from './controller.js';
11
22
  import { ProxyManager } from './proxy-manager.js';
23
+ import { ForwardProxy } from './forward-proxy.js';
24
+ /**
25
+ * 客户端状态接口
26
+ */
27
+ export interface ClientStatus {
28
+ running: boolean;
29
+ serverUrl: string;
30
+ connected: boolean;
31
+ authenticated: boolean;
32
+ uptime: number;
33
+ proxies: Array<ProxyConfig & {
34
+ registered?: boolean;
35
+ index?: number;
36
+ }>;
37
+ reconnectAttempts: number;
38
+ forwardProxies?: ForwardProxyEntry[];
39
+ isRegistered?: boolean;
40
+ clientId?: string;
41
+ }
12
42
  /**
13
43
  * IPC 请求处理器,处理来自 CLI 的文件系统 IPC 请求。
14
44
  *
@@ -21,12 +51,18 @@ export declare class IpcHandler {
21
51
  private controller;
22
52
  private proxyManager;
23
53
  private registeredProxies;
54
+ private forwardProxy;
55
+ private getStatus;
56
+ private updateConfigProxies;
24
57
  private timer;
25
58
  constructor(options: {
26
59
  requestDir: string;
27
60
  controller: Controller;
28
61
  proxyManager: ProxyManager;
29
62
  registeredProxies: ProxyConfig[];
63
+ forwardProxy: ForwardProxy;
64
+ getStatus: () => ClientStatus;
65
+ updateConfigProxies: (proxies: ProxyConfig[]) => Promise<void>;
30
66
  });
31
67
  /**
32
68
  * 启动 IPC 请求监听,每 500ms 扫描一次请求目录。
@@ -42,11 +78,47 @@ export declare class IpcHandler {
42
78
  */
43
79
  checkRequests(): void;
44
80
  /**
45
- * 处理单个添加代理请求文件。
81
+ * 处理单个 IPC 请求文件。
46
82
  *
47
- * 读取请求文件 → 检查认证状态注册代理 → 写入响应文件。
83
+ * 读取请求文件 → 根据类型分发处理 → 写入响应文件。
48
84
  * 无论成功或失败,始终写入响应文件,确保 CLI 不会超时等待。
49
85
  */
50
86
  handleRequest(requestFilePath: string): Promise<void>;
87
+ /**
88
+ * 处理获取状态请求
89
+ */
90
+ private handleGetStatus;
91
+ /**
92
+ * 处理添加代理请求
93
+ */
94
+ private handleAddProxy;
95
+ /**
96
+ * 处理删除代理请求
97
+ */
98
+ private handleRemoveProxy;
99
+ /**
100
+ * 处理清除所有代理请求
101
+ */
102
+ private handleClearProxies;
103
+ /**
104
+ * 处理正向穿透列表请求
105
+ */
106
+ private handleForwardList;
107
+ /**
108
+ * 处理添加正向穿透请求
109
+ */
110
+ private handleForwardAdd;
111
+ /**
112
+ * 处理删除正向穿透请求
113
+ */
114
+ private handleForwardRemove;
115
+ /**
116
+ * 处理获取在线客户端列表请求
117
+ */
118
+ private handleForwardClients;
119
+ /**
120
+ * 处理注册为可发现客户端请求
121
+ */
122
+ private handleForwardRegister;
51
123
  }
52
124
  //# sourceMappingURL=ipc-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ipc-handler.d.ts","sourceRoot":"","sources":["../src/ipc-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAE,WAAW,EAAU,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,KAAK,CAA+B;gBAEhC,OAAO,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,UAAU,CAAC;QACvB,YAAY,EAAE,YAAY,CAAC;QAC3B,iBAAiB,EAAE,WAAW,EAAE,CAAC;KAClC;IAOD;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;;OAGG;IACH,aAAa,IAAI,IAAI;IAiBrB;;;;;OAKG;IACG,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAwC5D"}
1
+ {"version":3,"file":"ipc-handler.d.ts","sourceRoot":"","sources":["../src/ipc-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,OAAO,EAAE,WAAW,EAAU,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuCD;;;;;GAKG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,iBAAiB,CAAgB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,mBAAmB,CAA4C;IACvE,OAAO,CAAC,KAAK,CAA+B;gBAEhC,OAAO,EAAE;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,UAAU,CAAC;QACvB,YAAY,EAAE,YAAY,CAAC;QAC3B,iBAAiB,EAAE,WAAW,EAAE,CAAC;QACjC,YAAY,EAAE,YAAY,CAAC;QAC3B,SAAS,EAAE,MAAM,YAAY,CAAC;QAC9B,mBAAmB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAChE;IAUD;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;;OAGG;IACH,aAAa,IAAI,IAAI;IAuBrB;;;;;OAKG;IACG,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD3D;;OAEG;YACW,eAAe;IAO7B;;OAEG;YACW,cAAc;IAqB5B;;OAEG;YACW,iBAAiB;IAwB/B;;OAEG;YACW,kBAAkB;IAyBhC;;OAEG;YACW,iBAAiB;IAU/B;;OAEG;YACW,gBAAgB;IAiB9B;;OAEG;YACW,mBAAmB;IAajC;;OAEG;YACW,oBAAoB;IAelC;;OAEG;YACW,qBAAqB;CAcpC"}