@rxflow/manhattan 0.0.2 → 0.0.3
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.
- package/cjs/geometry/Line.d.ts +21 -0
- package/cjs/geometry/Line.d.ts.map +1 -0
- package/cjs/geometry/Line.js +88 -0
- package/cjs/geometry/Point.d.ts +49 -0
- package/cjs/geometry/Point.d.ts.map +1 -0
- package/cjs/geometry/Point.js +94 -0
- package/cjs/geometry/Rectangle.d.ts +41 -0
- package/cjs/geometry/Rectangle.d.ts.map +1 -0
- package/cjs/geometry/Rectangle.js +65 -0
- package/cjs/geometry/collision.d.ts +15 -0
- package/cjs/geometry/collision.d.ts.map +1 -0
- package/cjs/geometry/collision.js +81 -0
- package/cjs/geometry/index.d.ts +5 -0
- package/cjs/geometry/index.d.ts.map +1 -0
- package/cjs/geometry/index.js +45 -0
- package/cjs/getManHattanPath.d.ts +53 -0
- package/cjs/getManHattanPath.d.ts.map +1 -0
- package/cjs/getManHattanPath.js +449 -0
- package/cjs/index.d.ts +16 -0
- package/cjs/index.d.ts.map +1 -0
- package/cjs/index.js +117 -0
- package/cjs/obstacle/ObstacleMap.d.ts +66 -0
- package/cjs/obstacle/ObstacleMap.d.ts.map +1 -0
- package/cjs/obstacle/ObstacleMap.js +328 -0
- package/cjs/obstacle/QuadTree.d.ts +119 -0
- package/cjs/obstacle/QuadTree.d.ts.map +1 -0
- package/cjs/obstacle/QuadTree.js +334 -0
- package/cjs/obstacle/index.d.ts +2 -0
- package/cjs/obstacle/index.d.ts.map +1 -0
- package/cjs/obstacle/index.js +12 -0
- package/cjs/options/defaults.d.ts +16 -0
- package/cjs/options/defaults.d.ts.map +1 -0
- package/cjs/options/defaults.js +39 -0
- package/cjs/options/index.d.ts +4 -0
- package/cjs/options/index.d.ts.map +1 -0
- package/cjs/options/index.js +38 -0
- package/cjs/options/resolver.d.ts +10 -0
- package/cjs/options/resolver.d.ts.map +1 -0
- package/cjs/options/resolver.js +248 -0
- package/cjs/options/types.d.ts +210 -0
- package/cjs/options/types.d.ts.map +1 -0
- package/cjs/options/types.js +5 -0
- package/cjs/pathfinder/PathCache.d.ts +92 -0
- package/cjs/pathfinder/PathCache.d.ts.map +1 -0
- package/cjs/pathfinder/PathCache.js +249 -0
- package/cjs/pathfinder/SortedSet.d.ts +35 -0
- package/cjs/pathfinder/SortedSet.d.ts.map +1 -0
- package/cjs/pathfinder/SortedSet.js +95 -0
- package/cjs/pathfinder/findRoute.d.ts +8 -0
- package/cjs/pathfinder/findRoute.d.ts.map +1 -0
- package/cjs/pathfinder/findRoute.js +395 -0
- package/cjs/pathfinder/index.d.ts +4 -0
- package/cjs/pathfinder/index.d.ts.map +1 -0
- package/cjs/pathfinder/index.js +44 -0
- package/cjs/svg/index.d.ts +3 -0
- package/cjs/svg/index.d.ts.map +1 -0
- package/cjs/svg/index.js +31 -0
- package/cjs/svg/pathConverter.d.ts +23 -0
- package/cjs/svg/pathConverter.d.ts.map +1 -0
- package/cjs/svg/pathConverter.js +285 -0
- package/cjs/svg/pathParser.d.ts +11 -0
- package/cjs/svg/pathParser.d.ts.map +1 -0
- package/cjs/svg/pathParser.js +76 -0
- package/cjs/utils/AdaptiveStepCalculator.d.ts +90 -0
- package/cjs/utils/AdaptiveStepCalculator.d.ts.map +1 -0
- package/cjs/utils/AdaptiveStepCalculator.js +224 -0
- package/cjs/utils/ErrorRecovery.d.ts +182 -0
- package/cjs/utils/ErrorRecovery.d.ts.map +1 -0
- package/cjs/utils/ErrorRecovery.js +413 -0
- package/cjs/utils/GlobalGrid.d.ts +99 -0
- package/cjs/utils/GlobalGrid.d.ts.map +1 -0
- package/cjs/utils/GlobalGrid.js +224 -0
- package/cjs/utils/PerformanceMonitor.d.ts +139 -0
- package/cjs/utils/PerformanceMonitor.d.ts.map +1 -0
- package/cjs/utils/PerformanceMonitor.js +305 -0
- package/cjs/utils/direction.d.ts +24 -0
- package/cjs/utils/direction.d.ts.map +1 -0
- package/cjs/utils/direction.js +54 -0
- package/cjs/utils/getAnchorPoints.d.ts +15 -0
- package/cjs/utils/getAnchorPoints.d.ts.map +1 -0
- package/cjs/utils/getAnchorPoints.js +71 -0
- package/cjs/utils/grid.d.ts +42 -0
- package/cjs/utils/grid.d.ts.map +1 -0
- package/cjs/utils/grid.js +73 -0
- package/cjs/utils/heuristics.d.ts +61 -0
- package/cjs/utils/heuristics.d.ts.map +1 -0
- package/cjs/utils/heuristics.js +141 -0
- package/cjs/utils/index.d.ts +14 -0
- package/cjs/utils/index.d.ts.map +1 -0
- package/cjs/utils/index.js +148 -0
- package/cjs/utils/node.d.ts +27 -0
- package/cjs/utils/node.d.ts.map +1 -0
- package/cjs/utils/node.js +36 -0
- package/cjs/utils/pathProcessing.d.ts +45 -0
- package/cjs/utils/pathProcessing.d.ts.map +1 -0
- package/cjs/utils/pathProcessing.js +270 -0
- package/cjs/utils/pathValidation.d.ts +11 -0
- package/cjs/utils/pathValidation.d.ts.map +1 -0
- package/cjs/utils/pathValidation.js +129 -0
- package/cjs/utils/rect.d.ts +9 -0
- package/cjs/utils/rect.d.ts.map +1 -0
- package/cjs/utils/rect.js +110 -0
- package/cjs/utils/route.d.ts +19 -0
- package/cjs/utils/route.d.ts.map +1 -0
- package/cjs/utils/route.js +92 -0
- package/esm/geometry/Line.d.ts +21 -0
- package/esm/geometry/Line.d.ts.map +1 -0
- package/esm/geometry/Point.d.ts +49 -0
- package/esm/geometry/Point.d.ts.map +1 -0
- package/esm/geometry/Rectangle.d.ts +41 -0
- package/esm/geometry/Rectangle.d.ts.map +1 -0
- package/esm/geometry/collision.d.ts +15 -0
- package/esm/geometry/collision.d.ts.map +1 -0
- package/esm/geometry/index.d.ts +5 -0
- package/esm/geometry/index.d.ts.map +1 -0
- package/esm/getManHattanPath.d.ts +53 -0
- package/esm/getManHattanPath.d.ts.map +1 -0
- package/esm/index.d.ts +16 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/obstacle/ObstacleMap.d.ts +66 -0
- package/esm/obstacle/ObstacleMap.d.ts.map +1 -0
- package/esm/obstacle/QuadTree.d.ts +119 -0
- package/esm/obstacle/QuadTree.d.ts.map +1 -0
- package/esm/obstacle/index.d.ts +2 -0
- package/esm/obstacle/index.d.ts.map +1 -0
- package/esm/options/defaults.d.ts +16 -0
- package/esm/options/defaults.d.ts.map +1 -0
- package/esm/options/index.d.ts +4 -0
- package/esm/options/index.d.ts.map +1 -0
- package/esm/options/resolver.d.ts +10 -0
- package/esm/options/resolver.d.ts.map +1 -0
- package/esm/options/types.d.ts +210 -0
- package/esm/options/types.d.ts.map +1 -0
- package/esm/pathfinder/PathCache.d.ts +92 -0
- package/esm/pathfinder/PathCache.d.ts.map +1 -0
- package/esm/pathfinder/SortedSet.d.ts +35 -0
- package/esm/pathfinder/SortedSet.d.ts.map +1 -0
- package/esm/pathfinder/findRoute.d.ts +8 -0
- package/esm/pathfinder/findRoute.d.ts.map +1 -0
- package/esm/pathfinder/index.d.ts +4 -0
- package/esm/pathfinder/index.d.ts.map +1 -0
- package/esm/svg/index.d.ts +3 -0
- package/esm/svg/index.d.ts.map +1 -0
- package/esm/svg/pathConverter.d.ts +23 -0
- package/esm/svg/pathConverter.d.ts.map +1 -0
- package/esm/svg/pathParser.d.ts +11 -0
- package/esm/svg/pathParser.d.ts.map +1 -0
- package/esm/utils/AdaptiveStepCalculator.d.ts +90 -0
- package/esm/utils/AdaptiveStepCalculator.d.ts.map +1 -0
- package/esm/utils/ErrorRecovery.d.ts +182 -0
- package/esm/utils/ErrorRecovery.d.ts.map +1 -0
- package/esm/utils/GlobalGrid.d.ts +99 -0
- package/esm/utils/GlobalGrid.d.ts.map +1 -0
- package/esm/utils/PerformanceMonitor.d.ts +139 -0
- package/esm/utils/PerformanceMonitor.d.ts.map +1 -0
- package/esm/utils/direction.d.ts +24 -0
- package/esm/utils/direction.d.ts.map +1 -0
- package/esm/utils/getAnchorPoints.d.ts +15 -0
- package/esm/utils/getAnchorPoints.d.ts.map +1 -0
- package/esm/utils/grid.d.ts +42 -0
- package/esm/utils/grid.d.ts.map +1 -0
- package/esm/utils/heuristics.d.ts +61 -0
- package/esm/utils/heuristics.d.ts.map +1 -0
- package/esm/utils/index.d.ts +14 -0
- package/esm/utils/index.d.ts.map +1 -0
- package/esm/utils/node.d.ts +27 -0
- package/esm/utils/node.d.ts.map +1 -0
- package/esm/utils/pathProcessing.d.ts +45 -0
- package/esm/utils/pathProcessing.d.ts.map +1 -0
- package/esm/utils/pathValidation.d.ts +11 -0
- package/esm/utils/pathValidation.d.ts.map +1 -0
- package/esm/utils/rect.d.ts +9 -0
- package/esm/utils/rect.d.ts.map +1 -0
- package/esm/utils/route.d.ts +19 -0
- package/esm/utils/route.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ErrorRecovery - 错误恢复和降级策略
|
|
3
|
+
*
|
|
4
|
+
* 提供路径计算失败时的恢复机制,包括:
|
|
5
|
+
* - 超时检测和处理
|
|
6
|
+
* - 降级路径生成
|
|
7
|
+
* - 错误分类和报告
|
|
8
|
+
*
|
|
9
|
+
* Implements: Requirements 4.2, 3.6
|
|
10
|
+
*/
|
|
11
|
+
import { Point, Rectangle } from '../geometry';
|
|
12
|
+
/**
|
|
13
|
+
* 错误类型枚举
|
|
14
|
+
*/
|
|
15
|
+
export declare enum PathfindingErrorType {
|
|
16
|
+
/** 超时错误 - 计算时间超过限制 */
|
|
17
|
+
TIMEOUT = "TIMEOUT",
|
|
18
|
+
/** 无路径错误 - 无法找到有效路径 */
|
|
19
|
+
NO_PATH = "NO_PATH",
|
|
20
|
+
/** 无效输入错误 - 输入参数无效 */
|
|
21
|
+
INVALID_INPUT = "INVALID_INPUT",
|
|
22
|
+
/** 障碍物阻塞错误 - 起点或终点被障碍物阻塞 */
|
|
23
|
+
BLOCKED = "BLOCKED",
|
|
24
|
+
/** 内部错误 - 算法内部错误 */
|
|
25
|
+
INTERNAL = "INTERNAL"
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 路径计算错误
|
|
29
|
+
*/
|
|
30
|
+
export declare class PathfindingError extends Error {
|
|
31
|
+
readonly type: PathfindingErrorType;
|
|
32
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
33
|
+
constructor(type: PathfindingErrorType, message: string, details?: Record<string, unknown> | undefined);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 恢复策略类型
|
|
37
|
+
*/
|
|
38
|
+
export declare enum RecoveryStrategy {
|
|
39
|
+
/** 直线连接 */
|
|
40
|
+
DIRECT_LINE = "DIRECT_LINE",
|
|
41
|
+
/** L形路径 */
|
|
42
|
+
L_SHAPE = "L_SHAPE",
|
|
43
|
+
/** Z形路径 */
|
|
44
|
+
Z_SHAPE = "Z_SHAPE",
|
|
45
|
+
/** 简化曼哈顿路径 */
|
|
46
|
+
SIMPLE_MANHATTAN = "SIMPLE_MANHATTAN",
|
|
47
|
+
/** 无恢复 */
|
|
48
|
+
NONE = "NONE"
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 恢复结果
|
|
52
|
+
*/
|
|
53
|
+
export interface RecoveryResult {
|
|
54
|
+
/** 是否成功恢复 */
|
|
55
|
+
success: boolean;
|
|
56
|
+
/** 恢复后的路径 */
|
|
57
|
+
path: Point[];
|
|
58
|
+
/** 使用的恢复策略 */
|
|
59
|
+
strategy: RecoveryStrategy;
|
|
60
|
+
/** 原始错误 */
|
|
61
|
+
originalError?: PathfindingError;
|
|
62
|
+
/** 恢复耗时(毫秒) */
|
|
63
|
+
recoveryTime: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 错误恢复配置
|
|
67
|
+
*/
|
|
68
|
+
export interface ErrorRecoveryConfig {
|
|
69
|
+
/** 是否启用自动恢复 */
|
|
70
|
+
enabled: boolean;
|
|
71
|
+
/** 最大恢复尝试次数 */
|
|
72
|
+
maxAttempts: number;
|
|
73
|
+
/** 恢复策略优先级 */
|
|
74
|
+
strategyPriority: RecoveryStrategy[];
|
|
75
|
+
/** 是否记录恢复日志 */
|
|
76
|
+
logRecovery: boolean;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 默认恢复配置
|
|
80
|
+
*/
|
|
81
|
+
export declare const DEFAULT_RECOVERY_CONFIG: ErrorRecoveryConfig;
|
|
82
|
+
/**
|
|
83
|
+
* 错误恢复类
|
|
84
|
+
*/
|
|
85
|
+
export declare class ErrorRecovery {
|
|
86
|
+
private config;
|
|
87
|
+
private recoveryAttempts;
|
|
88
|
+
constructor(config?: Partial<ErrorRecoveryConfig>);
|
|
89
|
+
/**
|
|
90
|
+
* 尝试恢复路径计算
|
|
91
|
+
*/
|
|
92
|
+
recover(from: Point, to: Point, error: PathfindingError, obstacles?: Rectangle[]): RecoveryResult;
|
|
93
|
+
/**
|
|
94
|
+
* 应用恢复策略
|
|
95
|
+
*/
|
|
96
|
+
private applyStrategy;
|
|
97
|
+
/**
|
|
98
|
+
* 直线连接策略
|
|
99
|
+
*/
|
|
100
|
+
private directLine;
|
|
101
|
+
/**
|
|
102
|
+
* L形路径策略
|
|
103
|
+
*/
|
|
104
|
+
private lShape;
|
|
105
|
+
/**
|
|
106
|
+
* Z形路径策略
|
|
107
|
+
*/
|
|
108
|
+
private zShape;
|
|
109
|
+
/**
|
|
110
|
+
* 简化曼哈顿路径策略
|
|
111
|
+
*/
|
|
112
|
+
private simpleManhattan;
|
|
113
|
+
/**
|
|
114
|
+
* 检查路径是否与障碍物相交
|
|
115
|
+
*/
|
|
116
|
+
private pathIntersectsObstacles;
|
|
117
|
+
/**
|
|
118
|
+
* 检查线段是否与矩形相交
|
|
119
|
+
*/
|
|
120
|
+
private lineIntersectsRect;
|
|
121
|
+
/**
|
|
122
|
+
* 检查点是否在矩形内部
|
|
123
|
+
*/
|
|
124
|
+
private pointInRect;
|
|
125
|
+
/**
|
|
126
|
+
* 检查两条线段是否相交
|
|
127
|
+
*/
|
|
128
|
+
private lineIntersectsLine;
|
|
129
|
+
/**
|
|
130
|
+
* 计算叉积方向
|
|
131
|
+
*/
|
|
132
|
+
private direction;
|
|
133
|
+
/**
|
|
134
|
+
* 检查点是否在线段上
|
|
135
|
+
*/
|
|
136
|
+
private onSegment;
|
|
137
|
+
/**
|
|
138
|
+
* 创建超时错误
|
|
139
|
+
*/
|
|
140
|
+
static createTimeoutError(iterations: number, maxIterations: number): PathfindingError;
|
|
141
|
+
/**
|
|
142
|
+
* 创建无路径错误
|
|
143
|
+
*/
|
|
144
|
+
static createNoPathError(from: Point, to: Point): PathfindingError;
|
|
145
|
+
/**
|
|
146
|
+
* 创建无效输入错误
|
|
147
|
+
*/
|
|
148
|
+
static createInvalidInputError(message: string): PathfindingError;
|
|
149
|
+
/**
|
|
150
|
+
* 创建阻塞错误
|
|
151
|
+
*/
|
|
152
|
+
static createBlockedError(point: Point, type: 'source' | 'target'): PathfindingError;
|
|
153
|
+
/**
|
|
154
|
+
* 创建内部错误
|
|
155
|
+
*/
|
|
156
|
+
static createInternalError(message: string, cause?: Error): PathfindingError;
|
|
157
|
+
/**
|
|
158
|
+
* 生成回退路径(静态方法)
|
|
159
|
+
*/
|
|
160
|
+
static generateFallbackPath(source: Point, target: Point): Point[];
|
|
161
|
+
/**
|
|
162
|
+
* 验证并修复配置选项
|
|
163
|
+
*/
|
|
164
|
+
static validateAndFixOptions<T extends Record<string, unknown>>(options: T, defaults: T): T;
|
|
165
|
+
/**
|
|
166
|
+
* 获取恢复尝试次数
|
|
167
|
+
*/
|
|
168
|
+
getRecoveryAttempts(): number;
|
|
169
|
+
/**
|
|
170
|
+
* 重置恢复状态
|
|
171
|
+
*/
|
|
172
|
+
reset(): void;
|
|
173
|
+
/**
|
|
174
|
+
* 更新配置
|
|
175
|
+
*/
|
|
176
|
+
updateConfig(config: Partial<ErrorRecoveryConfig>): void;
|
|
177
|
+
/**
|
|
178
|
+
* 获取当前配置
|
|
179
|
+
*/
|
|
180
|
+
getConfig(): ErrorRecoveryConfig;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=ErrorRecovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorRecovery.d.ts","sourceRoot":"","sources":["../../src/utils/ErrorRecovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RecoveryStrategy = exports.PathfindingErrorType = exports.PathfindingError = exports.ErrorRecovery = exports.DEFAULT_RECOVERY_CONFIG = void 0;
|
|
7
|
+
var _geometry = require("../geometry");
|
|
8
|
+
/**
|
|
9
|
+
* ErrorRecovery - 错误恢复和降级策略
|
|
10
|
+
*
|
|
11
|
+
* 提供路径计算失败时的恢复机制,包括:
|
|
12
|
+
* - 超时检测和处理
|
|
13
|
+
* - 降级路径生成
|
|
14
|
+
* - 错误分类和报告
|
|
15
|
+
*
|
|
16
|
+
* Implements: Requirements 4.2, 3.6
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* 错误类型枚举
|
|
20
|
+
*/
|
|
21
|
+
let PathfindingErrorType = exports.PathfindingErrorType = /*#__PURE__*/function (PathfindingErrorType) {
|
|
22
|
+
PathfindingErrorType["TIMEOUT"] = "TIMEOUT";
|
|
23
|
+
PathfindingErrorType["NO_PATH"] = "NO_PATH";
|
|
24
|
+
PathfindingErrorType["INVALID_INPUT"] = "INVALID_INPUT";
|
|
25
|
+
PathfindingErrorType["BLOCKED"] = "BLOCKED";
|
|
26
|
+
PathfindingErrorType["INTERNAL"] = "INTERNAL";
|
|
27
|
+
return PathfindingErrorType;
|
|
28
|
+
}({});
|
|
29
|
+
/**
|
|
30
|
+
* 路径计算错误
|
|
31
|
+
*/
|
|
32
|
+
class PathfindingError extends Error {
|
|
33
|
+
constructor(type, message, details) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.type = type;
|
|
36
|
+
this.details = details;
|
|
37
|
+
this.name = 'PathfindingError';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 恢复策略类型
|
|
43
|
+
*/
|
|
44
|
+
exports.PathfindingError = PathfindingError;
|
|
45
|
+
let RecoveryStrategy = exports.RecoveryStrategy = /*#__PURE__*/function (RecoveryStrategy) {
|
|
46
|
+
RecoveryStrategy["DIRECT_LINE"] = "DIRECT_LINE";
|
|
47
|
+
RecoveryStrategy["L_SHAPE"] = "L_SHAPE";
|
|
48
|
+
RecoveryStrategy["Z_SHAPE"] = "Z_SHAPE";
|
|
49
|
+
RecoveryStrategy["SIMPLE_MANHATTAN"] = "SIMPLE_MANHATTAN";
|
|
50
|
+
RecoveryStrategy["NONE"] = "NONE";
|
|
51
|
+
return RecoveryStrategy;
|
|
52
|
+
}({});
|
|
53
|
+
/**
|
|
54
|
+
* 恢复结果
|
|
55
|
+
*/
|
|
56
|
+
/**
|
|
57
|
+
* 错误恢复配置
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* 默认恢复配置
|
|
61
|
+
*/
|
|
62
|
+
const DEFAULT_RECOVERY_CONFIG = exports.DEFAULT_RECOVERY_CONFIG = {
|
|
63
|
+
enabled: true,
|
|
64
|
+
maxAttempts: 3,
|
|
65
|
+
strategyPriority: [RecoveryStrategy.SIMPLE_MANHATTAN, RecoveryStrategy.L_SHAPE, RecoveryStrategy.Z_SHAPE, RecoveryStrategy.DIRECT_LINE],
|
|
66
|
+
logRecovery: false
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* 错误恢复类
|
|
71
|
+
*/
|
|
72
|
+
class ErrorRecovery {
|
|
73
|
+
config;
|
|
74
|
+
recoveryAttempts = 0;
|
|
75
|
+
constructor(config = {}) {
|
|
76
|
+
this.config = {
|
|
77
|
+
...DEFAULT_RECOVERY_CONFIG,
|
|
78
|
+
...config
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* 尝试恢复路径计算
|
|
84
|
+
*/
|
|
85
|
+
recover(from, to, error, obstacles) {
|
|
86
|
+
const startTime = performance.now();
|
|
87
|
+
if (!this.config.enabled) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
path: [],
|
|
91
|
+
strategy: RecoveryStrategy.NONE,
|
|
92
|
+
originalError: error,
|
|
93
|
+
recoveryTime: performance.now() - startTime
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
this.recoveryAttempts = 0;
|
|
97
|
+
for (const strategy of this.config.strategyPriority) {
|
|
98
|
+
if (this.recoveryAttempts >= this.config.maxAttempts) {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
this.recoveryAttempts++;
|
|
102
|
+
const path = this.applyStrategy(strategy, from, to, obstacles);
|
|
103
|
+
if (path.length > 0) {
|
|
104
|
+
if (this.config.logRecovery) {
|
|
105
|
+
console.info(`[ErrorRecovery] Recovered using ${strategy} after ${this.recoveryAttempts} attempts`);
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
success: true,
|
|
109
|
+
path,
|
|
110
|
+
strategy,
|
|
111
|
+
originalError: error,
|
|
112
|
+
recoveryTime: performance.now() - startTime
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// 所有策略都失败,返回直线作为最后手段
|
|
118
|
+
return {
|
|
119
|
+
success: true,
|
|
120
|
+
path: [from, to],
|
|
121
|
+
strategy: RecoveryStrategy.DIRECT_LINE,
|
|
122
|
+
originalError: error,
|
|
123
|
+
recoveryTime: performance.now() - startTime
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 应用恢复策略
|
|
129
|
+
*/
|
|
130
|
+
applyStrategy(strategy, from, to, obstacles) {
|
|
131
|
+
switch (strategy) {
|
|
132
|
+
case RecoveryStrategy.DIRECT_LINE:
|
|
133
|
+
return this.directLine(from, to);
|
|
134
|
+
case RecoveryStrategy.L_SHAPE:
|
|
135
|
+
return this.lShape(from, to, obstacles);
|
|
136
|
+
case RecoveryStrategy.Z_SHAPE:
|
|
137
|
+
return this.zShape(from, to, obstacles);
|
|
138
|
+
case RecoveryStrategy.SIMPLE_MANHATTAN:
|
|
139
|
+
return this.simpleManhattan(from, to, obstacles);
|
|
140
|
+
default:
|
|
141
|
+
return [];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* 直线连接策略
|
|
147
|
+
*/
|
|
148
|
+
directLine(from, to) {
|
|
149
|
+
return [from, to];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* L形路径策略
|
|
154
|
+
*/
|
|
155
|
+
lShape(from, to, obstacles) {
|
|
156
|
+
// 尝试先水平后垂直
|
|
157
|
+
const corner1 = new _geometry.Point(to.x, from.y);
|
|
158
|
+
const path1 = [from, corner1, to];
|
|
159
|
+
if (!obstacles || !this.pathIntersectsObstacles(path1, obstacles)) {
|
|
160
|
+
return path1;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// 尝试先垂直后水平
|
|
164
|
+
const corner2 = new _geometry.Point(from.x, to.y);
|
|
165
|
+
const path2 = [from, corner2, to];
|
|
166
|
+
if (!obstacles || !this.pathIntersectsObstacles(path2, obstacles)) {
|
|
167
|
+
return path2;
|
|
168
|
+
}
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Z形路径策略
|
|
174
|
+
*/
|
|
175
|
+
zShape(from, to, obstacles) {
|
|
176
|
+
const midX = (from.x + to.x) / 2;
|
|
177
|
+
const midY = (from.y + to.y) / 2;
|
|
178
|
+
|
|
179
|
+
// 尝试水平-垂直-水平 Z形
|
|
180
|
+
const path1 = [from, new _geometry.Point(midX, from.y), new _geometry.Point(midX, to.y), to];
|
|
181
|
+
if (!obstacles || !this.pathIntersectsObstacles(path1, obstacles)) {
|
|
182
|
+
return path1;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// 尝试垂直-水平-垂直 Z形
|
|
186
|
+
const path2 = [from, new _geometry.Point(from.x, midY), new _geometry.Point(to.x, midY), to];
|
|
187
|
+
if (!obstacles || !this.pathIntersectsObstacles(path2, obstacles)) {
|
|
188
|
+
return path2;
|
|
189
|
+
}
|
|
190
|
+
return [];
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* 简化曼哈顿路径策略
|
|
195
|
+
*/
|
|
196
|
+
simpleManhattan(from, to, obstacles) {
|
|
197
|
+
const offsets = [0.25, 0.5, 0.75, 0.1, 0.9];
|
|
198
|
+
for (const offset of offsets) {
|
|
199
|
+
// 水平方向偏移
|
|
200
|
+
const midX = from.x + (to.x - from.x) * offset;
|
|
201
|
+
const path1 = [from, new _geometry.Point(midX, from.y), new _geometry.Point(midX, to.y), to];
|
|
202
|
+
if (!obstacles || !this.pathIntersectsObstacles(path1, obstacles)) {
|
|
203
|
+
return path1;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// 垂直方向偏移
|
|
207
|
+
const midY = from.y + (to.y - from.y) * offset;
|
|
208
|
+
const path2 = [from, new _geometry.Point(from.x, midY), new _geometry.Point(to.x, midY), to];
|
|
209
|
+
if (!obstacles || !this.pathIntersectsObstacles(path2, obstacles)) {
|
|
210
|
+
return path2;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* 检查路径是否与障碍物相交
|
|
218
|
+
*/
|
|
219
|
+
pathIntersectsObstacles(path, obstacles) {
|
|
220
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
221
|
+
const p1 = path[i];
|
|
222
|
+
const p2 = path[i + 1];
|
|
223
|
+
for (const obstacle of obstacles) {
|
|
224
|
+
if (this.lineIntersectsRect(p1, p2, obstacle)) {
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return false;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* 检查线段是否与矩形相交
|
|
234
|
+
*/
|
|
235
|
+
lineIntersectsRect(p1, p2, rect) {
|
|
236
|
+
const minX = rect.x;
|
|
237
|
+
const maxX = rect.x + rect.width;
|
|
238
|
+
const minY = rect.y;
|
|
239
|
+
const maxY = rect.y + rect.height;
|
|
240
|
+
|
|
241
|
+
// 检查线段是否完全在矩形外部
|
|
242
|
+
if (p1.x < minX && p2.x < minX || p1.x > maxX && p2.x > maxX || p1.y < minY && p2.y < minY || p1.y > maxY && p2.y > maxY) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// 检查线段端点是否在矩形内部
|
|
247
|
+
if (this.pointInRect(p1, rect) || this.pointInRect(p2, rect)) {
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// 检查线段是否与矩形的四条边相交
|
|
252
|
+
return this.lineIntersectsLine(p1, p2, new _geometry.Point(minX, minY), new _geometry.Point(maxX, minY)) || this.lineIntersectsLine(p1, p2, new _geometry.Point(maxX, minY), new _geometry.Point(maxX, maxY)) || this.lineIntersectsLine(p1, p2, new _geometry.Point(maxX, maxY), new _geometry.Point(minX, maxY)) || this.lineIntersectsLine(p1, p2, new _geometry.Point(minX, maxY), new _geometry.Point(minX, minY));
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 检查点是否在矩形内部
|
|
257
|
+
*/
|
|
258
|
+
pointInRect(p, rect) {
|
|
259
|
+
return p.x > rect.x && p.x < rect.x + rect.width && p.y > rect.y && p.y < rect.y + rect.height;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* 检查两条线段是否相交
|
|
264
|
+
*/
|
|
265
|
+
lineIntersectsLine(p1, p2, p3, p4) {
|
|
266
|
+
const d1 = this.direction(p3, p4, p1);
|
|
267
|
+
const d2 = this.direction(p3, p4, p2);
|
|
268
|
+
const d3 = this.direction(p1, p2, p3);
|
|
269
|
+
const d4 = this.direction(p1, p2, p4);
|
|
270
|
+
if ((d1 > 0 && d2 < 0 || d1 < 0 && d2 > 0) && (d3 > 0 && d4 < 0 || d3 < 0 && d4 > 0)) {
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
if (d1 === 0 && this.onSegment(p3, p4, p1)) return true;
|
|
274
|
+
if (d2 === 0 && this.onSegment(p3, p4, p2)) return true;
|
|
275
|
+
if (d3 === 0 && this.onSegment(p1, p2, p3)) return true;
|
|
276
|
+
if (d4 === 0 && this.onSegment(p1, p2, p4)) return true;
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* 计算叉积方向
|
|
282
|
+
*/
|
|
283
|
+
direction(p1, p2, p3) {
|
|
284
|
+
return (p3.x - p1.x) * (p2.y - p1.y) - (p2.x - p1.x) * (p3.y - p1.y);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* 检查点是否在线段上
|
|
289
|
+
*/
|
|
290
|
+
onSegment(p1, p2, p) {
|
|
291
|
+
return p.x >= Math.min(p1.x, p2.x) && p.x <= Math.max(p1.x, p2.x) && p.y >= Math.min(p1.y, p2.y) && p.y <= Math.max(p1.y, p2.y);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* 创建超时错误
|
|
296
|
+
*/
|
|
297
|
+
static createTimeoutError(iterations, maxIterations) {
|
|
298
|
+
return new PathfindingError(PathfindingErrorType.TIMEOUT, `Pathfinding timeout: exceeded ${maxIterations} iterations`, {
|
|
299
|
+
iterations,
|
|
300
|
+
maxIterations
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* 创建无路径错误
|
|
306
|
+
*/
|
|
307
|
+
static createNoPathError(from, to) {
|
|
308
|
+
return new PathfindingError(PathfindingErrorType.NO_PATH, `No path found from (${from.x}, ${from.y}) to (${to.x}, ${to.y})`, {
|
|
309
|
+
from: {
|
|
310
|
+
x: from.x,
|
|
311
|
+
y: from.y
|
|
312
|
+
},
|
|
313
|
+
to: {
|
|
314
|
+
x: to.x,
|
|
315
|
+
y: to.y
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* 创建无效输入错误
|
|
322
|
+
*/
|
|
323
|
+
static createInvalidInputError(message) {
|
|
324
|
+
return new PathfindingError(PathfindingErrorType.INVALID_INPUT, message);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* 创建阻塞错误
|
|
329
|
+
*/
|
|
330
|
+
static createBlockedError(point, type) {
|
|
331
|
+
return new PathfindingError(PathfindingErrorType.BLOCKED, `${type === 'source' ? 'Source' : 'Target'} point (${point.x}, ${point.y}) is blocked`, {
|
|
332
|
+
point: {
|
|
333
|
+
x: point.x,
|
|
334
|
+
y: point.y
|
|
335
|
+
},
|
|
336
|
+
type
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* 创建内部错误
|
|
342
|
+
*/
|
|
343
|
+
static createInternalError(message, cause) {
|
|
344
|
+
return new PathfindingError(PathfindingErrorType.INTERNAL, message, {
|
|
345
|
+
cause: cause?.message
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* 生成回退路径(静态方法)
|
|
351
|
+
*/
|
|
352
|
+
static generateFallbackPath(source, target) {
|
|
353
|
+
const midX = (source.x + target.x) / 2;
|
|
354
|
+
return [source, new _geometry.Point(midX, source.y), new _geometry.Point(midX, target.y), target];
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* 验证并修复配置选项
|
|
359
|
+
*/
|
|
360
|
+
static validateAndFixOptions(options, defaults) {
|
|
361
|
+
const fixed = {
|
|
362
|
+
...options
|
|
363
|
+
};
|
|
364
|
+
for (const key of Object.keys(defaults)) {
|
|
365
|
+
const value = fixed[key];
|
|
366
|
+
const defaultValue = defaults[key];
|
|
367
|
+
if (value === undefined || value === null) {
|
|
368
|
+
;
|
|
369
|
+
fixed[key] = defaultValue;
|
|
370
|
+
} else if (typeof defaultValue === 'number' && typeof value === 'number') {
|
|
371
|
+
if (value <= 0 && defaultValue > 0) {
|
|
372
|
+
console.warn(`Invalid ${key} value (${value}), using default (${defaultValue})`);
|
|
373
|
+
fixed[key] = defaultValue;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
return fixed;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* 获取恢复尝试次数
|
|
382
|
+
*/
|
|
383
|
+
getRecoveryAttempts() {
|
|
384
|
+
return this.recoveryAttempts;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* 重置恢复状态
|
|
389
|
+
*/
|
|
390
|
+
reset() {
|
|
391
|
+
this.recoveryAttempts = 0;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* 更新配置
|
|
396
|
+
*/
|
|
397
|
+
updateConfig(config) {
|
|
398
|
+
this.config = {
|
|
399
|
+
...this.config,
|
|
400
|
+
...config
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* 获取当前配置
|
|
406
|
+
*/
|
|
407
|
+
getConfig() {
|
|
408
|
+
return {
|
|
409
|
+
...this.config
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
exports.ErrorRecovery = ErrorRecovery;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GlobalGrid class for consistent path alignment
|
|
3
|
+
* Feature: manhattan-optimization
|
|
4
|
+
*
|
|
5
|
+
* This class ensures all paths align to a unified global grid,
|
|
6
|
+
* solving the path overlap problem where paths should share segments.
|
|
7
|
+
*/
|
|
8
|
+
import { Point } from '../geometry';
|
|
9
|
+
/**
|
|
10
|
+
* Global grid configuration
|
|
11
|
+
*/
|
|
12
|
+
export interface GlobalGridConfig {
|
|
13
|
+
/** Grid step size in X direction */
|
|
14
|
+
stepX: number;
|
|
15
|
+
/** Grid step size in Y direction */
|
|
16
|
+
stepY: number;
|
|
17
|
+
/** Grid origin point (default: (0, 0)) */
|
|
18
|
+
origin?: Point;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* GlobalGrid class for managing grid alignment
|
|
22
|
+
*
|
|
23
|
+
* Key features:
|
|
24
|
+
* - Uses a fixed global origin (0, 0) for consistent alignment across all paths
|
|
25
|
+
* - Supports configurable step sizes
|
|
26
|
+
* - Provides methods for snapping points to grid
|
|
27
|
+
* - Ensures path segments can properly overlap when they should
|
|
28
|
+
*/
|
|
29
|
+
export declare class GlobalGrid {
|
|
30
|
+
/** Grid origin point */
|
|
31
|
+
readonly origin: Point;
|
|
32
|
+
/** Grid step size in X direction */
|
|
33
|
+
readonly stepX: number;
|
|
34
|
+
/** Grid step size in Y direction */
|
|
35
|
+
readonly stepY: number;
|
|
36
|
+
constructor(config: GlobalGridConfig);
|
|
37
|
+
/**
|
|
38
|
+
* Create a GlobalGrid with uniform step size
|
|
39
|
+
*/
|
|
40
|
+
static uniform(step: number, origin?: Point): GlobalGrid;
|
|
41
|
+
/**
|
|
42
|
+
* Snap a single value to the grid
|
|
43
|
+
*/
|
|
44
|
+
snapValue(value: number, step: number, originOffset?: number): number;
|
|
45
|
+
/**
|
|
46
|
+
* Snap a point to the global grid
|
|
47
|
+
*/
|
|
48
|
+
snapToGrid(point: Point): Point;
|
|
49
|
+
/**
|
|
50
|
+
* Snap a point to grid and apply precision rounding
|
|
51
|
+
*/
|
|
52
|
+
snapToGridWithPrecision(point: Point, precision: number): Point;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a point is on the grid (within tolerance)
|
|
55
|
+
*/
|
|
56
|
+
isOnGrid(point: Point, tolerance?: number): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get the nearest grid point in a specific direction
|
|
59
|
+
*/
|
|
60
|
+
getNearestGridPoint(point: Point, direction: 'up' | 'down' | 'left' | 'right' | 'nearest'): Point;
|
|
61
|
+
/**
|
|
62
|
+
* Get all grid points within a rectangle
|
|
63
|
+
*/
|
|
64
|
+
getGridPointsInRect(minX: number, minY: number, maxX: number, maxY: number): Point[];
|
|
65
|
+
/**
|
|
66
|
+
* Calculate the grid distance between two points
|
|
67
|
+
* (number of grid steps, not actual distance)
|
|
68
|
+
*/
|
|
69
|
+
gridDistance(p1: Point, p2: Point): {
|
|
70
|
+
x: number;
|
|
71
|
+
y: number;
|
|
72
|
+
total: number;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Snap an array of points to the grid
|
|
76
|
+
*/
|
|
77
|
+
snapPathToGrid(points: Point[]): Point[];
|
|
78
|
+
/**
|
|
79
|
+
* Snap path to grid and remove duplicate consecutive points
|
|
80
|
+
*/
|
|
81
|
+
snapAndSimplifyPath(points: Point[], tolerance?: number): Point[];
|
|
82
|
+
/**
|
|
83
|
+
* Get grid offset for a direction
|
|
84
|
+
*/
|
|
85
|
+
getDirectionOffset(direction: 'up' | 'down' | 'left' | 'right'): Point;
|
|
86
|
+
/**
|
|
87
|
+
* Clone this grid with optional overrides
|
|
88
|
+
*/
|
|
89
|
+
clone(overrides?: Partial<GlobalGridConfig>): GlobalGrid;
|
|
90
|
+
/**
|
|
91
|
+
* Create a string representation for debugging
|
|
92
|
+
*/
|
|
93
|
+
toString(): string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Default global grid instance with step size 10
|
|
97
|
+
*/
|
|
98
|
+
export declare const defaultGlobalGrid: GlobalGrid;
|
|
99
|
+
//# sourceMappingURL=GlobalGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GlobalGrid.d.ts","sourceRoot":"","sources":["../../src/utils/GlobalGrid.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAA;IACb,0CAA0C;IAC1C,MAAM,CAAC,EAAE,KAAK,CAAA;CACf;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACrB,wBAAwB;IACxB,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAA;IAEtB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IAEtB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;gBAEV,MAAM,EAAE,gBAAgB;IAWpC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,UAAU;IAQxD;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,GAAE,MAAU,GAAG,MAAM;IAMxE;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK;IAO/B;;OAEG;IACH,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK;IAI/D;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO;IAM1D;;OAEG;IACH,mBAAmB,CACjB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GACtD,KAAK;IAqCR;;OAEG;IACH,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,KAAK,EAAE;IAkBV;;;OAGG;IACH,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAW3E;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,EAAE;IAIxC;;OAEG;IACH,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,SAAS,GAAE,MAAc,GAAG,KAAK,EAAE;IAsBxE;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK;IAatE;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU;IAQxD;;OAEG;IACH,QAAQ,IAAI,MAAM;CAGnB;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,YAAyB,CAAA"}
|