s3m-three 0.4.19 → 0.4.21

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 (87) hide show
  1. package/dist/browser/assets/{s3mWorker-4iTAmWIu.js → s3mWorker-DvAUA8NJ.js} +1 -1
  2. package/dist/browser/s3m-three.iife.ext-three.js +243 -243
  3. package/dist/browser/s3m-three.iife.js +227 -227
  4. package/dist/core/Draco.d.ts.map +1 -1
  5. package/dist/core/Draco.js +0 -1
  6. package/dist/core/Draco.js.map +1 -1
  7. package/dist/core/S3MBlockParser.d.ts.map +1 -1
  8. package/dist/core/S3MBlockParser.js +27 -14
  9. package/dist/core/S3MBlockParser.js.map +1 -1
  10. package/dist/core/SplatSort.d.ts +14 -1
  11. package/dist/core/SplatSort.d.ts.map +1 -1
  12. package/dist/core/SplatSort.js +51 -4
  13. package/dist/core/SplatSort.js.map +1 -1
  14. package/dist/core/TileGeometry.d.ts +10 -0
  15. package/dist/core/TileGeometry.d.ts.map +1 -1
  16. package/dist/core/TileGeometry.js +17 -14
  17. package/dist/core/TileGeometry.js.map +1 -1
  18. package/dist/render/DatasetManager.d.ts +3 -1
  19. package/dist/render/DatasetManager.d.ts.map +1 -1
  20. package/dist/render/DatasetManager.js +2 -1
  21. package/dist/render/DatasetManager.js.map +1 -1
  22. package/dist/render/FeatureStyleManager.d.ts.map +1 -1
  23. package/dist/render/GeometryBuilder.d.ts +8 -0
  24. package/dist/render/GeometryBuilder.d.ts.map +1 -1
  25. package/dist/render/GeometryBuilder.js +62 -7
  26. package/dist/render/GeometryBuilder.js.map +1 -1
  27. package/dist/render/S3MViewer.d.ts +106 -440
  28. package/dist/render/S3MViewer.d.ts.map +1 -1
  29. package/dist/render/S3MViewer.js +297 -1653
  30. package/dist/render/S3MViewer.js.map +1 -1
  31. package/dist/render/SplatSorter.d.ts.map +1 -1
  32. package/dist/render/SplatSorter.js +8 -1
  33. package/dist/render/SplatSorter.js.map +1 -1
  34. package/dist/render/viewer/EdgeDecorator.d.ts +206 -0
  35. package/dist/render/viewer/EdgeDecorator.d.ts.map +1 -0
  36. package/dist/render/viewer/EdgeDecorator.js +628 -0
  37. package/dist/render/viewer/EdgeDecorator.js.map +1 -0
  38. package/dist/render/viewer/HeightIndex.d.ts +36 -0
  39. package/dist/render/viewer/HeightIndex.d.ts.map +1 -0
  40. package/dist/render/viewer/HeightIndex.js +98 -0
  41. package/dist/render/viewer/HeightIndex.js.map +1 -0
  42. package/dist/render/viewer/LightRig.d.ts +88 -0
  43. package/dist/render/viewer/LightRig.d.ts.map +1 -0
  44. package/dist/render/viewer/LightRig.js +229 -0
  45. package/dist/render/viewer/LightRig.js.map +1 -0
  46. package/dist/render/viewer/PickService.d.ts +109 -0
  47. package/dist/render/viewer/PickService.d.ts.map +1 -0
  48. package/dist/render/viewer/PickService.js +591 -0
  49. package/dist/render/viewer/PickService.js.map +1 -0
  50. package/dist/render/viewer/SelectionDecorator.d.ts +84 -0
  51. package/dist/render/viewer/SelectionDecorator.d.ts.map +1 -0
  52. package/dist/render/viewer/SelectionDecorator.js +339 -0
  53. package/dist/render/viewer/SelectionDecorator.js.map +1 -0
  54. package/dist/render/viewer/SplatLayer.d.ts +26 -0
  55. package/dist/render/viewer/SplatLayer.d.ts.map +1 -0
  56. package/dist/render/viewer/SplatLayer.js +44 -0
  57. package/dist/render/viewer/SplatLayer.js.map +1 -0
  58. package/dist/render/viewer/types.d.ts +256 -0
  59. package/dist/render/viewer/types.d.ts.map +1 -0
  60. package/dist/render/viewer/types.js +3 -0
  61. package/dist/render/viewer/types.js.map +1 -0
  62. package/dist/tileset/S3MTileset.d.ts +30 -3
  63. package/dist/tileset/S3MTileset.d.ts.map +1 -1
  64. package/dist/tileset/S3MTileset.js +99 -5
  65. package/dist/tileset/S3MTileset.js.map +1 -1
  66. package/dist/worker/s3mWorker.js +1 -1
  67. package/dist/worker/s3mWorker.js.map +1 -1
  68. package/docs/API.md +9 -28
  69. package/docs/FORMAT-NOTES.md +38 -14
  70. package/package.json +1 -1
  71. package/src/core/Draco.ts +1 -2
  72. package/src/core/S3MBlockParser.ts +27 -16
  73. package/src/core/SplatSort.ts +67 -5
  74. package/src/core/TileGeometry.ts +24 -11
  75. package/src/render/DatasetManager.ts +5 -1
  76. package/src/render/FeatureStyleManager.ts +1 -1
  77. package/src/render/GeometryBuilder.ts +59 -7
  78. package/src/render/S3MViewer.ts +327 -1916
  79. package/src/render/SplatSorter.ts +8 -1
  80. package/src/render/viewer/EdgeDecorator.ts +722 -0
  81. package/src/render/viewer/HeightIndex.ts +94 -0
  82. package/src/render/viewer/LightRig.ts +267 -0
  83. package/src/render/viewer/PickService.ts +651 -0
  84. package/src/render/viewer/SelectionDecorator.ts +377 -0
  85. package/src/render/viewer/SplatLayer.ts +44 -0
  86. package/src/render/viewer/types.ts +264 -0
  87. package/src/tileset/S3MTileset.ts +106 -6
@@ -0,0 +1,628 @@
1
+ /**
2
+ * 棱线装饰:折边线 / 外推 / 背面外扩轮廓 / GPU 后处理描边。
3
+ *
4
+ * 从 `S3MViewer` 整体搬出来的最大一块。它只碰 `mesh.userData`(`edges` / `edgeHull` /
5
+ * `nativeEdges`)与共享 uniform,不碰拾取表、不碰瓦片生命周期 —— 所以能独立成模块。
6
+ *
7
+ * ## 为什么外观 uniform 要共享
8
+ *
9
+ * 棱线材质必须**逐网格一份**(各绑各的单体状态纹理),但外观(颜色 / 粗细 / 透明度 /
10
+ * 外推距离)必须全局统一。做法是外观 uniform 用同一批对象,`syncStyle()` 改一次全部生效,
11
+ * 棱线淡入淡出也只改一个 `uEdgeFade` —— 新建瓦片自动继承当前进度。
12
+ *
13
+ * ## 三种画法的成本
14
+ *
15
+ * - `line` / `offset`:CPU 现算 EdgesGeometry,按 8ms 一帧切片建,几十万面不会卡死;
16
+ * - `hull`:不建几何,把同一块网格沿法线外扩再画一遍,只画背面;
17
+ * - `gpu`:零几何、零额外 pass 的片元描边,线宽约 1 像素。
18
+ */
19
+ import * as THREE from 'three';
20
+ import { authFetch } from '../../core/AuthFetch.js';
21
+ import { createOutlineMaterial, resolveEdgeModes, sameEdgeModes, } from '../StyleMaterial.js';
22
+ import { buildFeatureEdgeSegments, buildPositionBatchMap, buildThickLineGeometry, createLineSharedUniforms, createThickLineMaterial, positionQuantKey, } from '../EdgeLines.js';
23
+ import { mergeVerticesByPosition } from '../MergeVertices.js';
24
+ import { GpuEdgePass } from '../GpuEdgePass.js';
25
+ /** 取网格上的 styled 材质(与 S3MViewer 里那份逐字一致) */
26
+ function styledMaterialOf(mesh) {
27
+ const m = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;
28
+ return m?.userData?.isStyled ? m : null;
29
+ }
30
+ /** 与 S3MViewer 里同名的工具(保持逐字一致,避免两处口径漂移) */
31
+ function clampOpacity(v) {
32
+ const n = v ?? 1;
33
+ return n < 0 ? 0 : n > 1 ? 1 : n;
34
+ }
35
+ /** 地形 / 绿地 / 道路 / 地面铺装等不参与自动描边(数据自带棱线包另说) */
36
+ const EDGE_SKIP_KEYWORDS = [
37
+ 'terrain', 'ground', 'vegetation', 'green', 'road', 'dem',
38
+ '绿地', '道路', '地面', '地形', '植被', '铺装',
39
+ ];
40
+ export class EdgeDecorator {
41
+ host;
42
+ /** 等宽线共享的分辨率 uniform(全局棱线 + 选中棱线共用) */
43
+ lineShared;
44
+ /** 全局棱线材质(外观 uniform 的持有者,逐网格棱线材质共享它的对象) */
45
+ edgeMaterial;
46
+ /** 选中棱线材质(同上,选中棱线的逐网格材质共享它的对象) */
47
+ selectionEdgeMaterial;
48
+ _edgeStyleUniforms;
49
+ _selEdgeStyleUniforms;
50
+ _hullStyleUniforms;
51
+ _enabled = false;
52
+ _modes;
53
+ /** 预制棱线缓存(Crease Cache):外部载入的全局统一 LineSegments */
54
+ _creaseLines = null;
55
+ /** 数据自带的棱线对象:改颜色时只刷这些,不再全场景 traverse */
56
+ _nativeLines = new Set();
57
+ /** GPU 描边后处理(深度 + 法线),只在 edges 含 'gpu' 时按帧执行 */
58
+ _gpuEdge = null;
59
+ /** 给 GPU 描边传色用的临时 Color,避免每帧 new */
60
+ _gpuEdgeColor = new THREE.Color();
61
+ constructor(host) {
62
+ this.host = host;
63
+ const style = host.style;
64
+ this._modes = resolveEdgeModes(false);
65
+ this.lineShared = createLineSharedUniforms();
66
+ this._edgeStyleUniforms = {
67
+ uColor: { value: new THREE.Color(style.edgeColor) },
68
+ uWidth: { value: Math.max(0.1, style.edgeWidth ?? 1.5) },
69
+ uOpacity: { value: 0.6 },
70
+ uOffset: { value: style.edgeOffset ?? 0.15 },
71
+ };
72
+ this.edgeMaterial = createThickLineMaterial(this.lineShared, {}, this._edgeStyleUniforms);
73
+ const full = style;
74
+ this._selEdgeStyleUniforms = {
75
+ uColor: { value: new THREE.Color(full.outlineColor ?? full.selectColor ?? '#ffffff') },
76
+ uWidth: { value: Math.max(0.1, full.outlineWidthPx ?? 3) },
77
+ uOpacity: { value: 1 },
78
+ uElevation: { value: full.selectElevation ?? 0 },
79
+ };
80
+ this.selectionEdgeMaterial = createThickLineMaterial(this.lineShared, {}, this._selEdgeStyleUniforms);
81
+ this._hullStyleUniforms = {
82
+ uColor: { value: new THREE.Color(style.edgeColor) },
83
+ uWidth: { value: Math.max(0, style.edgeHullWidth ?? 0.9) },
84
+ uOpacity: { value: 0.6 },
85
+ };
86
+ }
87
+ /** 当前是否开启棱线 */
88
+ get enabled() {
89
+ return this._enabled;
90
+ }
91
+ /** 当前生效的画法 */
92
+ get modes() {
93
+ return this._modes;
94
+ }
95
+ /** 数据自带棱线包在当前画法下还算不算数 */
96
+ useNativeEdges(hasNative) {
97
+ return hasNative && this.host.style.forceCpuEdges !== true && !this._modes.gpu;
98
+ }
99
+ /** 登记数据自带的棱线(注册瓦片时调) */
100
+ registerNativeLine(lines, visible) {
101
+ this._nativeLines.add(lines);
102
+ lines.visible = visible;
103
+ this._styleEdgeLine(lines);
104
+ }
105
+ /** 注销数据自带的棱线(瓦片淘汰时调) */
106
+ unregisterNativeLine(lines) {
107
+ this._nativeLines.delete(lines);
108
+ }
109
+ /** 新瓦片是否要自动补棱线装饰(受全局开关 / 数据集开关 / 关键字跳过三道控制) */
110
+ autoDecorate(mesh, entry, hasNativeEdges) {
111
+ if (hasNativeEdges || isPointCloud(mesh))
112
+ return;
113
+ if (!this._datasetEdgesEnabled(entry))
114
+ return;
115
+ const ud = mesh.userData;
116
+ if (this._shouldSkipAutoEdges(ud, entry.name))
117
+ return;
118
+ // 数据集强制开启时全局画法可能还是关的,退回默认折边线;gpu 画法本来就不建几何
119
+ if (this._modes.line || this._modes.hull)
120
+ this._ensureEdgeDecoration(mesh);
121
+ else if (!this._modes.gpu)
122
+ this._ensureEdges(mesh);
123
+ }
124
+ /** 释放全部装饰与后处理资源(unmount 时调) */
125
+ disposeAll() {
126
+ for (const p of this.host.pickables.values())
127
+ this._removeEdges(p.mesh);
128
+ this._gpuEdge?.dispose();
129
+ this._gpuEdge = null;
130
+ this.edgeMaterial.dispose();
131
+ this.selectionEdgeMaterial.dispose();
132
+ }
133
+ /** @internal GPU 描边实例,单测会替换成假对象观察 dispose */
134
+ get gpuEdge() {
135
+ return this._gpuEdge;
136
+ }
137
+ set gpuEdge(v) {
138
+ this._gpuEdge = v;
139
+ }
140
+ /** GPU 描边资源单独释放(换上下文时调,下一帧按需重建) */
141
+ disposeGpuEdge() {
142
+ this._gpuEdge?.dispose();
143
+ this._gpuEdge = null;
144
+ }
145
+ /** 一帧的 GPU 描边,必须画在主场景之后(依赖本帧已写好的深度) */
146
+ renderGpuEdges(canvas) {
147
+ if (!this._modes.gpu)
148
+ return;
149
+ const renderer = this.host.renderer;
150
+ const scene = this.host.scene;
151
+ const camera = this.host.camera;
152
+ if (!renderer || !scene || !camera)
153
+ return;
154
+ const s = this.host.style;
155
+ const fade = this.host.uniforms.uEdgeFade?.value ?? 1;
156
+ const opacity = Math.min(1, Math.max(0, s.edgeOpacity ?? 0.6)) * clampOpacity(s.opacity) * fade;
157
+ if (opacity <= 0.004)
158
+ return;
159
+ if (!this._gpuEdge)
160
+ this._gpuEdge = new GpuEdgePass();
161
+ if (!this._gpuEdge.supported(renderer))
162
+ return;
163
+ // 度数 → 归一化法线差(|Δn| = 2·sin(θ/2)),乘 0.6 让阈值落在「刚好能描出」的位置
164
+ const deg = Math.min(179, Math.max(1, s.edgeThreshold ?? 55));
165
+ const normalThreshold = 2 * Math.sin((deg * Math.PI) / 360) * 0.6;
166
+ this._gpuEdge.render(renderer, scene, camera, canvas.width, canvas.height, {
167
+ color: this._gpuEdgeColor.set(s.edgeColor),
168
+ opacity,
169
+ radius: Math.max(1, s.edgeWidth ?? 1.5),
170
+ normalThreshold,
171
+ depthThreshold: 0.08,
172
+ });
173
+ }
174
+ /** 建逐网格棱线材质;`selection` 为真时用选中棱线那套外观 uniform */
175
+ createPerMeshEdgeMaterial(mesh, selection = false) {
176
+ const styled = styledMaterialOf(mesh);
177
+ const u = this.host.uniforms;
178
+ const batch = styled?.userData?.uBatchTex
179
+ ? {
180
+ uBatchTex: styled.userData.uBatchTex,
181
+ uBatchTex2: styled.userData.uBatchTex2,
182
+ uBatchMix: u.uBatchMix,
183
+ uBatchTexWidth: styled.userData.uBatchTexWidth,
184
+ uBatchTexActive: styled.userData.uBatchTexActive,
185
+ uPathTex: u.uPathTex,
186
+ uPathCount: u.uPathCount,
187
+ uPathTexActive: u.uPathTexActive,
188
+ uPathTime: u.uPathTime,
189
+ }
190
+ : undefined;
191
+ return createThickLineMaterial(this.lineShared, {}, selection ? this._selEdgeStyleUniforms : this._edgeStyleUniforms, batch);
192
+ }
193
+ /**
194
+ * 全局棱线开关。
195
+ *
196
+ * 取值是 `boolean | EdgeStyle | EdgeStyle[]`(见 resolveEdgeModes):
197
+ * - `true` / `'line'` 折边线(旧口径)
198
+ * - `'offset'` 折边线 + 沿边法线外推 `edgeOffset` 米
199
+ * - `'hull'` 背面外扩轮廓(选中侧 outlineStyle:'hull' 的整场景版)
200
+ * - `'gpu'` 纯片元描边:零几何、零额外 pass,线宽约 1 像素
201
+ * - 数组 叠加,例如 `['line', 'hull']`
202
+ *
203
+ * 数据自带棱线包(primitiveType 13)时直接用,成本为零;`style.forceCpuEdges`
204
+ * 可以无视它,改由 CPU 现算 —— 那是 CPU 端的活,几十万面一次性建会卡住主线程
205
+ * (实测 20 个网格 1.9s),所以按 8ms 一帧切片,边建边出。
206
+ *
207
+ * 棱线本身用「屏幕空间等宽线」画(见 EdgeLines.ts):WebGL 的 lineWidth 基本无效,
208
+ * 只有摊成面向屏幕的四边形,`edgeWidth` 才能真正调粗。
209
+ *
210
+ * 带 `transition` 时做「淡入 / 淡出」,**不对几何做插值**(几何没法插值):
211
+ * 开:立刻置位 + 开始分片建线,同时 `uEdgeFade` 0→1 —— 建好一块亮一块,视觉上是渐显;
212
+ * 关:`uEdgeFade` 1→0,淡完才 dispose,避免棱线「啪」一下消失。
213
+ */
214
+ setEdges(edges, transition) {
215
+ const wantAnim = !!transition && ((transition.duration ?? 0) > 0 || !!transition.spring);
216
+ const modes = resolveEdgeModes(edges);
217
+ // 换画法(line ↔ hull ↔ offset)是结构变更:旧装饰必须拆掉再建,
218
+ // 否则会出现「切到 hull 了折边线还留着」这种叠影。
219
+ // 同一画法重复调用(滑块逐帧 setEdges(true))不重建,几何是复用的。
220
+ const modesChanged = !sameEdgeModes(this._modes, modes);
221
+ this._modes = modes;
222
+ this._enabled = modes.enabled;
223
+ this.host.style.edges = edges;
224
+ this.host.styleTarget.edges = edges;
225
+ // 数据自带的棱线:直接切可见性(forceCpuEdges 时永远收起,改由 CPU 现算)。
226
+ // 只遍历注册时收集好的那批 LineSegments —— 全数据集 traverse 在几千节点下太贵。
227
+ // gpu 模式下 shader 自己描边,native 线段包必须收起,否则叠成双线
228
+ const nativeVisible = modes.enabled && !modes.gpu && this.host.style.forceCpuEdges !== true;
229
+ for (const lines of this._nativeLines) {
230
+ lines.visible = nativeVisible;
231
+ this._styleEdgeLine(lines);
232
+ }
233
+ this._syncEdgeStyle();
234
+ // 关掉 gpu 画法就把后处理资源还回去(整屏 RT 白占显存没意义)。
235
+ // 必须放在「整体关闭」的早退之前,否则关棱线时永远轮不到它。
236
+ if (!modes.gpu && this._gpuEdge) {
237
+ this._gpuEdge.dispose();
238
+ this._gpuEdge = null;
239
+ }
240
+ if (!modes.enabled) {
241
+ if (wantAnim) {
242
+ this.host.animator.to('style.edgeFade', 0, {
243
+ ...transition,
244
+ onComplete: () => {
245
+ this._disposeEdges();
246
+ this.host.requestRepaint();
247
+ transition?.onComplete?.();
248
+ },
249
+ });
250
+ }
251
+ else {
252
+ this._setEdgeFade(1);
253
+ this._disposeEdges();
254
+ }
255
+ this.host.requestRepaint();
256
+ return;
257
+ }
258
+ if (modesChanged)
259
+ this._disposeEdges();
260
+ const pending = [...this.host.pickables.values()]
261
+ .map((p) => p.mesh)
262
+ .filter((m) => {
263
+ const ud = m.userData;
264
+ // 点云没有棱可描
265
+ if (isPointCloud(m))
266
+ return false;
267
+ // native 棱线还算不算数,取决于**当前**的 forceCpuEdges(它可以在运行中切换),
268
+ // 所以这里按注册时记下的原始标记重算,而不是沿用注册那一刻的结论。
269
+ ud.nativeEdges = ud.nativeEdgesRaw === true && this.host.style.forceCpuEdges !== true;
270
+ return !ud.nativeEdges && this._needsEdgeDecoration(ud);
271
+ });
272
+ let i = 0;
273
+ const step = () => {
274
+ const t0 = performance.now();
275
+ while (i < pending.length && performance.now() - t0 < 8)
276
+ this._ensureEdgeDecoration(pending[i++]);
277
+ if (i < pending.length)
278
+ setTimeout(step, 0);
279
+ else
280
+ this.host.requestRepaint();
281
+ };
282
+ step();
283
+ if (wantAnim) {
284
+ // 从 0 起淡入:新建出来的棱线自动继承当前进度,不会半路冒出一条满亮度的线
285
+ this._setEdgeFade(0);
286
+ this.host.animator.to('style.edgeFade', 1, transition);
287
+ }
288
+ else {
289
+ this._setEdgeFade(1);
290
+ }
291
+ }
292
+ /** 直接写棱线淡入乘子(不走动画通道) */
293
+ _setEdgeFade(v) {
294
+ if (this.host.uniforms.uEdgeFade)
295
+ this.host.uniforms.uEdgeFade.value = v;
296
+ this._syncEdgeStyle();
297
+ }
298
+ /** 释放所有现算棱线几何 */
299
+ _disposeEdges() {
300
+ for (const p of this.host.pickables.values())
301
+ this._removeEdges(p.mesh);
302
+ }
303
+ /**
304
+ * 挂载预制棱线缓存(Crease Cache)。
305
+ *
306
+ * 直接把 `source-creases.f32` 这类 Float32Array 缓冲载入为一组全局统一的
307
+ * LineSegments —— 相比逐 Mesh 现算 EdgesGeometry,性能高一个量级,视觉也最干净。
308
+ * 坐标按「场景本地坐标」(相对场景锚点的米)处理,与瓦片几何同一坐标系。
309
+ *
310
+ * @param url 棱线缓存地址(二进制 Float32 序列:x,y,z,x,y,z,… 成对成段)
311
+ */
312
+ async loadCreases(url) {
313
+ const resp = await authFetch(url, this.host.authenticate, 'creases');
314
+ if (!resp.ok)
315
+ throw new Error(`[s3m] 棱线缓存加载失败: ${resp.status} ${url}`);
316
+ const buf = await resp.arrayBuffer();
317
+ const arr = new Float32Array(buf);
318
+ if (arr.length < 6)
319
+ return;
320
+ const geo = new THREE.BufferGeometry();
321
+ geo.setAttribute('position', new THREE.BufferAttribute(arr, 3));
322
+ const s = this.host.style;
323
+ const mat = new THREE.LineBasicMaterial({
324
+ color: new THREE.Color(s.edgeColor),
325
+ transparent: true,
326
+ opacity: Math.min(1, Math.max(0, s.edgeOpacity ?? 0.6)) * clampOpacity(s.opacity),
327
+ depthWrite: false,
328
+ });
329
+ const lines = new THREE.LineSegments(geo, mat);
330
+ lines.renderOrder = 2;
331
+ lines.frustumCulled = false;
332
+ lines.raycast = () => { };
333
+ this.clearCreases();
334
+ this._creaseLines = lines;
335
+ this.host.scene?.add(lines);
336
+ this.host.requestRepaint();
337
+ }
338
+ /** 移除并释放预制棱线缓存 */
339
+ clearCreases() {
340
+ if (!this._creaseLines)
341
+ return;
342
+ this.host.scene?.remove(this._creaseLines);
343
+ this._creaseLines.geometry.dispose();
344
+ this._creaseLines.material?.dispose?.();
345
+ this._creaseLines = null;
346
+ this.host.requestRepaint();
347
+ }
348
+ /**
349
+ * 让全局棱线材质跟上 style.edgeColor / edgeWidth / edgeOpacity / edgeOffset。
350
+ *
351
+ * 全程 O(1):只有一份共享 edgeMaterial(所有逐 mesh 棱线都用它)+ 一份预制缓存
352
+ * + 一批共享外观对象的轮廓壳,所以棱线淡入淡出只要改一个 uniform,
353
+ * 新建瓦片自动继承当前进度。
354
+ */
355
+ _syncEdgeStyle() {
356
+ const s = this.host.style;
357
+ const fade = this.host.uniforms.uEdgeFade?.value ?? 1;
358
+ const opacity = Math.min(1, Math.max(0, s.edgeOpacity ?? 0.6)) *
359
+ clampOpacity(s.opacity) *
360
+ fade;
361
+ const u = this.edgeMaterial.uniforms;
362
+ u.uColor.value.set(s.edgeColor);
363
+ u.uWidth.value = Math.max(0.1, s.edgeWidth ?? 1.5);
364
+ u.uOpacity.value = opacity;
365
+ // 外推距离只在 offset 画法下非 0;其它画法把线钉在面上(与改动前一致)
366
+ u.uOffset.value = this._modes.offset ? Math.max(0, s.edgeOffset ?? 0.15) : 0;
367
+ // 外扩轮廓壳与折边线共用颜色 / 透明度,厚度是米制的单独一项
368
+ const h = this._hullStyleUniforms;
369
+ h.uColor.value.set(s.edgeColor);
370
+ h.uWidth.value = Math.max(0, s.edgeHullWidth ?? 0.9);
371
+ h.uOpacity.value = opacity;
372
+ // GPU 描边(edges: 'gpu')是后处理,参数每帧从 style 现取,这里不用同步 uniform
373
+ // 预制棱线缓存(LineBasicMaterial)同步颜色 / 不透明度
374
+ if (this._creaseLines) {
375
+ const m = this._creaseLines.material;
376
+ m.color.set(s.edgeColor);
377
+ m.opacity = opacity;
378
+ }
379
+ }
380
+ /** 让数据自带的棱线跟着 style.edgeColor / opacity 走(这些是 LineBasicMaterial,改不了粗细) */
381
+ _styleEdgeLine(lines) {
382
+ const mat = lines.material;
383
+ if (!mat || !mat.color)
384
+ return;
385
+ mat.color.set(this.host.style.edgeColor);
386
+ const baseOpacity = this.host.style.edgeOpacity ?? 0.6;
387
+ mat.opacity =
388
+ baseOpacity *
389
+ clampOpacity(this.host.style.opacity) *
390
+ (this.host.uniforms.uEdgeFade?.value ?? 1);
391
+ mat.transparent = true;
392
+ mat.polygonOffset = true;
393
+ mat.polygonOffsetFactor = -1;
394
+ mat.polygonOffsetUnits = -1;
395
+ mat.needsUpdate = true;
396
+ }
397
+ /**
398
+ * 刷新所有棱线外观。
399
+ *
400
+ * 数据自带的棱线是逐对象的 LineBasicMaterial,改颜色只能一个个写;但原来每次都要
401
+ * 遍历整个数据集树(几千个节点),颜色动画逐帧跑就是灾难。改成只刷注册时收集好的
402
+ * 那批 LineSegments,复杂度降到 O(棱线条数)。
403
+ */
404
+ _refreshEdgeLines() {
405
+ this._syncEdgeStyle();
406
+ for (const lines of this._nativeLines) {
407
+ if (lines.parent)
408
+ this._styleEdgeLine(lines);
409
+ }
410
+ }
411
+ /** 地形 / 绿地 / 道路 / 地面铺装等不参与自动描边(数据自带棱线包另说) */
412
+ /** 数据集级别的棱线开关:enableEdges 优先,否则跟随全局 style.edges */
413
+ _datasetEdgesEnabled(entry) {
414
+ const opt = entry.options?.enableEdges;
415
+ if (opt === true)
416
+ return true;
417
+ if (opt === false)
418
+ return false;
419
+ return this._enabled;
420
+ }
421
+ /** 该 mesh 是否命中「跳过自动描边」的关键字(skeletonName / 数据集名) */
422
+ _shouldSkipAutoEdges(ud, datasetName) {
423
+ const hay = `${ud.skeletonName ?? ''} ${datasetName}`.toLowerCase();
424
+ return EDGE_SKIP_KEYWORDS.some((k) => hay.includes(k));
425
+ }
426
+ /**
427
+ * 这块网格还缺哪种棱线装饰(缺就建,齐了就不动)。
428
+ *
429
+ * setEdges 的分片建线靠它筛「还没建完的」,注册新瓦片也靠它决定要不要动手。
430
+ */
431
+ _needsEdgeDecoration(ud) {
432
+ if (this._modes.line && !ud.edges)
433
+ return true;
434
+ if (this._modes.hull && !ud.edgeHull)
435
+ return true;
436
+ return false;
437
+ }
438
+ /** 按当前画法补齐这块网格的棱线装饰 */
439
+ _ensureEdgeDecoration(mesh) {
440
+ if (this._modes.line)
441
+ this._ensureEdges(mesh);
442
+ if (this._modes.hull)
443
+ this._ensureHull(mesh);
444
+ }
445
+ _ensureEdges(mesh) {
446
+ const ud = mesh.userData;
447
+ if (ud.edges || ud.nativeEdges || !mesh.geometry)
448
+ return;
449
+ // 地形 / 绿地 / 道路等不参与自动描边(即使全局开棱线也要跳过)
450
+ if (this._shouldSkipAutoEdges(ud, ''))
451
+ return;
452
+ const posAttr = mesh.geometry.getAttribute('position');
453
+ const indexCount = mesh.geometry.index?.count ?? (posAttr ? posAttr.count : 0);
454
+ // 棱线是 CPU 端建的,超大几何直接跳过,避免拖慢加载
455
+ if (indexCount > 120000)
456
+ return;
457
+ // 1. 先做顶点容差焊合,让相邻三角形正确共享边索引。
458
+ // S3M 几何常为「每面独立顶点」,不焊合的话 EdgesGeometry 会把每条三角形边都当成边界,棱线爆炸。
459
+ // 注意用本地实现而不是 three/examples/jsm —— jsm 子路径导入会在宿主里
460
+ // 制造第二份 three 实例("Multiple instances of Three.js" 警告的元凶)。
461
+ // tolerance 取米级模型下的 5mm,足以合并重合顶点又不会误并真实相邻面。
462
+ const welded = mergeVerticesByPosition(mesh.geometry, 0.005);
463
+ // 2. 调大临界角(默认 55°,可在 style.edgeThreshold 调),过滤浅坡与曲面细分,只保留真正的棱。
464
+ const thresholdAngle = this.host.style.edgeThreshold ?? 55;
465
+ // 'offset' 画法要额外带一条「边法线」才知道往哪推,所以走本地实现(它本来就算好了
466
+ // 相邻两面法线);其余画法保持 EdgesGeometry 这条老路,几何输出与改动前逐字一致。
467
+ let segments;
468
+ let normals;
469
+ if (this._modes.offset) {
470
+ const raw = [];
471
+ segments = buildFeatureEdgeSegments(welded, null, thresholdAngle, raw);
472
+ if (raw.length > 0)
473
+ normals = new Float32Array(raw);
474
+ }
475
+ else {
476
+ const source = new THREE.EdgesGeometry(welded, thresholdAngle);
477
+ const attr = source.getAttribute('position');
478
+ segments = attr ? attr.array : null;
479
+ source.dispose();
480
+ }
481
+ welded.dispose();
482
+ if (!segments || segments.length < 6)
483
+ return;
484
+ // 3. 回填每段棱线所属的单体 batchId。
485
+ // EdgesGeometry 只输出坐标不输出顶点号,只能拿端点坐标去查「位置 → batchId」表。
486
+ // 没有这张表,单体一动棱线就留在原地——这正是「棱线跟随」的关键一环。
487
+ const TOL = 0.005;
488
+ const batchMap = buildPositionBatchMap(mesh.geometry, TOL);
489
+ let batchIds;
490
+ if (batchMap) {
491
+ const segCount = segments.length / 6;
492
+ batchIds = new Float32Array(segCount);
493
+ for (let i = 0; i < segCount; i++) {
494
+ const s = i * 6;
495
+ batchIds[i] =
496
+ batchMap.get(positionQuantKey(segments[s], segments[s + 1], segments[s + 2], 1 / TOL)) ?? -1;
497
+ }
498
+ }
499
+ const lines = new THREE.Mesh(buildThickLineGeometry(segments, batchIds, normals), this.createPerMeshEdgeMaterial(mesh));
500
+ lines.renderOrder = 2;
501
+ // 屏幕空间外扩后可能超出原包围球,关掉剔除更稳
502
+ lines.frustumCulled = false;
503
+ lines.raycast = () => { };
504
+ lines.userData.isThickEdge = true;
505
+ ud.edges = lines;
506
+ mesh.add(lines); // 作为子节点,自动继承 mesh 的世界变换
507
+ }
508
+ /**
509
+ * 给一块网格挂「背面外扩轮廓」(整场景版)。
510
+ *
511
+ * 复用选中侧那套 `createOutlineMaterial`:顶点沿法线鼓 `edgeHullWidth` 米、只画背面,
512
+ * 于是被本体挡住的部分不显示,露出来的那圈就是描边。与折边线的差别在于——
513
+ * 这里**不建任何新几何**,成本只是把同一块网格多画一遍,折边判定那套 CPU 活全省了。
514
+ *
515
+ * 实例化几何拿不到逐实例变换(轮廓壳是 mesh 的子节点,不吃 instanceMatrix),
516
+ * 直接跳过:宁可这栋没描边,也不要所有实例的壳叠在原点。
517
+ */
518
+ _ensureHull(mesh) {
519
+ const ud = mesh.userData;
520
+ if (ud.edgeHull || !mesh.geometry)
521
+ return;
522
+ if (mesh.isInstancedMesh)
523
+ return;
524
+ // 地形 / 绿地 / 道路等不参与自动描边(即使全局开棱线也要跳过)
525
+ if (this._shouldSkipAutoEdges(ud, ''))
526
+ return;
527
+ // 逐网格一份材质(各绑各的单体状态纹理),外观 uniform 复用共享对象
528
+ const mat = createOutlineMaterial(this.host.uniforms, this.host.style.edgeHullWidth ?? 0.9, this._hullStyleUniforms, true);
529
+ // 整块几何都要外扩:选中侧靠 uSelBatch 只扩一栋,全局必须置 whole
530
+ mat.uniforms.uSelWhole.value = 1;
531
+ mat.uniforms.uSelBatch.value = -1;
532
+ const styled = styledMaterialOf(mesh);
533
+ if (styled?.userData?.uBatchTex) {
534
+ mat.uniforms.uBatchTex.value = styled.userData.uBatchTex.value;
535
+ mat.uniforms.uBatchTexWidth.value = styled.userData.uBatchTexWidth.value;
536
+ mat.uniforms.uBatchTexActive.value = styled.userData.uBatchTexActive.value;
537
+ }
538
+ const hull = new THREE.Mesh(mesh.geometry, mat);
539
+ hull.renderOrder = 2;
540
+ hull.frustumCulled = false;
541
+ hull.raycast = () => { };
542
+ hull.userData.isEdgeHull = true;
543
+ ud.edgeHull = hull;
544
+ mesh.add(hull); // 作为子节点,自动继承 mesh 的世界变换
545
+ }
546
+ /**
547
+ * 给一块网格造专属的棱线材质。
548
+ *
549
+ * 棱线材质必须逐网格一份,因为它要绑定**这个网格**的单体状态纹理;但外观
550
+ * (颜色 / 粗细 / 透明度)必须全局统一——所以外观 uniform 直接复用
551
+ * `_edgeStyleUniforms` 里的对象,`_syncEdgeStyle()` 改一次全部生效,
552
+ * program 也因为着色器相同而只编译一次。
553
+ */
554
+ /** 选中棱线的逐网格材质,道理同上 */
555
+ _createSelectionEdgeMaterial(mesh) {
556
+ const styled = styledMaterialOf(mesh);
557
+ const batch = styled?.userData?.uBatchTex
558
+ ? {
559
+ uBatchTex: styled.userData.uBatchTex,
560
+ uBatchTex2: styled.userData.uBatchTex2,
561
+ uBatchMix: this.host.uniforms.uBatchMix,
562
+ uBatchTexWidth: styled.userData.uBatchTexWidth,
563
+ uBatchTexActive: styled.userData.uBatchTexActive,
564
+ uPathTex: this.host.uniforms.uPathTex,
565
+ uPathCount: this.host.uniforms.uPathCount,
566
+ uPathTexActive: this.host.uniforms.uPathTexActive,
567
+ uPathTime: this.host.uniforms.uPathTime,
568
+ }
569
+ : undefined;
570
+ return createThickLineMaterial(this.lineShared, {}, this._selEdgeStyleUniforms, batch);
571
+ }
572
+ _removeEdges(mesh) {
573
+ const ud = mesh.userData;
574
+ const lines = ud.edges;
575
+ if (lines) {
576
+ mesh.remove(lines);
577
+ lines.geometry?.dispose();
578
+ // 棱线材质现在是逐网格一份(要绑各自的 batch 纹理),得跟着释放
579
+ const mat = lines.material;
580
+ if (Array.isArray(mat)) {
581
+ mat.forEach((m) => m?.dispose?.());
582
+ }
583
+ else {
584
+ mat?.dispose?.();
585
+ }
586
+ ud.edges = null;
587
+ }
588
+ // 外扩壳的 geometry 是**复用主网格的**,只能释放材质,不能 dispose 几何
589
+ const hull = ud.edgeHull;
590
+ if (hull) {
591
+ mesh.remove(hull);
592
+ const hmat = hull.material;
593
+ if (Array.isArray(hmat))
594
+ hmat.forEach((m) => m?.dispose?.());
595
+ else
596
+ hmat?.dispose?.();
597
+ ud.edgeHull = null;
598
+ }
599
+ }
600
+ /** 让全局棱线材质跟上当前 style(颜色 / 粗细 / 透明度 / 外推距离),O(1) */
601
+ syncStyle() {
602
+ this._syncEdgeStyle();
603
+ }
604
+ /** 刷新所有棱线外观:共享材质 + 数据自带的那批 LineSegments */
605
+ refreshLines() {
606
+ this._refreshEdgeLines();
607
+ }
608
+ /** 释放所有现算棱线几何(临界角 / 画法变了要重建,见 setEdges) */
609
+ disposeEdgeGeometry() {
610
+ this._disposeEdges();
611
+ }
612
+ /** @internal 给一块网格补折边线(单测直接调,观察顶点焊合 / 临界角) */
613
+ ensureEdges(mesh) {
614
+ this._ensureEdges(mesh);
615
+ }
616
+ /** 拆掉一块网格的棱线与外扩壳(瓦片淘汰时调) */
617
+ removeEdges(mesh) {
618
+ this._removeEdges(mesh);
619
+ }
620
+ /** 选中棱线的逐网格材质 */
621
+ createSelectionEdgeMaterial(mesh) {
622
+ return this._createSelectionEdgeMaterial(mesh);
623
+ }
624
+ }
625
+ function isPointCloud(o) {
626
+ return o.isPoints === true;
627
+ }
628
+ //# sourceMappingURL=EdgeDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EdgeDecorator.js","sourceRoot":"","sources":["../../../src/render/viewer/EdgeDecorator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GAKd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,GAIjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,2CAA2C;AAC3C,SAAS,gBAAgB,CAAC,IAAgB;IACxC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC1E,OAAQ,CAAgC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAE,CAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9F,CAAC;AAED,0CAA0C;AAC1C,SAAS,YAAY,CAAC,CAA4B;IAChD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,6CAA6C;AAC7C,MAAM,kBAAkB,GAAG;IACzB,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;IACzD,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;CACnC,CAAC;AAwCF,MAAM,OAAO,aAAa;IAuBK;IAtB7B,uCAAuC;IAC9B,UAAU,CAAqB;IACxC,4CAA4C;IACnC,YAAY,CAAoB;IACzC,kCAAkC;IACzB,qBAAqB,CAAoB;IAEjC,kBAAkB,CAAyB;IAC3C,qBAAqB,CAAyB;IAC9C,kBAAkB,CAAuB;IAElD,QAAQ,GAAG,KAAK,CAAC;IACjB,MAAM,CAAY;IAC1B,kDAAkD;IAC1C,YAAY,GAA8B,IAAI,CAAC;IACvD,wCAAwC;IACvB,YAAY,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC9D,gDAAgD;IACxC,QAAQ,GAAuB,IAAI,CAAC;IAC5C,oCAAoC;IACnB,aAAa,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;IAEnD,YAA6B,IAAc;QAAd,SAAI,GAAJ,IAAI,CAAU;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,wBAAwB,EAAE,CAAC;QAC7C,IAAI,CAAC,kBAAkB,GAAG;YACxB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACnD,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG,CAAC,EAAE;YACxD,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;YACxB,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI,EAAE;SAC7C,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,KAKZ,CAAC;QACF,IAAI,CAAC,qBAAqB,GAAG;YAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,IAAI,SAAS,CAAC,EAAE;YACtF,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,EAAE;YAC1D,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;YACtB,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE;SACjD,CAAC;QACF,IAAI,CAAC,qBAAqB,GAAG,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACtG,IAAI,CAAC,kBAAkB,GAAG;YACxB,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;YACnD,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,EAAE;YAC1D,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACzB,CAAC;IACJ,CAAC;IAED,eAAe;IACf,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,cAAc;IACd,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,yBAAyB;IACzB,cAAc,CAAC,SAAkB;QAC/B,OAAO,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;IACjF,CAAC;IAED,wBAAwB;IACxB,kBAAkB,CAAC,KAAyB,EAAE,OAAgB;QAC5D,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,wBAAwB;IACxB,oBAAoB,CAAC,KAAyB;QAC5C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,+CAA+C;IAC/C,YAAY,CAAC,IAAgB,EAAE,KAAsB,EAAE,cAAuB;QAC5E,IAAI,cAAc,IAAI,YAAY,CAAC,IAAI,CAAC;YAAE,OAAO;QACjD,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;YAAE,OAAO;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,QAAwB,CAAC;QACzC,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO;QACtD,2CAA2C;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;aACtE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,+BAA+B;IAC/B,UAAU;QACR,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;IACvC,CAAC;IAED,6CAA6C;IAC7C,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,CAAC,CAAqB;QAC/B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,mCAAmC;IACnC,cAAc;QACZ,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,uCAAuC;IACvC,cAAc,CAAC,MAAyB;QACtC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;YAAE,OAAO;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QAChG,IAAI,OAAO,IAAI,KAAK;YAAE,OAAO;QAE7B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC;YAAE,OAAO;QAE/C,uDAAuD;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAElE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;YACzE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC1C,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC;YACvC,eAAe;YACf,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,yBAAyB,CAAC,IAAgB,EAAE,SAAS,GAAG,KAAK;QAC3D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS;YACvC,CAAC,CAAC;gBACE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS;gBACpC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;gBACtC,SAAS,EAAE,CAAC,CAAC,SAAS;gBACtB,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc;gBAC9C,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;gBAChD,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,cAAc,EAAE,CAAC,CAAC,cAAc;gBAChC,SAAS,EAAE,CAAC,CAAC,SAAS;aACvB;YACH,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,uBAAuB,CAC5B,IAAI,CAAC,UAAU,EACf,EAAE,EACF,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAChE,KAAK,CACN,CAAC;IACJ,CAAC;IACD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,CAAC,KAAkB,EAAE,UAA8B;QACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACtC,4CAA4C;QAC5C,8BAA8B;QAC9B,2CAA2C;QAC3C,MAAM,YAAY,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAExD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC;QAEpC,iDAAiD;QACjD,uDAAuD;QACvD,4CAA4C;QAC5C,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;QAC5F,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,KAAK,CAAC,OAAO,GAAG,aAAa,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,sCAAsC;QACtC,gCAAgC;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE;oBACzC,GAAG,UAAU;oBACb,UAAU,EAAE,GAAG,EAAE;wBACf,IAAI,CAAC,aAAa,EAAE,CAAC;wBACrB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;wBAC3B,UAAU,EAAE,UAAU,EAAE,EAAE,CAAC;oBAC7B,CAAC;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,YAAY;YAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAEvC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;aAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,MAAM,EAAE,GAAG,CAAC,CAAC,QAAwB,CAAC;YACtC,UAAU;YACV,IAAI,YAAY,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAClC,sDAAsD;YACtD,mCAAmC;YACnC,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;YACtF,OAAO,CAAC,EAAE,CAAC,WAAW,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,MAAM,IAAI,GAAG,GAAS,EAAE;YACtB,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;gBAAE,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClG,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM;gBAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;;gBACvC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAClC,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;QAEP,IAAI,QAAQ,EAAE,CAAC;YACb,wCAAwC;YACxC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,wBAAwB;IAChB,YAAY,CAAC,CAAS;QAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,iBAAiB;IACT,aAAa;QACnB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,WAAW,CAAC,GAAW;QAC3B,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE3B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;QACvC,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC;YACtC,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;YACnC,WAAW,EAAE,IAAI;YACjB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;YACjF,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/C,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACtB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC5B,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QAEzB,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7B,CAAC;IAED,kBAAkB;IAClB,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC/B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,QAA2B,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;;OAMG;IACK,cAAc;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC;QACtD,MAAM,OAAO,GACX,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;YAC9C,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;YACvB,IAAI,CAAC;QACP,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QACrC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;QACnD,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC;QAC3B,0CAA0C;QAC1C,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,iCAAiC;QACjC,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;QACrD,CAAC,CAAC,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC;QAC3B,yDAAyD;QACzD,uCAAuC;QACvC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,QAAmC,CAAC;YAChE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC;QACtB,CAAC;IACH,CAAC;IAED,0EAA0E;IAClE,cAAc,CAAC,KAAyB;QAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,QAAmC,CAAC;QACtD,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QAC/B,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,GAAG,CAAC;QACvD,GAAG,CAAC,OAAO;YACT,WAAW;gBACX,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBACrC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;QAC7C,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;QACvB,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;QACzB,GAAG,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC;QAC7B,GAAG,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAC5B,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB;QACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,MAAM;gBAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,mDAAmD;IAC3C,oBAAoB,CAAC,KAAsB;QACjD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC;QACvC,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,mDAAmD;IAC3C,oBAAoB,CAAC,EAAgB,EAAE,WAAmB;QAChE,MAAM,GAAG,GAAG,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,WAAW,EAAE,CAAC;QACpE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACK,oBAAoB,CAAC,EAAgB;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAC/C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uBAAuB;IACf,qBAAqB,CAAC,IAAgB;QAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI;YAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,YAAY,CAAC,IAAgB;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAwB,CAAC;QACzC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QACzD,oCAAoC;QACpC,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC;YAAE,OAAO;QAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,8BAA8B;QAC9B,IAAI,UAAU,GAAG,MAAM;YAAE,OAAO;QAEhC,6BAA6B;QAC7B,8DAA8D;QAC9D,qDAAqD;QACrD,6DAA6D;QAC7D,+CAA+C;QAC/C,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC7D,+DAA+D;QAC/D,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC;QAE3D,+CAA+C;QAC/C,kDAAkD;QAClD,IAAI,QAA6B,CAAC;QAClC,IAAI,OAAiC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,GAAa,EAAE,CAAC;YACzB,QAAQ,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;YACvE,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,UAAU,CAAsC,CAAC;YAClF,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,KAAsB,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE7C,0BAA0B;QAC1B,yDAAyD;QACzD,wCAAwC;QACxC,MAAM,GAAG,GAAG,KAAK,CAAC;QAClB,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC3D,IAAI,QAAkC,CAAC;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACrC,QAAQ,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAChB,QAAQ,CAAC,CAAC,CAAC;oBACT,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACjG,CAAC;QACH,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAC1B,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EACnD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CACrC,CAAC;QACF,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;QACtB,yBAAyB;QACzB,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC;QAC5B,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QACxB,KAAK,CAAC,QAAyB,CAAC,WAAW,GAAG,IAAI,CAAC;QACpD,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB;IAC3C,CAAC;IAED;;;;;;;;;OASG;IACK,WAAW,CAAC,IAAgB;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAwB,CAAC;QACzC,IAAI,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1C,IAAK,IAAiD,CAAC,eAAe;YAAE,OAAO;QAC/E,oCAAoC;QACpC,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,EAAE,CAAC;YAAE,OAAO;QAE9C,wCAAwC;QACxC,MAAM,GAAG,GAAG,qBAAqB,CAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAClB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,GAAG,EACpC,IAAI,CAAC,kBAAkB,EACvB,IAAI,CACL,CAAC;QACF,2CAA2C;QAC3C,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QACjC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAsB,CAAC;YAChF,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAe,CAAC;YACnF,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAe,CAAC;QACvF,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;QACvB,IAAI,CAAC,QAAyB,CAAC,UAAU,GAAG,IAAI,CAAC;QAClD,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;IAC1C,CAAC;IAED;;;;;;;OAOG;IACH,sBAAsB;IACd,4BAA4B,CAAC,IAAgB;QACnD,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS;YACvC,CAAC,CAAC;gBACE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,SAAS;gBACpC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;gBACtC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;gBACvC,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc;gBAC9C,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;gBAChD,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBACrC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU;gBACzC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc;gBACjD,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS;aACxC;YACH,CAAC,CAAC,SAAS,CAAC;QACd,OAAO,uBAAuB,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;IACzF,CAAC;IAEO,YAAY,CAAC,IAAgB;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAwB,CAAC;QAEzC,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;QACvB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClB,KAAoB,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC1C,qCAAqC;YACrC,MAAM,GAAG,GAAI,KAAoB,CAAC,QAAQ,CAAC;YAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACL,GAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5B,CAAC;YACD,EAAE,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,iDAAiD;QACjD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC;QACzB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;;gBAChE,IAAY,EAAE,OAAO,EAAE,EAAE,CAAC;YAChC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,SAAS;QACP,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,2CAA2C;IAC3C,YAAY;QACV,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,mBAAmB;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,8CAA8C;IAC9C,WAAW,CAAC,IAAgB;QAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,4BAA4B;IAC5B,WAAW,CAAC,IAAgB;QAC1B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,2BAA2B,CAAC,IAAgB;QAC1C,OAAO,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;CACF;AAED,SAAS,YAAY,CAAC,CAAiB;IACrC,OAAQ,CAAkB,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC/C,CAAC"}