minerva-design 1.4.0 → 1.6.0
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/CHANGELOG.md +15 -0
- package/README.md +21 -21
- package/custom-elements.json +3072 -611
- package/dist/angular/fesm2022/minerva-angular.mjs +1491 -5
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +595 -5
- package/dist/charts/canvas.d.cts +4 -3
- package/dist/charts/canvas.d.ts +4 -3
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +6 -4
- package/dist/charts/core.d.ts +6 -4
- package/dist/charts/core.js +24 -16
- package/dist/charts/engine/axis.cjs +1 -1
- package/dist/charts/engine/axis.cjs.map +1 -1
- package/dist/charts/engine/axis.js +42 -19
- package/dist/charts/engine/axis.js.map +1 -1
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +155 -127
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +370 -255
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +18 -0
- package/dist/charts/engine/color.d.ts +18 -0
- package/dist/charts/engine/color.js +48 -2
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +34 -1
- package/dist/charts/engine/controller.d.ts +34 -1
- package/dist/charts/engine/controller.js +318 -273
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +3 -1
- package/dist/charts/engine/data.d.ts +3 -1
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +2 -0
- package/dist/charts/engine/defaults.cjs.map +1 -0
- package/dist/charts/engine/defaults.d.cts +20 -0
- package/dist/charts/engine/defaults.d.ts +20 -0
- package/dist/charts/engine/defaults.js +35 -0
- package/dist/charts/engine/defaults.js.map +1 -0
- package/dist/charts/engine/format.cjs +1 -1
- package/dist/charts/engine/format.cjs.map +1 -1
- package/dist/charts/engine/format.d.cts +6 -0
- package/dist/charts/engine/format.d.ts +6 -0
- package/dist/charts/engine/format.js +15 -2
- package/dist/charts/engine/format.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +2 -0
- package/dist/charts/engine/graph/chart.cjs.map +1 -0
- package/dist/charts/engine/graph/chart.d.cts +3 -0
- package/dist/charts/engine/graph/chart.d.ts +3 -0
- package/dist/charts/engine/graph/chart.js +1708 -0
- package/dist/charts/engine/graph/chart.js.map +1 -0
- package/dist/charts/engine/graph/circular.cjs +2 -0
- package/dist/charts/engine/graph/circular.cjs.map +1 -0
- package/dist/charts/engine/graph/circular.d.cts +16 -0
- package/dist/charts/engine/graph/circular.d.ts +16 -0
- package/dist/charts/engine/graph/circular.js +62 -0
- package/dist/charts/engine/graph/circular.js.map +1 -0
- package/dist/charts/engine/graph/dag.cjs +2 -0
- package/dist/charts/engine/graph/dag.cjs.map +1 -0
- package/dist/charts/engine/graph/dag.d.cts +34 -0
- package/dist/charts/engine/graph/dag.d.ts +34 -0
- package/dist/charts/engine/graph/dag.js +339 -0
- package/dist/charts/engine/graph/dag.js.map +1 -0
- package/dist/charts/engine/graph/dom.cjs +2 -0
- package/dist/charts/engine/graph/dom.cjs.map +1 -0
- package/dist/charts/engine/graph/dom.d.cts +23 -0
- package/dist/charts/engine/graph/dom.d.ts +23 -0
- package/dist/charts/engine/graph/dom.js +158 -0
- package/dist/charts/engine/graph/dom.js.map +1 -0
- package/dist/charts/engine/graph/force.cjs +2 -0
- package/dist/charts/engine/graph/force.cjs.map +1 -0
- package/dist/charts/engine/graph/force.d.cts +76 -0
- package/dist/charts/engine/graph/force.d.ts +76 -0
- package/dist/charts/engine/graph/force.js +423 -0
- package/dist/charts/engine/graph/force.js.map +1 -0
- package/dist/charts/engine/graph/geometry.cjs +2 -0
- package/dist/charts/engine/graph/geometry.cjs.map +1 -0
- package/dist/charts/engine/graph/geometry.d.cts +50 -0
- package/dist/charts/engine/graph/geometry.d.ts +50 -0
- package/dist/charts/engine/graph/geometry.js +197 -0
- package/dist/charts/engine/graph/geometry.js.map +1 -0
- package/dist/charts/engine/graph/index.cjs +1 -0
- package/dist/charts/engine/graph/index.d.cts +6 -0
- package/dist/charts/engine/graph/index.d.ts +6 -0
- package/dist/charts/engine/graph/index.js +6 -0
- package/dist/charts/engine/graph/labels.cjs +2 -0
- package/dist/charts/engine/graph/labels.cjs.map +1 -0
- package/dist/charts/engine/graph/labels.d.cts +12 -0
- package/dist/charts/engine/graph/labels.d.ts +12 -0
- package/dist/charts/engine/graph/labels.js +128 -0
- package/dist/charts/engine/graph/labels.js.map +1 -0
- package/dist/charts/engine/graph/model.cjs +2 -0
- package/dist/charts/engine/graph/model.cjs.map +1 -0
- package/dist/charts/engine/graph/model.d.cts +52 -0
- package/dist/charts/engine/graph/model.d.ts +52 -0
- package/dist/charts/engine/graph/model.js +108 -0
- package/dist/charts/engine/graph/model.js.map +1 -0
- package/dist/charts/engine/graph/sizing.cjs +2 -0
- package/dist/charts/engine/graph/sizing.cjs.map +1 -0
- package/dist/charts/engine/graph/sizing.d.cts +33 -0
- package/dist/charts/engine/graph/sizing.d.ts +33 -0
- package/dist/charts/engine/graph/sizing.js +60 -0
- package/dist/charts/engine/graph/sizing.js.map +1 -0
- package/dist/charts/engine/graph/tree.cjs +2 -0
- package/dist/charts/engine/graph/tree.cjs.map +1 -0
- package/dist/charts/engine/graph/tree.d.cts +30 -0
- package/dist/charts/engine/graph/tree.d.ts +30 -0
- package/dist/charts/engine/graph/tree.js +218 -0
- package/dist/charts/engine/graph/tree.js.map +1 -0
- package/dist/charts/engine/graph/types.d.cts +640 -0
- package/dist/charts/engine/graph/types.d.ts +640 -0
- package/dist/charts/engine/graph/worker.cjs +52 -0
- package/dist/charts/engine/graph/worker.cjs.map +1 -0
- package/dist/charts/engine/graph/worker.d.cts +36 -0
- package/dist/charts/engine/graph/worker.d.ts +36 -0
- package/dist/charts/engine/graph/worker.js +135 -0
- package/dist/charts/engine/graph/worker.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.d.cts +15 -2
- package/dist/charts/engine/items.d.ts +15 -2
- package/dist/charts/engine/items.js +131 -112
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/labels.cjs +1 -1
- package/dist/charts/engine/labels.cjs.map +1 -1
- package/dist/charts/engine/labels.d.cts +17 -0
- package/dist/charts/engine/labels.d.ts +17 -0
- package/dist/charts/engine/labels.js +28 -4
- package/dist/charts/engine/labels.js.map +1 -1
- package/dist/charts/engine/layout.cjs +1 -1
- package/dist/charts/engine/layout.cjs.map +1 -1
- package/dist/charts/engine/layout.d.cts +9 -0
- package/dist/charts/engine/layout.d.ts +9 -0
- package/dist/charts/engine/layout.js +11 -2
- package/dist/charts/engine/layout.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +73 -3
- package/dist/charts/engine/model.d.ts +73 -3
- package/dist/charts/engine/model.js +258 -154
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/field.cjs +37 -0
- package/dist/charts/engine/orderbook/field.cjs.map +1 -0
- package/dist/charts/engine/orderbook/field.d.cts +92 -0
- package/dist/charts/engine/orderbook/field.d.ts +92 -0
- package/dist/charts/engine/orderbook/field.js +297 -0
- package/dist/charts/engine/orderbook/field.js.map +1 -0
- package/dist/charts/engine/orderbook/format.cjs +1 -1
- package/dist/charts/engine/orderbook/format.cjs.map +1 -1
- package/dist/charts/engine/orderbook/format.d.cts +3 -2
- package/dist/charts/engine/orderbook/format.d.ts +3 -2
- package/dist/charts/engine/orderbook/format.js +5 -5
- package/dist/charts/engine/orderbook/format.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +566 -475
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/host.cjs +1 -1
- package/dist/charts/engine/orderbook/host.cjs.map +1 -1
- package/dist/charts/engine/orderbook/host.d.cts +8 -1
- package/dist/charts/engine/orderbook/host.d.ts +8 -1
- package/dist/charts/engine/orderbook/host.js +27 -5
- package/dist/charts/engine/orderbook/host.js.map +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs +1 -1
- package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
- package/dist/charts/engine/orderbook/ladder.js +1 -1
- package/dist/charts/engine/orderbook/ladder.js.map +1 -1
- package/dist/charts/engine/orderbook/layout.cjs +2 -0
- package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
- package/dist/charts/engine/orderbook/layout.d.cts +42 -0
- package/dist/charts/engine/orderbook/layout.d.ts +42 -0
- package/dist/charts/engine/orderbook/layout.js +76 -0
- package/dist/charts/engine/orderbook/layout.js.map +1 -0
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +4 -4
- package/dist/charts/engine/orderbook/tape.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +27 -3
- package/dist/charts/engine/orderbook/types.d.ts +27 -3
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +27 -0
- package/dist/charts/engine/overlay.d.ts +27 -0
- package/dist/charts/engine/overlay.js +34 -12
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +35 -3
- package/dist/charts/engine/presets.d.ts +35 -3
- package/dist/charts/engine/presets.js +121 -101
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.js +13 -9
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/renderers/detect.cjs +1 -1
- package/dist/charts/engine/renderers/detect.cjs.map +1 -1
- package/dist/charts/engine/renderers/detect.d.cts +2 -1
- package/dist/charts/engine/renderers/detect.d.ts +2 -1
- package/dist/charts/engine/renderers/detect.js +23 -21
- package/dist/charts/engine/renderers/detect.js.map +1 -1
- package/dist/charts/engine/renderers/follow.cjs +2 -0
- package/dist/charts/engine/renderers/follow.cjs.map +1 -0
- package/dist/charts/engine/renderers/follow.d.cts +8 -0
- package/dist/charts/engine/renderers/follow.d.ts +8 -0
- package/dist/charts/engine/renderers/follow.js +10 -0
- package/dist/charts/engine/renderers/follow.js.map +1 -0
- package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
- package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
- package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
- package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
- package/dist/charts/engine/renderers/gl-budget.js +95 -0
- package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
- package/dist/charts/engine/renderers/gl.cjs +1 -1
- package/dist/charts/engine/renderers/gl.cjs.map +1 -1
- package/dist/charts/engine/renderers/gl.js +1 -1
- package/dist/charts/engine/renderers/gl.js.map +1 -1
- package/dist/charts/engine/renderers/shaders.cjs +9 -6
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
- package/dist/charts/engine/renderers/shaders.d.cts +1 -1
- package/dist/charts/engine/renderers/shaders.d.ts +1 -1
- package/dist/charts/engine/renderers/shaders.js +9 -6
- package/dist/charts/engine/renderers/shaders.js.map +1 -1
- package/dist/charts/engine/renderers/types.cjs.map +1 -1
- package/dist/charts/engine/renderers/types.d.cts +2 -0
- package/dist/charts/engine/renderers/types.d.ts +2 -0
- package/dist/charts/engine/renderers/types.js.map +1 -1
- package/dist/charts/engine/renderers/webgl.cjs +1 -1
- package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl.js +85 -64
- package/dist/charts/engine/renderers/webgl.js.map +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl2.js +72 -58
- package/dist/charts/engine/renderers/webgl2.js.map +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgpu.js +1 -1
- package/dist/charts/engine/renderers/webgpu.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +104 -4
- package/dist/charts/engine/scene.d.ts +104 -4
- package/dist/charts/engine/scene.js +412 -193
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +110 -110
- package/dist/charts/engine/shapes/bullet.js.map +1 -1
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.js +4 -1
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/chord.cjs +2 -0
- package/dist/charts/engine/shapes/chord.cjs.map +1 -0
- package/dist/charts/engine/shapes/chord.d.cts +18 -0
- package/dist/charts/engine/shapes/chord.d.ts +18 -0
- package/dist/charts/engine/shapes/chord.js +419 -0
- package/dist/charts/engine/shapes/chord.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.d.cts +5 -1
- package/dist/charts/engine/shapes/draw.d.ts +5 -1
- package/dist/charts/engine/shapes/draw.js +47 -17
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/hit.cjs +1 -1
- package/dist/charts/engine/shapes/hit.cjs.map +1 -1
- package/dist/charts/engine/shapes/hit.d.cts +3 -1
- package/dist/charts/engine/shapes/hit.d.ts +3 -1
- package/dist/charts/engine/shapes/hit.js +75 -46
- package/dist/charts/engine/shapes/hit.js.map +1 -1
- package/dist/charts/engine/shapes/index.d.cts +3 -2
- package/dist/charts/engine/shapes/index.d.ts +3 -2
- package/dist/charts/engine/shapes/labels.cjs +1 -1
- package/dist/charts/engine/shapes/labels.cjs.map +1 -1
- package/dist/charts/engine/shapes/labels.js +12 -4
- package/dist/charts/engine/shapes/labels.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +3 -1
- package/dist/charts/engine/shapes/layout.d.ts +3 -1
- package/dist/charts/engine/shapes/layout.js +106 -78
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/scene.cjs +1 -1
- package/dist/charts/engine/shapes/scene.cjs.map +1 -1
- package/dist/charts/engine/shapes/scene.d.cts +33 -3
- package/dist/charts/engine/shapes/scene.d.ts +33 -3
- package/dist/charts/engine/shapes/scene.js +62 -19
- package/dist/charts/engine/shapes/scene.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +121 -8
- package/dist/charts/engine/shapes/types.d.ts +121 -8
- package/dist/charts/engine/signature.cjs +1 -1
- package/dist/charts/engine/signature.cjs.map +1 -1
- package/dist/charts/engine/signature.js +1 -1
- package/dist/charts/engine/signature.js.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.d.cts +41 -3
- package/dist/charts/engine/three-d/canvas2d.d.ts +41 -3
- package/dist/charts/engine/three-d/canvas2d.js +166 -67
- package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
- package/dist/charts/engine/three-d/chart.cjs +1 -1
- package/dist/charts/engine/three-d/chart.cjs.map +1 -1
- package/dist/charts/engine/three-d/chart.js +219 -215
- package/dist/charts/engine/three-d/chart.js.map +1 -1
- package/dist/charts/engine/three-d/detect.cjs +1 -1
- package/dist/charts/engine/three-d/detect.cjs.map +1 -1
- package/dist/charts/engine/three-d/detect.d.cts +3 -2
- package/dist/charts/engine/three-d/detect.d.ts +3 -2
- package/dist/charts/engine/three-d/detect.js +22 -20
- package/dist/charts/engine/three-d/detect.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.d.cts +6 -0
- package/dist/charts/engine/three-d/geometry.d.ts +6 -0
- package/dist/charts/engine/three-d/geometry.js +106 -90
- package/dist/charts/engine/three-d/geometry.js.map +1 -1
- package/dist/charts/engine/three-d/model.cjs +1 -1
- package/dist/charts/engine/three-d/model.cjs.map +1 -1
- package/dist/charts/engine/three-d/model.d.cts +2 -0
- package/dist/charts/engine/three-d/model.d.ts +2 -0
- package/dist/charts/engine/three-d/model.js +2 -0
- package/dist/charts/engine/three-d/model.js.map +1 -1
- package/dist/charts/engine/three-d/oit.cjs +109 -0
- package/dist/charts/engine/three-d/oit.cjs.map +1 -0
- package/dist/charts/engine/three-d/oit.d.cts +34 -0
- package/dist/charts/engine/three-d/oit.d.ts +34 -0
- package/dist/charts/engine/three-d/oit.js +111 -0
- package/dist/charts/engine/three-d/oit.js.map +1 -0
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +43 -36
- package/dist/charts/engine/three-d/overlay.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +37 -3
- package/dist/charts/engine/three-d/render-types.d.ts +37 -3
- package/dist/charts/engine/three-d/render-types.js +6 -10
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +109 -48
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +12 -5
- package/dist/charts/engine/three-d/shaders.d.ts +12 -5
- package/dist/charts/engine/three-d/shaders.js +118 -55
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/sort.cjs +1 -1
- package/dist/charts/engine/three-d/sort.cjs.map +1 -1
- package/dist/charts/engine/three-d/sort.d.cts +18 -5
- package/dist/charts/engine/three-d/sort.d.ts +18 -5
- package/dist/charts/engine/three-d/sort.js +129 -43
- package/dist/charts/engine/three-d/sort.js.map +1 -1
- package/dist/charts/engine/three-d/types.d.cts +36 -0
- package/dist/charts/engine/three-d/types.d.ts +36 -0
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.d.cts +9 -0
- package/dist/charts/engine/three-d/webgl.d.ts +9 -0
- package/dist/charts/engine/three-d/webgl.js +199 -74
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +231 -94
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.d.cts +10 -1
- package/dist/charts/engine/trading/chart.d.ts +10 -1
- package/dist/charts/engine/trading/chart.js +1677 -813
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/drawings.cjs +2 -1
- package/dist/charts/engine/trading/drawings.cjs.map +1 -1
- package/dist/charts/engine/trading/drawings.d.cts +53 -9
- package/dist/charts/engine/trading/drawings.d.ts +53 -9
- package/dist/charts/engine/trading/drawings.js +346 -71
- package/dist/charts/engine/trading/drawings.js.map +1 -1
- package/dist/charts/engine/trading/format.cjs +1 -1
- package/dist/charts/engine/trading/format.cjs.map +1 -1
- package/dist/charts/engine/trading/format.d.cts +19 -0
- package/dist/charts/engine/trading/format.d.ts +19 -0
- package/dist/charts/engine/trading/format.js +65 -21
- package/dist/charts/engine/trading/format.js.map +1 -1
- package/dist/charts/engine/trading/geometry.cjs +1 -1
- package/dist/charts/engine/trading/geometry.cjs.map +1 -1
- package/dist/charts/engine/trading/geometry.d.cts +16 -0
- package/dist/charts/engine/trading/geometry.d.ts +16 -0
- package/dist/charts/engine/trading/geometry.js +19 -4
- package/dist/charts/engine/trading/geometry.js.map +1 -1
- package/dist/charts/engine/trading/index.cjs +1 -1
- package/dist/charts/engine/trading/index.d.cts +2 -1
- package/dist/charts/engine/trading/index.d.ts +2 -1
- package/dist/charts/engine/trading/index.js +4 -3
- package/dist/charts/engine/trading/indicators.cjs +1 -1
- package/dist/charts/engine/trading/indicators.cjs.map +1 -1
- package/dist/charts/engine/trading/indicators.d.cts +180 -10
- package/dist/charts/engine/trading/indicators.d.ts +180 -10
- package/dist/charts/engine/trading/indicators.js +449 -173
- package/dist/charts/engine/trading/indicators.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +104 -4
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/store.cjs +1 -1
- package/dist/charts/engine/trading/store.cjs.map +1 -1
- package/dist/charts/engine/trading/store.d.cts +21 -0
- package/dist/charts/engine/trading/store.d.ts +21 -0
- package/dist/charts/engine/trading/store.js +22 -1
- package/dist/charts/engine/trading/store.js.map +1 -1
- package/dist/charts/engine/trading/studies.cjs +1 -1
- package/dist/charts/engine/trading/studies.cjs.map +1 -1
- package/dist/charts/engine/trading/studies.d.cts +49 -8
- package/dist/charts/engine/trading/studies.d.ts +49 -8
- package/dist/charts/engine/trading/studies.js +352 -93
- package/dist/charts/engine/trading/studies.js.map +1 -1
- package/dist/charts/engine/trading/sync.cjs +2 -0
- package/dist/charts/engine/trading/sync.cjs.map +1 -0
- package/dist/charts/engine/trading/sync.d.cts +8 -0
- package/dist/charts/engine/trading/sync.d.ts +8 -0
- package/dist/charts/engine/trading/sync.js +25 -0
- package/dist/charts/engine/trading/sync.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +514 -16
- package/dist/charts/engine/trading/types.d.ts +514 -16
- package/dist/charts/engine/types.d.cts +106 -11
- package/dist/charts/engine/types.d.ts +106 -11
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +3 -2
- package/dist/charts/index.d.ts +3 -2
- package/dist/charts/index.js +30 -22
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.js +51 -34
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/graph.cjs +2 -0
- package/dist/charts/react/graph.cjs.map +1 -0
- package/dist/charts/react/graph.d.cts +219 -0
- package/dist/charts/react/graph.d.ts +219 -0
- package/dist/charts/react/graph.js +160 -0
- package/dist/charts/react/graph.js.map +1 -0
- package/dist/charts/react/orderbook.cjs +1 -1
- package/dist/charts/react/orderbook.cjs.map +1 -1
- package/dist/charts/react/orderbook.d.cts +3 -1
- package/dist/charts/react/orderbook.d.ts +3 -1
- package/dist/charts/react/orderbook.js +1 -0
- package/dist/charts/react/orderbook.js.map +1 -1
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +88 -4
- package/dist/charts/react/shapes.d.ts +88 -4
- package/dist/charts/react/shapes.js +55 -12
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/charts/react/three-d.cjs +1 -1
- package/dist/charts/react/three-d.cjs.map +1 -1
- package/dist/charts/react/three-d.d.cts +7 -0
- package/dist/charts/react/three-d.d.ts +7 -0
- package/dist/charts/react/three-d.js +14 -13
- package/dist/charts/react/three-d.js.map +1 -1
- package/dist/charts/react/trading.cjs +1 -1
- package/dist/charts/react/trading.cjs.map +1 -1
- package/dist/charts/react/trading.d.cts +54 -2
- package/dist/charts/react/trading.d.ts +54 -2
- package/dist/charts/react/trading.js +68 -37
- package/dist/charts/react/trading.js.map +1 -1
- package/dist/charts/react/types.d.cts +11 -0
- package/dist/charts/react/types.d.ts +11 -0
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +5 -4
- package/dist/native/charts/src/engine/axis.cjs +1 -1
- package/dist/native/charts/src/engine/axis.cjs.map +1 -1
- package/dist/native/charts/src/engine/axis.js +42 -19
- package/dist/native/charts/src/engine/axis.js.map +1 -1
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +47 -5
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +296 -251
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/format.cjs +1 -1
- package/dist/native/charts/src/engine/format.cjs.map +1 -1
- package/dist/native/charts/src/engine/format.js +15 -2
- package/dist/native/charts/src/engine/format.js.map +1 -1
- package/dist/native/charts/src/engine/labels.cjs +1 -1
- package/dist/native/charts/src/engine/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/labels.js +42 -5
- package/dist/native/charts/src/engine/labels.js.map +1 -1
- package/dist/native/charts/src/engine/layout.cjs +1 -1
- package/dist/native/charts/src/engine/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/layout.js +11 -2
- package/dist/native/charts/src/engine/layout.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +278 -174
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +2 -2
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +110 -90
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +421 -202
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
- package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
- package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
- package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
- package/dist/native/charts/src/engine/shapes/chord.js +419 -0
- package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +47 -17
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.js +73 -44
- package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.js +12 -4
- package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +136 -94
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.js +62 -19
- package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
- package/dist/native/components/Chart/ChartBase.cjs +1 -1
- package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
- package/dist/native/components/Chart/ChartBase.js +127 -115
- package/dist/native/components/Chart/ChartBase.js.map +1 -1
- package/dist/native/components/Chart/charts.cjs +1 -1
- package/dist/native/components/Chart/charts.cjs.map +1 -1
- package/dist/native/components/Chart/charts.js +8 -5
- package/dist/native/components/Chart/charts.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.d.cts +6 -1
- package/dist/native/components/Chart/scene.d.ts +6 -1
- package/dist/native/components/Chart/scene.js +226 -108
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/components/Chart/types.d.cts +7 -1
- package/dist/native/components/Chart/types.d.ts +7 -1
- package/dist/native/components/Charts/charts.cjs +1 -1
- package/dist/native/components/Charts/charts.cjs.map +1 -1
- package/dist/native/components/Charts/charts.js +60 -43
- package/dist/native/components/Charts/charts.js.map +1 -1
- package/dist/native/components/Charts/types.d.cts +11 -0
- package/dist/native/components/Charts/types.d.ts +11 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -106
- package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
- package/dist/native/components/ShapeChart/charts.cjs +1 -1
- package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
- package/dist/native/components/ShapeChart/charts.d.cts +6 -1
- package/dist/native/components/ShapeChart/charts.d.ts +6 -1
- package/dist/native/components/ShapeChart/charts.js +138 -96
- package/dist/native/components/ShapeChart/charts.js.map +1 -1
- package/dist/native/components/ShapeChart/draw.cjs +1 -1
- package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
- package/dist/native/components/ShapeChart/draw.d.cts +1 -1
- package/dist/native/components/ShapeChart/draw.d.ts +1 -1
- package/dist/native/components/ShapeChart/draw.js +26 -17
- package/dist/native/components/ShapeChart/draw.js.map +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
- package/dist/native/components/ShapeChart/geometry.js +233 -70
- package/dist/native/components/ShapeChart/geometry.js.map +1 -1
- package/dist/native/components/ShapeChart/index.cjs +1 -1
- package/dist/native/components/ShapeChart/index.d.cts +1 -1
- package/dist/native/components/ShapeChart/index.d.ts +1 -1
- package/dist/native/components/ShapeChart/index.js +2 -2
- package/dist/native/components/ShapeChart/recorder.cjs +1 -1
- package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
- package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
- package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
- package/dist/native/components/ShapeChart/recorder.js +19 -10
- package/dist/native/components/ShapeChart/recorder.js.map +1 -1
- package/dist/native/components/ShapeChart/types.d.cts +95 -8
- package/dist/native/components/ShapeChart/types.d.ts +95 -8
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.js +2 -2
- package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
- package/dist/native/source/components/Chart/charts.tsx +10 -3
- package/dist/native/source/components/Chart/scene.tsx +243 -14
- package/dist/native/source/components/Chart/types.ts +7 -0
- package/dist/native/source/components/Charts/charts.tsx +37 -2
- package/dist/native/source/components/Charts/types.ts +11 -0
- package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -34
- package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
- package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
- package/dist/native/source/components/ShapeChart/geometry.ts +376 -25
- package/dist/native/source/components/ShapeChart/index.ts +1 -0
- package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
- package/dist/native/source/components/ShapeChart/types.ts +99 -6
- package/dist/native/source/manifest.ts +1 -0
- package/dist/taro/chart-a11y.d.ts +7 -0
- package/dist/taro/charts.d.ts +29 -6
- package/dist/taro/index.js +3129 -1902
- package/dist/taro/shape-charts.d.ts +99 -5
- package/dist/uni/AreaChart.vue +2 -1
- package/dist/uni/AreaChart.vue.d.ts +5 -1
- package/dist/uni/Badge.vue.d.ts +1 -1
- package/dist/uni/BarChart.vue +2 -1
- package/dist/uni/BarChart.vue.d.ts +5 -1
- package/dist/uni/BoxPlotChart.vue +2 -1
- package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
- package/dist/uni/BubbleChart.vue +2 -1
- package/dist/uni/BubbleChart.vue.d.ts +4 -0
- package/dist/uni/BulletChart.vue.d.ts +4 -0
- package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/uni/CandlestickChart.vue +2 -1
- package/dist/uni/CandlestickChart.vue.d.ts +4 -0
- package/dist/uni/Chart.vue +2 -1
- package/dist/uni/Chart.vue.d.ts +4 -0
- package/dist/uni/ChordChart.vue +93 -0
- package/dist/uni/ChordChart.vue.d.ts +136 -0
- package/dist/uni/Divider.vue.d.ts +1 -1
- package/dist/uni/DonutChart.vue.d.ts +5 -1
- package/dist/uni/FunnelChart.vue.d.ts +4 -0
- package/dist/uni/GanttChart.vue +2 -1
- package/dist/uni/GanttChart.vue.d.ts +15 -0
- package/dist/uni/GaugeChart.vue.d.ts +5 -1
- package/dist/uni/HeatmapChart.vue +2 -1
- package/dist/uni/HeatmapChart.vue.d.ts +8 -2
- package/dist/uni/HistogramChart.vue +2 -1
- package/dist/uni/HistogramChart.vue.d.ts +4 -0
- package/dist/uni/HorizontalBarChart.vue +2 -1
- package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
- package/dist/uni/LineChart.vue +2 -1
- package/dist/uni/LineChart.vue.d.ts +4 -0
- package/dist/uni/MixedChart.vue +2 -1
- package/dist/uni/MixedChart.vue.d.ts +4 -0
- package/dist/uni/PieChart.vue.d.ts +5 -1
- package/dist/uni/QuadrantChart.vue +2 -1
- package/dist/uni/QuadrantChart.vue.d.ts +4 -0
- package/dist/uni/RadarChart.vue.d.ts +4 -0
- package/dist/uni/RadialBarChart.vue.d.ts +4 -0
- package/dist/uni/RangeAreaChart.vue +2 -1
- package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
- package/dist/uni/SankeyChart.vue.d.ts +4 -0
- package/dist/uni/ScatterChart.vue +2 -1
- package/dist/uni/ScatterChart.vue.d.ts +4 -0
- package/dist/uni/Sparkline.vue +2 -1
- package/dist/uni/Sparkline.vue.d.ts +4 -0
- package/dist/uni/SunburstChart.vue.d.ts +4 -0
- package/dist/uni/ToastProvider.vue.d.ts +1 -1
- package/dist/uni/TreemapChart.vue.d.ts +4 -0
- package/dist/uni/WaterfallChart.vue +2 -1
- package/dist/uni/WaterfallChart.vue.d.ts +9 -0
- package/dist/uni/chart-a11y.d.ts +7 -0
- package/dist/uni/chart-a11y.js +29 -0
- package/dist/uni/chart-canvas.d.ts +12 -0
- package/dist/uni/chart-canvas.js +15 -1
- package/dist/uni/chart-types.d.ts +36 -5
- package/dist/uni/chart-types.js +31 -3
- package/dist/uni/charts-canvas.js +3 -2
- package/dist/uni/index.d.ts +2 -1
- package/dist/uni/index.js +1 -0
- package/dist/uni/manifest.d.ts +7 -0
- package/dist/uni/manifest.js +10 -0
- package/dist/uni/named-chart-options.d.ts +11 -2
- package/dist/uni/named-chart-options.js +21 -1
- package/dist/uni/shape-chart-canvas.d.ts +3 -3
- package/dist/uni/shape-chart-canvas.js +17 -58
- package/dist/uni/shape-chart-types.d.ts +53 -3
- package/dist/uni/shape-chart-types.js +45 -1
- package/dist/vue/charts-global.d.ts +48 -0
- package/dist/vue/charts.d.ts +18 -0
- package/dist/vue/charts.js +56 -0
- package/dist/vue/charts.js.map +1 -0
- package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
- package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
- package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +181 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/GanttChart.vue.d.ts +19 -0
- package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +12 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/GraphChart.vue.d.ts +186 -0
- package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
- package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
- package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TradingChart.vue.d.ts +58 -1
- package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/TreeChart.vue.d.ts +174 -0
- package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
- package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
- package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/graph.d.ts +156 -0
- package/dist/vue/components/Chart/graph.js +137 -0
- package/dist/vue/components/Chart/graph.js.map +1 -0
- package/dist/vue/components/Chart/index.d.ts +5 -1
- package/dist/vue/components/Chart/index.js +5 -1
- package/dist/vue/components/Chart/orderbook.d.ts +5 -1
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/vue/components/Chart/three-d.d.ts +3 -0
- package/dist/vue/components/Chart/three-d.js +2 -0
- package/dist/vue/components/Chart/three-d.js.map +1 -1
- package/dist/vue/components/Chart/trading.d.ts +30 -3
- package/dist/vue/components/Chart/trading.js +9 -0
- package/dist/vue/components/Chart/trading.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +74 -2
- package/dist/vue/global.d.ts +2 -38
- package/dist/vue/groups/charts.js +10 -2
- package/dist/vue/groups/charts.js.map +1 -1
- package/dist/vue/index.js +6 -2
- package/dist/vue/internal/register.d.ts +7 -0
- package/dist/vue/internal/register.js +14 -0
- package/dist/vue/internal/register.js.map +1 -0
- package/dist/vue/plugin.d.ts +9 -4
- package/dist/vue/plugin.js +6 -11
- package/dist/vue/plugin.js.map +1 -1
- package/dist/weapp/area-chart/index.wxml +1 -1
- package/dist/weapp/bar-chart/index.wxml +1 -1
- package/dist/weapp/box-plot-chart/index.wxml +1 -1
- package/dist/weapp/bubble-chart/index.wxml +1 -1
- package/dist/weapp/candlestick-chart/index.wxml +1 -1
- package/dist/weapp/chart/index.wxml +1 -1
- package/dist/weapp/charts/canvas.js +1987 -175
- package/dist/weapp/charts/core.js +3 -0
- package/dist/weapp/chord-chart/index.js +1 -0
- package/dist/weapp/chord-chart/index.json +1 -0
- package/dist/weapp/chord-chart/index.wxml +1 -0
- package/dist/weapp/chord-chart/index.wxss +1 -0
- package/dist/weapp/controls.js +148 -57
- package/dist/weapp/gantt-chart/index.wxml +1 -1
- package/dist/weapp/heatmap-chart/index.wxml +1 -1
- package/dist/weapp/histogram-chart/index.wxml +1 -1
- package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
- package/dist/weapp/line-chart/index.wxml +1 -1
- package/dist/weapp/mixed-chart/index.wxml +1 -1
- package/dist/weapp/quadrant-chart/index.wxml +1 -1
- package/dist/weapp/range-area-chart/index.wxml +1 -1
- package/dist/weapp/scatter-chart/index.wxml +1 -1
- package/dist/weapp/sparkline/index.wxml +1 -1
- package/dist/weapp/types.d.ts +96 -4
- package/dist/weapp/waterfall-chart/index.wxml +1 -1
- package/dist/web-components/components/chart/charts.d.ts +4 -2
- package/dist/web-components/components/chart/charts.js +8 -1
- package/dist/web-components/components/chart/charts.js.map +1 -1
- package/dist/web-components/components/chart/extended.d.ts +21 -7
- package/dist/web-components/components/chart/extended.js +29 -9
- package/dist/web-components/components/chart/extended.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
- package/dist/web-components/components/chart/shapes-extended.js +27 -1
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
- package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
- package/dist/web-components/components/graph/graph.d.ts +156 -0
- package/dist/web-components/components/graph/graph.js +150 -0
- package/dist/web-components/components/graph/graph.js.map +1 -0
- package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
- package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
- package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
- package/dist/web-components/elements/chart.d.ts +1 -1
- package/dist/web-components/elements/chart.js +6 -5
- package/dist/web-components/elements/chart.js.map +1 -1
- package/dist/web-components/elements/graph.d.ts +2 -0
- package/dist/web-components/elements/graph.js +12 -0
- package/dist/web-components/elements/graph.js.map +1 -0
- package/dist/web-components/html-custom-data.json +318 -4
- package/dist/web-components/types/react.d.ts +63 -4
- package/dist/web-components/types/solid.d.ts +55 -8
- package/dist/web-components/types/svelte.d.ts +55 -8
- package/dist/web-components/types/vue.d.ts +55 -4
- package/package.json +16 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chart.js","names":["styleElement","storeUpdate","storeAppend","storePrepend","assign","TIME_AXIS","MIN_AXIS","MAX_SPACING","MIN_PANE","PRICE","UP","DOWN","WARNING","PRIMARY","PRICE_LINE_TITLES","clamp","v","lo","hi","textOn","color","parseColor","fill","luminance","finite","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","store","createStore","pyramid","createPyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","DAY","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","readTheme","themeVersion","optionsVersion","renderer","rendererToken","frameId","layers","geomKey","builtTail","itemVersion","resolveReady","ready","resolve","pointer","keyboardIndex","gesture","touches","pinch","kinetic","scrollAnim","pendingRange","drawings","emittedDrawings","tool","selected","hovered","draft","drawingCounter","lineOverrides","hoveredLine","lastRange","lastCrosshair","historyFirst","countdownTimer","listeners","emit","type","fn","event","locale","resolveLocale","texts","localeLabels","TRADING_LABELS","resolveTexts","labels","n","redUp","upCss","downCss","css","fallback","toCss","value","alpha","precision","priceFormat","priceFormatter","priceFormatKey","formatPrice","key","timeframe","parseTimeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","indexOfTimeExt","last","time","indexOfTime","display","markDirty","from","c","level","l","p","syncDerived","valid","next","heikinAshiInto","j","lowerBoundTime","afterDataChange","detectPrecision","inferTimeframe","invalidate","rebuildStudies","buildStudies","reused","id","s","rebuildCompares","data","series","a","b","LINE_COLORS","d","followsRealtime","replaceBars","setBars","bars","scale","applyBarsOption","length","inputLength","first","barAt","follow","before","at","updateBar","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","createScale","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","pyramidLevel","i0","i1","r0","r1","groupCenter","g","groupValue","values","groupBars","firstVisibleIndex","compareBase","compareScaled","base","toScaled","baselinePrice","autoscale","pane","closeOnly","vol","out","fitScale","timeTicks","tf","intraday","offset","gEnd","groupTime","candidates","prev","shiftTime","boundaryWeight","sample","gap","ctx","pickTicks","t","tickText","paneTickText","formatPercent","scaled","stepDecimals","fromScaled","formatVolume","formatFixed","studyValueText","createLayers","result","up","down","upP","packColor","downP","bg","metrics","candleMetrics","dpr","X","histogramHalf","volumeColors","bottom","Y","yOf","lineLayer","buffer","LineBuffer","isLive","ga","gb","toY","lineWidth","st","BarBuffer","pixelRange","yOfScaled","lineColor","area","AreaBuffer","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","range","clampRange","side","bt","bb","segments","edges","box","items","y0","strong","faded","mix","runLayer","lastMain","version","item","renderData","canvas","bw","bh","sizeCanvas","w","roundRect","r","paintBackground","grid","showGrid","ys","ui","li","upper","lower","started","back","flush","ya","axisLabel","second","textColor","text","priceAxisText","line","kind","linePrice","crosshairState","bar","valueAt","best","yy","drawingMapper","formatSpan","abs","ms","parts","days","hours","HOUR","minutes","MINUTE","paintForeground","muted","bgCss","upC","downC","hiG","loG","below","leftSide","label","stack","many","marker","sell","anchor","dir","tip","mapper","context","drawing","paintDrawing","lastClose","lineStyle","setDash","titleKey","title","pnl","pnlFill","widths","part","grip","lastLine","lastColor","covered","start","end","date","formatCountdown","cross","labelBg","scaledAt","textValue","formatCrosshairTime","legendKey","legendRows","legendBoxes","legendBox","legendRow","row","button","updateLegends","outputs","span","buildLegends","priceBox","head","titleOf","setSpan","prevClose","change","html","name","escapeHtml","pct","shown","slots","prefix","ch","frame","animate","active","now","eased","dt","measureAxis","widest","animating","fg","pass","applyRange","scaleTicks","bands","updateJump","emitView","show","visibleRange","readBar","local","rect","zoomAt","factor","anchorAt","setTool","notify","select","commitDrawings","finishDraft","done","hitLine","hitDrawingAt","hit","hitDrawing","separatorAt","updateCursor","cursor","nextHover","onPointerDown","sep","above","anchorCount","onPointerMove","distance","mid","dx","panScale","zoomScale","lastIndex","dy","nextBelow","step","di","ds","points","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","page","move","current","target","keyboard","resizeObserver","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","langObserver","applyStatic","initRenderer","token","createRenderer","createDataCanvas","exclude","symbol","wantTimer","applyOptions","previous","appendBars","prependBars","animateScroll","to","visible","set","listener"],"sources":["../../../../../charts/src/engine/trading/chart.ts"],"sourcesContent":["// Trading chart: candles (or bars, lines, areas...) over a gap-free index\n// axis, indicator panes, price lines, markers, drawings and streaming.\n//\n// Layers, bottom to top: a Canvas2D background (grid, bands, watermark),\n// the GPU data canvas covering every pane (candles, volumes, indicator\n// lines, baked in device pixels), a Canvas2D overlay (axes, labels, price\n// lines, markers, drawings, crosshair) and DOM legends. The GPU items are\n// rebuilt only when the view, the scales or the data change; a tick\n// rebuilds only the items of the last bar.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { createDataCanvas, styleElement } from \"../dom\";\nimport { createRenderer } from \"../renderers/detect\";\nimport type { ChartRenderer, RenderItem } from \"../renderers/types\";\nimport { stepDecimals } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { localeLabels, resolveLocale } from \"../locale\";\nimport {\n anchorCount,\n hitDrawing,\n paintDrawing,\n setDash,\n type DrawingMapper,\n} from \"./drawings\";\nimport {\n DAY,\n HOUR,\n MINUTE,\n boundaryWeight,\n detectPrecision,\n formatCountdown,\n formatCrosshairTime,\n formatFixed,\n formatPercent,\n formatVolume,\n inferTimeframe,\n pickTicks,\n priceFormatter,\n shiftTime,\n tickText,\n} from \"./format\";\nimport {\n AreaBuffer,\n BarBuffer,\n LineBuffer,\n candleMetrics,\n clampRange,\n pixelRange,\n} from \"./geometry\";\nimport { heikinAshiInto, parseTimeframe } from \"./indicators\";\nimport { TRADING_LABELS, fill, type TradingTexts } from \"./labels\";\nimport {\n createScale,\n fitScale,\n fromScaled,\n panScale,\n scaleTicks,\n scaledAt,\n toScaled,\n valueAt,\n yOf,\n yOfScaled,\n zoomScale,\n type PaneScale,\n} from \"./scale\";\nimport {\n appendBars as storeAppend,\n createPyramid,\n createStore,\n indexOfTime,\n inputLength,\n barAt,\n prependBars as storePrepend,\n pyramidLevel,\n readBar,\n setBars as storeSet,\n updateBar as storeUpdate,\n lowerBoundTime,\n type OhlcColumns,\n} from \"./store\";\nimport { LINE_COLORS, buildStudies, type Study } from \"./studies\";\nimport type {\n TradingBarsInput,\n TradingChartEventMap,\n TradingChartInstance,\n TradingChartOptions,\n TradingCrosshairEvent,\n TradingDrawing,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingPriceLine,\n TradingScaleMode,\n TradingVisibleRange,\n} from \"./types\";\n\nconst TIME_AXIS = 28;\nconst MIN_AXIS = 60;\nconst MAX_SPACING = 60;\nconst MIN_PANE = 48;\nconst PRICE = \"price\";\nconst UP = \"var(--success-color, #089981)\";\nconst DOWN = \"var(--danger-color, #f23645)\";\nconst WARNING = \"var(--warning-color, #f59e0b)\";\nconst PRIMARY = \"var(--primary-color, #2962ff)\";\n\nconst PRICE_LINE_TITLES: Record<string, keyof TradingTexts | undefined> = {\n order: \"limit\",\n position: \"position\",\n takeProfit: \"takeProfit\",\n stopLoss: \"stopLoss\",\n alert: \"alert\",\n};\n\nconst clamp = (v: number, lo: number, hi: number) =>\n v < lo ? lo : v > hi ? hi : v;\n\n/** Readable text on a fill (a CSS color): dark on light fills, white otherwise */\nconst textOn = (fill: string) => {\n const color = parseColor(fill);\n return color && luminance(color) > 0.5 ? \"#0b0e11\" : \"#fff\";\n};\n\nconst finite = Number.isFinite;\n\ninterface Pane {\n id: string;\n study: Study | null;\n scale: PaneScale;\n top: number;\n height: number;\n ticks: number[];\n step: number;\n}\n\n/** Bars drawn: a level of the pyramid and the groups in view */\ninterface Visible {\n /** Logical index at the left edge */\n left: number;\n level: number;\n /** Bars per group */\n size: number;\n cols: OhlcColumns;\n /** Groups drawn (one extra on each side) */\n g0: number;\n g1: number;\n /** Groups whose center is in the plot */\n s0: number;\n s1: number;\n /** Last group */\n last: number;\n}\n\ninterface LegendRow {\n row: HTMLDivElement;\n values: HTMLSpanElement[];\n button: HTMLButtonElement | null;\n}\n\ntype Layer = (ga: number, gb: number, live: boolean) => RenderItem[];\n\n/** Interaction in progress */\ntype Gesture =\n | {\n kind: \"pan\";\n x: number;\n y: number;\n right: number;\n pane: Pane | null;\n moved: boolean;\n lastX: number;\n lastY: number;\n lastT: number;\n velocity: number;\n }\n | { kind: \"axisY\"; pane: Pane; y: number; min: number; max: number }\n | { kind: \"axisX\"; x: number; spacing: number }\n | {\n kind: \"separator\";\n index: number;\n y: number;\n above: number;\n below: number;\n }\n | { kind: \"order\"; line: TradingPriceLine; startPrice: number }\n | {\n kind: \"drawing\";\n id: string;\n handle: number;\n x: number;\n y: number;\n original: TradingDrawing;\n moved: boolean;\n }\n | { kind: \"create\"; x: number; y: number; moved: boolean };\n\n/** Mounts a trading chart in `container` (which should have a height) */\nexport const createTradingChart = (\n container: HTMLElement,\n initial: TradingChartOptions = {},\n): TradingChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n let options: TradingChartOptions = { ...initial };\n let destroyed = false;\n\n // ------------------------------------------------------------------ DOM\n\n const make = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n ) => styleElement(doc.createElement(tag), style) as HTMLElementTagNameMap[K];\n\n const root = make(\"div\", {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n outline: \"none\",\n userSelect: \"none\",\n touchAction: \"pan-y\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n cursor: \"crosshair\",\n });\n root.className = \"minerva-trading-chart\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n\n const layer = (tag: \"canvas\" | \"div\") =>\n make(tag, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n const background = layer(\"canvas\") as HTMLCanvasElement;\n const foreground = layer(\"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n const legends = layer(\"div\") as HTMLDivElement;\n legends.style.right = \"0\";\n legends.style.bottom = \"0\";\n const jump = make(\"button\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"28px\",\n height: \"28px\",\n padding: \"0\",\n borderRadius: \"50%\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow: \"0 4px 14px -4px rgba(15, 23, 42, 0.25)\",\n cursor: \"pointer\",\n });\n jump.type = \"button\";\n jump.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3l5 5-5 5M9 3l5 5-5 5\"/></svg>';\n const live = make(\"div\", {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n live.setAttribute(\"aria-live\", \"polite\");\n root.append(background, foreground, legends, jump, live);\n container.appendChild(root);\n\n // ----------------------------------------------------------------- data\n\n const store = createStore();\n let pyramid = createPyramid();\n /** Heikin-Ashi bars (time and volume shared with the store) */\n const ha: OhlcColumns = {\n time: store.time,\n open: new Float64Array(0),\n high: new Float64Array(0),\n low: new Float64Array(0),\n close: new Float64Array(0),\n volume: store.volume,\n };\n let haValid = 0;\n let haPyramid = createPyramid();\n let studies: Study[] = [];\n const studyValid = new Map<Study, number>();\n const visibility = new Map<string, boolean>();\n interface CompareRuntime {\n id: string;\n name: string;\n color: string;\n times: Float64Array;\n data: Float64Array;\n values: Float64Array;\n valid: number;\n }\n let compares: CompareRuntime[] = [];\n /** Changes when bars other than the last one change */\n let dataVersion = 0;\n /** Changes when the last bar changes */\n let tailVersion = 0;\n let detectedPrecision = 2;\n let inferredTimeframe = DAY;\n\n // ----------------------------------------------------------------- view\n\n let spacing = options.barSpacing ?? 8;\n let right = NaN;\n let plotW = 0;\n let plotH = 0;\n let axisW = MIN_AXIS;\n let width = 0;\n let height = 0;\n let panes: Pane[] = [];\n const scales = new Map<string, PaneScale>();\n const paneHeights = new Map<string, number>();\n let vis: Visible | null = null;\n let volumeOverlayMax = 0;\n\n // -------------------------------------------------------------- state\n\n let theme: ChartTheme = readTheme(root);\n let themeVersion = 0;\n let optionsVersion = 0;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let frameId = 0;\n let layers: { fn: Layer; main: RenderItem[]; live: RenderItem[] }[] = [];\n let geomKey = \"\";\n let builtTail = -1;\n let itemVersion = 0;\n let resolveReady!: (kind: ChartRendererKind | null) => void;\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let pointer: { x: number; y: number } | null = null;\n let keyboardIndex: number | null = null;\n let gesture: Gesture | null = null;\n const touches = new Map<number, { x: number; y: number }>();\n let pinch: { distance: number; spacing: number } | null = null;\n let kinetic: { v: number; t: number } | null = null;\n let scrollAnim: { from: number; to: number; start: number } | null = null;\n /** Range asked by `setVisibleRange` / `fitContent`, applied once the plot width is known */\n let pendingRange: { from: number; to: number } | null = null;\n\n let drawings: readonly TradingDrawing[] = options.drawings ?? [];\n let emittedDrawings: readonly TradingDrawing[] | null = null;\n let tool: TradingDrawingTool = options.drawingMode ?? \"cursor\";\n let selected: string | null = null;\n let hovered: string | null = null;\n let draft: TradingDrawing | null = null;\n let drawingCounter = 0;\n const lineOverrides = new Map<string, number>();\n let hoveredLine: string | null = null;\n let lastRange: TradingVisibleRange | null = null;\n let lastCrosshair = \"\";\n let historyFirst = NaN;\n let countdownTimer: ReturnType<typeof setInterval> | null = null;\n\n // ---------------------------------------------------------- listeners\n\n const listeners = new Map<string, Set<(event: never) => void>>();\n const emit = <K extends keyof TradingChartEventMap>(\n type: K,\n event: TradingChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: TradingChartEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- helpers\n\n // locale and texts, resolved at each options update (and `<html lang>` change)\n let locale = resolveLocale(options.locale);\n let texts = localeLabels(TRADING_LABELS, locale, options.labels);\n const resolveTexts = () => {\n locale = resolveLocale(options.locale);\n texts = localeLabels(TRADING_LABELS, locale, options.labels);\n };\n const labels = () => texts;\n const n = () => store.length;\n const style = () => options.chartStyle ?? \"candles\";\n const redUp = () => options.colorConvention === \"redUp\";\n const upCss = () => options.upColor ?? (redUp() ? DOWN : UP);\n const downCss = () => options.downColor ?? (redUp() ? UP : DOWN);\n const resolve = (css: string, fallback: Rgba = theme.primary): Rgba =>\n theme.resolve ? theme.resolve(css, fallback) : fallback;\n const css = (value: string, alpha = 1) => toCss(resolve(value), alpha);\n const precision = () => options.precision ?? detectedPrecision;\n let priceFormat = priceFormatter(2, undefined);\n let priceFormatKey = \"\";\n const formatPrice = (value: number) => {\n if (options.formatPrice) return options.formatPrice(value);\n const key = `${precision()}|${locale}`;\n if (key !== priceFormatKey) {\n priceFormat = priceFormatter(precision(), locale);\n priceFormatKey = key;\n }\n return priceFormat(value);\n };\n const timeframe = () => {\n const parsed =\n options.timeframe !== undefined\n ? parseTimeframe(options.timeframe)\n : null;\n return (\n parsed ?? {\n unit: \"ms\" as const,\n count: inferredTimeframe,\n ms: inferredTimeframe,\n }\n );\n };\n const tfMs = () => timeframe().ms;\n const font = (size: number, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\n const isVisible = (study: Study) =>\n visibility.get(study.id) ?? study.config.visible ?? true;\n\n const xOf = (index: number) => plotW + (index - right) * spacing;\n const indexAt = (x: number) => right - (plotW - x) / spacing;\n\n /** Time of a logical index (extrapolated outside the bars) */\n const timeAt = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.round(index);\n if (i < 0) return store.time[0] + i * tfMs();\n if (i >= count) return store.time[count - 1] + (i - count + 1) * tfMs();\n return store.time[i];\n };\n\n /** Logical index of a time (extrapolated outside the bars) */\n const indexOfTimeExt = (time: number) => {\n const count = n();\n if (!count) return 0;\n const last = store.time[count - 1];\n if (time > last) return count - 1 + (time - last) / tfMs();\n if (time < store.time[0]) return (time - store.time[0]) / tfMs();\n return indexOfTime(store.time, count, time);\n };\n\n /** Bars as drawn: Heikin-Ashi or the store */\n const display = (): OhlcColumns => (style() === \"heikinAshi\" ? ha : store);\n\n // ------------------------------------------------------- derived data\n\n const markDirty = (from: number) => {\n for (const study of studies)\n studyValid.set(study, Math.min(studyValid.get(study) ?? 0, from));\n haValid = Math.min(haValid, from);\n for (const c of compares) c.valid = Math.min(c.valid, from);\n const level = (p: typeof pyramid) => {\n for (const l of p.levels)\n if (l) l.valid = Math.min(l.valid, Math.floor(from / l.size));\n };\n level(pyramid);\n level(haPyramid);\n };\n\n const syncDerived = () => {\n const count = n();\n for (const study of studies) {\n const valid = studyValid.get(study) ?? 0;\n if (valid < count) {\n study.compute(store, valid);\n studyValid.set(study, count);\n }\n }\n ha.time = store.time;\n ha.volume = store.volume;\n if (style() === \"heikinAshi\" && haValid < count) {\n if (ha.open.length < store.capacity) {\n for (const key of [\"open\", \"high\", \"low\", \"close\"] as const) {\n const next = new Float64Array(store.capacity);\n next.set(ha[key].subarray(0, haValid));\n ha[key] = next;\n }\n }\n heikinAshiInto(\n store.open,\n store.high,\n store.low,\n store.close,\n count,\n ha,\n haValid,\n );\n haValid = count;\n }\n for (const c of compares) {\n if (c.valid >= count) continue;\n if (c.values.length < store.capacity) {\n const next = new Float64Array(store.capacity).fill(NaN);\n next.set(c.values.subarray(0, c.valid));\n c.values = next;\n }\n for (let i = c.valid; i < count; i++) {\n const j =\n lowerBoundTime(c.times, c.times.length, store.time[i] + 0.5) - 1;\n c.values[i] = j >= 0 ? c.data[j] : NaN;\n }\n c.valid = count;\n }\n };\n\n const afterDataChange = (from: number) => {\n markDirty(from);\n const count = n();\n if (from < count - 1) dataVersion++;\n tailVersion++;\n if (count) {\n detectedPrecision = Math.max(\n from === 0 ? 0 : detectedPrecision,\n detectPrecision(store.close, from, count),\n detectPrecision(store.open, Math.max(from, count - 50), count),\n );\n if (from === 0 || count < 80)\n inferredTimeframe = inferTimeframe(store.time, count);\n }\n invalidate();\n };\n\n const rebuildStudies = () => {\n const { studies: next, reused } = buildStudies(\n options.indicators ?? [],\n studies,\n options.utcOffset ?? -new Date().getTimezoneOffset(),\n );\n for (const study of studies)\n if (!reused.has(study)) studyValid.delete(study);\n for (const study of next) if (!reused.has(study)) studyValid.set(study, 0);\n studies = next;\n // drop the user's toggles of indicators whose visibility is now set\n for (const id of [...visibility.keys()])\n if (!studies.some((s) => s.id === id)) visibility.delete(id);\n };\n\n const rebuildCompares = () => {\n compares = (options.compare ?? []).map((series, i) => {\n const data = [...series.data].sort((a, b) => a.time - b.time);\n return {\n id: series.id ?? series.name,\n name: series.name,\n color: series.color ?? LINE_COLORS[(i + 2) % LINE_COLORS.length],\n times: Float64Array.from(data, (d) => d.time),\n data: Float64Array.from(data, (d) => d.value),\n values: new Float64Array(0),\n valid: 0,\n };\n });\n };\n\n // ---------------------------------------------------------- bars input\n\n /** Last bar visible: new bars keep the view at the latest bar */\n const followsRealtime = () => {\n const count = n();\n if (!count || !finite(right)) return true;\n const x = xOf(count - 1);\n return x >= 0 && x <= plotW + spacing * 0.5;\n };\n\n const replaceBars = (bars: TradingBarsInput) => {\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n for (const scale of scales.values()) scale.auto = true;\n right = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n scrollAnim = null;\n afterDataChange(0);\n };\n\n /**\n * New `bars` option: streamed (same first bars plus newer ones),\n * prepended history (same last bar), or replaced\n */\n const applyBarsOption = (bars: TradingBarsInput) => {\n const count = n();\n const length = inputLength(bars);\n if (count >= 2 && length >= count) {\n const first = barAt(bars, 0).time;\n const last = store.time[count - 1];\n if (\n first === store.time[0] &&\n barAt(bars, count - 2).time === store.time[count - 2]\n ) {\n // streaming through the props: update the last bar, append the rest\n const follow = followsRealtime();\n const before = count;\n let from = count;\n for (let i = count - 1; i < length; i++) {\n const at = storeUpdate(store, barAt(bars, i));\n if (at >= 0) from = Math.min(from, at);\n }\n if (follow) right += n() - before;\n if (from < n()) afterDataChange(from);\n return;\n }\n if (barAt(bars, length - 1).time === last && length > count) {\n const added = length - count;\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n afterDataChange(0);\n return;\n }\n }\n replaceBars(bars);\n };\n\n // --------------------------------------------------------------- layout\n\n const layoutPanes = () => {\n const paneStudies = studies.filter((s) => !s.overlay);\n const available = plotH;\n const wanted = paneStudies.map((s) => paneHeights.get(s.id) ?? s.height);\n const total = wanted.reduce((a, b) => a + b, 0);\n const max = Math.max(0, available * 0.62);\n const k = total > max && total > 0 ? max / total : 1;\n const heights = wanted.map((h) =>\n Math.max(MIN_PANE * Math.min(1, k * 2), h * k),\n );\n const priceHeight = Math.max(\n 40,\n available - heights.reduce((a, b) => a + b, 0),\n );\n const next: Pane[] = [];\n const scaleOf = (id: string, mode: TradingScaleMode) => {\n let scale = scales.get(id);\n if (!scale) {\n scale = createScale(mode);\n scales.set(id, scale);\n }\n if (scale.mode !== mode) {\n scale.mode = mode;\n scale.auto = true;\n }\n return scale;\n };\n const price = scaleOf(PRICE, options.scaleMode ?? \"linear\");\n price.top = 0;\n price.height = priceHeight;\n price.marginTop = 0.1;\n price.marginBottom = 0.08;\n next.push({\n id: PRICE,\n study: null,\n scale: price,\n top: 0,\n height: priceHeight,\n ticks: [],\n step: 0,\n });\n let top = priceHeight;\n paneStudies.forEach((study, i) => {\n const scale = scaleOf(study.id, \"linear\");\n scale.top = top;\n scale.height = heights[i];\n scale.marginTop = study.type === \"volume\" ? 0.18 : 0.14;\n scale.marginBottom = study.type === \"volume\" ? 0 : 0.1;\n if (study.range) scale.marginTop = scale.marginBottom = 0.06;\n next.push({\n id: study.id,\n study,\n scale,\n top,\n height: heights[i],\n ticks: [],\n step: 0,\n });\n top += heights[i];\n });\n for (const id of [...scales.keys()])\n if (!next.some((p) => p.id === id)) scales.delete(id);\n panes = next;\n };\n\n const paneAt = (y: number) =>\n panes.find((p) => y >= p.top && y < p.top + p.height) ?? null;\n\n const clampView = () => {\n const count = n();\n const minSpacing = Math.min(1, (plotW * 0.8) / Math.max(1, count));\n spacing = clamp(spacing, Math.max(1e-4, minSpacing), MAX_SPACING);\n const bars = plotW / spacing;\n if (!finite(right)) right = count - 1 + (options.rightOffset ?? 8);\n const hi =\n Math.max(0, count - 1) + Math.max(options.rightOffset ?? 8, bars * 0.75);\n const lo = Math.min(bars * 0.25, hi);\n right = clamp(right, lo, hi);\n };\n\n const computeVisible = (): Visible | null => {\n const count = n();\n if (!count) return null;\n const left = right - plotW / spacing;\n const level = spacing >= 2 ? 0 : Math.ceil(Math.log2(2 / spacing));\n const size = 2 ** level;\n const src = display();\n const cols = level\n ? pyramidLevel(\n style() === \"heikinAshi\" ? haPyramid : pyramid,\n src,\n count,\n level,\n )\n : src;\n const last = Math.floor((count - 1) / size);\n const i0 = clamp(Math.floor(left) - 1, 0, count - 1);\n const i1 = clamp(Math.ceil(right) + 1, 0, count - 1);\n const r0 = clamp(Math.ceil(left - 0.5), 0, count - 1);\n const r1 = clamp(Math.floor(right + 0.5), 0, count - 1);\n return {\n left,\n level,\n size,\n cols,\n g0: Math.floor(i0 / size),\n g1: Math.floor(i1 / size),\n s0: Math.floor(r0 / size),\n s1: Math.floor(r1 / size),\n last,\n };\n };\n\n /** Center index of a group */\n const groupCenter = (v: Visible, g: number) => g * v.size + (v.size - 1) / 2;\n /** Value of a study output for a group (its last bar) */\n const groupValue = (v: Visible, values: Float64Array, g: number) =>\n values[Math.min(n() - 1, g * v.size + v.size - 1)];\n const groupBars = (v: Visible, g: number) =>\n Math.min(v.size, n() - g * v.size);\n\n /** First visible bar: the base of the percent scale and of the baseline */\n const firstVisibleIndex = () =>\n clamp(Math.ceil(right - plotW / spacing - 0.5), 0, Math.max(0, n() - 1));\n\n const compareBase = (c: CompareRuntime) => {\n const count = n();\n for (let i = firstVisibleIndex(); i < count; i++) {\n const v = c.values[i];\n if (finite(v) && v !== 0) return v;\n }\n return NaN;\n };\n\n /** Scaled value of a comparison series (percent: from its own base) */\n const compareScaled = (scale: PaneScale, value: number, base: number) =>\n scale.mode === \"percent\"\n ? (value / base - 1) * 100\n : toScaled(scale, value);\n\n const baselinePrice = () =>\n options.baselinePrice ?? display().close[firstVisibleIndex()];\n\n const autoscale = (v: Visible | null) => {\n volumeOverlayMax = 0;\n for (const pane of panes) {\n const scale = pane.scale;\n if (!v) continue;\n if (pane.id === PRICE) {\n scale.base = store.close[firstVisibleIndex()] || 1;\n const { cols } = v;\n const s = style();\n const closeOnly = s === \"line\" || s === \"area\" || s === \"baseline\";\n let lo = Infinity;\n let hi = -Infinity;\n for (let g = v.s0; g <= v.s1; g++) {\n const l = closeOnly ? cols.close[g] : cols.low[g];\n const h = closeOnly ? cols.close[g] : cols.high[g];\n if (l < lo) lo = l;\n if (h > hi) hi = h;\n }\n for (const study of studies) {\n if (!study.overlay || !isVisible(study)) continue;\n if (study.type === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (vol > volumeOverlayMax) volumeOverlayMax = vol;\n }\n continue;\n }\n for (const out of study.outputs) {\n for (let g = v.s0; g <= v.s1; g++) {\n const value = groupValue(v, out.values, g);\n if (value < lo) lo = value;\n if (value > hi) hi = value;\n }\n }\n }\n if (s === \"baseline\") {\n const b = baselinePrice();\n if (b < lo) lo = b;\n if (b > hi) hi = b;\n }\n if (!scale.auto) continue;\n let a = toScaled(scale, lo);\n let b = toScaled(scale, hi);\n if (scale.mode === \"log\" && !(lo > 0))\n a = toScaled(scale, Math.max(hi * 1e-3, 1e-12));\n for (const c of compares) {\n const base = compareBase(c);\n for (let g = v.s0; g <= v.s1; g++) {\n const value = compareScaled(\n scale,\n groupValue(v, c.values, g),\n base,\n );\n if (value < a) a = value;\n if (value > b) b = value;\n }\n }\n fitScale(scale, a, b);\n continue;\n }\n const study = pane.study;\n if (!study || !scale.auto) continue;\n if (study.range) {\n fitScale(scale, study.range[0], study.range[1]);\n continue;\n }\n let lo = Infinity;\n let hi = -Infinity;\n if (study.type === \"volume\") lo = 0;\n for (const out of study.outputs) {\n for (let g = v.s0; g <= v.s1; g++) {\n const value =\n out.kind === \"volume\"\n ? v.cols.volume[g] / groupBars(v, g)\n : groupValue(v, out.values, g);\n if (value < lo) lo = value;\n if (value > hi) hi = value;\n }\n }\n if (study.type === \"macd\" && finite(lo) && finite(hi)) {\n // keep the zero line in view\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n fitScale(scale, lo, hi);\n }\n };\n\n // ----------------------------------------------------------------- ticks\n\n interface TimeLabel {\n x: number;\n text: string;\n bold: boolean;\n }\n\n const timeTicks = (\n v: Visible | null,\n ctx: CanvasRenderingContext2D,\n ): TimeLabel[] => {\n const count = n();\n if (!count || !v) return [];\n const tf = tfMs();\n const intraday = tf < DAY;\n const offset = options.utcOffset;\n // groups up to the right edge, past the last bar too\n const gEnd = Math.floor(Math.max(0, Math.ceil(right)) / v.size);\n const groupTime = (g: number) => {\n if (g <= v.last) return v.cols.time[g];\n return store.time[count - 1] + (g * v.size - (count - 1)) * tf;\n };\n const candidates: { x: number; weight: number; time: number }[] = [];\n let prev = v.g0 > 0 ? shiftTime(groupTime(v.g0 - 1), offset) : NaN;\n for (let g = v.g0; g <= gEnd; g++) {\n const time = shiftTime(groupTime(g), offset);\n const x = xOf(groupCenter(v, g));\n const weight = boundaryWeight(prev, time);\n // no labels inside a second (tick charts)\n if (x >= -20 && x <= plotW + 20 && weight > 10)\n candidates.push({ x, weight, time });\n prev = time;\n }\n ctx.font = font(theme.fontSize);\n const sample = intraday ? \"00:00\" : \"Sep 30\";\n const gap =\n Math.max(ctx.measureText(sample).width, ctx.measureText(\"2024\").width) +\n 34;\n return pickTicks(candidates, gap)\n .filter((t) => t.x > 8 && t.x < plotW - 8)\n .map((t) => ({\n x: t.x,\n text: tickText(t.time, t.weight, locale, intraday),\n bold: t.weight >= (intraday ? 50 : 60),\n }));\n };\n\n const paneTickText = (pane: Pane, scaled: number) => {\n if (pane.id === PRICE) {\n if (pane.scale.mode === \"percent\")\n return formatPercent(\n scaled,\n locale,\n Math.min(2, stepDecimals(pane.step)),\n );\n return formatPrice(fromScaled(pane.scale, scaled));\n }\n if (pane.study?.compact) return formatVolume(scaled, locale);\n return formatFixed(scaled, Math.min(4, stepDecimals(pane.step)), locale);\n };\n\n /** Text of a value of a study in the legend */\n const studyValueText = (study: Study, value: number) => {\n if (study.overlay && study.type !== \"volume\") return formatPrice(value);\n if (study.compact) return formatVolume(value, locale);\n return formatFixed(\n value,\n study.range ? 2 : Math.max(2, Math.min(6, precision())),\n locale,\n );\n };\n\n // ------------------------------------------------------------ GPU items\n\n const createLayers = (v: Visible, dpr: number): Layer[] => {\n const result: Layer[] = [];\n const cols = v.cols;\n const up = resolve(upCss());\n const down = resolve(downCss());\n const upP = packColor(up);\n const downP = packColor(down);\n const bg = theme.background;\n const metrics = candleMetrics(spacing * v.size * dpr, dpr);\n const X = (g: number) => xOf(groupCenter(v, g)) * dpr;\n const s = style();\n\n const histogramHalf = Math.max(0.5, metrics.body / 2);\n const volumeColors = {\n up: packColor([up[0], up[1], up[2], 0.5]),\n down: packColor([down[0], down[1], down[2], 0.5]),\n };\n\n for (const pane of panes) {\n const top = pane.top * dpr;\n const bottom = (pane.top + pane.height) * dpr;\n const scale = pane.scale;\n const Y = (value: number) => yOf(scale, value) * dpr;\n\n const lineLayer =\n (\n values: (g: number) => number,\n color: Rgba,\n lineWidth: number,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const buffer = new LineBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n buffer.push(X(g), toY(values(g)));\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n if (pane.id === PRICE) {\n // volume at the bottom of the price pane\n const volumeStudy = studies.find(\n (st) => st.overlay && st.type === \"volume\" && isVisible(st),\n );\n if (volumeStudy && volumeOverlayMax > 0) {\n const h = (bottom - top) * 0.2;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const y = bottom - (vol / volumeOverlayMax) * h;\n const [a, b] = pixelRange(y, bottom);\n buffer.push(\n metrics.snap(X(g)),\n a,\n b,\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n }\n // comparison series\n for (const c of compares) {\n const base = compareBase(c);\n const color = resolve(c.color);\n result.push(\n lineLayer(\n (g) => groupValue(v, c.values, g),\n color,\n 1.5,\n (value) =>\n yOfScaled(scale, compareScaled(scale, value, base)) * dpr,\n ),\n );\n }\n // the bars\n if (s === \"line\" || s === \"area\" || s === \"baseline\") {\n const lineColor = resolve(PRIMARY);\n if (s === \"area\") {\n result.push((ga, gb, isLive) => {\n const area = new AreaBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n area.push(X(g), Y(cols.close[g]), bottom);\n return area.count > 1 ? [area.item(\"\", 0, lineColor, 0.28)] : [];\n });\n }\n if (s === \"baseline\") {\n const yb = Y(baselinePrice());\n result.push((ga, gb, isLive) => {\n const upArea = new AreaBuffer(top, bottom);\n const downArea = new AreaBuffer(top, bottom);\n const upLine = new LineBuffer(top, bottom);\n const downLine = new LineBuffer(top, bottom);\n let px = NaN;\n let py = NaN;\n const point = (x: number, y: number) => {\n upArea.push(x, Math.min(y, yb), yb);\n downArea.push(x, Math.max(y, yb), yb);\n if (y <= yb) upLine.push(x, y);\n else upLine.break();\n if (y >= yb) downLine.push(x, y);\n else downLine.break();\n };\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++) {\n const x = X(g);\n const y = Y(cols.close[g]);\n if (finite(py) && (py - yb) * (y - yb) < 0) {\n const t = (yb - py) / (y - py);\n point(px + (x - px) * t, yb);\n }\n point(x, y);\n px = x;\n py = y;\n }\n const out: RenderItem[] = [];\n if (upArea.count > 1)\n out.push(\n upArea.item(\"u\", 0, up, 0.22),\n downArea.item(\"d\", 0, down, 0.22),\n );\n if (upLine.count > 1) out.push(upLine.item(\"ul\", 0, up, 2));\n if (downLine.count > 1) out.push(downLine.item(\"dl\", 0, down, 2));\n return out;\n });\n } else {\n result.push(lineLayer((g) => cols.close[g], lineColor, 2));\n }\n } else {\n const hollow = s === \"hollowCandles\";\n const ohlc = s === \"bars\";\n const wick = metrics.wick;\n const body = metrics.body;\n result.push((ga, gb) => {\n const wicks = new BarBuffer();\n const bodies = new BarBuffer();\n const caps = new BarBuffer();\n const ticks = new BarBuffer();\n const tick = Math.max(wick, Math.round((body - wick) / 2));\n for (let g = ga; g <= gb; g++) {\n const o = cols.open[g];\n const h = cols.high[g];\n const l = cols.low[g];\n const c = cols.close[g];\n if (!finite(o) || !finite(c)) continue;\n const rising = hollow\n ? c >= (g > 0 ? cols.close[g - 1] : o)\n : c >= o;\n const color = rising ? upP : downP;\n const cx = metrics.snap(X(g));\n const [wt, wb] = pixelRange(Y(h), Y(l));\n if (ohlc) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n for (const [value, side] of [\n [o, -1],\n [c, 1],\n ] as const) {\n const y = Math.round(Y(value) - wick / 2);\n if (y < top || y + wick > bottom) continue;\n ticks.push(\n cx + side * (wick / 2 + tick / 2),\n y,\n y + wick,\n color,\n );\n }\n continue;\n }\n const [bt, bb] = pixelRange(Y(o), Y(c));\n if (body <= wick) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n continue;\n }\n if (hollow && c > o) {\n const segments: [number, number][] = [\n [wt, bt],\n [bb, wb],\n ];\n for (const [a, b] of segments) {\n const range = b > a ? clampRange(a, b, top, bottom) : null;\n if (range) wicks.push(cx, range[0], range[1], color);\n }\n const edges = clampRange(bt, bb, top, bottom);\n if (edges) {\n wicks.push(\n cx - body / 2 + wick / 2,\n edges[0],\n edges[1],\n color,\n );\n wicks.push(\n cx + body / 2 - wick / 2,\n edges[0],\n edges[1],\n color,\n );\n }\n for (const y of [bt, bb - wick]) {\n if (y >= top && y + wick <= bottom)\n caps.push(cx, y, y + wick, color);\n }\n continue;\n }\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n const box = clampRange(bt, bb, top, bottom);\n if (box) bodies.push(cx, box[0], box[1], color);\n }\n const items: RenderItem[] = [wicks.item(\"w\", 0, wick / 2)];\n if (bodies.count) items.push(bodies.item(\"b\", 0, body / 2));\n if (caps.count) items.push(caps.item(\"c\", 0, body / 2));\n if (ticks.count) items.push(ticks.item(\"t\", 0, tick / 2));\n return items;\n });\n }\n }\n\n // indicators of the pane\n const paneStudies =\n pane.id === PRICE\n ? studies.filter((st) => st.overlay && st.type !== \"volume\")\n : pane.study\n ? [pane.study]\n : [];\n for (const study of paneStudies) {\n if (!isVisible(study)) continue;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n const y0 = Y(0);\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const range = clampRange(\n ...pixelRange(Y(vol), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(\n metrics.snap(X(g)),\n range[0],\n range[1],\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"histogram\") {\n const y0 = Y(0);\n const strong = { up: upP, down: downP };\n const faded = {\n up: packColor(mix(bg, up, 0.45)),\n down: packColor(mix(bg, down, 0.45)),\n };\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = groupValue(v, out.values, g);\n if (!finite(value)) continue;\n const prev = g > 0 ? groupValue(v, out.values, g - 1) : value;\n const color =\n value >= 0\n ? value >= prev\n ? strong.up\n : faded.up\n : value <= prev\n ? strong.down\n : faded.down;\n const range = clampRange(\n ...pixelRange(Y(value), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(metrics.snap(X(g)), range[0], range[1], color);\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else {\n result.push(\n lineLayer(\n (g) => groupValue(v, out.values, g),\n resolve(out.color),\n out.width,\n ),\n );\n }\n }\n }\n }\n return result;\n };\n\n /** Builds the items of the main bars or of the last group */\n const runLayer = (\n fn: Layer,\n index: number,\n v: Visible,\n isLive: boolean,\n ): RenderItem[] => {\n const lastMain = Math.min(v.g1, v.last - 1);\n const items = isLive\n ? v.last >= v.g0 && v.last <= v.g1\n ? fn(v.last, v.last, true)\n : []\n : lastMain >= v.g0\n ? fn(v.g0, lastMain, false)\n : [];\n const version = ++itemVersion;\n return items.map((item, k) => ({\n ...item,\n key: `L${index}:${k}:${item.kind}:${item.key}${isLive ? \":live\" : \"\"}`,\n version,\n }));\n };\n\n const renderData = (v: Visible | null, dpr: number) => {\n if (!renderer) return;\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: \"0px\",\n top: \"0px\",\n width: `${plotW}px`,\n height: `${plotH}px`,\n });\n const bw = Math.max(1, Math.round(plotW * dpr));\n const bh = Math.max(1, Math.round(plotH * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n if (v) {\n const key = [\n bw,\n bh,\n dpr,\n spacing,\n right,\n v.level,\n style(),\n dataVersion,\n themeVersion,\n optionsVersion,\n volumeOverlayMax,\n style() === \"baseline\" ? baselinePrice() : 0,\n ...panes.map(\n (p) =>\n `${p.id}:${p.top}:${p.height}:${p.scale.min}:${p.scale.max}:${p.scale.base}:${p.scale.mode}`,\n ),\n ...studies.map((st) => `${st.id}:${isVisible(st)}`),\n ].join(\"|\");\n if (key !== geomKey) {\n geomKey = key;\n builtTail = tailVersion;\n layers = createLayers(v, dpr).map((fn) => ({ fn, main: [], live: [] }));\n layers.forEach((l, i) => {\n l.main = runLayer(l.fn, i, v, false);\n l.live = runLayer(l.fn, i, v, true);\n });\n } else if (builtTail !== tailVersion) {\n builtTail = tailVersion;\n layers.forEach((l, i) => {\n l.live = runLayer(l.fn, i, v, true);\n });\n }\n } else {\n layers = [];\n geomKey = \"\";\n }\n const items = layers.flatMap((l) => [...l.main, ...l.live]);\n renderer.render(items, {\n transform: { xScale: 2 / bw, xOffset: -1, yScale: -2 / bh, yOffset: 1 },\n width: bw,\n height: bh,\n dpr,\n });\n };\n\n // -------------------------------------------------------- 2D painting\n\n const sizeCanvas = (canvas: HTMLCanvasElement, dpr: number) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n };\n\n const paintBackground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const grid = toCss(theme.grid);\n const showGrid = options.grid !== false;\n ctx.lineWidth = 1;\n if (showGrid) {\n ctx.strokeStyle = grid;\n ctx.beginPath();\n for (const t of ticks) {\n const x = Math.round(t.x) + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = Math.round(yOfScaled(pane.scale, t)) + 0.5;\n if (y < pane.top + 2 || y > pane.top + pane.height - 2) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n }\n ctx.stroke();\n }\n // watermark\n if (options.watermark) {\n const price = panes[0];\n ctx.save();\n ctx.font = font(Math.min(56, Math.max(22, plotW / 14)), 700);\n ctx.fillStyle = toCss(theme.text, 0.07);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(options.watermark, plotW / 2, price.top + price.height / 2);\n ctx.restore();\n }\n // bands of the indicator panes, fill of the Bollinger bands\n for (const pane of panes) {\n const study = pane.study;\n if (study?.bands && isVisible(study)) {\n const color = resolve(study.outputs[0]?.color ?? PRIMARY);\n const ys = study.bands.map((b) => Math.round(yOf(pane.scale, b)) + 0.5);\n if (study.type === \"rsi\" && ys.length === 2) {\n ctx.fillStyle = toCss(color, 0.07);\n ctx.fillRect(\n 0,\n Math.min(ys[0], ys[1]),\n plotW,\n Math.abs(ys[1] - ys[0]),\n );\n }\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = toCss(theme.textMuted, 0.45);\n ctx.beginPath();\n for (const y of ys) {\n if (y < pane.top || y > pane.top + pane.height) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n }\n }\n if (v) {\n const price = panes[0];\n for (const study of studies) {\n if (study.type !== \"boll\" || !study.fill || !isVisible(study)) continue;\n const [ui, li] = study.fill;\n const upper = study.outputs[ui].values;\n const lower = study.outputs[li].values;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n ctx.fillStyle = css(study.outputs[ui].color, 0.07);\n ctx.beginPath();\n let started = false;\n const back: [number, number][] = [];\n const flush = () => {\n for (let k = back.length - 1; k >= 0; k--)\n ctx.lineTo(back[k][0], back[k][1]);\n if (started) ctx.closePath();\n back.length = 0;\n started = false;\n };\n for (let g = v.g0; g <= v.g1; g++) {\n const a = groupValue(v, upper, g);\n const b = groupValue(v, lower, g);\n if (!finite(a) || !finite(b)) {\n flush();\n continue;\n }\n const x = xOf(groupCenter(v, g));\n const ya = yOf(price.scale, a);\n if (started) ctx.lineTo(x, ya);\n else ctx.moveTo(x, ya);\n started = true;\n back.push([x, yOf(price.scale, b)]);\n }\n flush();\n ctx.fill();\n ctx.restore();\n }\n }\n // separators and axis borders\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n for (const pane of panes.slice(1)) {\n const y = Math.round(pane.top) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n }\n ctx.moveTo(Math.round(plotW) + 0.5, 0);\n ctx.lineTo(Math.round(plotW) + 0.5, height);\n ctx.moveTo(0, Math.round(plotH) + 0.5);\n ctx.lineTo(width, Math.round(plotH) + 0.5);\n ctx.stroke();\n };\n\n /** Label on the price axis; returns its vertical extent */\n const axisLabel = (\n ctx: CanvasRenderingContext2D,\n y: number,\n text: string,\n fill: string,\n textColor: string,\n second?: string,\n ) => {\n const h = second ? 32 : 18;\n const top = clamp(Math.round(y - 9), 0, plotH - h);\n roundRect(ctx, plotW + 1, top, axisW - 2, h, 3);\n ctx.fillStyle = fill;\n ctx.fill();\n ctx.fillStyle = textColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = font(theme.fontSize, 500);\n ctx.fillText(text, plotW + 7, top + 9.5);\n if (second) {\n ctx.font = font(theme.fontSize - 1);\n ctx.fillText(second, plotW + 7, top + 24);\n }\n };\n\n const priceAxisText = (value: number) =>\n panes[0]?.scale.mode === \"percent\"\n ? formatPercent(toScaled(panes[0].scale, value), locale)\n : formatPrice(value);\n\n const lineColor = (line: TradingPriceLine) => {\n if (line.color) return css(line.color);\n const kind = line.kind ?? \"line\";\n if (kind === \"takeProfit\") return css(upCss());\n if (kind === \"stopLoss\") return css(downCss());\n if (kind === \"alert\") return css(WARNING);\n if (kind === \"line\") return css(PRIMARY);\n return css(line.side === \"sell\" ? downCss() : upCss());\n };\n\n const linePrice = (line: TradingPriceLine) =>\n lineOverrides.get(line.id) ?? line.price;\n\n const crosshairState = () => {\n if (!vis || !panes.length) return null;\n if (keyboardIndex !== null) {\n const index = keyboardIndex;\n const bar = index >= 0 && index < n() ? display().close[index] : NaN;\n return { index, pane: panes[0], y: yOf(panes[0].scale, bar), price: bar };\n }\n if (!pointer || pointer.x > plotW || pointer.y > plotH) return null;\n const pane = paneAt(pointer.y);\n if (!pane) return null;\n const index = Math.round(indexAt(pointer.x));\n let y = pointer.y;\n let price = valueAt(pane.scale, y);\n if (\n pane.id === PRICE &&\n options.crosshair !== \"free\" &&\n index >= 0 &&\n index < n() &&\n tool === \"cursor\"\n ) {\n const d = display();\n let best = Infinity;\n for (const value of [\n d.open[index],\n d.high[index],\n d.low[index],\n d.close[index],\n ]) {\n const yy = yOf(pane.scale, value);\n if (Math.abs(yy - pointer.y) < best) {\n best = Math.abs(yy - pointer.y);\n y = yy;\n price = value;\n }\n }\n }\n return { index, pane, y, price };\n };\n\n const drawingMapper = (): DrawingMapper | null => {\n const price = panes[0];\n if (!price) return null;\n return {\n x: xOf,\n y: (p) => yOf(price.scale, p),\n index: indexOfTimeExt,\n left: 0,\n right: plotW,\n top: price.top,\n bottom: price.top + price.height,\n };\n };\n\n const formatSpan = (bars: number, ms: number) => {\n const l = labels();\n const abs = Math.abs(ms);\n const parts: string[] = [];\n const days = Math.floor(abs / DAY);\n const hours = Math.floor((abs % DAY) / HOUR);\n const minutes = Math.floor((abs % HOUR) / MINUTE);\n if (days) parts.push(fill(l.days, { count: days }));\n if (hours) parts.push(fill(l.hours, { count: hours }));\n if (minutes && !days) parts.push(fill(l.minutes, { count: minutes }));\n return `${fill(labels().bars, { count: bars })}, ${parts.join(\" \") || fill(l.minutes, { count: 0 })}`;\n };\n\n const paintForeground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const price = panes[0];\n if (!price) return;\n const count = n();\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const upC = css(upCss());\n const downC = css(downCss());\n\n // ---- price pane contents (clipped)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n\n // high / low of the visible bars\n if (\n v &&\n options.highLowMarkers !== false &&\n style() !== \"line\" &&\n style() !== \"area\" &&\n style() !== \"baseline\"\n ) {\n let hi = -Infinity;\n let lo = Infinity;\n let hiG = -1;\n let loG = -1;\n for (let g = v.s0; g <= v.s1; g++) {\n if (v.cols.high[g] > hi) {\n hi = v.cols.high[g];\n hiG = g;\n }\n if (v.cols.low[g] < lo) {\n lo = v.cols.low[g];\n loG = g;\n }\n }\n ctx.font = font(theme.fontSize);\n ctx.fillStyle = muted;\n ctx.strokeStyle = muted;\n ctx.lineWidth = 1;\n for (const [g, value, below] of [\n [hiG, hi, false],\n [loG, lo, true],\n ] as const) {\n if (g < 0 || !finite(value)) continue;\n const x = xOf(groupCenter(v, g));\n const y = yOf(price.scale, value) + (below ? 9 : -9);\n const leftSide = x > plotW * 0.6;\n const label = formatPrice(value);\n ctx.textBaseline = \"middle\";\n ctx.textAlign = leftSide ? \"right\" : \"left\";\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + (leftSide ? -14 : 14), y);\n ctx.stroke();\n ctx.fillText(label, x + (leftSide ? -17 : 17), y);\n }\n }\n\n // trade markers\n if (v && options.markers?.length) {\n const stack = new Map<string, number>();\n ctx.font = font(theme.fontSize, 600);\n ctx.textAlign = \"center\";\n const many = options.markers.length > 400;\n for (const marker of options.markers) {\n const index = indexOfTimeExt(marker.time);\n if (index < 0 || index > count - 1) continue;\n const g = Math.floor(index / v.size);\n if (g < v.g0 || g > v.g1) continue;\n const x = Math.round(xOf(groupCenter(v, g)));\n const sell = marker.side === \"sell\";\n const color = marker.color ? css(marker.color) : sell ? downC : upC;\n const key = `${g}:${sell}`;\n const offset = stack.get(key) ?? 0;\n stack.set(key, offset + (marker.text && !many ? 30 : 16));\n const anchor = yOf(price.scale, sell ? v.cols.high[g] : v.cols.low[g]);\n const dir = sell ? -1 : 1;\n const tip = anchor + dir * (6 + offset);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x, tip);\n ctx.lineTo(x - 5.5, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 7);\n ctx.lineTo(x + 5.5, tip + dir * 7);\n ctx.closePath();\n ctx.fill();\n if (marker.text && !many) {\n ctx.textBaseline = sell ? \"bottom\" : \"top\";\n ctx.fillText(marker.text, x, tip + dir * 14);\n }\n if (marker.price !== undefined && finite(marker.price)) {\n ctx.beginPath();\n ctx.arc(x, yOf(price.scale, marker.price), 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = bgCss;\n ctx.stroke();\n }\n }\n }\n\n // drawings\n const mapper = drawingMapper();\n if (mapper) {\n const context = (drawing: TradingDrawing) => ({\n color: css(drawing.color ?? PRIMARY),\n text,\n background: bgCss,\n up: upC,\n down: downC,\n font: font(theme.fontSize, 500),\n formatPrice,\n formatPercent: (value: number) => formatPercent(value, locale),\n formatSpan,\n textOn,\n });\n for (const drawing of drawings) {\n paintDrawing(ctx, drawing, mapper, context(drawing), {\n selected: drawing.id === selected,\n hovered: drawing.id === hovered,\n });\n }\n if (draft)\n paintDrawing(ctx, draft, mapper, context(draft), {\n selected: true,\n hovered: false,\n });\n }\n\n // price lines (orders, positions, TP / SL, alerts)\n const lastClose = count ? store.close[count - 1] : NaN;\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = Math.round(yOf(price.scale, p)) + 0.5;\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const color = lineColor(line);\n const kind = line.kind ?? \"line\";\n const lineStyle =\n line.lineStyle ??\n (kind === \"position\" || kind === \"line\" ? \"solid\" : \"dashed\");\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth =\n hoveredLine === line.id ||\n (gesture?.kind === \"order\" && gesture.line.id === line.id)\n ? 1.5\n : 1;\n setDash(ctx, lineStyle, 1);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n // label: [grip] title | quantity | profit\n const titleKey = PRICE_LINE_TITLES[kind];\n const title = line.title ?? (titleKey ? labels()[titleKey] : \"\");\n const parts: { text: string; fill: string; color: string }[] = [];\n if (title) parts.push({ text: title, fill: color, color: textOn(color) });\n if (line.quantity !== undefined && line.quantity !== \"\")\n parts.push({ text: String(line.quantity), fill: bgCss, color });\n if (\n kind === \"position\" &&\n typeof line.quantity === \"number\" &&\n finite(lastClose)\n ) {\n const pnl =\n (lastClose - p) * line.quantity * (line.side === \"sell\" ? -1 : 1);\n const pnlFill = pnl >= 0 ? upC : downC;\n parts.push({\n text: `${pnl >= 0 ? \"+\" : \"−\"}${formatPrice(Math.abs(pnl))}`,\n fill: pnlFill,\n color: textOn(pnlFill),\n });\n }\n if (!parts.length && !line.draggable) continue;\n ctx.font = font(theme.fontSize, 600);\n const widths = parts.map((part) => ctx.measureText(part.text).width + 12);\n const grip = line.draggable ? 14 : 0;\n const total = widths.reduce((a, b) => a + b, 0) + grip;\n let x = Math.round(plotW - total - 56);\n const top = Math.round(y - 9.5);\n roundRect(ctx, x - 0.5, top - 0.5, total + 1, 19, 3);\n ctx.fillStyle = bgCss;\n ctx.fill();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.setLineDash([]);\n ctx.stroke();\n if (grip) {\n ctx.fillStyle = color;\n for (let k = 0; k < 3; k++)\n ctx.fillRect(x + 4, top + 5 + k * 3.5, 6, 1.5);\n x += grip;\n }\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n parts.forEach((part, k) => {\n if (part.fill !== bgCss) {\n ctx.fillStyle = part.fill;\n ctx.fillRect(x, top, widths[k], 18);\n }\n ctx.fillStyle = part.color;\n ctx.fillText(part.text, x + widths[k] / 2, top + 9.5);\n x += widths[k];\n });\n }\n\n // last price line\n const lastLine = options.lastPriceLine !== false && count > 0;\n const lastUp = count > 0 && store.close[count - 1] >= store.open[count - 1];\n const lastColor = lastUp ? upC : downC;\n if (lastLine) {\n const y = Math.round(yOf(price.scale, lastClose)) + 0.5;\n ctx.save();\n ctx.strokeStyle = lastColor;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n ctx.restore();\n\n // price axis ticks, except under the labels drawn over the axis\n const covered: number[] = [];\n for (const line of options.priceLines ?? [])\n covered.push(yOf(price.scale, linePrice(line)));\n for (const drawing of drawings) {\n if (drawing.type === \"horizontalLine\" && drawing.points[0])\n covered.push(yOf(price.scale, drawing.points[0].price));\n }\n if (lastLine)\n covered.push(yOf(price.scale, lastClose) + (options.countdown ? 7 : 0));\n ctx.font = font(theme.fontSize);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = muted;\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = yOfScaled(pane.scale, t);\n if (y < pane.top + 8 || y > pane.top + pane.height - 8) continue;\n const gap = options.countdown ? 18 : 14;\n if (pane.id === PRICE && covered.some((c) => Math.abs(c - y) < gap))\n continue;\n ctx.fillText(paneTickText(pane, t), plotW + 8, y);\n }\n }\n // time axis ticks\n ctx.textAlign = \"center\";\n for (const t of ticks) {\n ctx.font = font(theme.fontSize, t.bold ? 600 : 400);\n ctx.fillStyle = t.bold ? text : muted;\n ctx.fillText(t.text, t.x, plotH + TIME_AXIS / 2);\n }\n\n // labels of the price lines and drawings\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = yOf(price.scale, p);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const fill = lineColor(line);\n axisLabel(ctx, y, priceAxisText(p), fill, textOn(fill));\n }\n for (const drawing of drawings) {\n if (drawing.type !== \"horizontalLine\" || !drawing.points[0]) continue;\n const p = drawing.points[0].price;\n const y = yOf(price.scale, p);\n if (y < price.top || y > price.top + price.height) continue;\n const fill = css(drawing.color ?? PRIMARY);\n axisLabel(ctx, y, priceAxisText(p), fill, textOn(fill));\n }\n // last price label (with the countdown)\n if (lastLine) {\n let second: string | undefined;\n if (options.countdown) {\n const tf = timeframe();\n const start = store.time[count - 1];\n let end = start + tf.ms;\n if (tf.unit === \"month\") {\n const date = new Date(start);\n end = Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + tf.count,\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n );\n }\n second = formatCountdown(end - Date.now(), labels());\n }\n axisLabel(\n ctx,\n yOf(price.scale, lastClose),\n priceAxisText(lastClose),\n lastColor,\n textOn(lastColor),\n second,\n );\n }\n\n // crosshair\n const cross = crosshairState();\n if (cross && v) {\n const x = Math.round(xOf(cross.index)) + 0.5;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.75);\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (x >= 0 && x <= plotW) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n const y = Math.round(cross.y) + 0.5;\n if (\n finite(y) &&\n y >= cross.pane.top &&\n y <= cross.pane.top + cross.pane.height\n ) {\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n const labelBg = toCss(theme.text);\n if (\n finite(cross.y) &&\n cross.y >= cross.pane.top &&\n cross.y <= cross.pane.top + cross.pane.height\n ) {\n const scaled = scaledAt(cross.pane.scale, cross.y);\n const textValue =\n cross.pane.id === PRICE\n ? priceAxisText(fromScaled(cross.pane.scale, scaled))\n : paneTickText(cross.pane, scaled);\n axisLabel(ctx, cross.y, textValue, labelBg, bgCss);\n }\n if (x >= 0 && x <= plotW && count) {\n const label = formatCrosshairTime(\n shiftTime(timeAt(cross.index), options.utcOffset),\n tfMs(),\n locale,\n );\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(label).width + 16;\n const left = clamp(x - w / 2, 0, width - w);\n roundRect(ctx, left, plotH + 3, w, 21, 3);\n ctx.fillStyle = labelBg;\n ctx.fill();\n ctx.fillStyle = bgCss;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, left + w / 2, plotH + 14);\n }\n }\n };\n\n // -------------------------------------------------------------- legends\n\n let legendKey = \"\";\n const legendRows = new Map<string, LegendRow>();\n const legendBoxes = new Map<string, HTMLDivElement>();\n\n const legendBox = (id: string) => {\n let box = legendBoxes.get(id);\n if (!box) {\n box = make(\"div\", {\n position: \"absolute\",\n left: \"8px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"1px\",\n maxWidth: \"calc(100% - 16px)\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n });\n legends.appendChild(box);\n legendBoxes.set(id, box);\n }\n return box;\n };\n\n const legendRow = (\n box: HTMLDivElement,\n title: string,\n study: Study | null,\n outputs: number,\n ) => {\n const row = make(\"div\", {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"0 4px\",\n marginLeft: \"-4px\",\n borderRadius: \"4px\",\n background:\n \"color-mix(in srgb, var(--surface-color, var(--background-color, #fff)) 86%, transparent)\",\n });\n let button: HTMLButtonElement | null = null;\n if (study) {\n button = make(\"button\", {\n all: \"unset\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n });\n button.type = \"button\";\n button.textContent = title;\n button.setAttribute(\n \"aria-label\",\n fill(labels().toggleIndicator, { name: title }),\n );\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const next = !isVisible(study);\n visibility.set(study.id, next);\n emit(\"indicatorToggle\", { id: study.id, visible: next });\n updateLegends();\n invalidate();\n });\n button.addEventListener(\"pointerdown\", (event) =>\n event.stopPropagation(),\n );\n row.appendChild(button);\n } else if (title) {\n const label = make(\"span\", { fontWeight: \"600\" });\n label.textContent = title;\n row.appendChild(label);\n }\n const values: HTMLSpanElement[] = [];\n for (let i = 0; i < outputs; i++) {\n const span = make(\"span\", {});\n row.appendChild(span);\n values.push(span);\n }\n box.appendChild(row);\n return { row, values, button };\n };\n\n const buildLegends = () => {\n legendRows.clear();\n for (const box of legendBoxes.values()) box.remove();\n legendBoxes.clear();\n if (options.legend === false) return;\n const priceBox = legendBox(PRICE);\n const head = [\n options.symbol,\n options.labels?.timeframe ??\n (typeof options.timeframe === \"string\" ? options.timeframe : \"\"),\n ]\n .filter(Boolean)\n .join(\" · \");\n legendRows.set(\"ohlc\", legendRow(priceBox, head, null, 1));\n for (const study of studies) {\n if (study.overlay && study.type === \"volume\") {\n legendRows.set(study.id, legendRow(priceBox, titleOf(study), study, 1));\n } else if (study.overlay) {\n legendRows.set(\n study.id,\n legendRow(priceBox, titleOf(study), study, study.outputs.length),\n );\n }\n }\n for (const c of compares)\n legendRows.set(`compare:${c.id}`, legendRow(priceBox, \"\", null, 1));\n for (const study of studies) {\n if (study.overlay) continue;\n legendRows.set(\n study.id,\n legendRow(\n legendBox(study.id),\n titleOf(study),\n study,\n study.outputs.length,\n ),\n );\n }\n };\n\n /** Legend title: indicator abbreviations, but a word for the volume */\n const titleOf = (study: Study) =>\n study.type === \"volume\" ? labels().volume : study.title;\n\n const setSpan = (\n span: HTMLSpanElement | undefined,\n text: string,\n color?: string,\n ) => {\n if (!span) return;\n if (span.textContent !== text) span.textContent = text;\n const c = color ?? \"\";\n if (span.style.color !== c) span.style.color = c;\n };\n\n const updateLegends = () => {\n const key = [\n options.legend !== false,\n options.symbol,\n options.timeframe,\n ...studies.map((s) => `${s.id}:${titleOf(s)}:${s.outputs.length}`),\n ...compares.map((c) => c.id),\n texts.toggleIndicator,\n options.labels?.timeframe,\n ].join(\"|\");\n if (key !== legendKey) {\n legendKey = key;\n buildLegends();\n }\n if (options.legend === false) return;\n for (const pane of panes) {\n const box = legendBoxes.get(pane.id);\n if (box) box.style.top = `${pane.top + 6}px`;\n }\n const count = n();\n const cross = crosshairState();\n const index = clamp(\n cross && cross.index >= 0 && cross.index < count\n ? cross.index\n : count - 1,\n 0,\n Math.max(0, count - 1),\n );\n const l = labels();\n const ohlc = legendRows.get(\"ohlc\");\n const upC = css(upCss());\n const downC = css(downCss());\n if (ohlc && count) {\n const d = display();\n const o = d.open[index];\n const c = d.close[index];\n const prevClose = index > 0 ? d.close[index - 1] : o;\n const change = c - prevClose;\n const color = c >= o ? upC : downC;\n const span = ohlc.values[0];\n const html = [\n [l.open, d.open[index]],\n [l.high, d.high[index]],\n [l.low, d.low[index]],\n [l.close, c],\n ]\n .map(\n ([name, value]) =>\n `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(String(name))}</span><span style=\"color:${color}\">${escapeHtml(formatPrice(value as number))}</span>`,\n )\n .join(\" \");\n const pct = prevClose ? (change / prevClose) * 100 : NaN;\n const changeName = l.change\n ? `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.change)}</span>`\n : \"\";\n const changeHtml = `${changeName}<span style=\"color:${change >= 0 ? upC : downC}\">${change >= 0 ? \"+\" : \"−\"}${escapeHtml(formatPrice(Math.abs(change)))} (${escapeHtml(formatPercent(pct, locale))})</span>`;\n const vol = store.hasVolume\n ? ` <span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.volume)}</span>${escapeHtml(formatVolume(store.volume[index], locale))}`\n : \"\";\n const next = `${html} ${changeHtml}${vol}`;\n if (span && span.dataset.html !== next) {\n span.innerHTML = next;\n span.dataset.html = next;\n span.style.display = \"inline-flex\";\n span.style.gap = \"4px\";\n span.style.flexWrap = \"wrap\";\n }\n }\n for (const study of studies) {\n const row = legendRows.get(study.id);\n if (!row) continue;\n const shown = isVisible(study);\n row.row.style.opacity = shown ? \"1\" : \"0.5\";\n if (row.button) {\n row.button.setAttribute(\"aria-pressed\", String(shown));\n row.button.style.textDecoration = shown ? \"none\" : \"line-through\";\n }\n const slots = study.outputs.length;\n study.outputs.forEach((out, i) => {\n // the MACD histogram (drawn first, under the lines) is listed last\n const span =\n row.values[study.type === \"macd\" ? (i + slots - 1) % slots : i];\n if (!shown || !count) {\n setSpan(span, \"\");\n return;\n }\n if (out.kind === \"volume\") {\n const c = store.close[index] >= store.open[index] ? upC : downC;\n setSpan(span, formatVolume(store.volume[index], locale), c);\n return;\n }\n const value = out.values[index];\n let color = out.color ? css(out.color) : undefined;\n if (out.kind === \"histogram\") color = value >= 0 ? upC : downC;\n const prefix =\n study.outputs.length > 1 && study.type !== \"boll\"\n ? `${out.label} `\n : \"\";\n setSpan(span, `${prefix}${studyValueText(study, value)}`, color);\n });\n }\n for (const c of compares) {\n const row = legendRows.get(`compare:${c.id}`);\n if (!row) continue;\n const value = c.values[index];\n const base = compareBase(c);\n const pct = finite(base) ? (value / base - 1) * 100 : NaN;\n setSpan(\n row.values[0],\n `${c.name} ${formatPrice(value)} ${formatPercent(pct, locale)}`,\n css(c.color),\n );\n }\n };\n\n const escapeHtml = (text: string) =>\n text.replace(/[&<>\"]/g, (ch) =>\n ch === \"&\"\n ? \"&\"\n : ch === \"<\"\n ? \"<\"\n : ch === \">\"\n ? \">\"\n : \""\",\n );\n\n // ---------------------------------------------------------------- frame\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(() => frame(Date.now()), 16) as unknown as number);\n };\n\n const animate = (now: number) => {\n let active = false;\n if (scrollAnim) {\n const t = Math.min(1, (now - scrollAnim.start) / 320);\n const eased = 1 - (1 - t) ** 3;\n right = scrollAnim.from + (scrollAnim.to - scrollAnim.from) * eased;\n if (t >= 1) scrollAnim = null;\n else active = true;\n }\n if (kinetic) {\n const dt = Math.min(64, now - kinetic.t);\n kinetic.t = now;\n const before = right;\n right -= (kinetic.v * dt) / spacing;\n kinetic.v *= Math.exp(-dt / 320);\n clampView();\n if (Math.abs(kinetic.v) < 0.02 || right === before) kinetic = null;\n else active = true;\n }\n return active;\n };\n\n const measureAxis = (ctx: CanvasRenderingContext2D) => {\n ctx.font = font(theme.fontSize, 500);\n let widest = 0;\n for (const pane of panes) {\n for (const t of pane.ticks)\n widest = Math.max(widest, ctx.measureText(paneTickText(pane, t)).width);\n }\n const count = n();\n if (count) {\n widest = Math.max(\n widest,\n ctx.measureText(priceAxisText(store.close[count - 1])).width,\n );\n if (options.countdown)\n widest = Math.max(widest, ctx.measureText(\"00:00:00\").width);\n }\n const wanted = Math.max(MIN_AXIS, Math.ceil(widest + 18));\n // shrink only when clearly narrower (no jitter while the price moves)\n if (wanted > axisW || wanted < axisW - 12) axisW = wanted;\n };\n\n function frame(now?: number) {\n frameId = 0;\n if (destroyed) return;\n width = root.clientWidth;\n height = root.clientHeight;\n if (width <= 0 || height <= 0) return;\n const time = now ?? Date.now();\n const animating = animate(\n typeof performance !== \"undefined\" ? performance.now() : time,\n );\n const dpr = win?.devicePixelRatio || 1;\n syncDerived();\n sizeCanvas(background, dpr);\n sizeCanvas(foreground, dpr);\n const bg = background.getContext(\"2d\");\n const fg = foreground.getContext(\"2d\");\n plotH = Math.max(1, height - TIME_AXIS);\n for (let pass = 0; pass < 2; pass++) {\n plotW = Math.max(1, width - axisW);\n layoutPanes();\n if (pendingRange) applyRange(pendingRange);\n clampView();\n vis = computeVisible();\n autoscale(vis);\n for (const pane of panes) {\n const ticks = scaleTicks(pane.scale, pane.id === PRICE ? 44 : 30);\n // fixed-range panes (RSI) label their bands and their middle\n const range = pane.study?.range;\n const bands = pane.study?.bands;\n pane.ticks =\n range && bands\n ? [...bands, (range[0] + range[1]) / 2].sort((a, b) => a - b)\n : ticks.scaled;\n pane.step = ticks.step;\n }\n const before = axisW;\n if (fg) measureAxis(fg);\n if (axisW === before) break;\n }\n const v = vis;\n pendingRange = null;\n const ticks = fg ? timeTicks(v, fg) : [];\n renderData(v, dpr);\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n paintBackground(bg, v, ticks);\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n paintForeground(fg, v, ticks);\n }\n updateLegends();\n updateJump();\n emitView();\n if (animating) invalidate();\n }\n\n const updateJump = () => {\n const count = n();\n const price = panes[0];\n const show = count > 0 && price && xOf(count - 1) > plotW + spacing * 0.5;\n jump.style.display = show ? \"flex\" : \"none\";\n if (show && price) {\n jump.style.left = `${plotW - 40}px`;\n jump.style.top = `${price.top + price.height - 40}px`;\n const text = labels().scrollToRealtime;\n if (jump.getAttribute(\"aria-label\") !== text) {\n jump.setAttribute(\"aria-label\", text);\n jump.title = text;\n }\n }\n };\n\n const visibleRange = (): TradingVisibleRange => {\n const from = right - plotW / spacing;\n return { from, to: right, fromTime: timeAt(from), toTime: timeAt(right) };\n };\n\n const emitView = () => {\n const count = n();\n if (!count) return;\n const range = visibleRange();\n if (\n !lastRange ||\n Math.abs(lastRange.from - range.from) > 1e-6 ||\n Math.abs(lastRange.to - range.to) > 1e-6\n ) {\n lastRange = range;\n emit(\"visibleRangeChange\", range);\n }\n if (range.from < 10 && historyFirst !== store.time[0]) {\n historyFirst = store.time[0];\n emit(\"historyRequest\", { firstTime: store.time[0], count });\n }\n const cross = crosshairState();\n const key = cross ? `${cross.index}|${cross.price}|${cross.pane.id}` : \"\";\n if (key !== lastCrosshair) {\n lastCrosshair = key;\n if (!cross) {\n emit(\"crosshairMove\", null);\n } else {\n const event: TradingCrosshairEvent = {\n index: cross.index,\n time: timeAt(cross.index),\n bar:\n cross.index >= 0 && cross.index < count\n ? readBar(store, cross.index)\n : null,\n price: cross.price,\n pane: cross.pane.id,\n x: xOf(cross.index),\n y: cross.y,\n };\n emit(\"crosshairMove\", event);\n }\n }\n };\n\n // ---------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = root.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const applyRange = (range: { from: number; to: number }) => {\n spacing = plotW / (range.to - range.from);\n right = range.to;\n clampView();\n };\n\n /**\n * Zooms around `x`; while the latest bar is in view it stays where it is\n * (the reader is following the market), like the price scale side of\n * trading terminals\n */\n const zoomAt = (x: number, factor: number) => {\n const count = n();\n if (count && followsRealtime()) x = Math.min(plotW, xOf(count - 1));\n const anchor = indexAt(x);\n spacing = spacing * factor;\n clampView();\n right = anchor + (plotW - x) / spacing;\n clampView();\n kinetic = null;\n scrollAnim = null;\n invalidate();\n };\n\n const anchorAt = (x: number, y: number): TradingDrawingPoint => {\n const index = Math.round(indexAt(x));\n return { time: timeAt(index), price: valueAt(panes[0].scale, y) };\n };\n\n const setTool = (next: TradingDrawingTool, notify: boolean) => {\n if (next === tool) return;\n tool = next;\n draft = null;\n if (notify) emit(\"drawingToolChange\", next);\n invalidate();\n };\n\n const select = (id: string | null) => {\n if (id === selected) return;\n selected = id;\n emit(\"drawingSelect\", id);\n invalidate();\n };\n\n const commitDrawings = (next: readonly TradingDrawing[]) => {\n drawings = next;\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n invalidate();\n };\n\n const finishDraft = () => {\n if (!draft) return;\n const done = draft;\n draft = null;\n commitDrawings([...drawings, done]);\n select(done.id);\n if (!options.keepDrawingMode) setTool(\"cursor\", true);\n };\n\n const hitLine = (x: number, y: number) => {\n const price = panes[0];\n if (!price || x > plotW) return null;\n for (const line of options.priceLines ?? []) {\n if (!line.draggable) continue;\n if (Math.abs(yOf(price.scale, linePrice(line)) - y) <= 5) return line;\n }\n return null;\n };\n\n const hitDrawingAt = (x: number, y: number) => {\n const mapper = drawingMapper();\n if (!mapper || y < mapper.top || y > mapper.bottom || x > plotW)\n return null;\n for (let i = drawings.length - 1; i >= 0; i--) {\n const hit = hitDrawing(drawings[i], mapper, { x, y });\n if (hit) return { drawing: drawings[i], hit };\n }\n return null;\n };\n\n const separatorAt = (y: number) => {\n for (let i = 1; i < panes.length; i++) {\n if (Math.abs(panes[i].top - y) <= 4) return i;\n }\n return -1;\n };\n\n const updateCursor = (x: number, y: number) => {\n let cursor = \"crosshair\";\n hoveredLine = null;\n let nextHover: string | null = null;\n if (gesture?.kind === \"pan\" && gesture.moved) cursor = \"grabbing\";\n else if (separatorAt(y) > 0) cursor = \"row-resize\";\n else if (x > plotW && y < plotH) cursor = \"ns-resize\";\n else if (y > plotH) cursor = \"ew-resize\";\n else if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n cursor = \"ns-resize\";\n hoveredLine = line.id;\n } else {\n const hit = hitDrawingAt(x, y);\n if (hit) {\n nextHover = hit.drawing.id;\n cursor = hit.drawing.locked\n ? \"pointer\"\n : hit.hit.part === \"handle\"\n ? \"move\"\n : \"pointer\";\n }\n }\n }\n if (nextHover !== hovered) hovered = nextHover;\n if (root.style.cursor !== cursor) root.style.cursor = cursor;\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === \"mouse\") return;\n const { x, y } = local(event);\n pointer = { x, y };\n keyboardIndex = null;\n kinetic = null;\n scrollAnim = null;\n if (event.pointerType === \"touch\") {\n touches.set(event.pointerId, { x, y });\n if (touches.size === 2) {\n const [a, b] = [...touches.values()];\n pinch = { distance: Math.hypot(a.x - b.x, a.y - b.y), spacing };\n gesture = null;\n return;\n }\n }\n try {\n root.setPointerCapture(event.pointerId);\n } catch {\n // the pointer may already be released\n }\n const sep = separatorAt(y);\n if (sep > 0) {\n const above = panes[sep - 1];\n const below = panes[sep];\n gesture = {\n kind: \"separator\",\n index: sep,\n y,\n above: above.height,\n below: below.height,\n };\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane)\n gesture = {\n kind: \"axisY\",\n pane,\n y,\n min: pane.scale.min,\n max: pane.scale.max,\n };\n return;\n }\n if (y > plotH) {\n gesture = { kind: \"axisX\", x, spacing };\n return;\n }\n const pane = paneAt(y);\n if (tool !== \"cursor\" && pane?.id === PRICE && n()) {\n const point = anchorAt(x, y);\n if (draft) {\n draft = { ...draft, points: [draft.points[0], point] };\n finishDraft();\n gesture = null;\n return;\n }\n const type = tool;\n draft = {\n id: `drawing-${Date.now().toString(36)}-${++drawingCounter}`,\n type,\n points: anchorCount(type) === 1 ? [point] : [point, point],\n };\n if (anchorCount(type) === 1) {\n finishDraft();\n return;\n }\n gesture = { kind: \"create\", x, y, moved: false };\n invalidate();\n return;\n }\n if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n gesture = { kind: \"order\", line, startPrice: line.price };\n return;\n }\n const hit = hitDrawingAt(x, y);\n if (hit) {\n select(hit.drawing.id);\n if (!hit.drawing.locked) {\n gesture = {\n kind: \"drawing\",\n id: hit.drawing.id,\n handle: hit.hit.part === \"handle\" ? hit.hit.index : -1,\n x,\n y,\n original: hit.drawing,\n moved: false,\n };\n }\n return;\n }\n }\n gesture = {\n kind: \"pan\",\n x,\n y,\n right,\n pane,\n moved: false,\n lastX: x,\n lastY: y,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n pointer = { x, y };\n if (event.pointerType === \"touch\" && touches.has(event.pointerId)) {\n touches.set(event.pointerId, { x, y });\n if (pinch && touches.size === 2) {\n const [a, b] = [...touches.values()];\n const distance = Math.hypot(a.x - b.x, a.y - b.y);\n const count = n();\n const mid =\n count && followsRealtime()\n ? Math.min(plotW, xOf(count - 1))\n : (a.x + b.x) / 2;\n const anchor = indexAt(mid);\n spacing = (pinch.spacing * distance) / Math.max(1, pinch.distance);\n clampView();\n right = anchor + (plotW - mid) / spacing;\n clampView();\n invalidate();\n return;\n }\n }\n const g = gesture;\n if (!g) {\n updateCursor(x, y);\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\": {\n const dx = x - g.x;\n if (!g.moved && Math.hypot(dx, y - g.y) < 3) break;\n g.moved = true;\n right = g.right - dx / spacing;\n if (g.pane && !g.pane.scale.auto) panScale(g.pane.scale, y - g.lastY);\n g.lastY = y;\n const dt = Math.max(1, event.timeStamp - g.lastT);\n g.velocity = 0.6 * ((x - g.lastX) / dt) + 0.4 * g.velocity;\n g.lastX = x;\n g.lastT = event.timeStamp;\n clampView();\n root.style.cursor = \"grabbing\";\n break;\n }\n case \"axisY\": {\n const scale = g.pane.scale;\n scale.min = g.min;\n scale.max = g.max;\n zoomScale(scale, Math.exp((y - g.y) * 0.006));\n break;\n }\n case \"axisX\": {\n const lastIndex = right;\n spacing = g.spacing * Math.exp((x - g.x) * 0.006);\n clampView();\n right = lastIndex;\n clampView();\n break;\n }\n case \"separator\": {\n const dy = y - g.y;\n const above = panes[g.index - 1];\n const below = panes[g.index];\n if (!above || !below) break;\n const total = g.above + g.below;\n const nextBelow = clamp(g.below - dy, MIN_PANE, total - MIN_PANE);\n paneHeights.set(below.id, nextBelow);\n if (above.id !== PRICE) paneHeights.set(above.id, total - nextBelow);\n break;\n }\n case \"order\": {\n const price = valueAt(panes[0].scale, y);\n const step = 10 ** -precision();\n lineOverrides.set(g.line.id, Math.round(price / step) * step);\n break;\n }\n case \"drawing\": {\n if (!g.moved && Math.hypot(x - g.x, y - g.y) < 3) break;\n g.moved = true;\n const scale = panes[0].scale;\n const di = Math.round(indexAt(x) - indexAt(g.x));\n const ds = scaledAt(scale, y) - scaledAt(scale, g.y);\n const points = g.original.points.map((p, i) => {\n if (g.handle >= 0 && i !== g.handle) return p;\n if (g.handle >= 0) return anchorAt(x, y);\n return {\n time: timeAt(Math.round(indexOfTimeExt(p.time)) + di),\n price: fromScaled(scale, toScaled(scale, p.price) + ds),\n };\n });\n drawings = drawings.map((d) => (d.id === g.id ? { ...d, points } : d));\n break;\n }\n case \"create\": {\n if (draft) {\n if (Math.hypot(x - g.x, y - g.y) >= 4) g.moved = true;\n draft = { ...draft, points: [draft.points[0], anchorAt(x, y)] };\n }\n break;\n }\n }\n invalidate();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n touches.delete(event.pointerId);\n if (touches.size < 2) pinch = null;\n const g = gesture;\n gesture = null;\n const { x, y } = local(event);\n if (event.pointerType === \"touch\") pointer = null;\n if (!g) {\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\":\n if (!g.moved) {\n if (selected) select(null);\n const pane = paneAt(y);\n if (pane && x <= plotW) {\n emit(\"click\", {\n index: Math.round(indexAt(x)),\n time: timeAt(Math.round(indexAt(x))),\n price: valueAt(pane.scale, y),\n pane: pane.id,\n });\n }\n } else if (\n options.kineticScroll !== false &&\n event.timeStamp - g.lastT < 60 &&\n Math.abs(g.velocity) > 0.25\n ) {\n kinetic = {\n v: g.velocity,\n t:\n typeof performance !== \"undefined\"\n ? performance.now()\n : Date.now(),\n };\n }\n break;\n case \"order\": {\n const next = lineOverrides.get(g.line.id);\n if (next !== undefined && next !== g.startPrice) {\n emit(\"orderMove\", {\n id: g.line.id,\n price: next,\n previousPrice: g.startPrice,\n line: g.line,\n });\n } else {\n lineOverrides.delete(g.line.id);\n }\n break;\n }\n case \"drawing\":\n if (g.moved) commitDrawings(drawings);\n break;\n case \"create\":\n // a click starts a click-click drawing; a drag finishes it\n if (g.moved) finishDraft();\n break;\n default:\n break;\n }\n updateCursor(x, y);\n invalidate();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (gesture || event.pointerType === \"touch\") return;\n pointer = null;\n hovered = null;\n hoveredLine = null;\n invalidate();\n };\n\n const onWheel = (event: WheelEvent) => {\n const mode = options.wheel ?? \"zoom\";\n if (mode === \"none\") return;\n const { x } = local(event);\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? plotW : 1;\n const dx = event.deltaX * unit;\n const dy = event.deltaY * unit;\n const modifier = event.ctrlKey || event.metaKey;\n if (mode === \"modifier\" && !modifier && Math.abs(dx) <= Math.abs(dy))\n return;\n event.preventDefault();\n keyboardIndex = null;\n if (Math.abs(dx) > Math.abs(dy) || event.shiftKey) {\n right += (Math.abs(dx) > Math.abs(dy) ? dx : dy) / spacing;\n clampView();\n kinetic = null;\n invalidate();\n return;\n }\n const factor = Math.exp(-dy * (event.ctrlKey ? 0.01 : 0.0015));\n zoomAt(Math.min(x, plotW), factor);\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = local(event);\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane) pane.scale.auto = true;\n } else if (y > plotH) {\n spacing = options.barSpacing ?? 8;\n instance.scrollToRealtime(true);\n } else {\n for (const scale of scales.values()) scale.auto = true;\n }\n invalidate();\n };\n\n const announce = (index: number) => {\n if (index < 0 || index >= n()) return;\n const d = display();\n const l = labels();\n live.textContent = fill(l.announcement, {\n time: formatCrosshairTime(\n shiftTime(store.time[index], options.utcOffset),\n tfMs(),\n locale,\n ),\n open: formatPrice(d.open[index]),\n high: formatPrice(d.high[index]),\n low: formatPrice(d.low[index]),\n close: formatPrice(d.close[index]),\n });\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n const count = n();\n const page = Math.max(1, Math.floor(plotW / spacing / 2));\n const move = (index: number) => {\n keyboardIndex = clamp(index, 0, Math.max(0, count - 1));\n const x = xOf(keyboardIndex);\n if (x < spacing) right += (spacing - x) / spacing + 1;\n if (x > plotW - spacing) right -= (x - plotW + spacing) / spacing - 1;\n clampView();\n announce(keyboardIndex);\n };\n const current = keyboardIndex ?? Math.min(count - 1, Math.round(right));\n switch (event.key) {\n case \"ArrowLeft\":\n move(current - (event.shiftKey ? 10 : 1));\n break;\n case \"ArrowRight\":\n move(current + (event.shiftKey ? 10 : 1));\n break;\n case \"PageUp\":\n move(current - page);\n break;\n case \"PageDown\":\n move(current + page);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(count - 1);\n instance.scrollToRealtime(true);\n break;\n case \"+\":\n case \"=\":\n case \"ArrowUp\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1.2);\n break;\n case \"-\":\n case \"_\":\n case \"ArrowDown\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1 / 1.2);\n break;\n case \"Escape\":\n if (draft) draft = null;\n else if (tool !== \"cursor\") setTool(\"cursor\", true);\n else if (selected) select(null);\n else keyboardIndex = null;\n break;\n case \"Delete\":\n case \"Backspace\": {\n const target = drawings.find((d) => d.id === selected);\n if (!target || target.locked) return;\n select(null);\n commitDrawings(drawings.filter((d) => d.id !== target.id));\n break;\n }\n default:\n return;\n }\n event.preventDefault();\n invalidate();\n };\n\n const onFocus = () => {\n let keyboard = true;\n try {\n keyboard = root.matches(\":focus-visible\");\n } catch {\n // older engines: show the ring\n }\n if (keyboard)\n root.style.boxShadow = `inset 0 0 0 2px ${toCss(theme.primary, 0.6)}`;\n };\n const onBlur = () => {\n root.style.boxShadow = \"\";\n if (keyboardIndex !== null) {\n keyboardIndex = null;\n invalidate();\n }\n };\n\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerUp);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"dblclick\", onDoubleClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"focus\", onFocus);\n root.addEventListener(\"blur\", onBlur);\n jump.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n jump.addEventListener(\"click\", () => instance.scrollToRealtime(true));\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(root);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(root);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n legendKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // the page language, when no `locale` is given\n let langObserver: MutationObserver | null = null;\n if (typeof MutationObserver === \"function\" && root.ownerDocument) {\n langObserver = new MutationObserver(() => {\n if (options.locale) return;\n const before = locale;\n resolveTexts();\n if (locale === before) return;\n legendKey = \"\";\n optionsVersion++;\n applyStatic();\n invalidate();\n });\n langObserver.observe(root.ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\n });\n }\n\n // ------------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => createDataCanvas(doc),\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n geomKey = \"\";\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, foreground);\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------- options\n\n const applyStatic = () => {\n const symbol = options.symbol ?? \"\";\n root.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? fill(labels().chart, { symbol }).trim(),\n );\n const wantTimer = !!options.countdown && options.lastPriceLine !== false;\n if (wantTimer && !countdownTimer)\n countdownTimer = setInterval(invalidate, 1000);\n if (!wantTimer && countdownTimer) {\n clearInterval(countdownTimer);\n countdownTimer = null;\n }\n };\n\n const applyOptions = (previous: TradingChartOptions | null) => {\n const next = options;\n resolveTexts();\n if (\n !previous ||\n next.indicators !== previous.indicators ||\n next.utcOffset !== previous.utcOffset\n ) {\n rebuildStudies();\n }\n if (!previous || next.compare !== previous.compare) rebuildCompares();\n if (next.bars && (!previous || next.bars !== previous.bars)) {\n if (previous) applyBarsOption(next.bars);\n else replaceBars(next.bars);\n } else if (!next.bars && previous?.bars) {\n replaceBars([]);\n }\n if (previous && next.barSpacing !== previous.barSpacing && next.barSpacing)\n spacing = next.barSpacing;\n if (previous && next.scaleMode !== previous.scaleMode) {\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n }\n if (\n next.drawings &&\n next.drawings !== emittedDrawings &&\n (!previous || next.drawings !== previous.drawings)\n ) {\n drawings = next.drawings;\n if (selected && !drawings.some((d) => d.id === selected)) select(null);\n }\n if (\n previous &&\n (next.drawingMode ?? \"cursor\") !== (previous.drawingMode ?? \"cursor\")\n ) {\n setTool(next.drawingMode ?? \"cursor\", false);\n }\n if (previous && next.priceLines !== previous.priceLines)\n lineOverrides.clear();\n if (previous && next.chartStyle !== previous.chartStyle)\n haValid = Math.min(haValid, 0);\n optionsVersion++;\n applyStatic();\n invalidate();\n };\n\n applyOptions(null);\n void initRenderer();\n\n // ------------------------------------------------------------------ api\n\n const instance: TradingChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = { ...next };\n applyOptions(previous);\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setBars(bars) {\n replaceBars(bars);\n },\n update(bar) {\n const before = n();\n const follow = followsRealtime();\n const at = storeUpdate(store, bar);\n if (at < 0) return;\n if (n() > before && follow) right += n() - before;\n afterDataChange(at);\n },\n appendBars(bars) {\n const before = n();\n const follow = followsRealtime();\n const at = storeAppend(store, bars);\n if (at < 0) return;\n if (follow) right += n() - before;\n afterDataChange(at);\n },\n prependBars(bars) {\n const added = storePrepend(store, bars);\n if (!added) return;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n if (keyboardIndex !== null) keyboardIndex += added;\n afterDataChange(0);\n },\n getBarCount: () => n(),\n getBar: (index) =>\n index >= 0 && index < n() ? readBar(store, Math.floor(index)) : null,\n scrollToRealtime(animateScroll = true) {\n const target = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n if (\n animateScroll &&\n finite(right) &&\n Math.abs(target - right) * spacing < plotW * 6\n ) {\n scrollAnim = {\n from: right,\n to: target,\n start:\n typeof performance !== \"undefined\" ? performance.now() : Date.now(),\n };\n } else {\n right = target;\n }\n invalidate();\n },\n fitContent() {\n const count = n();\n if (!count) return;\n instance.setVisibleRange({\n from: -0.5,\n to: count - 1 + (options.rightOffset ?? 8),\n });\n },\n getVisibleRange: () => visibleRange(),\n setVisibleRange({ from, to }) {\n if (!(to > from)) return;\n kinetic = null;\n scrollAnim = null;\n pendingRange = { from, to };\n applyRange(pendingRange);\n invalidate();\n },\n setScaleMode(mode) {\n options = { ...options, scaleMode: mode };\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n invalidate();\n },\n resetPriceScales() {\n for (const scale of scales.values()) scale.auto = true;\n invalidate();\n },\n setDrawingTool: (next) => setTool(next, true),\n getDrawingTool: () => tool,\n getDrawings: () => drawings,\n setDrawings(next) {\n drawings = next;\n if (selected && !drawings.some((d) => d.id === selected)) select(null);\n invalidate();\n },\n removeDrawing(id) {\n if (!drawings.some((d) => d.id === id)) return;\n if (selected === id) select(null);\n commitDrawings(drawings.filter((d) => d.id !== id));\n },\n selectDrawing: (id) => select(id),\n setIndicatorVisible(id, visible) {\n visibility.set(id, visible);\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n resize: () => invalidate(),\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) listeners.set(type, (set = new Set()));\n set.add(listener as (event: never) => void);\n return () => set.delete(listener as (event: never) => void);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n if (countdownTimer) clearInterval(countdownTimer);\n resizeObserver?.disconnect();\n unwatchTheme();\n langObserver?.disconnect();\n root.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n resolveReady(null);\n listeners.clear();\n root.remove();\n },\n };\n return instance;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chart.js","names":["styleElement","storeUpdate","storeAppend","storePrepend","assign","TIME_AXIS","MIN_AXIS","MAX_SPACING","MIN_PANE","PRICE","UP","DOWN","WARNING","PRIMARY","HISTORY_LIMIT","PALETTE","LINE_STYLES","syncHooks","PRICE_LINE_TITLES","clamp","v","lo","hi","textOn","color","parseColor","fill","luminance","finite","ORDER_KEYS","ELLIPSIS","PAIR","createTradingChart","doc","container","win","options","initial","destroyed","make","tag","style","root","layer","background","foreground","legends","jump","live","toolbar","editor","sheet","store","createStore","pyramid","createPyramid","ha","haValid","haPyramid","studies","studyValid","visibility","compares","outputLods","trendLods","dataVersion","tailVersion","detectedPrecision","inferredTimeframe","DAY","spacing","right","plotW","plotH","axisW","width","height","panes","scales","paneHeights","vis","volumeOverlayMax","theme","readTheme","themeVersion","optionsVersion","renderer","rendererToken","frameId","layers","geomKey","builtTail","itemVersion","resolveReady","ready","resolve","pointer","keyboardIndex","keyOrder","gesture","touches","pinch","kinetic","scrollAnim","pendingRange","drawings","emittedDrawings","committed","undoStack","redoStack","undoKey","tool","selected","hovered","draft","draftClicks","draftPane","drawingCounter","textBoxes","editing","toolbarKey","paletteOpen","lineOverrides","hoveredLine","canvasButtons","hoveredButton","lastRange","silentRange","externalCross","lastCrosshair","historyFirst","countdownTimer","replay","replayPicking","replaySpeed","profile","listeners","emit","type","fn","event","locale","resolveLocale","texts","localeLabels","TRADING_LABELS","resolveTexts","labels","n","redUp","redUpLocale","upCss","downCss","css","fallback","toCss","value","alpha","precision","priceFormat","priceFormatter","priceFormatKey","formatPrice","key","timeframe","parseTimeframe","tfMs","font","weight","size","isVisible","study","xOf","index","indexAt","x","timeAt","count","i","timeAtFrac","edge","t","indexAtTimeFrac","time","indexOfTime","span","zone","offsetMinutes","zoneOffset","studyOffset","shift","MINUTE","colorOf","groupRanges","rangeLevel","lod","values","trendLodOf","createRangePyramid","lodOf","out","indexOfTimeExt","last","display","markDirty","from","invalidateRangePyramid","trendLod","c","level","l","p","syncDerived","valid","next","heikinAshiInto","j","lowerBoundTime","afterDataChange","detectPrecision","inferTimeframe","invalidate","rebuildStudies","buildStudies","reused","id","s","rebuildCompares","data","series","a","b","LINE_COLORS","d","followsRealtime","replaceBars","setBars","bars","scale","applyBarsOption","length","inputLength","first","barAt","follow","before","at","updateBar","added","layoutPanes","paneStudies","available","wanted","total","max","k","heights","h","priceHeight","scaleOf","createScale","mode","price","top","paneAt","y","clampView","minSpacing","computeVisible","left","src","cols","pyramidLevel","i0","i1","r0","r1","groupCenter","g","groupBars","firstVisibleIndex","compareBase","compareScaled","base","toScaled","baselinePrice","outputExtent","r","offset","shiftBars","range","drawingsExtent","dragged","drawing","paneId","drawingPrices","autoscale","pane","closeOnly","vol","extent","scaled","fitScale","band","timeTicks","tf","intraday","gEnd","groupTime","candidates","prev","boundaryWeight","sample","gap","ctx","pickTicks","tickText","paneTickText","formatPercent","stepDecimals","fromScaled","formatVolume","formatFixed","studyValueText","createLayers","result","up","down","upP","packColor","downP","bg","metrics","candleMetrics","dpr","X","histogramHalf","volumeColors","bottom","Y","yOf","lineLayer","buffer","LineBuffer","isLive","ga","gb","toY","lineWidth","rangeLayer","dx","extra","to","prevY","yLo","yHi","second","trendLayer","trend","line","TrendBuffer","halo","items","upColor","downColor","st","BarBuffer","pixelRange","yOfScaled","lineColor","area","AreaBuffer","yb","upArea","downArea","upLine","downLine","px","py","point","hollow","ohlc","wick","body","wicks","bodies","caps","ticks","tick","o","cx","wt","wb","clampRange","side","bt","bb","segments","edges","box","upOut","downOut","y0","strong","faded","mix","fixed","radius","half","runLayer","lastMain","version","item","renderData","canvas","bw","bh","sizeCanvas","w","roundRect","paintFill","outA","f","outB","ra","rb","above","below","run","sign","flush","ya","d0","cy","paintSessionBreaks","xs","prevDay","day","profileOptions","option","paintVolumeProfile","rows","volumeProfile","largest","fromRight","y1","upLength","downLength","dir","start","paintBackground","grid","showGrid","ys","axisLabel","textColor","text","priceAxisText","kind","linePrice","crosshairState","bar","valueAt","best","yy","paneOf","drawingMapper","formatSpan","abs","ms","parts","days","hours","HOUR","minutes","paneValueText","roundPrice","step","pill","align","fillColor","canvasButton","paintDrawings","all","position","mapper","own","paintDrawing","colors","paintForeground","muted","bgCss","upC","downC","hiG","loG","label","labelLeft","row","priceLegend","roomRight","roomLeft","leftSide","tx","stack","many","marker","sell","anchor","tip","lastClose","lineStyle","setDash","titleKey","title","pnl","pnlFill","widths","part","grip","partFill","lastLine","lastUp","lastColor","compareLabels","covered","end","date","formatCountdown","badgeY","formatCrosshairTime","cross","labelBg","scaledAt","textValue","bx","by","orderPrice","hover","legendKey","legendRows","legendBoxes","legendBox","legendRow","button","updateLegends","outputs","buildLegends","priceBox","head","slots","titleOf","setSpan","maxWidth","maxHeight","measured","moved","prevClose","change","html","name","escapeHtml","pct","shown","source","prefix","ch","frame","animate","active","now","eased","dt","measureAxis","widest","animating","fg","pass","applyRange","scaleTicks","bands","updateJump","updateToolbar","positionEditor","emitView","buttonAt","updateCursor","show","visibleRange","readBar","local","rect","zoomAt","factor","anchorAt","setTool","notify","select","undoState","emitUndo","state","commitDrawings","restoreDrawings","undo","previous","closeEditor","redo","updateDrawing","patch","removeDrawing","positionPoints","entry","risk","target","long","stop","finishDraft","done","openEditor","fixDraftAnchor","followDraft","hitLine","hitDrawingAt","hit","hitDrawing","separatorAt","autosizeEditor","created","commit","icon","dash","path","toolbarButton","pressed","content","onClick","separator","buildToolbar","swatch","isFillable","remove","palette","dragging","pts","handlePoints","x0","x1","replayState","emitReplay","columnsOf","showBars","hasVolume","stopReplayTimer","beginReplay","replayStepBy","playReplay","speed","interval","perTick","endReplay","wasPicking","restore","cursor","nextHover","onPointerDown","endKeyOrder","sep","isPosition","anchors","anchorCount","onPointerMove","distance","mid","panScale","zoomScale","lastIndex","dy","nextBelow","points","moveHandle","di","ds","onPointerUp","onPointerLeave","onWheel","unit","modifier","onDoubleClick","instance","announce","say","keyLines","lineTitle","onOrderKey","orderText","lines","current","pickedId","picked","page","move","keyboard","resizeObserver","refreshTheme","themeColorsChanged","unwatchTheme","watchTheme","langObserver","applyStatic","compose","origin","view","element","computed","fullscreen","onFullscreen","initRenderer","token","createRenderer","createDataCanvas","exclude","symbol","wantTimer","applyOptions","nextZone","isTimeZone","timeChanged","unfollowDefault","followDefaultRenderer","appendBars","prependBars","animateScroll","quality","visible","set","listener"],"sources":["../../../../../charts/src/engine/trading/chart.ts"],"sourcesContent":["// Trading chart: candles (or bars, lines, areas...) over a gap-free index\n// axis, indicator panes, price lines, markers, drawings and streaming.\n//\n// Layers, bottom to top: a Canvas2D background (grid, bands, watermark),\n// the GPU data canvas covering every pane (candles, volumes, indicator\n// lines, baked in device pixels), a Canvas2D overlay (axes, labels, price\n// lines, markers, drawings, crosshair) and DOM legends. The GPU items are\n// rebuilt only when the view, the scales or the data change; a tick\n// rebuilds only the items of the last bar.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { createDataCanvas, styleElement } from \"../dom\";\nimport { createRenderer } from \"../renderers/detect\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport type { ChartRenderer, RenderItem } from \"../renderers/types\";\nimport { stepDecimals } from \"../scale\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { localeLabels, resolveLocale } from \"../locale\";\nimport {\n anchorCount,\n drawingPrices,\n handlePoints,\n hitDrawing,\n isFillable,\n isPosition,\n moveHandle,\n paintDrawing,\n setDash,\n type Box,\n type DrawingMapper,\n} from \"./drawings\";\nimport {\n DAY,\n HOUR,\n MINUTE,\n boundaryWeight,\n detectPrecision,\n formatCountdown,\n formatCrosshairTime,\n formatFixed,\n formatPercent,\n formatVolume,\n inferTimeframe,\n isTimeZone,\n pickTicks,\n priceFormatter,\n redUpLocale,\n tickText,\n zoneOffset,\n type UtcOffset,\n} from \"./format\";\nimport {\n AreaBuffer,\n BarBuffer,\n LineBuffer,\n TrendBuffer,\n candleMetrics,\n clampRange,\n pixelRange,\n} from \"./geometry\";\nimport { heikinAshiInto, parseTimeframe, volumeProfile } from \"./indicators\";\nimport { TRADING_LABELS, fill, type TradingTexts } from \"./labels\";\nimport {\n createScale,\n fitScale,\n fromScaled,\n panScale,\n scaleTicks,\n scaledAt,\n toScaled,\n valueAt,\n yOf,\n yOfScaled,\n zoomScale,\n type PaneScale,\n} from \"./scale\";\nimport {\n appendBars as storeAppend,\n createPyramid,\n createRangePyramid,\n createStore,\n indexOfTime,\n inputLength,\n invalidateRangePyramid,\n barAt,\n prependBars as storePrepend,\n pyramidLevel,\n rangeLevel,\n readBar,\n setBars as storeSet,\n updateBar as storeUpdate,\n lowerBoundTime,\n type BarStore,\n type OhlcColumns,\n type RangePyramid,\n} from \"./store\";\nimport {\n LINE_COLORS,\n buildStudies,\n type Study,\n type StudyOutput,\n} from \"./studies\";\nimport type {\n TradingBarsInput,\n TradingChartEventMap,\n TradingChartInstance,\n TradingChartOptions,\n TradingCrosshairEvent,\n TradingDrawing,\n TradingDrawingPatch,\n TradingDrawingPoint,\n TradingDrawingTool,\n TradingLineStyle,\n TradingPriceLine,\n TradingReplayState,\n TradingScaleMode,\n TradingUndoState,\n TradingVisibleRange,\n TradingVolumeProfile,\n TradingVolumeProfileOptions,\n} from \"./types\";\n\nconst TIME_AXIS = 28;\nconst MIN_AXIS = 60;\nconst MAX_SPACING = 60;\nconst MIN_PANE = 48;\nconst PRICE = \"price\";\nconst UP = \"var(--success-color, #089981)\";\nconst DOWN = \"var(--danger-color, #f23645)\";\nconst WARNING = \"var(--warning-color, #f59e0b)\";\nconst PRIMARY = \"var(--primary-color, #2962ff)\";\nconst HISTORY_LIMIT = 100;\n\n/** Colors of the drawing toolbar */\nconst PALETTE = [\n \"#2962ff\",\n \"#089981\",\n \"#f23645\",\n \"#f59e0b\",\n \"#a855f7\",\n \"#0ea5e9\",\n \"#ec4899\",\n \"#787b86\",\n];\nconst LINE_STYLES: readonly TradingLineStyle[] = [\"solid\", \"dashed\", \"dotted\"];\n\n/**\n * Hooks used by `syncCharts` to follow another chart without echoing its\n * events back (internal: not part of the public instance)\n */\nexport const syncHooks = new WeakMap<\n TradingChartInstance,\n { setTimeRange(range: { from: number; to: number }): void }\n>();\n\nconst PRICE_LINE_TITLES: Record<string, keyof TradingTexts | undefined> = {\n order: \"limit\",\n position: \"position\",\n takeProfit: \"takeProfit\",\n stopLoss: \"stopLoss\",\n alert: \"alert\",\n};\n\nconst clamp = (v: number, lo: number, hi: number) =>\n v < lo ? lo : v > hi ? hi : v;\n\n/** Readable text on a fill (a CSS color): dark on light fills, white otherwise */\nconst textOn = (fill: string) => {\n const color = parseColor(fill);\n return color && luminance(color) > 0.5 ? \"#0b0e11\" : \"#fff\";\n};\n\nconst finite = Number.isFinite;\n\ninterface Pane {\n id: string;\n study: Study | null;\n scale: PaneScale;\n top: number;\n height: number;\n ticks: number[];\n step: number;\n}\n\n/** Bars drawn: a level of the pyramid and the groups in view */\ninterface Visible {\n /** Logical index at the left edge */\n left: number;\n level: number;\n /** Bars per group */\n size: number;\n cols: OhlcColumns;\n /** Groups drawn (one extra on each side) */\n g0: number;\n g1: number;\n /** Groups whose center is in the plot */\n s0: number;\n s1: number;\n /** Last group */\n last: number;\n}\n\ninterface LegendRow {\n row: HTMLDivElement;\n values: HTMLSpanElement[];\n button: HTMLButtonElement | null;\n}\n\ntype Layer = (ga: number, gb: number, live: boolean) => RenderItem[];\n\n/** Interaction in progress */\ntype Gesture =\n | {\n kind: \"pan\";\n x: number;\n y: number;\n right: number;\n pane: Pane | null;\n moved: boolean;\n lastX: number;\n lastY: number;\n lastT: number;\n velocity: number;\n }\n | { kind: \"axisY\"; pane: Pane; y: number; min: number; max: number }\n | { kind: \"axisX\"; x: number; spacing: number }\n | {\n kind: \"separator\";\n index: number;\n y: number;\n above: number;\n below: number;\n }\n | { kind: \"order\"; line: TradingPriceLine; startPrice: number }\n | {\n kind: \"drawing\";\n id: string;\n pane: Pane;\n handle: number;\n x: number;\n y: number;\n original: TradingDrawing;\n moved: boolean;\n }\n | { kind: \"create\"; pane: Pane; x: number; y: number; moved: boolean }\n | { kind: \"button\"; action: () => void };\n\n/** Mounts a trading chart in `container` (which should have a height) */\n/** Keys of the keyboard order entry (`aria-keyshortcuts`) */\nconst ORDER_KEYS =\n \"B S O Shift+O ArrowUp ArrowDown Shift+ArrowUp Shift+ArrowDown Enter Escape Delete\";\n\n/** Legend items cut with an ellipsis when wider than the legend */\nconst ELLIPSIS: Partial<CSSStyleDeclaration> = {\n minWidth: \"0\",\n maxWidth: \"100%\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n/** A name and its value in the OHLC legend, never split by the wrapping */\nconst PAIR =\n \"display:inline-flex;gap:3px;max-width:100%;overflow:hidden;text-overflow:ellipsis\";\n\nexport const createTradingChart = (\n container: HTMLElement,\n initial: TradingChartOptions = {},\n): TradingChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n let options: TradingChartOptions = { ...initial };\n let destroyed = false;\n\n // ------------------------------------------------------------------ DOM\n\n const make = <K extends keyof HTMLElementTagNameMap>(\n tag: K,\n style: Partial<CSSStyleDeclaration>,\n ) => styleElement(doc.createElement(tag), style) as HTMLElementTagNameMap[K];\n\n const root = make(\"div\", {\n position: \"relative\",\n width: \"100%\",\n height: \"100%\",\n minHeight: \"0\",\n overflow: \"hidden\",\n outline: \"none\",\n userSelect: \"none\",\n touchAction: \"pan-y\",\n fontFamily: \"var(--font-family-sans, system-ui, sans-serif)\",\n color: \"var(--text-color, #1f2937)\",\n cursor: \"crosshair\",\n });\n root.className = \"minerva-trading-chart\";\n root.tabIndex = 0;\n root.setAttribute(\"role\", \"figure\");\n root.setAttribute(\"aria-roledescription\", \"chart\");\n\n const layer = (tag: \"canvas\" | \"div\") =>\n make(tag, {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n const background = layer(\"canvas\") as HTMLCanvasElement;\n const foreground = layer(\"canvas\") as HTMLCanvasElement;\n background.setAttribute(\"aria-hidden\", \"true\");\n foreground.setAttribute(\"aria-hidden\", \"true\");\n const legends = layer(\"div\") as HTMLDivElement;\n legends.style.right = \"0\";\n legends.style.bottom = \"0\";\n const jump = make(\"button\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"28px\",\n height: \"28px\",\n padding: \"0\",\n borderRadius: \"50%\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 80%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n boxShadow: \"0 4px 14px -4px rgba(15, 23, 42, 0.25)\",\n cursor: \"pointer\",\n });\n jump.type = \"button\";\n jump.innerHTML =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 3l5 5-5 5M9 3l5 5-5 5\"/></svg>';\n const live = make(\"div\", {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n live.setAttribute(\"aria-live\", \"polite\");\n // floating toolbar of the selected drawing, and the editor of text drawings\n const toolbar = make(\"div\", {\n position: \"absolute\",\n display: \"none\",\n alignItems: \"center\",\n gap: \"1px\",\n padding: \"3px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n zIndex: \"2\",\n cursor: \"default\",\n });\n toolbar.className = \"minerva-trading-toolbar\";\n toolbar.setAttribute(\"role\", \"toolbar\");\n const editor = make(\"textarea\", {\n position: \"absolute\",\n display: \"none\",\n minWidth: \"120px\",\n minHeight: \"28px\",\n padding: \"5px 9px\",\n resize: \"none\",\n border: \"1px solid var(--primary-color, #2962ff)\",\n borderRadius: \"5px\",\n outline: \"none\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n color: \"var(--text-color, #1f2937)\",\n font: \"500 13px var(--font-family-sans, system-ui, sans-serif)\",\n boxShadow: \"0 6px 18px -6px rgba(15, 23, 42, 0.3)\",\n zIndex: \"3\",\n });\n editor.rows = 1;\n const sheet = make(\"style\", {});\n sheet.textContent = `.minerva-trading-toolbar button{all:unset;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;min-width:26px;height:26px;padding:0 5px;border-radius:5px;cursor:pointer;color:var(--text-color,#1f2937)}.minerva-trading-toolbar button:hover{background:color-mix(in srgb,var(--text-color,#1f2937) 9%,transparent)}.minerva-trading-toolbar button:focus-visible{box-shadow:inset 0 0 0 2px var(--primary-color,#2962ff)}.minerva-trading-toolbar button[aria-pressed=\"true\"]{background:color-mix(in srgb,var(--primary-color,#2962ff) 16%,transparent);color:var(--primary-color,#2962ff)}.minerva-trading-toolbar .sep{width:1px;height:18px;margin:0 3px;background:var(--border-color,#e5e7eb)}`;\n root.append(\n sheet,\n background,\n foreground,\n legends,\n jump,\n toolbar,\n editor,\n live,\n );\n container.appendChild(root);\n\n // ----------------------------------------------------------------- data\n\n const store = createStore();\n let pyramid = createPyramid();\n /** Heikin-Ashi bars (time and volume shared with the store) */\n const ha: OhlcColumns = {\n time: store.time,\n open: new Float64Array(0),\n high: new Float64Array(0),\n low: new Float64Array(0),\n close: new Float64Array(0),\n volume: store.volume,\n };\n let haValid = 0;\n let haPyramid = createPyramid();\n let studies: Study[] = [];\n const studyValid = new Map<Study, number>();\n const visibility = new Map<string, boolean>();\n interface CompareRuntime {\n id: string;\n name: string;\n color: string;\n width: number;\n times: Float64Array;\n data: Float64Array;\n values: Float64Array;\n valid: number;\n lod: RangePyramid;\n }\n let compares: CompareRuntime[] = [];\n /** Min / max pyramids of the indicator outputs (zoomed-out decimation) */\n const outputLods = new WeakMap<StudyOutput, RangePyramid>();\n /** Min / max pyramids of the trend lines (SuperTrend) */\n const trendLods = new WeakMap<Study, RangePyramid>();\n /** Changes when bars other than the last one change */\n let dataVersion = 0;\n /** Changes when the last bar changes */\n let tailVersion = 0;\n let detectedPrecision = 2;\n let inferredTimeframe = DAY;\n\n // ----------------------------------------------------------------- view\n\n let spacing = options.barSpacing ?? 8;\n let right = NaN;\n let plotW = 0;\n let plotH = 0;\n let axisW = MIN_AXIS;\n let width = 0;\n let height = 0;\n let panes: Pane[] = [];\n const scales = new Map<string, PaneScale>();\n const paneHeights = new Map<string, number>();\n let vis: Visible | null = null;\n let volumeOverlayMax = 0;\n\n // -------------------------------------------------------------- state\n\n let theme: ChartTheme = readTheme(root);\n let themeVersion = 0;\n let optionsVersion = 0;\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let frameId = 0;\n let layers: { fn: Layer; main: RenderItem[]; live: RenderItem[] }[] = [];\n let geomKey = \"\";\n let builtTail = -1;\n let itemVersion = 0;\n let resolveReady!: (kind: ChartRendererKind | null) => void;\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n\n let pointer: { x: number; y: number } | null = null;\n let keyboardIndex: number | null = null;\n /**\n * Keyboard order entry: an order armed with B / S, or a price line picked\n * with O (its preview price lives in `lineOverrides`, like a drag)\n */\n let keyOrder:\n | { kind: \"create\"; side: \"buy\" | \"sell\"; price: number }\n | { kind: \"move\"; id: string; start: number; override?: number }\n | null = null;\n let gesture: Gesture | null = null;\n const touches = new Map<number, { x: number; y: number }>();\n let pinch: { distance: number; spacing: number } | null = null;\n let kinetic: { v: number; t: number } | null = null;\n let scrollAnim: { from: number; to: number; start: number } | null = null;\n /** Range asked by `setVisibleRange` / `fitContent`, applied once the plot width is known */\n let pendingRange: { from: number; to: number } | null = null;\n\n let drawings: readonly TradingDrawing[] = options.drawings ?? [];\n let emittedDrawings: readonly TradingDrawing[] | null = null;\n /** Drawings of the last commit: the base of the undo history */\n let committed: readonly TradingDrawing[] = drawings;\n const undoStack: (readonly TradingDrawing[])[] = [];\n const redoStack: (readonly TradingDrawing[])[] = [];\n let undoKey = \"false|false\";\n let tool: TradingDrawingTool = options.drawingMode ?? \"cursor\";\n let selected: string | null = null;\n let hovered: string | null = null;\n let draft: TradingDrawing | null = null;\n /** Clicks still needed by the drawing being made (three-anchor tools) */\n let draftClicks = 0;\n let draftPane: string = PRICE;\n let drawingCounter = 0;\n /** Text boxes measured when painted (hit tests of text drawings) */\n const textBoxes = new Map<string, Box>();\n /** Drawing whose text is being edited */\n let editing: { id: string; created: boolean } | null = null;\n let toolbarKey = \"\";\n let paletteOpen = false;\n const lineOverrides = new Map<string, number>();\n let hoveredLine: string | null = null;\n /** Clickable areas painted on the canvas (close buttons, order entry) */\n let canvasButtons: {\n x: number;\n y: number;\n w: number;\n h: number;\n action: () => void;\n }[] = [];\n let hoveredButton = -1;\n let lastRange: TradingVisibleRange | null = null;\n /** The next view change comes from a synchronized chart: not reported */\n let silentRange = false;\n /** Crosshair set by `setCrosshair` (synchronized charts) */\n let externalCross: { time: number; price: number } | null = null;\n let lastCrosshair = \"\";\n let historyFirst = NaN;\n let countdownTimer: ReturnType<typeof setInterval> | null = null;\n /** Bar replay: the full history, and the bars shown so far */\n let replay: {\n source: BarStore;\n playing: boolean;\n speed: number;\n timer: ReturnType<typeof setInterval> | null;\n } | null = null;\n let replayPicking = false;\n let replaySpeed = 4;\n let profile: { key: string; result: TradingVolumeProfile } | null = null;\n\n // ---------------------------------------------------------- listeners\n\n const listeners = new Map<string, Set<(event: never) => void>>();\n const emit = <K extends keyof TradingChartEventMap>(\n type: K,\n event: TradingChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: TradingChartEventMap[K]) => void)(event));\n };\n\n // ------------------------------------------------------------- helpers\n\n // locale and texts, resolved at each options update (and `<html lang>` change)\n let locale = resolveLocale(options.locale);\n let texts = localeLabels(TRADING_LABELS, locale, options.labels);\n const resolveTexts = () => {\n locale = resolveLocale(options.locale);\n texts = localeLabels(TRADING_LABELS, locale, options.labels);\n };\n const labels = () => texts;\n const n = () => store.length;\n const style = () => options.chartStyle ?? \"candles\";\n const redUp = () =>\n options.colorConvention === \"redUp\" ||\n (options.colorConvention === \"auto\" && redUpLocale(locale));\n const upCss = () => options.upColor ?? (redUp() ? DOWN : UP);\n const downCss = () => options.downColor ?? (redUp() ? UP : DOWN);\n const resolve = (css: string, fallback: Rgba = theme.primary): Rgba =>\n theme.resolve ? theme.resolve(css, fallback) : fallback;\n const css = (value: string, alpha = 1) => toCss(resolve(value), alpha);\n const precision = () => options.precision ?? detectedPrecision;\n let priceFormat = priceFormatter(2, undefined);\n let priceFormatKey = \"\";\n const formatPrice = (value: number) => {\n if (options.formatPrice) return options.formatPrice(value);\n const key = `${precision()}|${locale}`;\n if (key !== priceFormatKey) {\n priceFormat = priceFormatter(precision(), locale);\n priceFormatKey = key;\n }\n return priceFormat(value);\n };\n const timeframe = () => {\n const parsed =\n options.timeframe !== undefined\n ? parseTimeframe(options.timeframe)\n : null;\n return (\n parsed ?? {\n unit: \"ms\" as const,\n count: inferredTimeframe,\n ms: inferredTimeframe,\n }\n );\n };\n const tfMs = () => timeframe().ms;\n const font = (size: number, weight = 400) =>\n `${weight} ${size}px ${theme.fontFamily}`;\n\n const isVisible = (study: Study) =>\n visibility.get(study.id) ?? study.config.visible ?? true;\n\n const xOf = (index: number) => plotW + (index - right) * spacing;\n const indexAt = (x: number) => right - (plotW - x) / spacing;\n\n /** Time of a logical index (extrapolated outside the bars) */\n const timeAt = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.round(index);\n if (i < 0) return store.time[0] + i * tfMs();\n if (i >= count) return store.time[count - 1] + (i - count + 1) * tfMs();\n return store.time[i];\n };\n\n /** Time of a fractional index, interpolated between the bars */\n const timeAtFrac = (index: number) => {\n const count = n();\n if (!count) return 0;\n const i = Math.floor(index);\n if (i < 0 || i >= count - 1) {\n const edge = i < 0 ? 0 : count - 1;\n return store.time[edge] + (index - edge) * tfMs();\n }\n const t = index - i;\n return store.time[i] + t * (store.time[i + 1] - store.time[i]);\n };\n\n /** Fractional index of a time (the inverse of `timeAtFrac`) */\n const indexAtTimeFrac = (time: number) => {\n const count = n();\n if (!count) return 0;\n if (time >= store.time[count - 1])\n return count - 1 + (time - store.time[count - 1]) / tfMs();\n if (time <= store.time[0]) return (time - store.time[0]) / tfMs();\n const i = indexOfTime(store.time, count, time);\n const span = store.time[i + 1] - store.time[i];\n return i + (span > 0 ? (time - store.time[i]) / span : 0);\n };\n\n // displayed time: a fixed offset, a time zone or the local time\n let zone: string | undefined;\n const offsetMinutes = (time: number) =>\n options.utcOffset ??\n (zone\n ? zoneOffset(time, zone)\n : -new Date(finite(time) ? time : 0).getTimezoneOffset());\n const studyOffset: UtcOffset = (time) => offsetMinutes(time);\n /** Time shifted so that the UTC getters read the displayed time */\n const shift = (time: number) => time + offsetMinutes(time) * MINUTE;\n\n /** CSS color of a study color: `up` / `down` stand for the bar colors */\n const colorOf = (color: string) =>\n color === \"up\" ? upCss() : color === \"down\" ? downCss() : color;\n\n /** Min / max / last of each visible group of a column of values */\n const groupRanges = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n ): {\n min: ArrayLike<number>;\n max: ArrayLike<number>;\n last: ArrayLike<number>;\n } => {\n if (!v.level) return { min: values, max: values, last: values };\n const level = rangeLevel(lod, values, n(), v.level);\n return level;\n };\n const trendLodOf = (study: Study) => {\n let lod = trendLods.get(study);\n if (!lod) trendLods.set(study, (lod = createRangePyramid()));\n return lod;\n };\n const lodOf = (out: StudyOutput) => {\n let lod = outputLods.get(out);\n if (!lod) outputLods.set(out, (lod = createRangePyramid()));\n return lod;\n };\n\n /** Logical index of a time (extrapolated outside the bars) */\n const indexOfTimeExt = (time: number) => {\n const count = n();\n if (!count) return 0;\n const last = store.time[count - 1];\n if (time > last) return count - 1 + (time - last) / tfMs();\n if (time < store.time[0]) return (time - store.time[0]) / tfMs();\n return indexOfTime(store.time, count, time);\n };\n\n /** Bars as drawn: Heikin-Ashi or the store */\n const display = (): OhlcColumns => (style() === \"heikinAshi\" ? ha : store);\n\n // ------------------------------------------------------- derived data\n\n const markDirty = (from: number) => {\n for (const study of studies) {\n studyValid.set(study, Math.min(studyValid.get(study) ?? 0, from));\n for (const out of study.outputs) {\n const lod = outputLods.get(out);\n if (lod) invalidateRangePyramid(lod, from);\n }\n const trendLod = trendLods.get(study);\n if (trendLod) invalidateRangePyramid(trendLod, from);\n }\n haValid = Math.min(haValid, from);\n for (const c of compares) {\n c.valid = Math.min(c.valid, from);\n invalidateRangePyramid(c.lod, from);\n }\n profile = null;\n const level = (p: typeof pyramid) => {\n for (const l of p.levels)\n if (l) l.valid = Math.min(l.valid, Math.floor(from / l.size));\n };\n level(pyramid);\n level(haPyramid);\n };\n\n const syncDerived = () => {\n const count = n();\n for (const study of studies) {\n const valid = studyValid.get(study) ?? 0;\n if (valid < count) {\n study.compute(store, valid);\n studyValid.set(study, count);\n }\n }\n ha.time = store.time;\n ha.volume = store.volume;\n if (style() === \"heikinAshi\" && haValid < count) {\n if (ha.open.length < store.capacity) {\n for (const key of [\"open\", \"high\", \"low\", \"close\"] as const) {\n const next = new Float64Array(store.capacity);\n next.set(ha[key].subarray(0, haValid));\n ha[key] = next;\n }\n }\n heikinAshiInto(\n store.open,\n store.high,\n store.low,\n store.close,\n count,\n ha,\n haValid,\n );\n haValid = count;\n }\n for (const c of compares) {\n if (c.valid >= count) continue;\n if (c.values.length < store.capacity) {\n const next = new Float64Array(store.capacity).fill(NaN);\n next.set(c.values.subarray(0, c.valid));\n c.values = next;\n }\n for (let i = c.valid; i < count; i++) {\n const j =\n lowerBoundTime(c.times, c.times.length, store.time[i] + 0.5) - 1;\n c.values[i] = j >= 0 ? c.data[j] : NaN;\n }\n c.valid = count;\n }\n };\n\n const afterDataChange = (from: number) => {\n markDirty(from);\n const count = n();\n if (from < count - 1) dataVersion++;\n tailVersion++;\n if (count) {\n detectedPrecision = Math.max(\n from === 0 ? 0 : detectedPrecision,\n detectPrecision(store.close, from, count),\n detectPrecision(store.open, Math.max(from, count - 50), count),\n );\n if (from === 0 || count < 80)\n inferredTimeframe = inferTimeframe(store.time, count);\n }\n invalidate();\n };\n\n const rebuildStudies = () => {\n const { studies: next, reused } = buildStudies(\n options.indicators ?? [],\n studies,\n studyOffset,\n );\n for (const study of studies)\n if (!reused.has(study)) studyValid.delete(study);\n for (const study of next) if (!reused.has(study)) studyValid.set(study, 0);\n studies = next;\n // drop the user's toggles of indicators whose visibility is now set\n for (const id of [...visibility.keys()])\n if (!studies.some((s) => s.id === id)) visibility.delete(id);\n };\n\n const rebuildCompares = () => {\n compares = (options.compare ?? []).map((series, i) => {\n const data = [...series.data].sort((a, b) => a.time - b.time);\n return {\n id: series.id ?? series.name,\n name: series.name,\n color: series.color ?? LINE_COLORS[(i + 2) % LINE_COLORS.length],\n width: series.lineWidth ?? 1.5,\n times: Float64Array.from(data, (d) => d.time),\n data: Float64Array.from(data, (d) => d.value),\n values: new Float64Array(0),\n valid: 0,\n lod: createRangePyramid(),\n };\n });\n };\n\n // ---------------------------------------------------------- bars input\n\n /** Last bar visible: new bars keep the view at the latest bar */\n const followsRealtime = () => {\n const count = n();\n if (!count || !finite(right)) return true;\n const x = xOf(count - 1);\n return x >= 0 && x <= plotW + spacing * 0.5;\n };\n\n const replaceBars = (bars: TradingBarsInput) => {\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n for (const scale of scales.values()) scale.auto = true;\n right = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n scrollAnim = null;\n afterDataChange(0);\n };\n\n /**\n * New `bars` option: streamed (same first bars plus newer ones),\n * prepended history (same last bar), or replaced\n */\n const applyBarsOption = (bars: TradingBarsInput) => {\n const count = n();\n const length = inputLength(bars);\n if (count >= 2 && length >= count) {\n const first = barAt(bars, 0).time;\n const last = store.time[count - 1];\n if (\n first === store.time[0] &&\n barAt(bars, count - 2).time === store.time[count - 2]\n ) {\n // streaming through the props: update the last bar, append the rest\n const follow = followsRealtime();\n const before = count;\n let from = count;\n for (let i = count - 1; i < length; i++) {\n const at = storeUpdate(store, barAt(bars, i));\n if (at >= 0) from = Math.min(from, at);\n }\n if (follow) right += n() - before;\n if (from < n()) afterDataChange(from);\n return;\n }\n if (barAt(bars, length - 1).time === last && length > count) {\n const added = length - count;\n storeSet(store, bars);\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n afterDataChange(0);\n return;\n }\n }\n replaceBars(bars);\n };\n\n // --------------------------------------------------------------- layout\n\n const layoutPanes = () => {\n const paneStudies = studies.filter((s) => !s.overlay);\n const available = plotH;\n const wanted = paneStudies.map((s) => paneHeights.get(s.id) ?? s.height);\n const total = wanted.reduce((a, b) => a + b, 0);\n const max = Math.max(0, available * 0.62);\n const k = total > max && total > 0 ? max / total : 1;\n const heights = wanted.map((h) =>\n Math.max(MIN_PANE * Math.min(1, k * 2), h * k),\n );\n const priceHeight = Math.max(\n 40,\n available - heights.reduce((a, b) => a + b, 0),\n );\n const next: Pane[] = [];\n const scaleOf = (id: string, mode: TradingScaleMode) => {\n let scale = scales.get(id);\n if (!scale) {\n scale = createScale(mode);\n scales.set(id, scale);\n }\n if (scale.mode !== mode) {\n scale.mode = mode;\n scale.auto = true;\n }\n return scale;\n };\n const price = scaleOf(PRICE, options.scaleMode ?? \"linear\");\n price.top = 0;\n price.height = priceHeight;\n price.marginTop = 0.1;\n price.marginBottom = 0.08;\n next.push({\n id: PRICE,\n study: null,\n scale: price,\n top: 0,\n height: priceHeight,\n ticks: [],\n step: 0,\n });\n let top = priceHeight;\n paneStudies.forEach((study, i) => {\n const scale = scaleOf(study.id, \"linear\");\n scale.top = top;\n scale.height = heights[i];\n scale.marginTop = study.type === \"volume\" ? 0.18 : 0.14;\n scale.marginBottom = study.type === \"volume\" ? 0 : 0.1;\n if (study.range) scale.marginTop = scale.marginBottom = 0.06;\n next.push({\n id: study.id,\n study,\n scale,\n top,\n height: heights[i],\n ticks: [],\n step: 0,\n });\n top += heights[i];\n });\n for (const id of [...scales.keys()])\n if (!next.some((p) => p.id === id)) scales.delete(id);\n panes = next;\n };\n\n const paneAt = (y: number) =>\n panes.find((p) => y >= p.top && y < p.top + p.height) ?? null;\n\n const clampView = () => {\n const count = n();\n const minSpacing = Math.min(1, (plotW * 0.8) / Math.max(1, count));\n spacing = clamp(spacing, Math.max(1e-4, minSpacing), MAX_SPACING);\n const bars = plotW / spacing;\n if (!finite(right)) right = count - 1 + (options.rightOffset ?? 8);\n const hi =\n Math.max(0, count - 1) + Math.max(options.rightOffset ?? 8, bars * 0.75);\n const lo = Math.min(bars * 0.25, hi);\n right = clamp(right, lo, hi);\n };\n\n const computeVisible = (): Visible | null => {\n const count = n();\n if (!count) return null;\n const left = right - plotW / spacing;\n const level = spacing >= 2 ? 0 : Math.ceil(Math.log2(2 / spacing));\n const size = 2 ** level;\n const src = display();\n const cols = level\n ? pyramidLevel(\n style() === \"heikinAshi\" ? haPyramid : pyramid,\n src,\n count,\n level,\n )\n : src;\n const last = Math.floor((count - 1) / size);\n const i0 = clamp(Math.floor(left) - 1, 0, count - 1);\n const i1 = clamp(Math.ceil(right) + 1, 0, count - 1);\n const r0 = clamp(Math.ceil(left - 0.5), 0, count - 1);\n const r1 = clamp(Math.floor(right + 0.5), 0, count - 1);\n return {\n left,\n level,\n size,\n cols,\n g0: Math.floor(i0 / size),\n g1: Math.floor(i1 / size),\n s0: Math.floor(r0 / size),\n s1: Math.floor(r1 / size),\n last,\n };\n };\n\n /** Center index of a group */\n const groupCenter = (v: Visible, g: number) => g * v.size + (v.size - 1) / 2;\n const groupBars = (v: Visible, g: number) =>\n Math.min(v.size, n() - g * v.size);\n\n /** First visible bar: the base of the percent scale and of the baseline */\n const firstVisibleIndex = () =>\n clamp(Math.ceil(right - plotW / spacing - 0.5), 0, Math.max(0, n() - 1));\n\n const compareBase = (c: CompareRuntime) => {\n const count = n();\n for (let i = firstVisibleIndex(); i < count; i++) {\n const v = c.values[i];\n if (finite(v) && v !== 0) return v;\n }\n return NaN;\n };\n\n /** Scaled value of a comparison series (percent: from its own base) */\n const compareScaled = (scale: PaneScale, value: number, base: number) =>\n scale.mode === \"percent\"\n ? (value / base - 1) * 100\n : toScaled(scale, value);\n\n const baselinePrice = () =>\n options.baselinePrice ?? display().close[firstVisibleIndex()];\n\n /** Extends `[lo, hi]` with the visible groups of an output (shift included) */\n const outputExtent = (\n v: Visible,\n values: Float64Array,\n lod: RangePyramid,\n shiftBars: number,\n range: [number, number],\n ) => {\n const r = groupRanges(v, values, lod);\n const offset = Math.round(shiftBars / v.size);\n const a = clamp(v.s0 - offset, 0, v.last);\n const b = clamp(v.s1 - offset, 0, v.last);\n for (let g = a; g <= b; g++) {\n if (r.min[g] < range[0]) range[0] = r.min[g];\n if (r.max[g] > range[1]) range[1] = r.max[g];\n }\n };\n\n /**\n * Extends `[lo, hi]` with the visible drawings of a pane\n * (`autoscaleIncludesDrawings`); a drawing being dragged counts where it\n * started, so the scale does not move under the pointer\n */\n const drawingsExtent = (paneId: string, range: [number, number]) => {\n if (!options.autoscaleIncludesDrawings || !drawings.length) return;\n const from = right - plotW / spacing;\n const dragged = gesture?.kind === \"drawing\" ? gesture : null;\n for (const drawing of drawings) {\n if ((drawing.pane ?? PRICE) !== paneId) continue;\n const d =\n dragged && dragged.id === drawing.id ? dragged.original : drawing;\n for (const price of drawingPrices(d, indexOfTimeExt, from, right)) {\n if (price < range[0]) range[0] = price;\n if (price > range[1]) range[1] = price;\n }\n }\n };\n\n const autoscale = (v: Visible | null) => {\n volumeOverlayMax = 0;\n for (const pane of panes) {\n const scale = pane.scale;\n if (!v) continue;\n if (pane.id === PRICE) {\n scale.base = store.close[firstVisibleIndex()] || 1;\n const { cols } = v;\n const s = style();\n const closeOnly = s === \"line\" || s === \"area\" || s === \"baseline\";\n const range: [number, number] = [Infinity, -Infinity];\n for (let g = v.s0; g <= v.s1; g++) {\n const l = closeOnly ? cols.close[g] : cols.low[g];\n const h = closeOnly ? cols.close[g] : cols.high[g];\n if (l < range[0]) range[0] = l;\n if (h > range[1]) range[1] = h;\n }\n for (const study of studies) {\n if (!study.overlay || !isVisible(study)) continue;\n if (study.type === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (vol > volumeOverlayMax) volumeOverlayMax = vol;\n }\n continue;\n }\n for (const out of study.outputs)\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n drawingsExtent(PRICE, range);\n let [lo, hi] = range;\n if (s === \"baseline\") {\n const b = baselinePrice();\n if (b < lo) lo = b;\n if (b > hi) hi = b;\n }\n if (!scale.auto) continue;\n let a = toScaled(scale, lo);\n let b = toScaled(scale, hi);\n if (scale.mode === \"log\" && !(lo > 0))\n a = toScaled(scale, Math.max(hi * 1e-3, 1e-12));\n for (const c of compares) {\n const base = compareBase(c);\n const extent: [number, number] = [Infinity, -Infinity];\n outputExtent(v, c.values, c.lod, 0, extent);\n for (const value of extent) {\n const scaled = compareScaled(scale, value, base);\n if (scaled < a) a = scaled;\n if (scaled > b) b = scaled;\n }\n }\n if (scale.mode === \"percent\" && compares.length) {\n // the 0% line of a comparison stays in view\n a = Math.min(a, 0);\n b = Math.max(b, 0);\n }\n fitScale(scale, a, b);\n continue;\n }\n const study = pane.study;\n if (!study || !scale.auto) continue;\n if (study.range) {\n fitScale(scale, study.range[0], study.range[1]);\n continue;\n }\n const range: [number, number] = [Infinity, -Infinity];\n if (study.type === \"volume\") range[0] = 0;\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n for (let g = v.s0; g <= v.s1; g++) {\n const value = v.cols.volume[g] / groupBars(v, g);\n if (value > range[1]) range[1] = value;\n }\n continue;\n }\n outputExtent(v, out.values, lodOf(out), out.shift, range);\n }\n drawingsExtent(pane.id, range);\n let [lo, hi] = range;\n if (study.bands && finite(lo) && finite(hi)) {\n // reference bands (CCI ±100, DMI 25) stay in view\n for (const band of study.bands) {\n lo = Math.min(lo, band);\n hi = Math.max(hi, band);\n }\n }\n if (study.zero && finite(lo) && finite(hi)) {\n lo = Math.min(lo, 0);\n hi = Math.max(hi, 0);\n }\n fitScale(scale, lo, hi);\n }\n };\n\n // ----------------------------------------------------------------- ticks\n\n interface TimeLabel {\n x: number;\n text: string;\n bold: boolean;\n }\n\n const timeTicks = (\n v: Visible | null,\n ctx: CanvasRenderingContext2D,\n ): TimeLabel[] => {\n const count = n();\n if (!count || !v) return [];\n const tf = tfMs();\n const intraday = tf < DAY;\n // groups up to the right edge, past the last bar too\n const gEnd = Math.floor(Math.max(0, Math.ceil(right)) / v.size);\n const groupTime = (g: number) => {\n if (g <= v.last) return v.cols.time[g];\n return store.time[count - 1] + (g * v.size - (count - 1)) * tf;\n };\n const candidates: { x: number; weight: number; time: number }[] = [];\n let prev = v.g0 > 0 ? shift(groupTime(v.g0 - 1)) : NaN;\n for (let g = v.g0; g <= gEnd; g++) {\n const time = shift(groupTime(g));\n const x = xOf(groupCenter(v, g));\n const weight = boundaryWeight(prev, time);\n // no labels inside a second (tick charts)\n if (x >= -20 && x <= plotW + 20 && weight > 10)\n candidates.push({ x, weight, time });\n prev = time;\n }\n ctx.font = font(theme.fontSize);\n const sample = intraday ? \"00:00\" : \"Sep 30\";\n const gap =\n Math.max(ctx.measureText(sample).width, ctx.measureText(\"2024\").width) +\n 34;\n return pickTicks(candidates, gap)\n .filter((t) => t.x > 8 && t.x < plotW - 8)\n .map((t) => ({\n x: t.x,\n text: tickText(t.time, t.weight, locale, intraday),\n bold: t.weight >= (intraday ? 50 : 60),\n }));\n };\n\n const paneTickText = (pane: Pane, scaled: number) => {\n if (pane.id === PRICE) {\n if (pane.scale.mode === \"percent\")\n return formatPercent(\n scaled,\n locale,\n Math.min(2, stepDecimals(pane.step)),\n );\n return formatPrice(fromScaled(pane.scale, scaled));\n }\n if (pane.study?.compact) return formatVolume(scaled, locale);\n return formatFixed(scaled, Math.min(4, stepDecimals(pane.step)), locale);\n };\n\n /** Text of a value of a study in the legend */\n const studyValueText = (study: Study, value: number) => {\n if (study.overlay && study.type !== \"volume\") return formatPrice(value);\n if (study.compact) return formatVolume(value, locale);\n return formatFixed(\n value,\n study.range ? 2 : Math.max(2, Math.min(6, precision())),\n locale,\n );\n };\n\n // ------------------------------------------------------------ GPU items\n\n const createLayers = (v: Visible, dpr: number): Layer[] => {\n const result: Layer[] = [];\n const cols = v.cols;\n const up = resolve(upCss());\n const down = resolve(downCss());\n const upP = packColor(up);\n const downP = packColor(down);\n const bg = theme.background;\n const metrics = candleMetrics(spacing * v.size * dpr, dpr);\n const X = (g: number) => xOf(groupCenter(v, g)) * dpr;\n const s = style();\n\n const histogramHalf = Math.max(0.5, metrics.body / 2);\n const volumeColors = {\n up: packColor([up[0], up[1], up[2], 0.5]),\n down: packColor([down[0], down[1], down[2], 0.5]),\n };\n\n for (const pane of panes) {\n const top = pane.top * dpr;\n const bottom = (pane.top + pane.height) * dpr;\n const scale = pane.scale;\n const Y = (value: number) => yOf(scale, value) * dpr;\n\n const lineLayer =\n (\n values: (g: number) => number,\n color: Rgba,\n lineWidth: number,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const buffer = new LineBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n buffer.push(X(g), toY(values(g)));\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n /**\n * Line of a column of values: one point per bar, or the low and high\n * of each group once zoomed out (min / max decimation), drawn\n * `shiftBars` later\n */\n const rangeLayer =\n (\n values: Float64Array,\n lod: RangePyramid,\n color: Rgba,\n lineWidth: number,\n shiftBars = 0,\n toY: (value: number) => number = Y,\n ): Layer =>\n (ga, gb, isLive) => {\n const r = groupRanges(v, values, lod);\n const dx = shiftBars * spacing * dpr;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n let from = isLive ? Math.max(0, ga - 1) : ga;\n let to = gb;\n if (!isLive && shiftBars > 0) from = Math.max(0, from - extra);\n if (!isLive && shiftBars < 0) to = Math.min(v.last - 1, to + extra);\n const buffer = new LineBuffer(top, bottom);\n let prevY = NaN;\n for (let g = from; g <= to; g++) {\n const x = X(g) + dx;\n const lo = r.min[g];\n const hi = r.max[g];\n if (!v.level || lo === hi || !finite(lo) || !finite(hi)) {\n prevY = toY(r.last[g]);\n buffer.push(x, prevY);\n continue;\n }\n const yLo = toY(lo);\n const yHi = toY(hi);\n // start with the extreme closest to the previous point\n const first =\n finite(prevY) && Math.abs(prevY - yHi) < Math.abs(prevY - yLo)\n ? yHi\n : yLo;\n const second = first === yHi ? yLo : yHi;\n buffer.push(x, first);\n buffer.push(x, second);\n prevY = second;\n }\n return buffer.count > 1 ? [buffer.item(\"\", 0, color, lineWidth)] : [];\n };\n\n /**\n * Line colored by its direction once zoomed out: the min / max of each\n * group in the color of its last bar, each run starting at the last\n * point of the previous one so the line stays joined at the flips\n */\n const trendLayer =\n (\n trend: NonNullable<Study[\"trend\"]>,\n lod: RangePyramid,\n upColor: Rgba,\n downColor: Rgba,\n lineWidth: number,\n ): Layer =>\n (ga, gb, isLive) => {\n const r = groupRanges(v, trend.value, lod);\n const count = n();\n const line = new TrendBuffer(top, bottom);\n let prevY = NaN;\n for (let g = isLive ? Math.max(0, ga - 1) : ga; g <= gb; g++) {\n const lo = r.min[g];\n const hi = r.max[g];\n if (!finite(lo) || !finite(hi)) {\n line.break();\n prevY = NaN;\n continue;\n }\n const up =\n trend.direction[Math.min(count - 1, g * v.size + v.size - 1)] !==\n -1;\n const x = X(g);\n const yLo = Y(lo);\n const yHi = Y(hi);\n // start with the extreme closest to the previous point\n const first =\n finite(prevY) && Math.abs(prevY - yHi) < Math.abs(prevY - yLo)\n ? yHi\n : yLo;\n const second = first === yHi ? yLo : yHi;\n line.push(x, first, up);\n if (second !== first) line.push(x, second, up);\n prevY = second;\n }\n // a halo of the background under the line: zoomed out, it runs\n // through the bars, drawn in the same colors\n const halo: Rgba = [bg[0], bg[1], bg[2], 0.9];\n const items: RenderItem[] = [];\n for (const [buffer, key] of [\n [line.up, \"u\"],\n [line.down, \"d\"],\n ] as const) {\n if (buffer.count > 1)\n items.push(buffer.item(`${key}h`, 0, halo, lineWidth + 2.5));\n }\n if (line.up.count > 1)\n items.push(line.up.item(\"u\", 0, upColor, lineWidth));\n if (line.down.count > 1)\n items.push(line.down.item(\"d\", 0, downColor, lineWidth));\n return items;\n };\n\n if (pane.id === PRICE) {\n // volume at the bottom of the price pane\n const volumeStudy = studies.find(\n (st) => st.overlay && st.type === \"volume\" && isVisible(st),\n );\n if (volumeStudy && volumeOverlayMax > 0) {\n const h = (bottom - top) * 0.2;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const y = bottom - (vol / volumeOverlayMax) * h;\n const [a, b] = pixelRange(y, bottom);\n buffer.push(\n metrics.snap(X(g)),\n a,\n b,\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n }\n // comparison series\n for (const c of compares) {\n const base = compareBase(c);\n const color = resolve(c.color);\n result.push(\n rangeLayer(\n c.values,\n c.lod,\n color,\n c.width,\n 0,\n (value) =>\n yOfScaled(scale, compareScaled(scale, value, base)) * dpr,\n ),\n );\n }\n // the bars\n if (s === \"line\" || s === \"area\" || s === \"baseline\") {\n const lineColor = resolve(PRIMARY);\n if (s === \"area\") {\n result.push((ga, gb, isLive) => {\n const area = new AreaBuffer(top, bottom);\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++)\n area.push(X(g), Y(cols.close[g]), bottom);\n return area.count > 1 ? [area.item(\"\", 0, lineColor, 0.28)] : [];\n });\n }\n if (s === \"baseline\") {\n const yb = Y(baselinePrice());\n result.push((ga, gb, isLive) => {\n const upArea = new AreaBuffer(top, bottom);\n const downArea = new AreaBuffer(top, bottom);\n const upLine = new LineBuffer(top, bottom);\n const downLine = new LineBuffer(top, bottom);\n let px = NaN;\n let py = NaN;\n const point = (x: number, y: number) => {\n upArea.push(x, Math.min(y, yb), yb);\n downArea.push(x, Math.max(y, yb), yb);\n if (y <= yb) upLine.push(x, y);\n else upLine.break();\n if (y >= yb) downLine.push(x, y);\n else downLine.break();\n };\n for (let g = isLive ? Math.max(v.g0, ga - 1) : ga; g <= gb; g++) {\n const x = X(g);\n const y = Y(cols.close[g]);\n if (finite(py) && (py - yb) * (y - yb) < 0) {\n const t = (yb - py) / (y - py);\n point(px + (x - px) * t, yb);\n }\n point(x, y);\n px = x;\n py = y;\n }\n const out: RenderItem[] = [];\n if (upArea.count > 1)\n out.push(\n upArea.item(\"u\", 0, up, 0.22),\n downArea.item(\"d\", 0, down, 0.22),\n );\n if (upLine.count > 1) out.push(upLine.item(\"ul\", 0, up, 2));\n if (downLine.count > 1) out.push(downLine.item(\"dl\", 0, down, 2));\n return out;\n });\n } else {\n result.push(lineLayer((g) => cols.close[g], lineColor, 2));\n }\n } else {\n const hollow = s === \"hollowCandles\";\n const ohlc = s === \"bars\";\n const wick = metrics.wick;\n const body = metrics.body;\n result.push((ga, gb) => {\n const wicks = new BarBuffer();\n const bodies = new BarBuffer();\n const caps = new BarBuffer();\n const ticks = new BarBuffer();\n const tick = Math.max(wick, Math.round((body - wick) / 2));\n for (let g = ga; g <= gb; g++) {\n const o = cols.open[g];\n const h = cols.high[g];\n const l = cols.low[g];\n const c = cols.close[g];\n if (!finite(o) || !finite(c)) continue;\n const rising = hollow\n ? c >= (g > 0 ? cols.close[g - 1] : o)\n : c >= o;\n const color = rising ? upP : downP;\n const cx = metrics.snap(X(g));\n const [wt, wb] = pixelRange(Y(h), Y(l));\n if (ohlc) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n for (const [value, side] of [\n [o, -1],\n [c, 1],\n ] as const) {\n const y = Math.round(Y(value) - wick / 2);\n if (y < top || y + wick > bottom) continue;\n ticks.push(\n cx + side * (wick / 2 + tick / 2),\n y,\n y + wick,\n color,\n );\n }\n continue;\n }\n const [bt, bb] = pixelRange(Y(o), Y(c));\n if (body <= wick) {\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n continue;\n }\n if (hollow && c > o) {\n const segments: [number, number][] = [\n [wt, bt],\n [bb, wb],\n ];\n for (const [a, b] of segments) {\n const range = b > a ? clampRange(a, b, top, bottom) : null;\n if (range) wicks.push(cx, range[0], range[1], color);\n }\n const edges = clampRange(bt, bb, top, bottom);\n if (edges) {\n wicks.push(\n cx - body / 2 + wick / 2,\n edges[0],\n edges[1],\n color,\n );\n wicks.push(\n cx + body / 2 - wick / 2,\n edges[0],\n edges[1],\n color,\n );\n }\n for (const y of [bt, bb - wick]) {\n if (y >= top && y + wick <= bottom)\n caps.push(cx, y, y + wick, color);\n }\n continue;\n }\n const range = clampRange(wt, wb, top, bottom);\n if (range) wicks.push(cx, range[0], range[1], color);\n const box = clampRange(bt, bb, top, bottom);\n if (box) bodies.push(cx, box[0], box[1], color);\n }\n const items: RenderItem[] = [wicks.item(\"w\", 0, wick / 2)];\n if (bodies.count) items.push(bodies.item(\"b\", 0, body / 2));\n if (caps.count) items.push(caps.item(\"c\", 0, body / 2));\n if (ticks.count) items.push(ticks.item(\"t\", 0, tick / 2));\n return items;\n });\n }\n }\n\n // indicators of the pane\n const paneStudies =\n pane.id === PRICE\n ? studies.filter((st) => st.overlay && st.type !== \"volume\")\n : pane.study\n ? [pane.study]\n : [];\n for (const study of paneStudies) {\n if (!isVisible(study)) continue;\n const trend = study.trend;\n const [upOut, downOut] = study.outputs;\n if (trend && v.level && upOut && downOut) {\n result.push(\n trendLayer(\n trend,\n trendLodOf(study),\n resolve(colorOf(upOut.color)),\n resolve(colorOf(downOut.color)),\n upOut.width,\n ),\n );\n continue;\n }\n for (const out of study.outputs) {\n if (out.kind === \"volume\") {\n const y0 = Y(0);\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const vol = cols.volume[g] / groupBars(v, g);\n if (!(vol > 0)) continue;\n const range = clampRange(\n ...pixelRange(Y(vol), y0),\n top,\n bottom,\n );\n if (range)\n buffer.push(\n metrics.snap(X(g)),\n range[0],\n range[1],\n cols.close[g] >= cols.open[g]\n ? volumeColors.up\n : volumeColors.down,\n );\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"histogram\") {\n const y0 = Y(0);\n const strong = { up: upP, down: downP };\n const faded = {\n up: packColor(mix(bg, up, 0.45)),\n down: packColor(mix(bg, down, 0.45)),\n };\n const lod = lodOf(out);\n result.push((ga, gb) => {\n const r = groupRanges(v, out.values, lod);\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = r.last[g];\n if (!finite(value)) continue;\n const prev = g > 0 ? r.last[g - 1] : value;\n const color =\n value >= 0\n ? value >= prev\n ? strong.up\n : faded.up\n : value <= prev\n ? strong.down\n : faded.down;\n // a group spans its lowest and highest values (and zero)\n const lo = Math.min(0, finite(r.min[g]) ? r.min[g] : value);\n const hi = Math.max(0, finite(r.max[g]) ? r.max[g] : value);\n const range = clampRange(\n ...(v.level\n ? pixelRange(Y(hi), Y(lo))\n : pixelRange(Y(value), y0)),\n top,\n bottom,\n );\n if (range)\n buffer.push(metrics.snap(X(g)), range[0], range[1], color);\n }\n return [buffer.item(\"\", 0, histogramHalf)];\n });\n } else if (out.kind === \"dots\") {\n const fixed = out.color\n ? packColor(resolve(colorOf(out.color)))\n : 0;\n const radius = clamp(spacing * v.size * 0.22, 1.25, 2.6);\n const half = radius * dpr;\n result.push((ga, gb) => {\n const buffer = new BarBuffer();\n for (let g = ga; g <= gb; g++) {\n const value = v.level\n ? out.values[Math.min(n() - 1, g * v.size + v.size - 1)]\n : out.values[g];\n if (!finite(value)) continue;\n const y = Y(value);\n if (y < top || y > bottom) continue;\n const color = fixed || (value <= cols.close[g] ? upP : downP);\n buffer.push(X(g), y - half, y + half, color);\n }\n return buffer.count ? [buffer.item(\"\", 0, half, 0, radius)] : [];\n });\n } else {\n const color = resolve(colorOf(out.color));\n result.push(\n rangeLayer(\n out.values,\n lodOf(out),\n [color[0], color[1], color[2], color[3] * out.alpha],\n out.width,\n out.shift,\n ),\n );\n }\n }\n }\n }\n return result;\n };\n\n /** Builds the items of the main bars or of the last group */\n const runLayer = (\n fn: Layer,\n index: number,\n v: Visible,\n isLive: boolean,\n ): RenderItem[] => {\n const lastMain = Math.min(v.g1, v.last - 1);\n const items = isLive\n ? v.last >= v.g0 && v.last <= v.g1\n ? fn(v.last, v.last, true)\n : []\n : lastMain >= v.g0\n ? fn(v.g0, lastMain, false)\n : [];\n const version = ++itemVersion;\n return items.map((item, k) => ({\n ...item,\n key: `L${index}:${k}:${item.kind}:${item.key}${isLive ? \":live\" : \"\"}`,\n version,\n }));\n };\n\n const renderData = (v: Visible | null, dpr: number) => {\n if (!renderer) return;\n const canvas = renderer.canvas;\n styleElement(canvas, {\n left: \"0px\",\n top: \"0px\",\n width: `${plotW}px`,\n height: `${plotH}px`,\n });\n const bw = Math.max(1, Math.round(plotW * dpr));\n const bh = Math.max(1, Math.round(plotH * dpr));\n if (canvas.width !== bw || canvas.height !== bh) renderer.resize(bw, bh);\n if (v) {\n const key = [\n bw,\n bh,\n dpr,\n spacing,\n right,\n v.level,\n style(),\n dataVersion,\n themeVersion,\n optionsVersion,\n volumeOverlayMax,\n style() === \"baseline\" ? baselinePrice() : 0,\n ...panes.map(\n (p) =>\n `${p.id}:${p.top}:${p.height}:${p.scale.min}:${p.scale.max}:${p.scale.base}:${p.scale.mode}`,\n ),\n ...studies.map((st) => `${st.id}:${isVisible(st)}`),\n ].join(\"|\");\n if (key !== geomKey) {\n geomKey = key;\n builtTail = tailVersion;\n layers = createLayers(v, dpr).map((fn) => ({ fn, main: [], live: [] }));\n layers.forEach((l, i) => {\n l.main = runLayer(l.fn, i, v, false);\n l.live = runLayer(l.fn, i, v, true);\n });\n } else if (builtTail !== tailVersion) {\n builtTail = tailVersion;\n layers.forEach((l, i) => {\n l.live = runLayer(l.fn, i, v, true);\n });\n }\n } else {\n layers = [];\n geomKey = \"\";\n }\n const items = layers.flatMap((l) => [...l.main, ...l.live]);\n renderer.render(items, {\n transform: { xScale: 2 / bw, xOffset: -1, yScale: -2 / bh, yOffset: 1 },\n width: bw,\n height: bh,\n dpr,\n });\n };\n\n // -------------------------------------------------------- 2D painting\n\n const sizeCanvas = (canvas: HTMLCanvasElement, dpr: number) => {\n const w = Math.max(1, Math.round(width * dpr));\n const h = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== w) canvas.width = w;\n if (canvas.height !== h) canvas.height = h;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n };\n\n const roundRect = (\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n ) => {\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\") ctx.roundRect(x, y, w, h, r);\n else ctx.rect(x, y, w, h);\n };\n\n /** Area between two outputs of a study, colored by which one is above */\n const paintFill = (\n ctx: CanvasRenderingContext2D,\n v: Visible,\n pane: Pane,\n study: Study,\n f: Study[\"fills\"][number],\n ) => {\n const outA = study.outputs[f.a];\n const outB = study.outputs[f.b];\n if (!outA || !outB) return;\n const ra = groupRanges(v, outA.values, lodOf(outA));\n const rb = groupRanges(v, outB.values, lodOf(outB));\n const shiftBars = outA.shift;\n const extra = Math.ceil(Math.abs(shiftBars) / v.size) + 1;\n const from = Math.max(0, v.g0 - (shiftBars > 0 ? extra : 0));\n const to = Math.min(v.last, v.g1 + (shiftBars < 0 ? extra : 0));\n const above = css(colorOf(f.color), f.opacity);\n const below = css(colorOf(f.colorBelow ?? f.color), f.opacity);\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n let run: { x: number; ya: number; yb: number }[] = [];\n let sign = 0;\n const flush = () => {\n if (run.length > 1) {\n ctx.fillStyle = sign >= 0 ? above : below;\n ctx.beginPath();\n run.forEach((p, i) =>\n i ? ctx.lineTo(p.x, p.ya) : ctx.moveTo(p.x, p.ya),\n );\n for (let k = run.length - 1; k >= 0; k--) {\n const p = run[k];\n if (p) ctx.lineTo(p.x, p.yb);\n }\n ctx.closePath();\n ctx.fill();\n }\n run = [];\n };\n for (let g = from; g <= to; g++) {\n const a = ra.last[g];\n const b = rb.last[g];\n if (!finite(a) || !finite(b)) {\n flush();\n sign = 0;\n continue;\n }\n const x = xOf(groupCenter(v, g) + shiftBars);\n const ya = yOf(pane.scale, a);\n const yb = yOf(pane.scale, b);\n const s = a >= b ? 1 : -1;\n const prev = run[run.length - 1];\n if (prev && s !== sign) {\n // the lines cross: close the run at the crossing\n const d0 = prev.ya - prev.yb;\n const t = d0 / (d0 - (ya - yb));\n const cx = prev.x + (x - prev.x) * t;\n const cy = prev.ya + (ya - prev.ya) * t;\n run.push({ x: cx, ya: cy, yb: cy });\n flush();\n run.push({ x: cx, ya: cy, yb: cy });\n }\n sign = s;\n run.push({ x, ya, yb });\n }\n flush();\n ctx.restore();\n };\n\n /** Dashed lines where a day starts (in the displayed time zone) */\n const paintSessionBreaks = (ctx: CanvasRenderingContext2D, v: Visible) => {\n if (!options.sessionBreaks || tfMs() >= DAY) return;\n const xs: number[] = [];\n let prevDay = NaN;\n for (let g = Math.max(0, v.g0 - 1); g <= Math.min(v.g1, v.last); g++) {\n const day = Math.floor(shift(v.cols.time[g]) / DAY);\n if (finite(prevDay) && day !== prevDay) {\n const x = Math.round(xOf(g * v.size - 0.5)) + 0.5;\n if (x > 0 && x < plotW) xs.push(x);\n // too dense to read: none at all\n if (xs.length > plotW / 6) return;\n }\n prevDay = day;\n }\n if (!xs.length) return;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.4);\n ctx.setLineDash([4, 4]);\n ctx.beginPath();\n for (const x of xs) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n ctx.stroke();\n ctx.restore();\n };\n\n const profileOptions = (): TradingVolumeProfileOptions | null => {\n const option = options.volumeProfile;\n if (!option) return null;\n return option === true ? {} : option;\n };\n\n /** Volume by price of the visible bars, from the right (or left) edge */\n const paintVolumeProfile = (ctx: CanvasRenderingContext2D, v: Visible) => {\n const o = profileOptions();\n const price = panes[0];\n if (!o || !price || !store.hasVolume) return;\n const rows = clamp(Math.floor(o.rows ?? 24), 2, 400);\n const key = [\n v.level,\n v.s0,\n v.s1,\n rows,\n o.valueArea ?? 0.7,\n dataVersion,\n tailVersion,\n ].join(\"|\");\n if (!profile || profile.key !== key) {\n // real prices, also under Heikin-Ashi bars\n const cols = v.level ? pyramidLevel(pyramid, store, n(), v.level) : store;\n profile = {\n key,\n result: volumeProfile(cols, {\n from: v.s0,\n to: v.s1,\n rows,\n valueArea: o.valueArea,\n }),\n };\n }\n const r = profile.result;\n if (r.poc < 0) return;\n let largest = 0;\n for (let i = 0; i < rows; i++)\n largest = Math.max(largest, (r.up[i] ?? 0) + (r.down[i] ?? 0));\n if (!(largest > 0)) return;\n const span = plotW * clamp(o.width ?? 0.28, 0.05, 0.9);\n const fromRight = (o.side ?? \"right\") === \"right\";\n const upColor = resolve(colorOf(o.upColor ?? \"up\"));\n const downColor = resolve(colorOf(o.downColor ?? \"down\"));\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n for (let i = 0; i < rows; i++) {\n const up = r.up[i] ?? 0;\n const down = r.down[i] ?? 0;\n if (!(up + down > 0)) continue;\n const y0 = yOf(price.scale, r.low + i * r.step);\n const y1 = yOf(price.scale, r.low + (i + 1) * r.step);\n const top = Math.min(y0, y1);\n const h = Math.max(\n 1,\n Math.abs(y1 - y0) - (Math.abs(y1 - y0) > 4 ? 1 : 0),\n );\n const inside = i >= r.valueAreaFrom && i <= r.valueAreaTo;\n const alpha = inside ? 0.42 : 0.17;\n const upLength = (up / largest) * span;\n const downLength = (down / largest) * span;\n const edge = fromRight ? plotW : 0;\n const dir = fromRight ? -1 : 1;\n ctx.fillStyle = toCss(upColor, alpha);\n ctx.fillRect(Math.min(edge, edge + dir * upLength), top, upLength, h);\n ctx.fillStyle = toCss(downColor, alpha);\n const start = edge + dir * upLength;\n ctx.fillRect(\n Math.min(start, start + dir * downLength),\n top,\n downLength,\n h,\n );\n }\n // point of control\n const y =\n Math.round(yOf(price.scale, r.low + (r.poc + 0.5) * r.step)) + 0.5;\n ctx.strokeStyle = css(o.pocColor ?? WARNING, 0.9);\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n };\n\n const paintBackground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const grid = toCss(theme.grid);\n const showGrid = options.grid !== false;\n ctx.lineWidth = 1;\n if (showGrid) {\n ctx.strokeStyle = grid;\n ctx.beginPath();\n for (const t of ticks) {\n const x = Math.round(t.x) + 0.5;\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = Math.round(yOfScaled(pane.scale, t)) + 0.5;\n if (y < pane.top + 2 || y > pane.top + pane.height - 2) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n }\n ctx.stroke();\n }\n // watermark\n if (options.watermark) {\n const price = panes[0];\n ctx.save();\n ctx.font = font(Math.min(56, Math.max(22, plotW / 14)), 700);\n ctx.fillStyle = toCss(theme.text, 0.07);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(options.watermark, plotW / 2, price.top + price.height / 2);\n ctx.restore();\n }\n // bands of the indicator panes\n for (const pane of panes) {\n const study = pane.study;\n if (study?.bands && isVisible(study)) {\n const color = resolve(colorOf(study.outputs[0]?.color ?? PRIMARY));\n const ys = study.bands.map((b) => Math.round(yOf(pane.scale, b)) + 0.5);\n if (study.bandFill && ys.length === 2) {\n ctx.fillStyle = toCss(color, 0.07);\n ctx.fillRect(\n 0,\n Math.min(ys[0], ys[1]),\n plotW,\n Math.abs(ys[1] - ys[0]),\n );\n }\n ctx.save();\n ctx.setLineDash([4, 4]);\n ctx.strokeStyle = toCss(theme.textMuted, 0.45);\n ctx.beginPath();\n for (const y of ys) {\n if (y < pane.top || y > pane.top + pane.height) continue;\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n }\n }\n if (v) {\n paintSessionBreaks(ctx, v);\n for (const study of studies) {\n if (!study.fills.length || !isVisible(study)) continue;\n const pane = study.overlay\n ? panes[0]\n : panes.find((p) => p.study === study);\n if (pane)\n for (const f of study.fills) paintFill(ctx, v, pane, study, f);\n }\n const price = panes[0];\n if (price && price.scale.mode === \"percent\" && compares.length) {\n // the common origin of the compared series\n const y = Math.round(yOfScaled(price.scale, 0)) + 0.5;\n if (y > price.top && y < price.top + price.height) {\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.6);\n ctx.setLineDash([2, 3]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n }\n paintVolumeProfile(ctx, v);\n }\n // separators and axis borders\n ctx.strokeStyle = toCss(theme.axis);\n ctx.beginPath();\n for (const pane of panes.slice(1)) {\n const y = Math.round(pane.top) + 0.5;\n ctx.moveTo(0, y);\n ctx.lineTo(width, y);\n }\n ctx.moveTo(Math.round(plotW) + 0.5, 0);\n ctx.lineTo(Math.round(plotW) + 0.5, height);\n ctx.moveTo(0, Math.round(plotH) + 0.5);\n ctx.lineTo(width, Math.round(plotH) + 0.5);\n ctx.stroke();\n };\n\n /** Label on the price axis; returns its vertical extent */\n const axisLabel = (\n ctx: CanvasRenderingContext2D,\n y: number,\n text: string,\n fill: string,\n textColor: string,\n second?: string,\n ) => {\n const h = second ? 32 : 18;\n const top = clamp(Math.round(y - 9), 0, plotH - h);\n roundRect(ctx, plotW + 1, top, axisW - 2, h, 3);\n ctx.fillStyle = fill;\n ctx.fill();\n ctx.fillStyle = textColor;\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.font = font(theme.fontSize, 500);\n ctx.fillText(text, plotW + 7, top + 9.5);\n if (second) {\n ctx.font = font(theme.fontSize - 1);\n ctx.fillText(second, plotW + 7, top + 24);\n }\n };\n\n const priceAxisText = (value: number) =>\n panes[0]?.scale.mode === \"percent\"\n ? formatPercent(toScaled(panes[0].scale, value), locale)\n : formatPrice(value);\n\n const lineColor = (line: TradingPriceLine) => {\n if (line.color) return css(line.color);\n const kind = line.kind ?? \"line\";\n if (kind === \"takeProfit\") return css(upCss());\n if (kind === \"stopLoss\") return css(downCss());\n if (kind === \"alert\") return css(WARNING);\n if (kind === \"line\") return css(PRIMARY);\n return css(line.side === \"sell\" ? downCss() : upCss());\n };\n\n const linePrice = (line: TradingPriceLine) =>\n lineOverrides.get(line.id) ?? line.price;\n\n const crosshairState = () => {\n if (!vis || !panes.length) return null;\n if (keyboardIndex !== null) {\n const index = keyboardIndex;\n const bar = index >= 0 && index < n() ? display().close[index] : NaN;\n return { index, pane: panes[0], y: yOf(panes[0].scale, bar), price: bar };\n }\n if (!pointer && externalCross) {\n const index = Math.round(indexOfTimeExt(externalCross.time));\n const price = externalCross.price;\n return {\n index,\n pane: panes[0],\n y: finite(price) ? yOf(panes[0].scale, price) : NaN,\n price,\n };\n }\n if (!pointer || pointer.x > plotW || pointer.y > plotH) return null;\n const pane = paneAt(pointer.y);\n if (!pane) return null;\n const index = Math.round(indexAt(pointer.x));\n let y = pointer.y;\n let price = valueAt(pane.scale, y);\n if (\n pane.id === PRICE &&\n options.crosshair !== \"free\" &&\n index >= 0 &&\n index < n() &&\n tool === \"cursor\"\n ) {\n const d = display();\n let best = Infinity;\n for (const value of [\n d.open[index],\n d.high[index],\n d.low[index],\n d.close[index],\n ]) {\n const yy = yOf(pane.scale, value);\n if (Math.abs(yy - pointer.y) < best) {\n best = Math.abs(yy - pointer.y);\n y = yy;\n price = value;\n }\n }\n }\n return { index, pane, y, price };\n };\n\n const paneOf = (id: string | undefined) =>\n panes.find((p) => p.id === (id ?? PRICE)) ?? null;\n\n const drawingMapper = (pane: Pane | null): DrawingMapper | null => {\n if (!pane) return null;\n return {\n x: xOf,\n y: (p) => yOf(pane.scale, p),\n index: indexOfTimeExt,\n left: 0,\n right: plotW,\n top: pane.top,\n bottom: pane.top + pane.height,\n };\n };\n\n const formatSpan = (bars: number, ms: number) => {\n const l = labels();\n const abs = Math.abs(ms);\n const parts: string[] = [];\n const days = Math.floor(abs / DAY);\n const hours = Math.floor((abs % DAY) / HOUR);\n const minutes = Math.floor((abs % HOUR) / MINUTE);\n if (days) parts.push(fill(l.days, { count: days }));\n if (hours) parts.push(fill(l.hours, { count: hours }));\n if (minutes && !days) parts.push(fill(l.minutes, { count: minutes }));\n return `${fill(labels().bars, { count: bars })}, ${parts.join(\" \") || fill(l.minutes, { count: 0 })}`;\n };\n\n /** A value of a pane as written by its axis (prices on the price pane) */\n const paneValueText = (pane: Pane, value: number) =>\n pane.id === PRICE ? formatPrice(value) : paneTickText(pane, value);\n\n /** Price rounded to the precision of the prices */\n const roundPrice = (price: number) => {\n const step = 10 ** -precision();\n return Number((Math.round(price / step) * step).toFixed(precision()));\n };\n\n /** A rounded label (pill) with text */\n const pill = (\n ctx: CanvasRenderingContext2D,\n text: string,\n x: number,\n y: number,\n fillColor: string,\n align: \"left\" | \"center\" | \"right\" = \"center\",\n ) => {\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(text).width + 16;\n const left = clamp(\n align === \"center\" ? x - w / 2 : align === \"right\" ? x - w : x,\n 2,\n Math.max(2, plotW - w - 2),\n );\n roundRect(ctx, left, y, w, 22, 11);\n ctx.fillStyle = fillColor;\n ctx.fill();\n ctx.fillStyle = textOn(fillColor);\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(text, left + w / 2, y + 11.5);\n return w;\n };\n\n /** Registers a clickable area of the canvas; returns whether it is hovered */\n const canvasButton = (\n x: number,\n y: number,\n w: number,\n h: number,\n action: () => void,\n ) => {\n canvasButtons.push({ x, y, w, h, action });\n return hoveredButton === canvasButtons.length - 1;\n };\n\n const paintDrawings = (\n ctx: CanvasRenderingContext2D,\n colors: { text: string; background: string; up: string; down: string },\n ) => {\n const count = n();\n const last = count ? store.close[count - 1] : NaN;\n const all = draft ? [...drawings, draft] : drawings;\n if (!all.length) return;\n const l = labels();\n const position = {\n target: l.target,\n stop: l.stop,\n riskReward: l.riskReward,\n profit: l.profit,\n long: l.long,\n short: l.short,\n };\n for (const pane of panes) {\n const mapper = drawingMapper(pane);\n if (!mapper) continue;\n const own = all.filter((d) => (d.pane ?? PRICE) === pane.id);\n if (!own.length) continue;\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, pane.top, plotW, pane.height);\n ctx.clip();\n for (const drawing of own) {\n const box = paintDrawing(\n ctx,\n drawing,\n mapper,\n {\n ...colors,\n color: css(drawing.color ?? PRIMARY),\n font: font(theme.fontSize, 500),\n fontFamily: theme.fontFamily,\n formatPrice: (value) => paneValueText(pane, value),\n formatPercent: (value) => formatPercent(value, locale),\n formatSpan,\n textOn,\n defaultText: l.text,\n position,\n last: pane.id === PRICE ? last : NaN,\n fill,\n },\n {\n selected: drawing === draft || drawing.id === selected,\n hovered: drawing.id === hovered,\n },\n );\n if (box) textBoxes.set(drawing.id, box);\n }\n ctx.restore();\n }\n };\n\n const paintForeground = (\n ctx: CanvasRenderingContext2D,\n v: Visible | null,\n ticks: TimeLabel[],\n ) => {\n const price = panes[0];\n if (!price) return;\n canvasButtons = [];\n const count = n();\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const upC = css(upCss());\n const downC = css(downCss());\n const l = labels();\n\n // ---- price pane contents (clipped)\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n\n // high / low of the visible bars, kept inside the plot\n if (\n v &&\n options.highLowMarkers !== false &&\n style() !== \"line\" &&\n style() !== \"area\" &&\n style() !== \"baseline\"\n ) {\n let hi = -Infinity;\n let lo = Infinity;\n let hiG = -1;\n let loG = -1;\n for (let g = v.s0; g <= v.s1; g++) {\n if (v.cols.high[g] > hi) {\n hi = v.cols.high[g];\n hiG = g;\n }\n if (v.cols.low[g] < lo) {\n lo = v.cols.low[g];\n loG = g;\n }\n }\n ctx.font = font(theme.fontSize);\n ctx.fillStyle = muted;\n ctx.strokeStyle = muted;\n ctx.lineWidth = 1;\n for (const [g, value, below] of [\n [hiG, hi, false],\n [loG, lo, true],\n ] as const) {\n if (g < 0 || !finite(value)) continue;\n const x = xOf(groupCenter(v, g));\n const label = formatPrice(value);\n const w = ctx.measureText(label).width;\n let y = clamp(\n yOf(price.scale, value) + (below ? 9 : -9),\n price.top + 8,\n price.top + price.height - 8,\n );\n // not under a row of the legend\n const labelLeft = Math.min(x, x + (x > plotW * 0.6 ? -17 - w : 17 + w));\n for (const row of priceLegend) {\n if (\n labelLeft < row.right &&\n y - 7 < row.bottom &&\n y + 7 > row.top &&\n row.bottom + 10 < price.top + price.height - 8\n )\n y = row.bottom + 10;\n }\n // on the right of the bar, unless it does not fit there\n const roomRight = plotW - 4 - (x + 17 + w);\n const roomLeft = x - 17 - w - 4;\n const leftSide =\n (roomRight < 0 || x > plotW * 0.6) &&\n roomLeft >= Math.min(0, roomRight);\n const dir = leftSide ? -1 : 1;\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"left\";\n ctx.beginPath();\n ctx.moveTo(x, y);\n ctx.lineTo(x + dir * 14, y);\n ctx.stroke();\n const tx = clamp(leftSide ? x - 17 - w : x + 17, 2, plotW - w - 2);\n ctx.fillText(label, tx, y);\n }\n }\n\n // trade markers\n if (v && options.markers?.length) {\n const stack = new Map<string, number>();\n ctx.font = font(theme.fontSize, 600);\n ctx.textAlign = \"center\";\n const many = options.markers.length > 400;\n for (const marker of options.markers) {\n const index = indexOfTimeExt(marker.time);\n if (index < 0 || index > count - 1) continue;\n const g = Math.floor(index / v.size);\n if (g < v.g0 || g > v.g1) continue;\n const x = Math.round(xOf(groupCenter(v, g)));\n const sell = marker.side === \"sell\";\n const color = marker.color ? css(marker.color) : sell ? downC : upC;\n const key = `${g}:${sell}`;\n const offset = stack.get(key) ?? 0;\n stack.set(key, offset + (marker.text && !many ? 30 : 16));\n const anchor = yOf(price.scale, sell ? v.cols.high[g] : v.cols.low[g]);\n const dir = sell ? -1 : 1;\n const tip = anchor + dir * (6 + offset);\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.moveTo(x, tip);\n ctx.lineTo(x - 5.5, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 7);\n ctx.lineTo(x - 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 12);\n ctx.lineTo(x + 2, tip + dir * 7);\n ctx.lineTo(x + 5.5, tip + dir * 7);\n ctx.closePath();\n ctx.fill();\n if (marker.text && !many) {\n ctx.textBaseline = sell ? \"bottom\" : \"top\";\n ctx.fillText(marker.text, x, tip + dir * 14);\n }\n if (marker.price !== undefined && finite(marker.price)) {\n ctx.beginPath();\n ctx.arc(x, yOf(price.scale, marker.price), 3, 0, Math.PI * 2);\n ctx.fill();\n ctx.lineWidth = 1.5;\n ctx.strokeStyle = bgCss;\n ctx.stroke();\n }\n }\n }\n ctx.restore();\n\n // drawings, each in its pane\n paintDrawings(ctx, { text, background: bgCss, up: upC, down: downC });\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, price.top, plotW, price.height);\n ctx.clip();\n // price lines (orders, positions, TP / SL, alerts)\n const lastClose = count ? store.close[count - 1] : NaN;\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = Math.round(yOf(price.scale, p)) + 0.5;\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const color = lineColor(line);\n const kind = line.kind ?? \"line\";\n const lineStyle =\n line.lineStyle ??\n (kind === \"position\" || kind === \"line\" ? \"solid\" : \"dashed\");\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth =\n hoveredLine === line.id ||\n (gesture?.kind === \"order\" && gesture.line.id === line.id) ||\n (keyOrder?.kind === \"move\" && keyOrder.id === line.id)\n ? 1.5\n : 1;\n setDash(ctx, lineStyle, 1);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n // label: [grip] title | quantity | profit | close\n const titleKey = PRICE_LINE_TITLES[kind];\n const title = line.title ?? (titleKey ? l[titleKey] : \"\");\n const parts: {\n text: string;\n fill: string;\n color: string;\n cancel?: boolean;\n }[] = [];\n if (title) parts.push({ text: title, fill: color, color: textOn(color) });\n if (line.quantity !== undefined && line.quantity !== \"\")\n parts.push({ text: String(line.quantity), fill: bgCss, color });\n if (\n kind === \"position\" &&\n typeof line.quantity === \"number\" &&\n finite(lastClose)\n ) {\n const pnl =\n (lastClose - p) * line.quantity * (line.side === \"sell\" ? -1 : 1);\n const pnlFill = pnl >= 0 ? upC : downC;\n parts.push({\n text: `${pnl >= 0 ? \"+\" : \"−\"}${formatPrice(Math.abs(pnl))}`,\n fill: pnlFill,\n color: textOn(pnlFill),\n });\n }\n if (line.cancellable)\n parts.push({ text: \"×\", fill: bgCss, color, cancel: true });\n if (!parts.length && !line.draggable) continue;\n ctx.font = font(theme.fontSize, 600);\n const widths = parts.map((part) =>\n part.cancel ? 20 : ctx.measureText(part.text).width + 12,\n );\n const grip = line.draggable ? 14 : 0;\n const total = widths.reduce((a, b) => a + b, 0) + grip;\n let x = Math.round(plotW - total - 56);\n const top = Math.round(y - 9.5);\n if (keyOrder?.kind === \"move\" && keyOrder.id === line.id) {\n // picked with the keyboard: a focus ring around the label\n roundRect(ctx, x - 3.5, top - 3.5, total + 7, 25, 5);\n ctx.strokeStyle = css(PRIMARY);\n ctx.lineWidth = 2;\n ctx.setLineDash([]);\n ctx.stroke();\n }\n roundRect(ctx, x - 0.5, top - 0.5, total + 1, 19, 3);\n ctx.fillStyle = bgCss;\n ctx.fill();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1;\n ctx.setLineDash([]);\n ctx.stroke();\n if (grip) {\n ctx.fillStyle = color;\n for (let k = 0; k < 3; k++)\n ctx.fillRect(x + 4, top + 5 + k * 3.5, 6, 1.5);\n x += grip;\n }\n ctx.textBaseline = \"middle\";\n ctx.textAlign = \"center\";\n parts.forEach((part, k) => {\n const w = widths[k] ?? 0;\n let partFill = part.fill;\n if (part.cancel) {\n const hover = canvasButton(x, top, w, 18, () =>\n emit(\"orderCancel\", { id: line.id, line }),\n );\n if (hover) partFill = color;\n ctx.fillStyle = color;\n ctx.fillRect(x, top + 3, 1, 12);\n }\n if (partFill !== bgCss) {\n ctx.fillStyle = partFill;\n ctx.fillRect(x, top, w, 18);\n }\n ctx.fillStyle =\n part.cancel && partFill !== bgCss ? textOn(color) : part.color;\n if (part.cancel) ctx.font = font(theme.fontSize + 3, 500);\n ctx.fillText(part.text, x + w / 2, top + (part.cancel ? 9 : 9.5));\n ctx.font = font(theme.fontSize, 600);\n x += w;\n });\n }\n\n // last price line\n const lastLine = options.lastPriceLine !== false && count > 0;\n const lastUp = count > 0 && store.close[count - 1] >= store.open[count - 1];\n // a line takes its own color; bars the color of the last bar\n const lastColor =\n style() === \"line\" || style() === \"area\"\n ? css(PRIMARY)\n : lastUp\n ? upC\n : downC;\n if (lastLine) {\n const y = Math.round(yOf(price.scale, lastClose)) + 0.5;\n ctx.save();\n ctx.strokeStyle = lastColor;\n ctx.setLineDash([1, 2]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n }\n ctx.restore();\n\n // last values of the compared series\n const compareLabels: { y: number; text: string; color: string }[] = [];\n for (const c of compares) {\n let i = count - 1;\n while (i >= 0 && !finite(c.values[i])) i--;\n if (i < 0) continue;\n const value = c.values[i];\n const scaled = compareScaled(price.scale, value, compareBase(c));\n const y = yOfScaled(price.scale, scaled);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n compareLabels.push({\n y,\n text:\n price.scale.mode === \"percent\"\n ? formatPercent(scaled, locale)\n : formatPrice(value),\n color: css(c.color),\n });\n }\n\n // axis ticks, except under the labels drawn over the axis\n const covered: { pane: string; y: number }[] = [];\n for (const line of options.priceLines ?? [])\n covered.push({ pane: PRICE, y: yOf(price.scale, linePrice(line)) });\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (pane && drawing.type === \"horizontalLine\" && drawing.points[0])\n covered.push({\n pane: pane.id,\n y: yOf(pane.scale, drawing.points[0].price),\n });\n }\n for (const label of compareLabels)\n covered.push({ pane: PRICE, y: label.y });\n if (lastLine)\n covered.push({\n pane: PRICE,\n y: yOf(price.scale, lastClose) + (options.countdown ? 7 : 0),\n });\n ctx.font = font(theme.fontSize);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillStyle = muted;\n for (const pane of panes) {\n for (const t of pane.ticks) {\n const y = yOfScaled(pane.scale, t);\n if (y < pane.top + 8 || y > pane.top + pane.height - 8) continue;\n const gap = options.countdown && pane.id === PRICE ? 18 : 14;\n if (covered.some((c) => c.pane === pane.id && Math.abs(c.y - y) < gap))\n continue;\n ctx.fillText(paneTickText(pane, t), plotW + 8, y);\n }\n }\n // time axis ticks\n ctx.textAlign = \"center\";\n for (const t of ticks) {\n ctx.font = font(theme.fontSize, t.bold ? 600 : 400);\n ctx.fillStyle = t.bold ? text : muted;\n ctx.fillText(t.text, t.x, plotH + TIME_AXIS / 2);\n }\n\n // labels of the price lines, the drawings and the compared series\n for (const line of options.priceLines ?? []) {\n const p = linePrice(line);\n const y = yOf(price.scale, p);\n if (!finite(y) || y < price.top || y > price.top + price.height) continue;\n const fillColor = lineColor(line);\n axisLabel(ctx, y, priceAxisText(p), fillColor, textOn(fillColor));\n }\n for (const drawing of drawings) {\n const pane = paneOf(drawing.pane);\n if (!pane || drawing.type !== \"horizontalLine\" || !drawing.points[0])\n continue;\n const p = drawing.points[0].price;\n const y = yOf(pane.scale, p);\n if (y < pane.top || y > pane.top + pane.height) continue;\n const fillColor = css(drawing.color ?? PRIMARY);\n axisLabel(\n ctx,\n y,\n pane.id === PRICE ? priceAxisText(p) : paneValueText(pane, p),\n fillColor,\n textOn(fillColor),\n );\n }\n for (const label of compareLabels)\n axisLabel(ctx, label.y, label.text, label.color, textOn(label.color));\n // last price label (with the countdown)\n if (lastLine) {\n let second: string | undefined;\n if (options.countdown) {\n const tf = timeframe();\n const start = store.time[count - 1];\n let end = start + tf.ms;\n if (tf.unit === \"month\") {\n const date = new Date(start);\n end = Date.UTC(\n date.getUTCFullYear(),\n date.getUTCMonth() + tf.count,\n date.getUTCDate(),\n date.getUTCHours(),\n date.getUTCMinutes(),\n );\n }\n second = formatCountdown(end - Date.now(), l);\n }\n axisLabel(\n ctx,\n yOf(price.scale, lastClose),\n priceAxisText(lastClose),\n lastColor,\n textOn(lastColor),\n second,\n );\n }\n\n // replay: the badge, or the picking of the first bar (at the bottom of\n // the price pane: the legends cover its top)\n const badgeY = price.top + price.height - 32;\n if (replayPicking) {\n const x = pointer && pointer.x <= plotW ? pointer.x : NaN;\n if (finite(x)) {\n ctx.fillStyle = toCss(theme.background, 0.62);\n ctx.fillRect(x, 0, plotW - x, plotH);\n ctx.strokeStyle = css(PRIMARY);\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(Math.round(x) + 0.5, 0);\n ctx.lineTo(Math.round(x) + 0.5, plotH);\n ctx.stroke();\n }\n pill(ctx, l.replayHint, plotW / 2, badgeY, css(PRIMARY));\n } else if (replay && count) {\n pill(\n ctx,\n fill(l.replay, {\n time: formatCrosshairTime(\n shift(store.time[count - 1]),\n tfMs(),\n locale,\n ),\n }),\n plotW / 2,\n badgeY,\n css(PRIMARY),\n );\n }\n\n // keyboard order entry: the armed order and the keys to use\n if (keyOrder && count) {\n if (keyOrder.kind === \"create\") {\n const color = keyOrder.side === \"buy\" ? upC : downC;\n const y = Math.round(yOf(price.scale, keyOrder.price)) + 0.5;\n if (finite(y) && y >= price.top && y <= price.top + price.height) {\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = 1.5;\n ctx.setLineDash([6, 4]);\n ctx.beginPath();\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n ctx.stroke();\n ctx.restore();\n pill(\n ctx,\n fill(keyOrder.side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(keyOrder.price),\n }),\n plotW - 56,\n clamp(y - 11, price.top + 2, price.top + price.height - 24),\n color,\n \"right\",\n );\n axisLabel(\n ctx,\n y,\n priceAxisText(keyOrder.price),\n color,\n textOn(color),\n );\n }\n }\n // the keys to use, on the left: order labels sit on the right\n if (!replay && !replayPicking)\n pill(ctx, l.orderHint, 8, badgeY, toCss(theme.text, 0.86), \"left\");\n }\n\n // crosshair\n const cross = crosshairState();\n if (cross && v && !replayPicking) {\n const x = Math.round(xOf(cross.index)) + 0.5;\n ctx.save();\n ctx.strokeStyle = toCss(theme.textMuted, 0.75);\n ctx.lineWidth = 1;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (x >= 0 && x <= plotW) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, plotH);\n }\n const y = Math.round(cross.y) + 0.5;\n if (\n finite(y) &&\n y >= cross.pane.top &&\n y <= cross.pane.top + cross.pane.height\n ) {\n ctx.moveTo(0, y);\n ctx.lineTo(plotW, y);\n }\n ctx.stroke();\n ctx.restore();\n const labelBg = toCss(theme.text);\n if (\n finite(cross.y) &&\n cross.y >= cross.pane.top &&\n cross.y <= cross.pane.top + cross.pane.height\n ) {\n const scaled = scaledAt(cross.pane.scale, cross.y);\n const textValue =\n cross.pane.id === PRICE\n ? priceAxisText(fromScaled(cross.pane.scale, scaled))\n : paneTickText(cross.pane, scaled);\n axisLabel(ctx, cross.y, textValue, labelBg, bgCss);\n }\n if (x >= 0 && x <= plotW && count) {\n const label = formatCrosshairTime(\n shift(timeAt(cross.index)),\n tfMs(),\n locale,\n );\n ctx.font = font(theme.fontSize, 500);\n const w = ctx.measureText(label).width + 16;\n const left = clamp(x - w / 2, 0, width - w);\n roundRect(ctx, left, plotH + 3, w, 21, 3);\n ctx.fillStyle = labelBg;\n ctx.fill();\n ctx.fillStyle = bgCss;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(label, left + w / 2, plotH + 14);\n }\n // order entry: a \"+\" at the crosshair price\n if (\n options.orderEntry &&\n pointer &&\n cross.pane.id === PRICE &&\n finite(cross.y) &&\n tool === \"cursor\" &&\n !gesture &&\n count\n ) {\n const size = 18;\n const bx = plotW - size - 4;\n const by = clamp(\n Math.round(cross.y - size / 2),\n price.top + 1,\n price.top + price.height - size - 1,\n );\n const orderPrice = roundPrice(cross.price);\n const side = orderPrice < lastClose ? \"buy\" : \"sell\";\n const hover = canvasButton(bx, by, size, size, () =>\n emit(\"orderCreate\", { price: orderPrice, side }),\n );\n roundRect(ctx, bx, by, size, size, 4);\n ctx.fillStyle = hover ? css(PRIMARY) : labelBg;\n ctx.fill();\n ctx.strokeStyle = hover ? textOn(css(PRIMARY)) : bgCss;\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(bx + 5, by + size / 2);\n ctx.lineTo(bx + size - 5, by + size / 2);\n ctx.moveTo(bx + size / 2, by + 5);\n ctx.lineTo(bx + size / 2, by + size - 5);\n ctx.stroke();\n if (hover) {\n pill(\n ctx,\n fill(side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(orderPrice),\n }),\n bx - 6,\n by - 2,\n side === \"buy\" ? upC : downC,\n \"right\",\n );\n }\n }\n }\n };\n\n // -------------------------------------------------------------- legends\n\n let legendKey = \"\";\n /** Rows of the legend of the price pane (labels painted under them are moved) */\n let priceLegend: { right: number; top: number; bottom: number }[] = [];\n const legendRows = new Map<string, LegendRow>();\n const legendBoxes = new Map<string, HTMLDivElement>();\n\n const legendBox = (id: string) => {\n let box = legendBoxes.get(id);\n if (!box) {\n // narrow charts: rows wrap, long items are cut with an ellipsis and\n // the rows that do not fit in the pane are hidden\n box = make(\"div\", {\n position: \"absolute\",\n left: \"4px\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n gap: \"1px\",\n maxWidth: \"calc(100% - 12px)\",\n overflow: \"hidden\",\n fontSize: \"12px\",\n lineHeight: \"18px\",\n fontVariantNumeric: \"tabular-nums\",\n whiteSpace: \"nowrap\",\n pointerEvents: \"none\",\n });\n legends.appendChild(box);\n legendBoxes.set(id, box);\n }\n return box;\n };\n\n const legendRow = (\n box: HTMLDivElement,\n title: string,\n study: Study | null,\n outputs: number,\n ) => {\n const row = make(\"div\", {\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n columnGap: \"6px\",\n maxWidth: \"100%\",\n minWidth: \"0\",\n boxSizing: \"border-box\",\n padding: \"0 4px\",\n borderRadius: \"4px\",\n background:\n \"color-mix(in srgb, var(--surface-color, var(--background-color, #fff)) 86%, transparent)\",\n });\n let button: HTMLButtonElement | null = null;\n if (study) {\n button = make(\"button\", {\n all: \"unset\",\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n borderRadius: \"3px\",\n ...ELLIPSIS,\n });\n button.type = \"button\";\n button.textContent = title;\n button.setAttribute(\n \"aria-label\",\n fill(labels().toggleIndicator, { name: title }),\n );\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n const next = !isVisible(study);\n visibility.set(study.id, next);\n emit(\"indicatorToggle\", { id: study.id, visible: next });\n updateLegends();\n invalidate();\n });\n button.addEventListener(\"pointerdown\", (event) =>\n event.stopPropagation(),\n );\n row.appendChild(button);\n } else if (title) {\n const label = make(\"span\", { fontWeight: \"600\", ...ELLIPSIS });\n label.textContent = title;\n row.appendChild(label);\n }\n const values: HTMLSpanElement[] = [];\n for (let i = 0; i < outputs; i++) {\n const span = make(\"span\", ELLIPSIS);\n row.appendChild(span);\n values.push(span);\n }\n box.appendChild(row);\n return { row, values, button };\n };\n\n const buildLegends = () => {\n legendRows.clear();\n for (const box of legendBoxes.values()) box.remove();\n legendBoxes.clear();\n if (options.legend === false) return;\n const priceBox = legendBox(PRICE);\n const head = [\n options.symbol,\n options.labels?.timeframe ??\n (typeof options.timeframe === \"string\" ? options.timeframe : \"\"),\n ]\n .filter(Boolean)\n .join(\" · \");\n legendRows.set(\"ohlc\", legendRow(priceBox, head, null, 1));\n for (const study of studies) {\n const slots = study.mergeLegend ? 1 : study.outputs.length;\n if (study.overlay && study.type === \"volume\") {\n legendRows.set(study.id, legendRow(priceBox, titleOf(study), study, 1));\n } else if (study.overlay) {\n legendRows.set(\n study.id,\n legendRow(priceBox, titleOf(study), study, slots),\n );\n }\n }\n for (const c of compares)\n legendRows.set(`compare:${c.id}`, legendRow(priceBox, \"\", null, 1));\n for (const study of studies) {\n if (study.overlay) continue;\n legendRows.set(\n study.id,\n legendRow(\n legendBox(study.id),\n titleOf(study),\n study,\n study.mergeLegend ? 1 : study.outputs.length,\n ),\n );\n }\n };\n\n /** Legend title: indicator abbreviations, but words for the volume and some indicators */\n const titleOf = (study: Study) =>\n study.type === \"volume\"\n ? labels().volume\n : study.titleKey\n ? `${labels()[study.titleKey]} ${study.title}`\n : study.title;\n\n const setSpan = (\n span: HTMLSpanElement | undefined,\n text: string,\n color?: string,\n ) => {\n if (!span) return;\n if (span.textContent !== text) span.textContent = text;\n const c = color ?? \"\";\n if (span.style.color !== c) span.style.color = c;\n };\n\n const updateLegends = () => {\n const key = [\n options.legend !== false,\n options.symbol,\n options.timeframe,\n ...studies.map((s) => `${s.id}:${titleOf(s)}:${s.outputs.length}`),\n ...compares.map((c) => c.id),\n texts.toggleIndicator,\n options.labels?.timeframe,\n ].join(\"|\");\n if (key !== legendKey) {\n legendKey = key;\n buildLegends();\n }\n if (options.legend === false) return;\n for (const pane of panes) {\n const box = legendBoxes.get(pane.id);\n if (!box) continue;\n box.style.top = `${pane.top + 6}px`;\n // over the plot only, never over the price axis nor the next pane\n const maxWidth = `${Math.max(60, Math.floor(plotW - 10))}px`;\n if (box.style.maxWidth !== maxWidth) box.style.maxWidth = maxWidth;\n const maxHeight = `${Math.max(18, Math.floor(pane.height - 10))}px`;\n if (box.style.maxHeight !== maxHeight) box.style.maxHeight = maxHeight;\n }\n const priceBox = legendBoxes.get(PRICE);\n const measured = priceBox\n ? Array.from(\n priceBox.children as HTMLCollectionOf<HTMLElement>,\n (row) => ({\n right: priceBox.offsetLeft + row.offsetLeft + row.offsetWidth,\n top: priceBox.offsetTop + row.offsetTop,\n bottom: priceBox.offsetTop + row.offsetTop + row.offsetHeight,\n }),\n )\n : [];\n // the labels avoiding the legend were painted with the previous layout\n // (a resize wraps the rows differently): paint them again\n const moved =\n measured.length !== priceLegend.length ||\n measured.some((row, i) => {\n const before = priceLegend[i];\n return (\n !before ||\n before.right !== row.right ||\n before.top !== row.top ||\n before.bottom !== row.bottom\n );\n });\n priceLegend = measured;\n if (moved) invalidate();\n const count = n();\n const cross = crosshairState();\n const index = clamp(\n cross && cross.index >= 0 && cross.index < count\n ? cross.index\n : count - 1,\n 0,\n Math.max(0, count - 1),\n );\n const l = labels();\n const ohlc = legendRows.get(\"ohlc\");\n const upC = css(upCss());\n const downC = css(downCss());\n if (ohlc && count) {\n const d = display();\n const o = d.open[index];\n const c = d.close[index];\n const prevClose = index > 0 ? d.close[index - 1] : o;\n const change = c - prevClose;\n const color = c >= o ? upC : downC;\n const span = ohlc.values[0];\n const html = [\n [l.open, d.open[index]],\n [l.high, d.high[index]],\n [l.low, d.low[index]],\n [l.close, c],\n ]\n .map(\n ([name, value]) =>\n `<span style=\"${PAIR}\"><span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(String(name))}</span><span style=\"color:${color}\">${escapeHtml(formatPrice(value as number))}</span></span>`,\n )\n .join(\"\");\n const pct = prevClose ? (change / prevClose) * 100 : NaN;\n const changeName = l.change\n ? `<span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.change)}</span>`\n : \"\";\n const changeHtml = `<span style=\"${PAIR}\">${changeName}<span style=\"color:${change >= 0 ? upC : downC}\">${change >= 0 ? \"+\" : \"−\"}${escapeHtml(formatPrice(Math.abs(change)))} (${escapeHtml(formatPercent(pct, locale))})</span></span>`;\n const vol = store.hasVolume\n ? `<span style=\"${PAIR}\"><span style=\"color:var(--text-secondary-color,#6b7280)\">${escapeHtml(l.volume)}</span>${escapeHtml(formatVolume(store.volume[index], locale))}</span>`\n : \"\";\n const next = `${html}${changeHtml}${vol}`;\n if (span && span.dataset.html !== next) {\n span.innerHTML = next;\n span.dataset.html = next;\n span.style.display = \"inline-flex\";\n span.style.columnGap = \"6px\";\n span.style.flexWrap = \"wrap\";\n }\n }\n for (const study of studies) {\n const row = legendRows.get(study.id);\n if (!row) continue;\n const shown = isVisible(study);\n row.row.style.opacity = shown ? \"1\" : \"0.5\";\n if (row.button) {\n row.button.setAttribute(\"aria-pressed\", String(shown));\n row.button.style.textDecoration = shown ? \"none\" : \"line-through\";\n }\n const slots = study.outputs.length;\n if (study.mergeLegend) {\n // one value: the output in use (SuperTrend up or down)\n const out = study.outputs.find((o) => finite(o.values[index]));\n setSpan(\n row.values[0],\n shown && count && out ? studyValueText(study, out.values[index]) : \"\",\n out ? css(colorOf(out.color)) : undefined,\n );\n continue;\n }\n study.outputs.forEach((out, i) => {\n // the MACD histogram (drawn first, under the lines) is listed last\n const span =\n row.values[study.type === \"macd\" ? (i + slots - 1) % slots : i];\n if (!shown || !count) {\n setSpan(span, \"\");\n return;\n }\n if (out.kind === \"volume\") {\n const c = store.close[index] >= store.open[index] ? upC : downC;\n setSpan(span, formatVolume(store.volume[index], locale), c);\n return;\n }\n // a shifted output shows the value drawn at this bar\n const source = index - out.shift;\n const value = source >= 0 && source < count ? out.values[source] : NaN;\n let color = out.color ? css(colorOf(out.color)) : undefined;\n if (out.kind === \"histogram\") color = value >= 0 ? upC : downC;\n if (out.kind === \"dots\" && !out.color)\n color = value <= store.close[index] ? upC : downC;\n const prefix =\n study.outputs.length > 1 && !study.plainLegend ? `${out.label} ` : \"\";\n setSpan(span, `${prefix}${studyValueText(study, value)}`, color);\n });\n }\n for (const c of compares) {\n const row = legendRows.get(`compare:${c.id}`);\n if (!row) continue;\n const value = c.values[index];\n const base = compareBase(c);\n const pct = finite(base) ? (value / base - 1) * 100 : NaN;\n setSpan(\n row.values[0],\n `${c.name} ${formatPrice(value)} ${formatPercent(pct, locale)}`,\n css(c.color),\n );\n }\n };\n\n const escapeHtml = (text: string) =>\n text.replace(/[&<>\"]/g, (ch) =>\n ch === \"&\"\n ? \"&\"\n : ch === \"<\"\n ? \"<\"\n : ch === \">\"\n ? \">\"\n : \""\",\n );\n\n // ---------------------------------------------------------------- frame\n\n const invalidate = () => {\n if (destroyed || frameId) return;\n frameId = win?.requestAnimationFrame\n ? win.requestAnimationFrame(frame)\n : (setTimeout(() => frame(Date.now()), 16) as unknown as number);\n };\n\n const animate = (now: number) => {\n let active = false;\n if (scrollAnim) {\n const t = Math.min(1, (now - scrollAnim.start) / 320);\n const eased = 1 - (1 - t) ** 3;\n right = scrollAnim.from + (scrollAnim.to - scrollAnim.from) * eased;\n if (t >= 1) scrollAnim = null;\n else active = true;\n }\n if (kinetic) {\n const dt = Math.min(64, now - kinetic.t);\n kinetic.t = now;\n const before = right;\n right -= (kinetic.v * dt) / spacing;\n kinetic.v *= Math.exp(-dt / 320);\n clampView();\n if (Math.abs(kinetic.v) < 0.02 || right === before) kinetic = null;\n else active = true;\n }\n return active;\n };\n\n const measureAxis = (ctx: CanvasRenderingContext2D) => {\n ctx.font = font(theme.fontSize, 500);\n let widest = 0;\n for (const pane of panes) {\n for (const t of pane.ticks)\n widest = Math.max(widest, ctx.measureText(paneTickText(pane, t)).width);\n }\n const count = n();\n if (count) {\n widest = Math.max(\n widest,\n ctx.measureText(priceAxisText(store.close[count - 1])).width,\n );\n if (options.countdown)\n widest = Math.max(widest, ctx.measureText(\"00:00:00\").width);\n }\n const wanted = Math.max(MIN_AXIS, Math.ceil(widest + 18));\n // shrink only when clearly narrower (no jitter while the price moves)\n if (wanted > axisW || wanted < axisW - 12) axisW = wanted;\n };\n\n function frame(now?: number) {\n frameId = 0;\n if (destroyed) return;\n width = root.clientWidth;\n height = root.clientHeight;\n if (width <= 0 || height <= 0) return;\n const time = now ?? Date.now();\n const animating = animate(\n typeof performance !== \"undefined\" ? performance.now() : time,\n );\n const dpr = win?.devicePixelRatio || 1;\n syncDerived();\n sizeCanvas(background, dpr);\n sizeCanvas(foreground, dpr);\n const bg = background.getContext(\"2d\");\n const fg = foreground.getContext(\"2d\");\n plotH = Math.max(1, height - TIME_AXIS);\n for (let pass = 0; pass < 2; pass++) {\n plotW = Math.max(1, width - axisW);\n layoutPanes();\n if (pendingRange) applyRange(pendingRange);\n clampView();\n vis = computeVisible();\n autoscale(vis);\n for (const pane of panes) {\n const ticks = scaleTicks(pane.scale, pane.id === PRICE ? 44 : 30);\n // fixed-range panes (RSI) label their bands and their middle\n const range = pane.study?.range;\n const bands = pane.study?.bands;\n pane.ticks =\n range && bands\n ? [...bands, (range[0] + range[1]) / 2].sort((a, b) => a - b)\n : ticks.scaled;\n pane.step = ticks.step;\n }\n const before = axisW;\n if (fg) measureAxis(fg);\n if (axisW === before) break;\n }\n const v = vis;\n pendingRange = null;\n const ticks = fg ? timeTicks(v, fg) : [];\n renderData(v, dpr);\n if (bg) {\n bg.setTransform(dpr, 0, 0, dpr, 0, 0);\n bg.clearRect(0, 0, width, height);\n paintBackground(bg, v, ticks);\n }\n if (fg) {\n fg.setTransform(dpr, 0, 0, dpr, 0, 0);\n fg.clearRect(0, 0, width, height);\n paintForeground(fg, v, ticks);\n }\n updateLegends();\n updateJump();\n updateToolbar();\n positionEditor();\n emitView();\n // buttons painted this frame may now be under the pointer\n if (\n pointer &&\n !gesture &&\n buttonAt(pointer.x, pointer.y) !== hoveredButton\n ) {\n updateCursor(pointer.x, pointer.y);\n invalidate();\n }\n if (animating) invalidate();\n }\n\n const updateJump = () => {\n const count = n();\n const price = panes[0];\n const show = count > 0 && price && xOf(count - 1) > plotW + spacing * 0.5;\n jump.style.display = show ? \"flex\" : \"none\";\n if (show && price) {\n jump.style.left = `${plotW - 40}px`;\n jump.style.top = `${price.top + price.height - 40}px`;\n const text = labels().scrollToRealtime;\n if (jump.getAttribute(\"aria-label\") !== text) {\n jump.setAttribute(\"aria-label\", text);\n jump.title = text;\n }\n }\n };\n\n const visibleRange = (): TradingVisibleRange => {\n const from = right - plotW / spacing;\n return { from, to: right, fromTime: timeAt(from), toTime: timeAt(right) };\n };\n\n const emitView = () => {\n const count = n();\n if (!count) return;\n const range = visibleRange();\n if (\n !lastRange ||\n Math.abs(lastRange.from - range.from) > 1e-6 ||\n Math.abs(lastRange.to - range.to) > 1e-6\n ) {\n lastRange = range;\n if (!silentRange) emit(\"visibleRangeChange\", range);\n }\n silentRange = false;\n if (range.from < 10 && historyFirst !== store.time[0]) {\n historyFirst = store.time[0];\n emit(\"historyRequest\", { firstTime: store.time[0], count });\n }\n const cross = crosshairState();\n // a crosshair set by `setCrosshair` is not reported\n const own = cross && (pointer || keyboardIndex !== null) ? cross : null;\n const key = own ? `${own.index}|${own.price}|${own.pane.id}` : \"\";\n if (key !== lastCrosshair) {\n lastCrosshair = key;\n if (!own) {\n emit(\"crosshairMove\", null);\n } else {\n const event: TradingCrosshairEvent = {\n index: own.index,\n time: timeAt(own.index),\n bar:\n own.index >= 0 && own.index < count\n ? readBar(store, own.index)\n : null,\n price: own.price,\n pane: own.pane.id,\n x: xOf(own.index),\n y: own.y,\n };\n emit(\"crosshairMove\", event);\n }\n }\n };\n\n // ---------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = root.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const applyRange = (range: { from: number; to: number }) => {\n spacing = plotW / (range.to - range.from);\n right = range.to;\n clampView();\n };\n\n /**\n * Zooms around `x`; while the latest bar is in view it stays where it is\n * (the reader is following the market), like the price scale side of\n * trading terminals\n */\n const zoomAt = (x: number, factor: number) => {\n const count = n();\n if (count && followsRealtime()) x = Math.min(plotW, xOf(count - 1));\n const anchor = indexAt(x);\n spacing = spacing * factor;\n clampView();\n right = anchor + (plotW - x) / spacing;\n clampView();\n kinetic = null;\n scrollAnim = null;\n invalidate();\n };\n\n const anchorAt = (x: number, y: number, pane: Pane): TradingDrawingPoint => {\n const index = Math.round(indexAt(x));\n return { time: timeAt(index), price: valueAt(pane.scale, y) };\n };\n\n const setTool = (next: TradingDrawingTool, notify: boolean) => {\n if (next === tool) return;\n tool = next;\n draft = null;\n draftClicks = 0;\n if (notify) emit(\"drawingToolChange\", next);\n invalidate();\n };\n\n const select = (id: string | null) => {\n if (id === selected) return;\n selected = id;\n paletteOpen = false;\n emit(\"drawingSelect\", id);\n invalidate();\n };\n\n // ------------------------------------------------------ drawing history\n\n const undoState = (): TradingUndoState => ({\n canUndo: undoStack.length > 0,\n canRedo: redoStack.length > 0,\n });\n\n const emitUndo = () => {\n const state = undoState();\n const key = `${state.canUndo}|${state.canRedo}`;\n if (key === undoKey) return;\n undoKey = key;\n emit(\"undoChange\", state);\n };\n\n /** Records a change of the drawings: undoable, and reported unless `notify` is false */\n const commitDrawings = (next: readonly TradingDrawing[], notify = true) => {\n if (next !== committed) {\n undoStack.push(committed);\n if (undoStack.length > HISTORY_LIMIT) undoStack.shift();\n redoStack.length = 0;\n committed = next;\n }\n drawings = next;\n if (notify) {\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n }\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emitUndo();\n invalidate();\n };\n\n /** Shows drawings of the history (undo / redo) */\n const restoreDrawings = (next: readonly TradingDrawing[]) => {\n committed = next;\n drawings = next;\n emittedDrawings = next;\n draft = null;\n if (selected && !next.some((d) => d.id === selected)) select(null);\n emit(\"drawingsChange\", next);\n emitUndo();\n invalidate();\n };\n\n const undo = () => {\n const previous = undoStack.pop();\n if (!previous) return;\n if (editing) closeEditor(false);\n redoStack.push(committed);\n restoreDrawings(previous);\n };\n\n const redo = () => {\n const next = redoStack.pop();\n if (!next) return;\n undoStack.push(committed);\n restoreDrawings(next);\n };\n\n const updateDrawing = (id: string, patch: TradingDrawingPatch) => {\n if (!drawings.some((d) => d.id === id)) return;\n commitDrawings(\n drawings.map((d) =>\n d.id === id ? { ...d, ...patch, id: d.id, type: d.type } : d,\n ),\n );\n };\n\n const removeDrawing = (id: string) => {\n if (!drawings.some((d) => d.id === id)) return;\n if (selected === id) select(null);\n commitDrawings(drawings.filter((d) => d.id !== id));\n };\n\n /** Default target and stop of a new position: a reward twice the risk */\n const positionPoints = (\n entry: TradingDrawingPoint,\n pane: Pane,\n long: boolean,\n ): TradingDrawingPoint[] => {\n const y = yOf(pane.scale, entry.price);\n const risk = Math.max(12, pane.height * 0.07);\n const target = valueAt(pane.scale, y + (long ? -2 : 2) * risk);\n const stop = valueAt(pane.scale, y + (long ? 1 : -1) * risk);\n const bars = Math.max(6, Math.round((plotW * 0.16) / spacing));\n const end = timeAt(Math.round(indexOfTimeExt(entry.time)) + bars);\n return [\n entry,\n { time: end, price: roundPrice(target) },\n { time: end, price: roundPrice(stop) },\n ];\n };\n\n const finishDraft = () => {\n if (!draft) return;\n const done = draft;\n draft = null;\n draftClicks = 0;\n commitDrawings([...drawings, done]);\n select(done.id);\n if (!options.keepDrawingMode) setTool(\"cursor\", true);\n if (done.type === \"text\") openEditor(done.id, true);\n };\n\n /** Fixes the anchor following the pointer; the drawing is done after its last anchor */\n const fixDraftAnchor = () => {\n if (!draft) return;\n draftClicks--;\n if (draftClicks <= 0) {\n finishDraft();\n return;\n }\n const last = draft.points[draft.points.length - 1];\n if (last) draft = { ...draft, points: [...draft.points, last] };\n };\n\n /** Moves the anchor of the drawing being made to the pointer */\n const followDraft = (x: number, y: number) => {\n const pane = paneOf(draftPane);\n if (!draft || !pane || draftClicks <= 0) return;\n draft = {\n ...draft,\n points: [...draft.points.slice(0, -1), anchorAt(x, y, pane)],\n };\n };\n\n const hitLine = (x: number, y: number) => {\n const price = panes[0];\n if (!price || x > plotW) return null;\n for (const line of options.priceLines ?? []) {\n if (!line.draggable) continue;\n if (Math.abs(yOf(price.scale, linePrice(line)) - y) <= 5) return line;\n }\n return null;\n };\n\n const hitDrawingAt = (x: number, y: number) => {\n if (x > plotW) return null;\n const pane = paneAt(y);\n const mapper = drawingMapper(pane);\n if (!pane || !mapper) return null;\n for (let i = drawings.length - 1; i >= 0; i--) {\n const drawing = drawings[i];\n if (!drawing || (drawing.pane ?? PRICE) !== pane.id) continue;\n const hit = hitDrawing(\n drawing,\n mapper,\n { x, y },\n 6,\n textBoxes.get(drawing.id),\n );\n if (hit) return { drawing, hit, pane };\n }\n return null;\n };\n\n const buttonAt = (x: number, y: number) =>\n canvasButtons.findIndex(\n (b) => x >= b.x && x <= b.x + b.w && y >= b.y && y <= b.y + b.h,\n );\n\n const separatorAt = (y: number) => {\n for (let i = 1; i < panes.length; i++) {\n if (Math.abs(panes[i].top - y) <= 4) return i;\n }\n return -1;\n };\n\n // --------------------------------------------------------- text editor\n\n const autosizeEditor = () => {\n editor.style.height = \"auto\";\n editor.style.height = `${Math.max(28, editor.scrollHeight + 2)}px`;\n };\n\n const positionEditor = () => {\n if (!editing) return;\n const id = editing.id;\n const drawing = drawings.find((d) => d.id === id);\n const pane = drawing ? paneOf(drawing.pane) : null;\n const anchor = drawing?.points[0];\n if (!drawing || !pane || !anchor) return;\n const x = xOf(indexOfTimeExt(anchor.time));\n const y = yOf(pane.scale, anchor.price);\n editor.style.left = `${clamp(x, 2, Math.max(2, plotW - 160))}px`;\n editor.style.top = `${clamp(y, 2, Math.max(2, plotH - 40))}px`;\n };\n\n function openEditor(id: string, created: boolean) {\n const drawing = drawings.find((d) => d.id === id);\n if (!drawing || drawing.locked) return;\n editing = { id, created };\n editor.value = created ? \"\" : (drawing.text ?? \"\");\n editor.placeholder = labels().text;\n editor.setAttribute(\"aria-label\", labels().editText);\n editor.style.display = \"block\";\n positionEditor();\n autosizeEditor();\n editor.focus();\n editor.select();\n invalidate();\n }\n\n function closeEditor(commit: boolean) {\n if (!editing) return;\n const { id, created } = editing;\n editing = null;\n editor.style.display = \"none\";\n const text = editor.value.replace(/\\s+$/, \"\");\n const drawing = drawings.find((d) => d.id === id);\n if (drawing && created && (!commit || !text)) {\n // a new text left empty or cancelled: as if it had never been made\n const previous = undoStack.pop();\n restoreDrawings(previous ?? drawings.filter((d) => d.id !== id));\n } else if (drawing && commit && text !== (drawing.text ?? \"\")) {\n if (created) {\n // the text completes the creation (a single undo step)\n const next = drawings.map((d) => (d.id === id ? { ...d, text } : d));\n committed = next;\n drawings = next;\n emittedDrawings = next;\n emit(\"drawingsChange\", next);\n } else {\n updateDrawing(id, { text });\n }\n }\n if (doc.activeElement === editor || doc.activeElement === doc.body)\n root.focus();\n invalidate();\n }\n\n editor.addEventListener(\"keydown\", (event) => {\n event.stopPropagation();\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n closeEditor(true);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n closeEditor(false);\n }\n });\n editor.addEventListener(\"input\", autosizeEditor);\n editor.addEventListener(\"blur\", () => closeEditor(true));\n editor.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n editor.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n\n // ------------------------------------------------------ drawing toolbar\n\n const icon = (path: string, dash = \"\", width = 1.5) =>\n `<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"${width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"${dash ? ` stroke-dasharray=\"${dash}\"` : \"\"} aria-hidden=\"true\"><path d=\"${path}\"/></svg>`;\n\n const toolbarButton = (\n label: string,\n content: string,\n onClick: () => void,\n pressed?: boolean,\n ) => {\n const button = doc.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", label);\n button.title = label;\n if (pressed !== undefined)\n button.setAttribute(\"aria-pressed\", String(pressed));\n button.innerHTML = content;\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n onClick();\n });\n return button;\n };\n\n const separator = () => {\n const span = doc.createElement(\"span\");\n span.className = \"sep\";\n return span;\n };\n\n const buildToolbar = (drawing: TradingDrawing) => {\n toolbar.textContent = \"\";\n const l = labels();\n toolbar.setAttribute(\"aria-label\", l.lineStyle);\n const id = drawing.id;\n const items: HTMLElement[] = [];\n if (!drawing.locked) {\n const color = css(drawing.color ?? PRIMARY);\n const swatch = toolbarButton(\n l.color,\n `<span style=\"display:block;width:14px;height:14px;border-radius:50%;background:${color};box-shadow:inset 0 0 0 1px rgba(127,127,127,.35)\"></span>`,\n () => {\n paletteOpen = !paletteOpen;\n toolbarKey = \"\";\n updateToolbar();\n },\n );\n swatch.setAttribute(\"aria-expanded\", String(paletteOpen));\n items.push(swatch);\n const width = drawing.lineWidth ?? 1.5;\n const widths = [1, 2, 3, 4];\n items.push(\n toolbarButton(\n `${l.lineWidth}: ${width}px`,\n `${icon(\"M2 8h12\", \"\", Math.min(4, width))}<span style=\"font-size:11px;margin-left:3px\">${width}</span>`,\n () =>\n updateDrawing(id, {\n lineWidth: widths.find((w) => w > width) ?? widths[0],\n }),\n ),\n );\n const lineStyle = drawing.lineStyle ?? \"solid\";\n items.push(\n toolbarButton(\n l.lineStyle,\n icon(\n \"M2 8h12\",\n lineStyle === \"dashed\"\n ? \"3.5 2.5\"\n : lineStyle === \"dotted\"\n ? \"0.1 3\"\n : \"\",\n lineStyle === \"dotted\" ? 2.2 : 1.6,\n ),\n () =>\n updateDrawing(id, {\n lineStyle:\n LINE_STYLES[\n (LINE_STYLES.indexOf(lineStyle) + 1) % LINE_STYLES.length\n ],\n }),\n ),\n );\n if (isFillable(drawing.type)) {\n items.push(\n toolbarButton(\n l.fill,\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\"><rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"9\" rx=\"1.5\" fill=\"currentColor\" fill-opacity=\".3\" stroke=\"currentColor\" stroke-width=\"1.3\"/></svg>',\n () => updateDrawing(id, { fill: drawing.fill === false }),\n drawing.fill !== false,\n ),\n );\n }\n if (drawing.type === \"text\") {\n items.push(\n toolbarButton(l.editText, icon(\"M3 13h3l7-7-3-3-7 7zM9 4l3 3\"), () =>\n openEditor(id, false),\n ),\n );\n }\n items.push(separator());\n }\n items.push(\n toolbarButton(\n l.lock,\n drawing.locked\n ? icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 4 0v2\")\n : icon(\"M4.5 7.5h7v6h-7zM6 7.5V5.5a2 2 0 0 1 3.8-.9\"),\n () => updateDrawing(id, { locked: !drawing.locked }),\n !!drawing.locked,\n ),\n );\n if (!drawing.locked) {\n const remove = toolbarButton(\n l.remove,\n icon(\"M3 4.5h10M6.5 4.5V3h3v1.5M4.5 4.5l.7 8.5h5.6l.7-8.5\"),\n () => removeDrawing(id),\n );\n remove.style.color = \"var(--danger-color, #f23645)\";\n items.push(remove);\n }\n toolbar.append(...items);\n if (paletteOpen && !drawing.locked) {\n const palette = make(\"div\", {\n position: \"absolute\",\n left: \"0\",\n top: \"calc(100% + 4px)\",\n display: \"flex\",\n gap: \"2px\",\n padding: \"4px\",\n borderRadius: \"8px\",\n border:\n \"1px solid color-mix(in srgb, var(--border-color, #e5e7eb) 85%, transparent)\",\n background: \"var(--surface-elevated-color, var(--surface-color, #fff))\",\n boxShadow: \"0 8px 24px -8px rgba(15, 23, 42, 0.35)\",\n });\n for (const color of PALETTE) {\n const button = toolbarButton(\n `${l.color} ${color}`,\n `<span style=\"display:block;width:16px;height:16px;border-radius:50%;background:${color}\"></span>`,\n () => {\n paletteOpen = false;\n updateDrawing(id, { color });\n },\n (drawing.color ?? \"\").toLowerCase() === color,\n );\n palette.appendChild(button);\n }\n toolbar.appendChild(palette);\n }\n };\n\n function updateToolbar() {\n const drawing = selected\n ? drawings.find((d) => d.id === selected)\n : undefined;\n const pane = drawing ? paneOf(drawing.pane) : null;\n const mapper = drawingMapper(pane);\n const dragging = gesture?.kind === \"drawing\" && gesture.moved;\n if (\n !drawing ||\n !pane ||\n !mapper ||\n options.drawingToolbar === false ||\n editing ||\n dragging ||\n draft\n ) {\n toolbar.style.display = \"none\";\n toolbarKey = \"\";\n paletteOpen = false;\n return;\n }\n const key = [\n drawing.id,\n drawing.color,\n drawing.lineWidth,\n drawing.lineStyle,\n drawing.fill,\n drawing.locked,\n paletteOpen,\n locale,\n themeVersion,\n ].join(\"|\");\n if (key !== toolbarKey) {\n toolbarKey = key;\n buildToolbar(drawing);\n }\n toolbar.style.display = \"flex\";\n // above the drawing (below it when there is no room), inside the plot\n const pts = handlePoints(drawing, mapper, textBoxes.get(drawing.id));\n const box = textBoxes.get(drawing.id);\n if (drawing.type === \"text\" && box)\n pts.push({ x: box.x + box.w, y: box.y + box.h });\n let x0 = Infinity;\n let x1 = -Infinity;\n let y0 = Infinity;\n let y1 = -Infinity;\n for (const p of pts) {\n x0 = Math.min(x0, clamp(p.x, 0, plotW));\n x1 = Math.max(x1, clamp(p.x, 0, plotW));\n y0 = Math.min(y0, clamp(p.y, pane.top, pane.top + pane.height));\n y1 = Math.max(y1, clamp(p.y, pane.top, pane.top + pane.height));\n }\n if (drawing.type === \"horizontalLine\") {\n x0 = plotW * 0.35;\n x1 = plotW * 0.65;\n }\n const w = toolbar.offsetWidth || 200;\n const h = toolbar.offsetHeight || 34;\n const left = clamp((x0 + x1) / 2 - w / 2, 4, Math.max(4, plotW - w - 4));\n let top = y0 - h - 14;\n // below, clear of the labels under the drawing (position stops, measures)\n if (top < 4) top = y1 + 32;\n toolbar.style.left = `${Math.round(left)}px`;\n toolbar.style.top = `${Math.round(clamp(top, 4, Math.max(4, plotH - h - 4)))}px`;\n }\n\n toolbar.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"dblclick\", (event) => event.stopPropagation());\n // the chart under the toolbar is not hovered\n toolbar.addEventListener(\"pointermove\", (event) => event.stopPropagation());\n toolbar.addEventListener(\"pointerenter\", () => {\n pointer = null;\n hovered = null;\n root.style.cursor = \"default\";\n invalidate();\n });\n\n // ---------------------------------------------------------------- replay\n\n const replayState = (): TradingReplayState => ({\n active: !!replay,\n picking: replayPicking,\n playing: !!replay?.playing,\n speed: replay?.speed ?? replaySpeed,\n index: n(),\n total: replay ? replay.source.length : n(),\n time: n() ? store.time[n() - 1] : NaN,\n });\n\n const emitReplay = () => emit(\"replayChange\", replayState());\n\n const columnsOf = (from: BarStore, count: number) => ({\n time: from.time.subarray(0, count),\n open: from.open.subarray(0, count),\n high: from.high.subarray(0, count),\n low: from.low.subarray(0, count),\n close: from.close.subarray(0, count),\n volume: from.volume.subarray(0, count),\n });\n\n /** Replaces the bars of the store by the first `count` bars of `source` */\n const showBars = (source: BarStore, count: number) => {\n const hasVolume = source.hasVolume;\n storeSet(store, columnsOf(source, count));\n store.hasVolume = hasVolume;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n historyFirst = NaN;\n afterDataChange(0);\n };\n\n const stopReplayTimer = () => {\n if (replay?.timer) clearInterval(replay.timer);\n if (replay) {\n replay.timer = null;\n replay.playing = false;\n }\n };\n\n const beginReplay = (index: number) => {\n replayPicking = false;\n if (!replay) {\n if (!n()) return;\n const source = createStore();\n storeSet(source, columnsOf(store, n()));\n source.hasVolume = store.hasVolume;\n replay = { source, playing: false, speed: replaySpeed, timer: null };\n }\n stopReplayTimer();\n const shown = clamp(Math.round(index) + 1, 1, replay.source.length);\n showBars(replay.source, shown);\n right = shown - 1 + (options.rightOffset ?? 8);\n for (const scale of scales.values()) scale.auto = true;\n emitReplay();\n };\n\n const replayStepBy = (count: number) => {\n if (!replay) return;\n const source = replay.source;\n const before = n();\n const follow = followsRealtime();\n let from = -1;\n for (let i = 0; i < count && n() < source.length; i++) {\n const at = storeUpdate(store, readBar(source, n()));\n if (from < 0) from = at;\n }\n store.hasVolume = source.hasVolume;\n if (from >= 0) {\n if (follow) right += n() - before;\n afterDataChange(from);\n }\n if (n() >= source.length) stopReplayTimer();\n emitReplay();\n };\n\n const playReplay = (speed?: number) => {\n if (!replay) return;\n if (speed !== undefined && speed > 0) replay.speed = replaySpeed = speed;\n stopReplayTimer();\n if (n() >= replay.source.length) {\n emitReplay();\n return;\n }\n const interval = Math.max(16, 1000 / replay.speed);\n const perTick = Math.max(1, Math.round((replay.speed * interval) / 1000));\n replay.playing = true;\n replay.timer = setInterval(() => replayStepBy(perTick), interval);\n emitReplay();\n };\n\n /** Ends the replay; `restore` shows every bar again */\n const endReplay = (restore: boolean) => {\n const wasPicking = replayPicking;\n replayPicking = false;\n if (!replay) {\n if (wasPicking) {\n emitReplay();\n invalidate();\n }\n return;\n }\n stopReplayTimer();\n const source = replay.source;\n replay = null;\n if (restore) showBars(source, source.length);\n emitReplay();\n };\n\n // ----------------------------------------------------------- pointer\n\n const updateCursor = (x: number, y: number) => {\n let cursor = \"crosshair\";\n hoveredLine = null;\n let nextHover: string | null = null;\n const button = gesture ? -1 : buttonAt(x, y);\n if (button !== hoveredButton) hoveredButton = button;\n if (gesture?.kind === \"pan\" && gesture.moved) cursor = \"grabbing\";\n else if (button >= 0) cursor = \"pointer\";\n else if (replayPicking && x <= plotW && y <= plotH) cursor = \"pointer\";\n else if (separatorAt(y) > 0) cursor = \"row-resize\";\n else if (x > plotW && y < plotH) cursor = \"ns-resize\";\n else if (y > plotH) cursor = \"ew-resize\";\n else if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n cursor = \"ns-resize\";\n hoveredLine = line.id;\n } else {\n const hit = hitDrawingAt(x, y);\n if (hit) {\n nextHover = hit.drawing.id;\n cursor = hit.drawing.locked\n ? \"pointer\"\n : hit.hit.part === \"handle\"\n ? \"move\"\n : \"pointer\";\n }\n }\n }\n if (nextHover !== hovered) hovered = nextHover;\n if (root.style.cursor !== cursor) root.style.cursor = cursor;\n };\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0 && event.pointerType === \"mouse\") return;\n const { x, y } = local(event);\n pointer = { x, y };\n keyboardIndex = null;\n if (keyOrder) endKeyOrder(true);\n kinetic = null;\n scrollAnim = null;\n if (editing) closeEditor(true);\n if (paletteOpen) {\n paletteOpen = false;\n invalidate();\n }\n if (event.pointerType === \"touch\") {\n touches.set(event.pointerId, { x, y });\n if (touches.size === 2) {\n const [a, b] = [...touches.values()];\n pinch = { distance: Math.hypot(a.x - b.x, a.y - b.y), spacing };\n gesture = null;\n return;\n }\n }\n try {\n root.setPointerCapture(event.pointerId);\n } catch {\n // the pointer may already be released\n }\n const button = buttonAt(x, y);\n const target = canvasButtons[button];\n if (target) {\n gesture = { kind: \"button\", action: target.action };\n return;\n }\n if (replayPicking && x <= plotW && y <= plotH) {\n beginReplay(Math.min(n() - 1, Math.round(indexAt(x))));\n return;\n }\n const sep = separatorAt(y);\n if (sep > 0) {\n const above = panes[sep - 1];\n const below = panes[sep];\n gesture = {\n kind: \"separator\",\n index: sep,\n y,\n above: above.height,\n below: below.height,\n };\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane)\n gesture = {\n kind: \"axisY\",\n pane,\n y,\n min: pane.scale.min,\n max: pane.scale.max,\n };\n return;\n }\n if (y > plotH) {\n gesture = { kind: \"axisX\", x, spacing };\n return;\n }\n const pane = paneAt(y);\n if (tool !== \"cursor\" && pane && n()) {\n if (draft) {\n // the next anchor of a click-by-click drawing\n followDraft(x, y);\n fixDraftAnchor();\n gesture = null;\n invalidate();\n return;\n }\n const type = tool;\n const position = isPosition(type);\n // positions need prices: on the price pane only\n const at = position ? panes[0] : pane;\n const point = anchorAt(x, clamp(y, at.top, at.top + at.height), at);\n const anchors = anchorCount(type);\n draftPane = at.id;\n draft = {\n id: `drawing-${Date.now().toString(36)}-${++drawingCounter}`,\n type,\n points: position\n ? positionPoints(\n { ...point, price: roundPrice(point.price) },\n at,\n type === \"longPosition\",\n )\n : anchors === 1\n ? [point]\n : [point, point],\n ...(at.id !== PRICE ? { pane: at.id } : {}),\n };\n if (anchors === 1) {\n finishDraft();\n return;\n }\n draftClicks = anchors - 1;\n gesture = { kind: \"create\", pane: at, x, y, moved: false };\n invalidate();\n return;\n }\n if (tool === \"cursor\") {\n const line = hitLine(x, y);\n if (line) {\n gesture = { kind: \"order\", line, startPrice: line.price };\n return;\n }\n const hit = hitDrawingAt(x, y);\n if (hit) {\n select(hit.drawing.id);\n if (!hit.drawing.locked) {\n gesture = {\n kind: \"drawing\",\n id: hit.drawing.id,\n pane: hit.pane,\n handle: hit.hit.part === \"handle\" ? hit.hit.index : -1,\n x,\n y,\n original: hit.drawing,\n moved: false,\n };\n }\n return;\n }\n }\n gesture = {\n kind: \"pan\",\n x,\n y,\n right,\n pane,\n moved: false,\n lastX: x,\n lastY: y,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n pointer = { x, y };\n if (event.pointerType === \"touch\" && touches.has(event.pointerId)) {\n touches.set(event.pointerId, { x, y });\n if (pinch && touches.size === 2) {\n const [a, b] = [...touches.values()];\n const distance = Math.hypot(a.x - b.x, a.y - b.y);\n const count = n();\n const mid =\n count && followsRealtime()\n ? Math.min(plotW, xOf(count - 1))\n : (a.x + b.x) / 2;\n const anchor = indexAt(mid);\n spacing = (pinch.spacing * distance) / Math.max(1, pinch.distance);\n clampView();\n right = anchor + (plotW - mid) / spacing;\n clampView();\n invalidate();\n return;\n }\n }\n const g = gesture;\n if (!g) {\n if (draft) followDraft(x, y);\n updateCursor(x, y);\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\": {\n const dx = x - g.x;\n if (!g.moved && Math.hypot(dx, y - g.y) < 3) break;\n g.moved = true;\n right = g.right - dx / spacing;\n if (g.pane && !g.pane.scale.auto) panScale(g.pane.scale, y - g.lastY);\n g.lastY = y;\n const dt = Math.max(1, event.timeStamp - g.lastT);\n g.velocity = 0.6 * ((x - g.lastX) / dt) + 0.4 * g.velocity;\n g.lastX = x;\n g.lastT = event.timeStamp;\n clampView();\n root.style.cursor = \"grabbing\";\n break;\n }\n case \"axisY\": {\n const scale = g.pane.scale;\n scale.min = g.min;\n scale.max = g.max;\n zoomScale(scale, Math.exp((y - g.y) * 0.006));\n break;\n }\n case \"axisX\": {\n const lastIndex = right;\n spacing = g.spacing * Math.exp((x - g.x) * 0.006);\n clampView();\n right = lastIndex;\n clampView();\n break;\n }\n case \"separator\": {\n const dy = y - g.y;\n const above = panes[g.index - 1];\n const below = panes[g.index];\n if (!above || !below) break;\n const total = g.above + g.below;\n const nextBelow = clamp(g.below - dy, MIN_PANE, total - MIN_PANE);\n paneHeights.set(below.id, nextBelow);\n if (above.id !== PRICE) paneHeights.set(above.id, total - nextBelow);\n break;\n }\n case \"order\": {\n lineOverrides.set(g.line.id, roundPrice(valueAt(panes[0].scale, y)));\n break;\n }\n case \"drawing\": {\n if (!g.moved && Math.hypot(x - g.x, y - g.y) < 3) break;\n g.moved = true;\n const scale = g.pane.scale;\n let points: TradingDrawingPoint[];\n if (g.handle >= 0) {\n points = moveHandle(g.original, g.handle, anchorAt(x, y, g.pane));\n } else {\n const di = Math.round(indexAt(x) - indexAt(g.x));\n const ds = scaledAt(scale, y) - scaledAt(scale, g.y);\n points = g.original.points.map((p) => ({\n time: timeAt(Math.round(indexOfTimeExt(p.time)) + di),\n price: fromScaled(scale, toScaled(scale, p.price) + ds),\n }));\n }\n drawings = drawings.map((d) => (d.id === g.id ? { ...d, points } : d));\n break;\n }\n case \"create\": {\n if (Math.hypot(x - g.x, y - g.y) >= 4) g.moved = true;\n followDraft(x, y);\n break;\n }\n default:\n updateCursor(x, y);\n break;\n }\n invalidate();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n touches.delete(event.pointerId);\n if (touches.size < 2) pinch = null;\n const g = gesture;\n gesture = null;\n const { x, y } = local(event);\n if (event.pointerType === \"touch\") pointer = null;\n if (!g) {\n invalidate();\n return;\n }\n switch (g.kind) {\n case \"pan\":\n if (!g.moved) {\n if (selected) select(null);\n const pane = paneAt(y);\n if (pane && x <= plotW) {\n emit(\"click\", {\n index: Math.round(indexAt(x)),\n time: timeAt(Math.round(indexAt(x))),\n price: valueAt(pane.scale, y),\n pane: pane.id,\n });\n }\n } else if (\n options.kineticScroll !== false &&\n event.timeStamp - g.lastT < 60 &&\n Math.abs(g.velocity) > 0.25\n ) {\n kinetic = {\n v: g.velocity,\n t:\n typeof performance !== \"undefined\"\n ? performance.now()\n : Date.now(),\n };\n }\n break;\n case \"order\": {\n const next = lineOverrides.get(g.line.id);\n if (next !== undefined && next !== g.startPrice) {\n emit(\"orderMove\", {\n id: g.line.id,\n price: next,\n previousPrice: g.startPrice,\n line: g.line,\n });\n } else {\n lineOverrides.delete(g.line.id);\n }\n break;\n }\n case \"drawing\":\n if (g.moved) commitDrawings(drawings);\n break;\n case \"create\":\n // a click starts a click-by-click drawing; a drag fixes the anchor\n if (g.moved) fixDraftAnchor();\n break;\n case \"button\":\n if (buttonAt(x, y) >= 0) g.action();\n break;\n default:\n break;\n }\n updateCursor(x, y);\n invalidate();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (gesture || event.pointerType === \"touch\") return;\n pointer = null;\n hovered = null;\n hoveredLine = null;\n invalidate();\n };\n\n const onWheel = (event: WheelEvent) => {\n const mode = options.wheel ?? \"zoom\";\n if (mode === \"none\") return;\n const { x } = local(event);\n const unit = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? plotW : 1;\n const dx = event.deltaX * unit;\n const dy = event.deltaY * unit;\n const modifier = event.ctrlKey || event.metaKey;\n if (mode === \"modifier\" && !modifier && Math.abs(dx) <= Math.abs(dy))\n return;\n event.preventDefault();\n keyboardIndex = null;\n if (Math.abs(dx) > Math.abs(dy) || event.shiftKey) {\n right += (Math.abs(dx) > Math.abs(dy) ? dx : dy) / spacing;\n clampView();\n kinetic = null;\n invalidate();\n return;\n }\n const factor = Math.exp(-dy * (event.ctrlKey ? 0.01 : 0.0015));\n zoomAt(Math.min(x, plotW), factor);\n };\n\n const onDoubleClick = (event: MouseEvent) => {\n const { x, y } = local(event);\n const hit = tool === \"cursor\" ? hitDrawingAt(x, y) : null;\n if (hit?.drawing.type === \"text\") {\n openEditor(hit.drawing.id, false);\n return;\n }\n if (x > plotW && y < plotH) {\n const pane = paneAt(y);\n if (pane) pane.scale.auto = true;\n } else if (y > plotH) {\n spacing = options.barSpacing ?? 8;\n instance.scrollToRealtime(true);\n } else {\n for (const scale of scales.values()) scale.auto = true;\n }\n invalidate();\n };\n\n const announce = (index: number) => {\n if (index < 0 || index >= n()) return;\n const d = display();\n const l = labels();\n live.textContent = fill(l.announcement, {\n time: formatCrosshairTime(shift(store.time[index]), tfMs(), locale),\n open: formatPrice(d.open[index]),\n high: formatPrice(d.high[index]),\n low: formatPrice(d.low[index]),\n close: formatPrice(d.close[index]),\n });\n };\n\n const say = (text: string) => {\n live.textContent = text;\n };\n\n /** Price lines the keyboard can pick: draggable or cancellable ones */\n const keyLines = () =>\n (options.priceLines ?? []).filter(\n (line) => line.draggable || line.cancellable,\n );\n\n const lineTitle = (line: TradingPriceLine) => {\n const key = PRICE_LINE_TITLES[line.kind ?? \"line\"];\n return line.title ?? (key ? labels()[key] : \"\");\n };\n\n /** Leaves the keyboard order entry; `restore` puts a picked line back */\n const endKeyOrder = (restore: boolean) => {\n if (keyOrder?.kind === \"move\" && restore) {\n if (keyOrder.override === undefined) lineOverrides.delete(keyOrder.id);\n else lineOverrides.set(keyOrder.id, keyOrder.override);\n }\n keyOrder = null;\n };\n\n /** Order entry keys (`orderEntry`); returns whether the key was used */\n const onOrderKey = (event: KeyboardEvent): boolean => {\n const count = n();\n if (\n !options.orderEntry ||\n !count ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey\n )\n return false;\n const l = labels();\n const key = event.key.length === 1 ? event.key.toLowerCase() : event.key;\n const orderText = (side: \"buy\" | \"sell\", value: number) =>\n fill(side === \"buy\" ? l.buyLimit : l.sellLimit, {\n price: formatPrice(value),\n });\n if (key === \"b\" || key === \"s\") {\n endKeyOrder(true);\n const cross = crosshairState();\n const at =\n cross && cross.pane.id === PRICE && finite(cross.price)\n ? cross.price\n : store.close[count - 1];\n const side = key === \"b\" ? \"buy\" : \"sell\";\n keyOrder = { kind: \"create\", side, price: roundPrice(at) };\n say(`${orderText(side, keyOrder.price)}. ${l.orderHint}`);\n return true;\n }\n if (key === \"o\") {\n const lines = keyLines();\n if (!lines.length) return false;\n const current = keyOrder?.kind === \"move\" ? keyOrder.id : null;\n endKeyOrder(true);\n const at = lines.findIndex((line) => line.id === current);\n const step = event.shiftKey ? -1 : 1;\n const next =\n at < 0\n ? step > 0\n ? 0\n : lines.length - 1\n : (at + step + lines.length) % lines.length;\n const line = lines[next];\n if (!line) return false;\n keyOrder = {\n kind: \"move\",\n id: line.id,\n start: linePrice(line),\n override: lineOverrides.get(line.id),\n };\n const name = fill(l.orderLine, {\n title: lineTitle(line),\n price: formatPrice(linePrice(line)),\n });\n say(\n [\n name,\n line.draggable ? l.orderHint : \"\",\n line.cancellable ? l.orderCancelHint : \"\",\n ]\n .filter(Boolean)\n .join(\". \"),\n );\n return true;\n }\n if (!keyOrder) return false;\n const pickedId = keyOrder.kind === \"move\" ? keyOrder.id : null;\n const picked = (options.priceLines ?? []).find(\n (line) => line.id === pickedId,\n );\n switch (event.key) {\n case \"ArrowUp\":\n case \"ArrowDown\": {\n const tick =\n 10 ** -precision() *\n (event.shiftKey ? 10 : 1) *\n (event.key === \"ArrowUp\" ? 1 : -1);\n if (keyOrder.kind === \"create\") {\n keyOrder.price = roundPrice(keyOrder.price + tick);\n say(orderText(keyOrder.side, keyOrder.price));\n } else if (picked?.draggable) {\n const next = roundPrice(linePrice(picked) + tick);\n lineOverrides.set(picked.id, next);\n say(formatPrice(next));\n }\n return true;\n }\n case \"Enter\": {\n if (keyOrder.kind === \"create\") {\n const { price, side } = keyOrder;\n endKeyOrder(false);\n emit(\"orderCreate\", { price, side });\n say(fill(l.orderPlaced, { price: formatPrice(price) }));\n return true;\n }\n const start = keyOrder.start;\n endKeyOrder(false);\n const next = picked ? lineOverrides.get(picked.id) : undefined;\n if (picked && next !== undefined && next !== start) {\n emit(\"orderMove\", {\n id: picked.id,\n price: next,\n previousPrice: start,\n line: picked,\n });\n say(fill(l.orderPlaced, { price: formatPrice(next) }));\n }\n return true;\n }\n case \"Escape\":\n if (keyOrder.kind === \"create\") say(l.orderCancelled);\n else if (picked)\n say(\n fill(l.orderLine, {\n title: lineTitle(picked),\n price: formatPrice(keyOrder.start),\n }),\n );\n endKeyOrder(true);\n return true;\n case \"Delete\":\n case \"Backspace\":\n if (picked?.cancellable) {\n endKeyOrder(true);\n emit(\"orderCancel\", { id: picked.id, line: picked });\n say(l.orderCancelled);\n }\n return true;\n default:\n return false;\n }\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.target === root && onOrderKey(event)) {\n event.preventDefault();\n invalidate();\n return;\n }\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n const key = event.key.toLowerCase();\n if (key === \"z\" || key === \"y\") {\n if (key === \"y\" || event.shiftKey) redo();\n else undo();\n event.preventDefault();\n }\n return;\n }\n const count = n();\n const page = Math.max(1, Math.floor(plotW / spacing / 2));\n const move = (index: number) => {\n keyboardIndex = clamp(index, 0, Math.max(0, count - 1));\n const x = xOf(keyboardIndex);\n if (x < spacing) right += (spacing - x) / spacing + 1;\n if (x > plotW - spacing) right -= (x - plotW + spacing) / spacing - 1;\n clampView();\n announce(keyboardIndex);\n };\n const current = keyboardIndex ?? Math.min(count - 1, Math.round(right));\n switch (event.key) {\n case \"ArrowLeft\":\n move(current - (event.shiftKey ? 10 : 1));\n break;\n case \"ArrowRight\":\n move(current + (event.shiftKey ? 10 : 1));\n break;\n case \"PageUp\":\n move(current - page);\n break;\n case \"PageDown\":\n move(current + page);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(count - 1);\n instance.scrollToRealtime(true);\n break;\n case \"+\":\n case \"=\":\n case \"ArrowUp\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1.2);\n break;\n case \"-\":\n case \"_\":\n case \"ArrowDown\":\n zoomAt(keyboardIndex !== null ? xOf(keyboardIndex) : plotW, 1 / 1.2);\n break;\n case \"Escape\":\n if (paletteOpen) paletteOpen = false;\n else if (replayPicking) endReplay(false);\n else if (draft) {\n draft = null;\n draftClicks = 0;\n } else if (tool !== \"cursor\") setTool(\"cursor\", true);\n else if (selected) select(null);\n else keyboardIndex = null;\n break;\n case \"Delete\":\n case \"Backspace\": {\n const target = drawings.find((d) => d.id === selected);\n if (!target || target.locked) return;\n removeDrawing(target.id);\n break;\n }\n default:\n return;\n }\n event.preventDefault();\n invalidate();\n };\n\n const onFocus = () => {\n let keyboard = true;\n try {\n keyboard = root.matches(\":focus-visible\");\n } catch {\n // older engines: show the ring\n }\n if (keyboard)\n root.style.boxShadow = `inset 0 0 0 2px ${toCss(theme.primary, 0.6)}`;\n };\n const onBlur = () => {\n root.style.boxShadow = \"\";\n if (keyOrder) {\n endKeyOrder(true);\n invalidate();\n }\n if (keyboardIndex !== null) {\n keyboardIndex = null;\n invalidate();\n }\n };\n\n root.addEventListener(\"pointerdown\", onPointerDown);\n root.addEventListener(\"pointermove\", onPointerMove);\n root.addEventListener(\"pointerup\", onPointerUp);\n root.addEventListener(\"pointercancel\", onPointerUp);\n root.addEventListener(\"pointerleave\", onPointerLeave);\n root.addEventListener(\"wheel\", onWheel, { passive: false });\n root.addEventListener(\"dblclick\", onDoubleClick);\n root.addEventListener(\"keydown\", onKeyDown);\n root.addEventListener(\"focus\", onFocus);\n root.addEventListener(\"blur\", onBlur);\n jump.addEventListener(\"pointerdown\", (event) => event.stopPropagation());\n jump.addEventListener(\"click\", () => instance.scrollToRealtime(true));\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(root);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(root);\n if (themeColorsChanged(theme, next)) themeVersion++;\n theme = next;\n legendKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n // the page language, when no `locale` is given\n let langObserver: MutationObserver | null = null;\n if (typeof MutationObserver === \"function\" && root.ownerDocument) {\n langObserver = new MutationObserver(() => {\n if (options.locale) return;\n const before = locale;\n resolveTexts();\n if (locale === before) return;\n legendKey = \"\";\n optionsVersion++;\n applyStatic();\n invalidate();\n });\n langObserver.observe(root.ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: [\"lang\"],\n });\n }\n\n // ----------------------------------------------------- image, full screen\n\n /** Every layer of the chart (and the legends) drawn on one canvas */\n const compose = (): HTMLCanvasElement | null => {\n if (destroyed) return null;\n // a fresh frame: the GPU canvas is read in the same task\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n frameId = 0;\n }\n frame();\n const dpr = win?.devicePixelRatio || 1;\n const canvas = doc.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(width * dpr));\n canvas.height = Math.max(1, Math.round(height * dpr));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.fillStyle = toCss(theme.background);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n try {\n ctx.drawImage(background, 0, 0);\n if (renderer)\n ctx.drawImage(\n renderer.canvas,\n 0,\n 0,\n Math.round(plotW * dpr),\n Math.round(plotH * dpr),\n );\n ctx.drawImage(foreground, 0, 0);\n } catch {\n // a canvas that can't be read (lost context): skipped\n }\n // the legends are DOM text: written at their place\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n const origin = root.getBoundingClientRect();\n const view = win ?? null;\n legends.querySelectorAll(\"span, button\").forEach((element) => {\n const text = element.textContent ?? \"\";\n if (element.children.length || !text.trim() || !view) return;\n const rect = element.getBoundingClientRect();\n const computed = view.getComputedStyle(element);\n ctx.font = `${computed.fontWeight} ${computed.fontSize} ${computed.fontFamily}`;\n ctx.fillStyle = computed.color || toCss(theme.text);\n ctx.textAlign = \"left\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(\n text,\n rect.left - origin.left,\n rect.top - origin.top + rect.height / 2,\n );\n });\n return canvas;\n };\n\n let fullscreen = false;\n const onFullscreen = () => {\n const next = doc.fullscreenElement === root;\n if (next === fullscreen) return;\n fullscreen = next;\n root.style.background = next ? toCss(theme.background) : \"\";\n emit(\"fullscreenChange\", next);\n invalidate();\n };\n doc.addEventListener(\"fullscreenchange\", onFullscreen);\n\n // ------------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => createDataCanvas(doc),\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n geomKey = \"\";\n if (next) {\n root.dataset.renderer = next.kind;\n root.insertBefore(next.canvas, foreground);\n emit(\"renderer\", next.kind);\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ------------------------------------------------------------- options\n\n const applyStatic = () => {\n const symbol = options.symbol ?? \"\";\n root.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? fill(labels().chart, { symbol }).trim(),\n );\n const wantTimer = !!options.countdown && options.lastPriceLine !== false;\n if (wantTimer && !countdownTimer)\n countdownTimer = setInterval(invalidate, 1000);\n if (!wantTimer && countdownTimer) {\n clearInterval(countdownTimer);\n countdownTimer = null;\n }\n };\n\n const applyOptions = (previous: TradingChartOptions | null) => {\n const next = options;\n resolveTexts();\n const nextZone =\n next.timeZone && isTimeZone(next.timeZone) ? next.timeZone : undefined;\n const timeChanged =\n !!previous &&\n (next.utcOffset !== previous.utcOffset || nextZone !== zone);\n zone = nextZone;\n if (!previous || next.indicators !== previous.indicators) rebuildStudies();\n // session periods (VWAP) follow the displayed time\n if (timeChanged) for (const study of studies) studyValid.set(study, 0);\n if (!previous || next.compare !== previous.compare) rebuildCompares();\n if (next.bars && (!previous || next.bars !== previous.bars)) {\n if (replay) endReplay(false);\n if (previous) applyBarsOption(next.bars);\n else replaceBars(next.bars);\n } else if (!next.bars && previous?.bars) {\n if (replay) endReplay(false);\n replaceBars([]);\n }\n if (previous && next.barSpacing !== previous.barSpacing && next.barSpacing)\n spacing = next.barSpacing;\n if (previous && next.scaleMode !== previous.scaleMode) {\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n }\n if (\n next.drawings &&\n next.drawings !== emittedDrawings &&\n (!previous || next.drawings !== previous.drawings)\n ) {\n if (previous) commitDrawings(next.drawings, false);\n else drawings = committed = next.drawings;\n }\n if (\n previous &&\n (next.drawingMode ?? \"cursor\") !== (previous.drawingMode ?? \"cursor\")\n ) {\n setTool(next.drawingMode ?? \"cursor\", false);\n }\n if (previous && next.priceLines !== previous.priceLines) {\n lineOverrides.clear();\n // the picked line is gone, or its new price is the reference now\n if (keyOrder?.kind === \"move\") {\n const id = keyOrder.id;\n const line = keyLines().find((l) => l.id === id);\n keyOrder = line\n ? { kind: \"move\", id, start: line.price, override: undefined }\n : null;\n }\n }\n if (next.orderEntry) root.setAttribute(\"aria-keyshortcuts\", ORDER_KEYS);\n else {\n root.removeAttribute(\"aria-keyshortcuts\");\n if (keyOrder) endKeyOrder(true);\n }\n if (previous && next.chartStyle !== previous.chartStyle)\n haValid = Math.min(haValid, 0);\n optionsVersion++;\n applyStatic();\n invalidate();\n };\n\n applyOptions(null);\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ------------------------------------------------------------------ api\n\n const instance: TradingChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = { ...next };\n applyOptions(previous);\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setBars(bars) {\n if (replay) endReplay(false);\n replaceBars(bars);\n },\n update(bar) {\n if (replay) {\n // the stream goes on behind the replay\n storeUpdate(replay.source, bar);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeUpdate(store, bar);\n if (at < 0) return;\n if (n() > before && follow) right += n() - before;\n afterDataChange(at);\n },\n appendBars(bars) {\n if (replay) {\n storeAppend(replay.source, bars);\n return;\n }\n const before = n();\n const follow = followsRealtime();\n const at = storeAppend(store, bars);\n if (at < 0) return;\n if (follow) right += n() - before;\n afterDataChange(at);\n },\n prependBars(bars) {\n if (replay) storePrepend(replay.source, bars);\n const added = storePrepend(store, bars);\n if (!added) return;\n pyramid = createPyramid();\n haPyramid = createPyramid();\n haValid = 0;\n right += added;\n if (keyboardIndex !== null) keyboardIndex += added;\n afterDataChange(0);\n },\n getBarCount: () => n(),\n getBar: (index) =>\n index >= 0 && index < n() ? readBar(store, Math.floor(index)) : null,\n scrollToRealtime(animateScroll = true) {\n const target = n() - 1 + (options.rightOffset ?? 8);\n kinetic = null;\n if (\n animateScroll &&\n finite(right) &&\n Math.abs(target - right) * spacing < plotW * 6\n ) {\n scrollAnim = {\n from: right,\n to: target,\n start:\n typeof performance !== \"undefined\" ? performance.now() : Date.now(),\n };\n } else {\n right = target;\n }\n invalidate();\n },\n fitContent() {\n const count = n();\n if (!count) return;\n instance.setVisibleRange({\n from: -0.5,\n to: count - 1 + (options.rightOffset ?? 8),\n });\n },\n getVisibleRange: () => visibleRange(),\n setVisibleRange({ from, to }) {\n if (!(to > from)) return;\n kinetic = null;\n scrollAnim = null;\n pendingRange = { from, to };\n applyRange(pendingRange);\n invalidate();\n },\n getVisibleTimeRange() {\n const range = visibleRange();\n return { from: timeAtFrac(range.from), to: timeAtFrac(range.to) };\n },\n setVisibleTimeRange({ from, to }) {\n if (!n() || !(to > from)) return;\n instance.setVisibleRange({\n from: indexAtTimeFrac(from),\n to: indexAtTimeFrac(to),\n });\n },\n setCrosshair(time, price) {\n externalCross =\n time === null || !finite(time) ? null : { time, price: price ?? NaN };\n invalidate();\n },\n setScaleMode(mode) {\n options = { ...options, scaleMode: mode };\n const price = scales.get(PRICE);\n if (price) price.auto = true;\n invalidate();\n },\n resetPriceScales() {\n for (const scale of scales.values()) scale.auto = true;\n invalidate();\n },\n setDrawingTool: (next) => setTool(next, true),\n getDrawingTool: () => tool,\n getDrawings: () => drawings,\n setDrawings(next) {\n commitDrawings(next, false);\n },\n removeDrawing,\n updateDrawing,\n selectDrawing: (id) => select(id),\n undo,\n redo,\n getUndoState: undoState,\n startReplay(time) {\n if (!n() && !replay) return;\n if (time === undefined) {\n if (replay) endReplay(true);\n replayPicking = true;\n emitReplay();\n invalidate();\n return;\n }\n const source = replay ? replay.source : store;\n beginReplay(indexOfTime(source.time, source.length, time));\n },\n replayStep: (count = 1) => replayStepBy(Math.max(1, Math.floor(count))),\n replayPlay: (speed) => playReplay(speed),\n replayPause() {\n if (!replay) return;\n stopReplayTimer();\n emitReplay();\n },\n stopReplay: () => endReplay(true),\n getReplayState: replayState,\n toDataURL(type = \"image/png\", quality) {\n return compose()?.toDataURL(type, quality) ?? \"\";\n },\n toBlob(type = \"image/png\", quality) {\n const canvas = compose();\n return new Promise((resolve) => {\n if (!canvas || typeof canvas.toBlob !== \"function\") resolve(null);\n else canvas.toBlob(resolve, type, quality);\n });\n },\n async requestFullscreen() {\n if (typeof root.requestFullscreen === \"function\")\n await root.requestFullscreen();\n },\n async exitFullscreen() {\n if (\n doc.fullscreenElement === root &&\n typeof doc.exitFullscreen === \"function\"\n )\n await doc.exitFullscreen();\n },\n isFullscreen: () => doc.fullscreenElement === root,\n setIndicatorVisible(id, visible) {\n visibility.set(id, visible);\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n resize: () => invalidate(),\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) listeners.set(type, (set = new Set()));\n set.add(listener as (event: never) => void);\n return () => set.delete(listener as (event: never) => void);\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n if (frameId) {\n if (win?.cancelAnimationFrame) win.cancelAnimationFrame(frameId);\n else clearTimeout(frameId);\n }\n if (countdownTimer) clearInterval(countdownTimer);\n if (replay?.timer) clearInterval(replay.timer);\n doc.removeEventListener(\"fullscreenchange\", onFullscreen);\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n langObserver?.disconnect();\n root.removeEventListener(\"wheel\", onWheel);\n renderer?.destroy();\n renderer = null;\n resolveReady(null);\n listeners.clear();\n root.remove();\n },\n };\n syncHooks.set(instance, {\n setTimeRange(range) {\n silentRange = true;\n instance.setVisibleTimeRange(range);\n },\n });\n return instance;\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAuIA,IAAMK,KAAY,IACZC,KAAW,IACXC,KAAc,IACdC,KAAW,IACXC,IAAQ,SACRC,KAAK,iCACLC,KAAO,gCACPC,KAAU,iCACVC,KAAU,iCACVC,KAAgB,KAGhBC,KAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GACMC,KAA2C;CAAC;CAAS;CAAU;AAAQ,GAMhEC,qBAAY,IAAI,QAG3B,GAEIC,KAAoE;CACxE,OAAO;CACP,UAAU;CACV,YAAY;CACZ,UAAU;CACV,OAAO;AACT,GAEMC,KAAS,GAAW,GAAY,MACpCC,IAAIC,IAAKA,IAAKD,IAAIE,IAAKA,IAAKF,GAGxBG,MAAU,MAAiB;CAC/B,IAAMC,IAAQC,EAAWC,CAAI;CAC7B,OAAOF,KAASG,EAAUH,CAAK,IAAI,KAAM,YAAY;AACvD,GAEMI,IAAS,OAAO,UA6EhBC,KACJ,qFAGIC,KAAyC;CAC7C,UAAU;CACV,UAAU;CACV,UAAU;CACV,cAAc;AAChB,GAEMC,KACJ,qFAEWC,KACX,GACA,IAA+B,CAAC,MACP;CACzB,IAAMC,IAAMC,EAAU,eAChBC,KAAMF,EAAI,aACZG,IAA+B,EAAE,GAAGC,EAAQ,GAC5CC,KAAY,IAIVC,MACJ,GACA,MACGvC,EAAaiC,EAAI,cAAcO,CAAG,GAAGC,CAAK,GAEzCC,IAAOH,GAAK,OAAO;EACvB,UAAU;EACV,OAAO;EACP,QAAQ;EACR,WAAW;EACX,UAAU;EACV,SAAS;EACT,YAAY;EACZ,aAAa;EACb,YAAY;EACZ,OAAO;EACP,QAAQ;CACV,CAAC;CAID,AAHA,EAAK,YAAY,yBACjB,EAAK,WAAW,GAChBG,EAAK,aAAa,QAAQ,QAAQ,GAClCA,EAAK,aAAa,wBAAwB,OAAO;CAEjD,IAAMC,MAAS,MACbJ,GAAKC,GAAK;EACR,UAAU;EACV,MAAM;EACN,KAAK;EACL,eAAe;CACjB,CAAC,GACGI,KAAaD,GAAM,QAAQ,GAC3BE,KAAaF,GAAM,QAAQ;CAEjC,AADAC,GAAW,aAAa,eAAe,MAAM,GAC7CC,GAAW,aAAa,eAAe,MAAM;CAC7C,IAAMC,KAAUH,GAAM,KAAK;CAE3B,AADA,GAAQ,MAAM,QAAQ,KACtB,GAAQ,MAAM,SAAS;CACvB,IAAMI,KAAOR,GAAK,UAAU;EAC1B,UAAU;EACV,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,OAAO;EACP,QAAQ;EACR,SAAS;EACT,cAAc;EACd,QACE;EACF,YAAY;EACZ,OAAO;EACP,WAAW;EACX,QAAQ;CACV,CAAC;CAED,AADA,GAAK,OAAO,UACZ,GAAK,YACH;CACF,IAAMS,KAAOT,GAAK,OAAO;EACvB,UAAU;EACV,OAAO;EACP,QAAQ;EACR,UAAU;EACV,MAAM;EACN,UAAU;EACV,YAAY;CACd,CAAC;CACD,GAAK,aAAa,aAAa,QAAQ;CAEvC,IAAMU,IAAUV,GAAK,OAAO;EAC1B,UAAU;EACV,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACT,cAAc;EACd,QACE;EACF,YAAY;EACZ,WAAW;EACX,QAAQ;EACR,QAAQ;CACV,CAAC;CAED,AADA,EAAQ,YAAY,2BACpBU,EAAQ,aAAa,QAAQ,SAAS;CACtC,IAAMC,IAASX,GAAK,YAAY;EAC9B,UAAU;EACV,SAAS;EACT,UAAU;EACV,WAAW;EACX,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,cAAc;EACd,SAAS;EACT,YAAY;EACZ,OAAO;EACP,MAAM;EACN,WAAW;EACX,QAAQ;CACV,CAAC;CACD,EAAO,OAAO;CACd,IAAMY,KAAQZ,GAAK,SAAS,CAAC,CAAC;CAY9B,AAXA,GAAM,cAAc,4sBACpBG,EAAK,OACHS,IACAP,IACAC,IACAC,IACAC,IACAE,GACAC,GACAF,EACF,GACAd,EAAU,YAAYQ,CAAI;CAI1B,IAAMU,IAAQC,GAAY,GACtBC,KAAUC,GAAc,GAEtBC,KAAkB;EACtB,MAAMJ,EAAM;EACZ,sBAAM,IAAI,aAAc;EACxB,sBAAM,IAAI,aAAc;EACxB,qBAAK,IAAI,aAAc;EACvB,uBAAO,IAAI,aAAc;EACzB,QAAQA,EAAM;CAChB,GACIK,KAAU,GACVC,KAAYH,GAAc,GAC1BI,IAAmB,CAAC,GAClBC,qBAAa,IAAI,IAAmB,GACpCC,qBAAa,IAAI,IAAqB,GAYxCC,KAA6B,CAAC,GAE5BC,qBAAa,IAAI,QAAmC,GAEpDC,qBAAY,IAAI,QAA6B,GAE/CC,KAAc,GAEdC,KAAc,GACdC,KAAoB,GACpBC,KAAoBC,IAIpBC,IAAUlC,EAAQ,cAAc,GAChCmC,IAAQ,KACRC,IAAQ,GACRC,IAAQ,GACRC,KAAQpE,IACRqE,KAAQ,GACRC,KAAS,GACTC,IAAgB,CAAC,GACfC,qBAAS,IAAI,IAAuB,GACpCC,qBAAc,IAAI,IAAoB,GACxCC,KAAsB,MACtBC,KAAmB,GAInBC,IAAoBC,EAAUzC,CAAI,GAClC0C,KAAe,GACfC,KAAiB,GACjBC,IAAiC,MACjCC,KAAgB,GAChBC,KAAU,GACVC,KAAkE,CAAC,GACnEC,KAAU,IACVC,KAAY,IACZC,KAAc,GACdC,IACEC,KAAQ,IAAI,SAAmC,MAAY;EAC/D,KAAeC;CACjB,CAAC,GAEGC,IAA2C,MAC3CC,IAA+B,MAK/BC,IAGO,MACPC,IAA0B,MACxBC,qBAAU,IAAI,IAAsC,GACtDC,KAAsD,MACtDC,KAA2C,MAC3CC,KAAiE,MAEjEC,KAAoD,MAEpDC,IAAsCrE,EAAQ,YAAY,CAAC,GAC3DsE,KAAoD,MAEpDC,KAAuCF,GACrCG,KAA2C,CAAC,GAC5CC,KAA2C,CAAC,GAC9CC,KAAU,eACVC,KAA2B3E,EAAQ,eAAe,UAClD4E,KAA0B,MAC1BC,KAAyB,MACzBC,IAA+B,MAE/BC,KAAc,GACdC,KAAoB3G,GACpB4G,KAAiB,GAEfC,qBAAY,IAAI,IAAiB,GAEnCC,KAAmD,MACnDC,KAAa,IACbC,KAAc,IACZC,qBAAgB,IAAI,IAAoB,GAC1CC,KAA6B,MAE7BC,KAME,CAAC,GACHC,KAAgB,IAChBC,KAAwC,MAExCC,KAAc,IAEdC,KAAwD,MACxDC,KAAgB,IAChBC,KAAe,KACfC,KAAwD,MAExDC,IAKO,MACPC,KAAgB,IAChBC,KAAc,GACdC,KAAgE,MAI9DC,qBAAY,IAAI,IAAyC,GACzDC,KACJ,GACA,MACG;EACH,GACG,IAAIC,CAAI,CAAC,EACR,SAAS,MAAQC,EAA4CC,CAAK,CAAC;CACzE,GAKIC,IAASC,EAAc1G,EAAQ,MAAM,GACrC2G,KAAQC,EAAaC,IAAgBJ,GAAQzG,EAAQ,MAAM,GACzD8G,WAAqB;EAEzB,AADA,IAASJ,EAAc1G,EAAQ,MAAM,GACrC,KAAQ4G,EAAaC,IAAgBJ,GAAQzG,EAAQ,MAAM;CAC7D,GACM+G,WAAeJ,IACfK,UAAUhG,EAAM,QAChBX,WAAcL,EAAQ,cAAc,WACpCiH,WACJjH,EAAQ,oBAAoB,WAC3BA,EAAQ,oBAAoB,UAAUkH,GAAYT,CAAM,GACrDU,WAAcnH,EAAQ,YAAYiH,GAAM,IAAI1I,KAAOD,KACnD8I,WAAgBpH,EAAQ,cAAciH,GAAM,IAAI3I,KAAKC,KACrDoF,MAAW,GAAa,IAAiBb,EAAM,YACnDA,EAAM,UAAUA,EAAM,QAAQuE,GAAKC,CAAQ,IAAIA,GAC3CD,KAAO,GAAe,IAAQ,MAAME,EAAM5D,GAAQ6D,CAAK,GAAGC,CAAK,GAC/DC,WAAkB1H,EAAQ,aAAa+B,IACzC4F,KAAcC,GAAe,GAAG,KAAA,CAAS,GACzCC,KAAiB,IACfC,KAAe,MAAkB;EACrC,IAAI9H,EAAQ,aAAa,OAAOA,EAAQ,YAAYwH,CAAK;EACzD,IAAMO,IAAM,GAAGL,GAAU,EAAE,GAAGjB;EAK9B,OAJIsB,MAAQF,OACV,KAAcD,GAAeF,GAAU,GAAGjB,CAAM,GAChD,KAAiBsB,IAEZJ,GAAYH,CAAK;CAC1B,GACMQ,YAEFhI,EAAQ,cAAc,KAAA,IAElB,OADAiI,GAAejI,EAAQ,SAAS,MAG1B;EACR,MAAM;EACN,OAAOgC;EACP,IAAIA;CACN,GAGEkG,WAAaF,GAAU,CAAC,CAAC,IACzBG,MAAQ,GAAc,IAAS,QACnC,GAAGC,EAAO,GAAGC,EAAK,KAAKvF,EAAM,cAEzBwF,MAAa,MACjB7G,GAAW,IAAI8G,EAAM,EAAE,KAAKA,EAAM,OAAO,WAAW,IAEhDC,KAAO,MAAkBpG,KAASqG,IAAQtG,KAASD,GACnDwG,MAAW,MAAcvG,KAASC,IAAQuG,KAAKzG,GAG/C0G,MAAU,MAAkB;EAChC,IAAMC,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,GAAO,OAAO;EACnB,IAAMC,IAAI,KAAK,MAAML,CAAK;EAG1B,OAFIK,IAAI,IAAU9H,EAAM,KAAK,KAAK8H,IAAIZ,GAAK,IACvCY,KAAKD,IAAc7H,EAAM,KAAK6H,IAAQ,MAAMC,IAAID,IAAQ,KAAKX,GAAK,IAC/DlH,EAAM,KAAK8H;CACpB,GAGMC,MAAc,MAAkB;EACpC,IAAMF,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,GAAO,OAAO;EACnB,IAAMC,IAAI,KAAK,MAAML,CAAK;EAC1B,IAAIK,IAAI,KAAKA,KAAKD,IAAQ,GAAG;GAC3B,IAAMG,IAAOF,IAAI,IAAI,IAAID,IAAQ;GACjC,OAAO7H,EAAM,KAAKgI,MAASP,IAAQO,KAAQd,GAAK;EAClD;EACA,IAAMe,IAAIR,IAAQK;EAClB,OAAO9H,EAAM,KAAK8H,KAAKG,KAAKjI,EAAM,KAAK8H,IAAI,KAAK9H,EAAM,KAAK8H;CAC7D,GAGMI,MAAmB,MAAiB;EACxC,IAAML,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,GAAO,OAAO;EACnB,IAAIM,KAAQnI,EAAM,KAAK6H,IAAQ,IAC7B,OAAOA,IAAQ,KAAKM,IAAOnI,EAAM,KAAK6H,IAAQ,MAAMX,GAAK;EAC3D,IAAIiB,KAAQnI,EAAM,KAAK,IAAI,QAAQmI,IAAOnI,EAAM,KAAK,MAAMkH,GAAK;EAChE,IAAMY,IAAIM,GAAYpI,EAAM,MAAM6H,GAAOM,CAAI,GACvCE,IAAOrI,EAAM,KAAK8H,IAAI,KAAK9H,EAAM,KAAK8H;EAC5C,OAAOA,KAAKO,IAAO,KAAKF,IAAOnI,EAAM,KAAK8H,MAAMO,IAAO;CACzD,GAGIC,IACEC,MAAiB,MACrBvJ,EAAQ,cACPsJ,KACGE,GAAWL,GAAMG,EAAI,IACrB,CAAC,IAAI,KAAK9J,EAAO2J,CAAI,IAAIA,IAAO,CAAC,CAAC,CAAC,kBAAkB,IACrDM,MAA0B,MAASF,GAAcJ,CAAI,GAErDO,MAAS,MAAiBP,IAAOI,GAAcJ,CAAI,IAAIQ,IAGvDC,MAAW,MACfxK,MAAU,OAAO+H,GAAM,IAAI/H,MAAU,SAASgI,GAAQ,IAAIhI,GAGtDyK,MACJ,GACA,GACA,MAMK7K,EAAE,QACO8K,GAAWC,GAAKC,GAAQhD,EAAE,GAAGhI,EAAE,KACtC,IAFc;EAAE,KAAKgL;EAAQ,KAAKA;EAAQ,MAAMA;CAAO,GAI1DC,MAAc,MAAiB;EACnC,IAAIF,IAAMnI,GAAU,IAAI2G,CAAK;EAE7B,OADKwB,KAAKnI,GAAU,IAAI2G,GAAQ,IAAM2B,GAAmB,CAAE,GACpDH;CACT,GACMI,MAAS,MAAqB;EAClC,IAAIJ,IAAMpI,GAAW,IAAIyI,CAAG;EAE5B,OADKL,KAAKpI,GAAW,IAAIyI,GAAM,IAAMF,GAAmB,CAAE,GACnDH;CACT,GAGMM,MAAkB,MAAiB;EACvC,IAAMxB,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,GAAO,OAAO;EACnB,IAAMyB,IAAOtJ,EAAM,KAAK6H,IAAQ;EAGhC,OAFIM,IAAOmB,IAAazB,IAAQ,KAAKM,IAAOmB,KAAQpC,GAAK,IACrDiB,IAAOnI,EAAM,KAAK,MAAYmI,IAAOnI,EAAM,KAAK,MAAMkH,GAAK,IACxDkB,GAAYpI,EAAM,MAAM6H,GAAOM,CAAI;CAC5C,GAGMoB,WAA8BlK,GAAM,MAAM,eAAee,KAAKJ,GAI9DwJ,MAAa,MAAiB;EAClC,KAAK,IAAMjC,KAAShH,GAAS;GAC3B,GAAW,IAAIgH,GAAO,KAAK,IAAI/G,GAAW,IAAI+G,CAAK,KAAK,GAAGkC,CAAI,CAAC;GAChE,KAAK,IAAML,KAAO7B,EAAM,SAAS;IAC/B,IAAMwB,IAAMpI,GAAW,IAAIyI,CAAG;IAC9B,AAAIL,KAAKW,GAAuBX,GAAKU,CAAI;GAC3C;GACA,IAAME,IAAW/I,GAAU,IAAI2G,CAAK;GACpC,AAAIoC,KAAUD,GAAuBC,GAAUF,CAAI;EACrD;EACA,KAAU,KAAK,IAAIpJ,IAASoJ,CAAI;EAChC,KAAK,IAAMG,KAAKlJ,IAEd,AADA,EAAE,QAAQ,KAAK,IAAIkJ,EAAE,OAAOH,CAAI,GAChCC,GAAuBE,EAAE,KAAKH,CAAI;EAEpC,KAAU;EACV,IAAMI,KAAS,MAAsB;GACnC,KAAK,IAAMC,KAAKC,EAAE,QAChB,AAAID,MAAG,EAAE,QAAQ,KAAK,IAAIA,EAAE,OAAO,KAAK,MAAML,IAAOK,EAAE,IAAI,CAAC;EAChE;EAEA,AADAD,EAAM3J,EAAO,GACb2J,EAAMvJ,EAAS;CACjB,GAEM0J,WAAoB;EACxB,IAAMnC,IAAQ7B,EAAE;EAChB,KAAK,IAAMuB,KAAShH,GAAS;GAC3B,IAAM0J,IAAQzJ,GAAW,IAAI+G,CAAK,KAAK;GACvC,AAAI0C,IAAQpC,MACVN,EAAM,QAAQvH,GAAOiK,CAAK,GAC1BzJ,GAAW,IAAI+G,GAAOM,CAAK;EAE/B;EAGA,IAFA,GAAG,OAAO7H,EAAM,MAChB,GAAG,SAASA,EAAM,QACdX,GAAM,MAAM,gBAAgBgB,KAAUwH,GAAO;GAC/C,IAAIzH,GAAG,KAAK,SAASJ,EAAM,UACzB,KAAK,IAAM+G,KAAO;IAAC;IAAQ;IAAQ;IAAO;GAAO,GAAY;IAC3D,IAAMmD,IAAO,IAAI,aAAalK,EAAM,QAAQ;IAE5C,AADAkK,EAAK,IAAI9J,GAAG2G,EAAI,CAAC,SAAS,GAAG1G,EAAO,CAAC,GACrC,GAAG0G,KAAOmD;GACZ;GAWF,AATAC,GACEnK,EAAM,MACNA,EAAM,MACNA,EAAM,KACNA,EAAM,OACN6H,GACAzH,IACAC,EACF,GACA,KAAUwH;EACZ;EACA,KAAK,IAAM+B,KAAKlJ,IACd,IAAI,IAAE,SAASmH,IACf;OAAI+B,EAAE,OAAO,SAAS5J,EAAM,UAAU;IACpC,IAAMkK,IAAO,IAAI,aAAalK,EAAM,QAAQ,CAAC,CAAC,KAAK,GAAG;IAEtD,AADAkK,EAAK,IAAIN,EAAE,OAAO,SAAS,GAAGA,EAAE,KAAK,CAAC,GACtC,EAAE,SAASM;GACb;GACA,KAAK,IAAIpC,IAAI8B,EAAE,OAAO9B,IAAID,GAAO,KAAK;IACpC,IAAMuC,IACJC,GAAeT,EAAE,OAAOA,EAAE,MAAM,QAAQ5J,EAAM,KAAK8H,KAAK,EAAG,IAAI;IACjE,EAAE,OAAOA,KAAKsC,KAAK,IAAIR,EAAE,KAAKQ,KAAK;GACrC;GACA,EAAE,QAAQvC;EANV;CAQJ,GAEMyC,MAAmB,MAAiB;EACxC,GAAUb,CAAI;EACd,IAAM5B,IAAQ7B,EAAE;EAYhB,AAXIyD,IAAO5B,IAAQ,KAAG,MACtB,MACIA,MACF,KAAoB,KAAK,IACvB4B,MAAS,IAAI,IAAI1I,IACjBwJ,GAAgBvK,EAAM,OAAOyJ,GAAM5B,CAAK,GACxC0C,GAAgBvK,EAAM,MAAM,KAAK,IAAIyJ,GAAM5B,IAAQ,EAAE,GAAGA,CAAK,CAC/D,IACI4B,MAAS,KAAK5B,IAAQ,QACxB,KAAoB2C,GAAexK,EAAM,MAAM6H,CAAK,KAExD4C,EAAW;CACb,GAEMC,WAAuB;EAC3B,IAAM,EAAE,SAASR,GAAM,cAAWS,GAChC3L,EAAQ,cAAc,CAAC,GACvBuB,GACAkI,EACF;EACA,KAAK,IAAMlB,KAAShH,GAClB,AAAKqK,EAAO,IAAIrD,CAAK,KAAG/G,GAAW,OAAO+G,CAAK;EACjD,KAAK,IAAMA,KAAS2C,GAAM,AAAKU,EAAO,IAAIrD,CAAK,KAAG/G,GAAW,IAAI+G,GAAO,CAAC;EACzE,IAAU2C;EAEV,KAAK,IAAMW,KAAM,CAAC,GAAGpK,GAAW,KAAK,CAAC,GACpC,AAAKF,EAAQ,MAAM,MAAMuK,EAAE,OAAOD,CAAE,KAAGpK,GAAW,OAAOoK,CAAE;CAC/D,GAEME,WAAwB;EAC5B,MAAY/L,EAAQ,WAAW,CAAC,EAAA,CAAG,KAAK,GAAQ,MAAM;GACpD,IAAMgM,IAAO,CAAC,GAAGC,EAAO,IAAI,CAAC,CAAC,MAAM,GAAG,MAAMC,EAAE,OAAOC,EAAE,IAAI;GAC5D,OAAO;IACL,IAAIF,EAAO,MAAMA,EAAO;IACxB,MAAMA,EAAO;IACb,OAAOA,EAAO,SAASG,IAAatD,IAAI,KAAKsD,GAAY;IACzD,OAAOH,EAAO,aAAa;IAC3B,OAAO,aAAa,KAAKD,IAAO,MAAMK,EAAE,IAAI;IAC5C,MAAM,aAAa,KAAKL,IAAO,MAAMK,EAAE,KAAK;IAC5C,wBAAQ,IAAI,aAAc;IAC1B,OAAO;IACP,KAAKnC,GAAmB;GAC1B;EACF,CAAC;CACH,GAKMoC,WAAwB;EAC5B,IAAMzD,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,KAAS,CAACrJ,EAAO2C,CAAK,GAAG,OAAO;EACrC,IAAMwG,IAAIH,EAAIK,IAAQ,CAAC;EACvB,OAAOF,KAAK,KAAKA,KAAKvG,IAAQF,IAAU;CAC1C,GAEMqK,MAAe,MAA2B;EAK9C,AAJAC,GAASxL,GAAOyL,CAAI,GACpB,KAAUtL,GAAc,GACxB,KAAYA,GAAc,GAC1B,KAAU,GACV,KAAe;EACf,KAAK,IAAMuL,KAAShK,GAAO,OAAO,GAAG,EAAM,OAAO;EAIlD,AAHA,IAAQsE,EAAE,IAAI,KAAKhH,EAAQ,eAAe,IAC1C,KAAU,MACV,KAAa,MACbsL,GAAgB,CAAC;CACnB,GAMMqB,MAAmB,MAA2B;EAClD,IAAM9D,IAAQ7B,EAAE,GACV4F,IAASC,GAAYJ,CAAI;EAC/B,IAAI5D,KAAS,KAAK+D,KAAU/D,GAAO;GACjC,IAAMiE,IAAQC,GAAMN,GAAM,CAAC,CAAC,CAAC,MACvBnC,IAAOtJ,EAAM,KAAK6H,IAAQ;GAChC,IACEiE,MAAU9L,EAAM,KAAK,MACrB+L,GAAMN,GAAM5D,IAAQ,CAAC,CAAC,CAAC,SAAS7H,EAAM,KAAK6H,IAAQ,IACnD;IAEA,IAAMmE,IAASV,GAAgB,GACzBW,IAASpE,GACX4B,IAAO5B;IACX,KAAK,IAAIC,IAAID,IAAQ,GAAGC,IAAI8D,GAAQ,KAAK;KACvC,IAAMM,IAAKrP,GAAYmD,GAAO+L,GAAMN,GAAM3D,CAAC,CAAC;KAC5C,AAAIoE,KAAM,MAAG,IAAO,KAAK,IAAIzC,GAAMyC,CAAE;IACvC;IAEA,AADIF,MAAQ,KAAShG,EAAE,IAAIiG,IACvBxC,IAAOzD,EAAE,KAAGsE,GAAgBb,CAAI;IACpC;GACF;GACA,IAAIsC,GAAMN,GAAMG,IAAS,CAAC,CAAC,CAAC,SAAStC,KAAQsC,IAAS/D,GAAO;IAC3D,IAAMuE,IAAQR,IAAS/D;IAMvB,AALA2D,GAASxL,GAAOyL,CAAI,GACpB,KAAUtL,GAAc,GACxB,KAAYA,GAAc,GAC1B,KAAU,GACV,KAASiM,GACT9B,GAAgB,CAAC;IACjB;GACF;EACF;EACA,GAAYmB,CAAI;CAClB,GAIMY,WAAoB;EACxB,IAAMC,IAAc/L,EAAQ,QAAQ,MAAM,CAACuK,EAAE,OAAO,GAC9CyB,IAAYlL,GACZmL,IAASF,EAAY,KAAK,MAAM3K,GAAY,IAAImJ,EAAE,EAAE,KAAKA,EAAE,MAAM,GACjE2B,IAAQD,EAAO,QAAQ,GAAG,MAAMtB,IAAIC,GAAG,CAAC,GACxCuB,IAAM,KAAK,IAAI,GAAGH,IAAY,GAAI,GAClCI,IAAIF,IAAQC,KAAOD,IAAQ,IAAIC,IAAMD,IAAQ,GAC7CG,IAAUJ,EAAO,KAAK,MAC1B,KAAK,IAAIpP,KAAW,KAAK,IAAI,GAAGuP,IAAI,CAAC,GAAGE,IAAIF,CAAC,CAC/C,GACMG,IAAc,KAAK,IACvB,IACAP,IAAYK,EAAQ,QAAQ,GAAG,MAAM1B,IAAIC,GAAG,CAAC,CAC/C,GACMjB,IAAe,CAAC,GAChB6C,KAAW,GAAY,MAA2B;GACtD,IAAIrB,IAAQhK,GAAO,IAAImJ,CAAE;GASzB,OARKa,MACH,IAAQsB,GAAYC,CAAI,GACxBvL,GAAO,IAAImJ,GAAIa,CAAK,IAElBA,EAAM,SAASuB,MACjB,EAAM,OAAOA,GACb,EAAM,OAAO,KAERvB;EACT,GACMwB,IAAQH,EAAQ1P,GAAO2B,EAAQ,aAAa,QAAQ;EAK1D,AAJA,EAAM,MAAM,GACZ,EAAM,SAAS8N,GACf,EAAM,YAAY,IAClB,EAAM,eAAe,KACrB5C,EAAK,KAAK;GACR,IAAI7M;GACJ,OAAO;GACP,OAAO6P;GACP,KAAK;GACL,QAAQJ;GACR,OAAO,CAAC;GACR,MAAM;EACR,CAAC;EACD,IAAIK,IAAML;EACV,EAAY,SAAS,GAAO,MAAM;GAChC,IAAMpB,IAAQqB,EAAQxF,EAAM,IAAI,QAAQ;GAexC,AAdA,EAAM,MAAM4F,GACZ,EAAM,SAASP,EAAQ9E,IACvB,EAAM,YAAYP,EAAM,SAAS,WAAW,MAAO,KACnD,EAAM,eAAeA,EAAM,SAAS,WAAW,IAAI,IAC/CA,EAAM,UAAO,EAAM,YAAY,EAAM,eAAe,MACxD2C,EAAK,KAAK;IACR,IAAI3C,EAAM;IACV;IACA;IACA;IACA,QAAQqF,EAAQ9E;IAChB,OAAO,CAAC;IACR,MAAM;GACR,CAAC,GACD,KAAO8E,EAAQ9E;EACjB,CAAC;EACD,KAAK,IAAM+C,KAAM,CAAC,GAAGnJ,GAAO,KAAK,CAAC,GAChC,AAAKwI,EAAK,MAAM,MAAMH,EAAE,OAAOc,CAAE,KAAGnJ,GAAO,OAAOmJ,CAAE;EACtD,IAAQX;CACV,GAEMkD,MAAU,MACd3L,EAAM,MAAM,MAAM4L,KAAKtD,EAAE,OAAOsD,IAAItD,EAAE,MAAMA,EAAE,MAAM,KAAK,MAErDuD,WAAkB;EACtB,IAAMzF,IAAQ7B,EAAE,GACVuH,IAAa,KAAK,IAAI,GAAInM,IAAQ,KAAO,KAAK,IAAI,GAAGyG,CAAK,CAAC;EACjE,IAAU9J,EAAMmD,GAAS,KAAK,IAAI,MAAMqM,CAAU,GAAGpQ,EAAW;EAChE,IAAMsO,IAAOrK,IAAQF;EACrB,AAAK1C,EAAO2C,CAAK,MAAG,IAAQ0G,IAAQ,KAAK7I,EAAQ,eAAe;EAChE,IAAMd,IACJ,KAAK,IAAI,GAAG2J,IAAQ,CAAC,IAAI,KAAK,IAAI7I,EAAQ,eAAe,GAAGyM,IAAO,GAAI,GACnExN,IAAK,KAAK,IAAIwN,IAAO,KAAMvN,CAAE;EACnC,IAAQH,EAAMoD,GAAOlD,GAAIC,CAAE;CAC7B,GAEMsP,WAAuC;EAC3C,IAAM3F,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,GAAO,OAAO;EACnB,IAAM4F,IAAOtM,IAAQC,IAAQF,GACvB2I,IAAQ3I,KAAW,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,IAAIA,CAAO,CAAC,GAC3DmG,IAAO,KAAKwC,GACZ6D,IAAMnE,GAAQ,GACdoE,IAAO9D,IACT+D,GACEvO,GAAM,MAAM,eAAeiB,KAAYJ,IACvCwN,GACA7F,GACAgC,CACF,IACA6D,GACEpE,IAAO,KAAK,OAAOzB,IAAQ,KAAKR,CAAI,GACpCwG,IAAK9P,EAAM,KAAK,MAAM0P,CAAI,IAAI,GAAG,GAAG5F,IAAQ,CAAC,GAC7CiG,IAAK/P,EAAM,KAAK,KAAKoD,CAAK,IAAI,GAAG,GAAG0G,IAAQ,CAAC,GAC7CkG,IAAKhQ,EAAM,KAAK,KAAK0P,IAAO,EAAG,GAAG,GAAG5F,IAAQ,CAAC,GAC9CmG,IAAKjQ,EAAM,KAAK,MAAMoD,IAAQ,EAAG,GAAG,GAAG0G,IAAQ,CAAC;EACtD,OAAO;GACL;GACA;GACA;GACA;GACA,IAAI,KAAK,MAAMgG,IAAKxG,CAAI;GACxB,IAAI,KAAK,MAAMyG,IAAKzG,CAAI;GACxB,IAAI,KAAK,MAAM0G,IAAK1G,CAAI;GACxB,IAAI,KAAK,MAAM2G,IAAK3G,CAAI;GACxB;EACF;CACF,GAGM4G,MAAe,GAAY,MAAcC,IAAIlQ,EAAE,QAAQA,EAAE,OAAO,KAAK,GACrEmQ,MAAa,GAAY,MAC7B,KAAK,IAAInQ,EAAE,MAAMgI,EAAE,IAAIkI,IAAIlQ,EAAE,IAAI,GAG7BoQ,WACJrQ,EAAM,KAAK,KAAKoD,IAAQC,IAAQF,IAAU,EAAG,GAAG,GAAG,KAAK,IAAI,GAAG8E,EAAE,IAAI,CAAC,CAAC,GAEnEqI,MAAe,MAAsB;EACzC,IAAMxG,IAAQ7B,EAAE;EAChB,KAAK,IAAI8B,IAAIsG,GAAkB,GAAGtG,IAAID,GAAO,KAAK;GAChD,IAAM7J,IAAI4L,EAAE,OAAO9B;GACnB,IAAItJ,EAAOR,CAAC,KAAKA,MAAM,GAAG,OAAOA;EACnC;EACA,OAAO;CACT,GAGMsQ,MAAiB,GAAkB,GAAe,MACtD5C,EAAM,SAAS,aACVlF,IAAQ+H,IAAO,KAAK,MACrBC,GAAS9C,GAAOlF,CAAK,GAErBiI,WACJzP,EAAQ,iBAAiBuK,GAAQ,CAAC,CAAC,MAAM6E,GAAkB,IAGvDM,MACJ,GACA,GACA,GACA,GACA,MACG;EACH,IAAMC,IAAI9F,GAAY7K,GAAGgL,GAAQD,CAAG,GAC9B6F,IAAS,KAAK,MAAMC,IAAY7Q,EAAE,IAAI,GACtCkN,IAAInN,EAAMC,EAAE,KAAK4Q,GAAQ,GAAG5Q,EAAE,IAAI,GAClCmN,IAAIpN,EAAMC,EAAE,KAAK4Q,GAAQ,GAAG5Q,EAAE,IAAI;EACxC,KAAK,IAAIkQ,IAAIhD,GAAGgD,KAAK/C,GAAG,KAEtB,AADIwD,EAAE,IAAIT,KAAKY,EAAM,OAAI,EAAM,KAAKH,EAAE,IAAIT,KACtCS,EAAE,IAAIT,KAAKY,EAAM,OAAI,EAAM,KAAKH,EAAE,IAAIT;CAE9C,GAOMa,MAAkB,GAAgB,MAA4B;EAClE,IAAI,CAAC/P,EAAQ,6BAA6B,CAACqE,EAAS,QAAQ;EAC5D,IAAMoG,IAAOtI,IAAQC,IAAQF,GACvB8N,IAAUjM,GAAS,SAAS,YAAYA,IAAU;EACxD,KAAK,IAAMkM,KAAW5L,GAAU;GAC9B,KAAK4L,EAAQ,QAAQ5R,OAAW6R,GAAQ;GACxC,IAAM7D,IACJ2D,KAAWA,EAAQ,OAAOC,EAAQ,KAAKD,EAAQ,WAAWC;GAC5D,KAAK,IAAM/B,KAASiC,EAAc9D,GAAGhC,IAAgBI,GAAMtI,CAAK,GAE9D,AADI+L,IAAQ4B,EAAM,OAAI,EAAM,KAAK5B,IAC7BA,IAAQ4B,EAAM,OAAI,EAAM,KAAK5B;EAErC;CACF,GAEMkC,MAAa,MAAsB;EACvC,KAAmB;EACnB,KAAK,IAAMC,KAAQ5N,GAAO;GACxB,IAAMiK,IAAQ2D,EAAK;GACnB,IAAI,CAACrR,GAAG;GACR,IAAIqR,EAAK,OAAOhS,GAAO;IACrB,EAAM,OAAO2C,EAAM,MAAMoO,GAAkB,MAAM;IACjD,IAAM,EAAE,YAASpQ,GACX8M,IAAIzL,GAAM,GACViQ,IAAYxE,MAAM,UAAUA,MAAM,UAAUA,MAAM,YAClDgE,IAA0B,CAAC,UAAU,SAAS;IACpD,KAAK,IAAIZ,IAAIlQ,EAAE,IAAIkQ,KAAKlQ,EAAE,IAAI,KAAK;KACjC,IAAM8L,IAAIwF,IAAY3B,EAAK,MAAMO,KAAKP,EAAK,IAAIO,IACzCrB,IAAIyC,IAAY3B,EAAK,MAAMO,KAAKP,EAAK,KAAKO;KAEhD,AADIpE,IAAIgF,EAAM,OAAI,EAAM,KAAKhF,IACzB+C,IAAIiC,EAAM,OAAI,EAAM,KAAKjC;IAC/B;IACA,KAAK,IAAMtF,KAAShH,GAClB,IAAKgH,EAAM,WAAYD,GAAUC,CAAK,GACtC;SAAIA,EAAM,SAAS,UAAU;MAC3B,KAAK,IAAI2G,IAAIlQ,EAAE,IAAIkQ,KAAKlQ,EAAE,IAAI,KAAK;OACjC,IAAMuR,IAAM5B,EAAK,OAAOO,KAAKC,GAAUnQ,GAAGkQ,CAAC;OAC3C,AAAIqB,IAAM1N,OAAkB,KAAmB0N;MACjD;MACA;KACF;KACA,KAAK,IAAMnG,KAAO7B,EAAM,SACtB,GAAavJ,GAAGoL,EAAI,QAAQD,GAAMC,CAAG,GAAGA,EAAI,OAAO0F,CAAK;IAF1D;IAIF,GAAezR,GAAOyR,CAAK;IAC3B,IAAI,CAAC7Q,GAAIC,KAAM4Q;IACf,IAAIhE,MAAM,YAAY;KACpB,IAAMK,IAAIsD,GAAc;KAExB,AADItD,IAAIlN,MAAI,IAAKkN,IACbA,IAAIjN,MAAI,IAAKiN;IACnB;IACA,IAAI,CAACO,EAAM,MAAM;IACjB,IAAIR,IAAIsD,GAAS9C,GAAOzN,CAAE,GACtBkN,IAAIqD,GAAS9C,GAAOxN,CAAE;IAC1B,AAAIwN,EAAM,SAAS,SAAS,EAAEzN,IAAK,OACjC,IAAIuQ,GAAS9C,GAAO,KAAK,IAAIxN,IAAK,MAAM,KAAK,CAAC;IAChD,KAAK,IAAM0L,KAAKlJ,IAAU;KACxB,IAAM6N,IAAOF,GAAYzE,CAAC,GACpB4F,IAA2B,CAAC,UAAU,SAAS;KACrD,GAAaxR,GAAG4L,EAAE,QAAQA,EAAE,KAAK,GAAG4F,CAAM;KAC1C,KAAK,IAAMhJ,KAASgJ,GAAQ;MAC1B,IAAMC,IAASnB,GAAc5C,GAAOlF,GAAO+H,CAAI;MAE/C,AADIkB,IAASvE,MAAG,IAAIuE,IAChBA,IAAStE,MAAG,IAAIsE;KACtB;IACF;IAMA,AALI/D,EAAM,SAAS,aAAahL,GAAS,WAEvC,IAAI,KAAK,IAAIwK,GAAG,CAAC,GACjB,IAAI,KAAK,IAAIC,GAAG,CAAC,IAEnBuE,GAAShE,GAAOR,GAAGC,CAAC;IACpB;GACF;GACA,IAAM5D,IAAQ8H,EAAK;GACnB,IAAI,CAAC9H,KAAS,CAACmE,EAAM,MAAM;GAC3B,IAAInE,EAAM,OAAO;IACf,GAASmE,GAAOnE,EAAM,MAAM,IAAIA,EAAM,MAAM,EAAE;IAC9C;GACF;GACA,IAAMuH,IAA0B,CAAC,UAAU,SAAS;GACpD,AAAIvH,EAAM,SAAS,aAAU,EAAM,KAAK;GACxC,KAAK,IAAM6B,KAAO7B,EAAM,SAAS;IAC/B,IAAI6B,EAAI,SAAS,UAAU;KACzB,KAAK,IAAI8E,IAAIlQ,EAAE,IAAIkQ,KAAKlQ,EAAE,IAAI,KAAK;MACjC,IAAMwI,IAAQxI,EAAE,KAAK,OAAOkQ,KAAKC,GAAUnQ,GAAGkQ,CAAC;MAC/C,AAAI1H,IAAQsI,EAAM,OAAI,EAAM,KAAKtI;KACnC;KACA;IACF;IACA,GAAaxI,GAAGoL,EAAI,QAAQD,GAAMC,CAAG,GAAGA,EAAI,OAAO0F,CAAK;GAC1D;GACA,GAAeO,EAAK,IAAIP,CAAK;GAC7B,IAAI,CAAC7Q,GAAIC,KAAM4Q;GACf,IAAIvH,EAAM,SAAS/I,EAAOP,CAAE,KAAKO,EAAON,CAAE,GAExC,KAAK,IAAMyR,KAAQpI,EAAM,OAEvB,AADA,IAAK,KAAK,IAAItJ,GAAI0R,CAAI,GACtB,IAAK,KAAK,IAAIzR,GAAIyR,CAAI;GAO1B,AAJIpI,EAAM,QAAQ/I,EAAOP,CAAE,KAAKO,EAAON,CAAE,MACvC,IAAK,KAAK,IAAID,GAAI,CAAC,GACnB,IAAK,KAAK,IAAIC,GAAI,CAAC,IAErBwR,GAAShE,GAAOzN,GAAIC,CAAE;EACxB;CACF,GAUM0R,MACJ,GACA,MACgB;EAChB,IAAM/H,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,KAAS,CAAC7J,GAAG,OAAO,CAAC;EAC1B,IAAM6R,IAAK3I,GAAK,GACV4I,IAAWD,IAAK5O,IAEhB8O,IAAO,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,KAAK5O,CAAK,CAAC,IAAInD,EAAE,IAAI,GACxDgS,KAAa,MACb9B,KAAKlQ,EAAE,OAAaA,EAAE,KAAK,KAAKkQ,KAC7BlO,EAAM,KAAK6H,IAAQ,MAAMqG,IAAIlQ,EAAE,QAAQ6J,IAAQ,MAAMgI,GAExDI,IAA4D,CAAC,GAC/DC,IAAOlS,EAAE,KAAK,IAAI0K,GAAMsH,EAAUhS,EAAE,KAAK,CAAC,CAAC,IAAI;EACnD,KAAK,IAAIkQ,IAAIlQ,EAAE,IAAIkQ,KAAK6B,GAAM,KAAK;GACjC,IAAM5H,IAAOO,GAAMsH,EAAU9B,CAAC,CAAC,GACzBvG,IAAIH,EAAIyG,GAAYjQ,GAAGkQ,CAAC,CAAC,GACzB9G,IAAS+I,GAAeD,GAAM/H,CAAI;GAIxC,AAFIR,KAAK,OAAOA,KAAKvG,IAAQ,MAAMgG,IAAS,MAC1C6I,EAAW,KAAK;IAAE;IAAG;IAAQ;GAAK,CAAC,GACrC,IAAO9H;EACT;EACA,EAAI,OAAOhB,GAAKrF,EAAM,QAAQ;EAC9B,IAAMsO,IAASN,IAAW,UAAU,UAC9BO,IACJ,KAAK,IAAIC,EAAI,YAAYF,CAAM,CAAC,CAAC,OAAOE,EAAI,YAAY,MAAM,CAAC,CAAC,KAAK,IACrE;EACF,OAAOC,GAAUN,GAAYI,CAAG,CAAC,CAC9B,QAAQ,MAAMpI,EAAE,IAAI,KAAKA,EAAE,IAAI7G,IAAQ,CAAC,CAAC,CACzC,KAAK,OAAO;GACX,GAAG6G,EAAE;GACL,MAAMuI,GAASvI,EAAE,MAAMA,EAAE,QAAQxC,GAAQqK,CAAQ;GACjD,MAAM7H,EAAE,WAAW6H,IAAW,KAAK;EACrC,EAAE;CACN,GAEMW,MAAgB,GAAY,MAC5BpB,EAAK,OAAOhS,IACVgS,EAAK,MAAM,SAAS,YACfqB,GACLjB,GACAhK,GACA,KAAK,IAAI,GAAGkL,EAAatB,EAAK,IAAI,CAAC,CACrC,IACKvI,EAAY8J,GAAWvB,EAAK,OAAOI,CAAM,CAAC,IAE/CJ,EAAK,OAAO,UAAgBwB,GAAapB,GAAQhK,CAAM,IACpDqL,GAAYrB,GAAQ,KAAK,IAAI,GAAGkB,EAAatB,EAAK,IAAI,CAAC,GAAG5J,CAAM,GAInEsL,MAAkB,GAAc,MAChCxJ,EAAM,WAAWA,EAAM,SAAS,WAAiBT,EAAYN,CAAK,IAClEe,EAAM,UAAgBsJ,GAAarK,GAAOf,CAAM,IAC7CqL,GACLtK,GACAe,EAAM,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGb,GAAU,CAAC,CAAC,GACtDjB,CACF,GAKIuL,MAAgB,GAAY,MAAyB;EACzD,IAAMC,IAAkB,CAAC,GACnBtD,IAAO3P,EAAE,MACTkT,IAAKvO,GAAQwD,GAAM,CAAC,GACpBgL,IAAOxO,GAAQyD,GAAQ,CAAC,GACxBgL,IAAMC,EAAUH,CAAE,GAClBI,IAAQD,EAAUF,CAAI,GACtBI,IAAKzP,EAAM,YACX0P,IAAUC,GAAcvQ,IAAUlD,EAAE,OAAO0T,GAAKA,CAAG,GACnDC,KAAK,MAAcnK,EAAIyG,GAAYjQ,GAAGkQ,CAAC,CAAC,IAAIwD,GAC5C5G,IAAIzL,GAAM,GAEVuS,IAAgB,KAAK,IAAI,IAAKJ,EAAQ,OAAO,CAAC,GAC9CK,IAAe;GACnB,IAAIR,EAAU;IAACH,EAAG;IAAIA,EAAG;IAAIA,EAAG;IAAI;GAAG,CAAC;GACxC,MAAMG,EAAU;IAACF,EAAK;IAAIA,EAAK;IAAIA,EAAK;IAAI;GAAG,CAAC;EAClD;EAEA,KAAK,IAAM9B,KAAQ5N,GAAO;GACxB,IAAM0L,IAAMkC,EAAK,MAAMqC,GACjBI,KAAUzC,EAAK,MAAMA,EAAK,UAAUqC,GACpChG,IAAQ2D,EAAK,OACb0C,KAAK,MAAkBC,EAAItG,GAAOlF,CAAK,IAAIkL,GAE3CO,MAEF,GACA,GACA,GACA,IAAiCF,OAElC,GAAI,GAAI,MAAW;IAClB,IAAMG,IAAS,IAAIC,GAAWhF,GAAK2E,CAAM;IACzC,KAAK,IAAI5D,IAAIkE,IAAS,KAAK,IAAIpU,EAAE,IAAIqU,IAAK,CAAC,IAAIA,GAAInE,KAAKoE,GAAI,KAC1D,EAAO,KAAKX,EAAEzD,CAAC,GAAGqE,EAAIvJ,EAAOkF,CAAC,CAAC,CAAC;IAClC,OAAOgE,EAAO,QAAQ,IAAI,CAACA,EAAO,KAAK,IAAI,GAAG9T,GAAOoU,CAAS,CAAC,IAAI,CAAC;GACtE,GAOIC,MAEF,GACA,GACA,GACA,GACA,IAAY,GACZ,IAAiCV,OAElC,GAAI,GAAI,MAAW;IAClB,IAAMpD,IAAI9F,GAAY7K,GAAGgL,GAAQD,CAAG,GAC9B2J,IAAK7D,IAAY3N,IAAUwQ,GAC3BiB,IAAQ,KAAK,KAAK,KAAK,IAAI9D,CAAS,IAAI7Q,EAAE,IAAI,IAAI,GACpDyL,IAAO2I,IAAS,KAAK,IAAI,GAAGC,IAAK,CAAC,IAAIA,GACtCO,IAAKN;IAET,AADI,CAACF,KAAUvD,IAAY,MAAG,IAAO,KAAK,IAAI,GAAGpF,IAAOkJ,CAAK,IACzD,CAACP,KAAUvD,IAAY,MAAG,IAAK,KAAK,IAAI7Q,EAAE,OAAO,GAAG4U,IAAKD,CAAK;IAClE,IAAMT,IAAS,IAAIC,GAAWhF,GAAK2E,CAAM,GACrCe,IAAQ;IACZ,KAAK,IAAI3E,IAAIzE,GAAMyE,KAAK0E,GAAI,KAAK;KAC/B,IAAMjL,IAAIgK,EAAEzD,CAAC,IAAIwE,GACXzU,IAAK0Q,EAAE,IAAIT,IACXhQ,IAAKyQ,EAAE,IAAIT;KACjB,IAAI,CAAClQ,EAAE,SAASC,MAAOC,KAAM,CAACM,EAAOP,CAAE,KAAK,CAACO,EAAON,CAAE,GAAG;MAEvD,AADA,IAAQqU,EAAI5D,EAAE,KAAKT,EAAE,GACrBgE,EAAO,KAAKvK,GAAGkL,CAAK;MACpB;KACF;KACA,IAAMC,IAAMP,EAAItU,CAAE,GACZ8U,IAAMR,EAAIrU,CAAE,GAEZ4N,IACJtN,EAAOqU,CAAK,KAAK,KAAK,IAAIA,IAAQE,CAAG,IAAI,KAAK,IAAIF,IAAQC,CAAG,IACzDC,IACAD,GACAE,IAASlH,MAAUiH,IAAMD,IAAMC;KAGrC,AAFAb,EAAO,KAAKvK,GAAGmE,CAAK,GACpBoG,EAAO,KAAKvK,GAAGqL,CAAM,GACrB,IAAQA;IACV;IACA,OAAOd,EAAO,QAAQ,IAAI,CAACA,EAAO,KAAK,IAAI,GAAG9T,GAAOoU,CAAS,CAAC,IAAI,CAAC;GACtE,GAOIS,MAEF,GACA,GACA,GACA,GACA,OAED,GAAI,GAAI,MAAW;IAClB,IAAMtE,IAAI9F,GAAY7K,GAAGkV,EAAM,OAAOnK,CAAG,GACnClB,IAAQ7B,EAAE,GACVmN,IAAO,IAAIC,GAAYjG,GAAK2E,CAAM,GACpCe,IAAQ;IACZ,KAAK,IAAI3E,IAAIkE,IAAS,KAAK,IAAI,GAAGC,IAAK,CAAC,IAAIA,GAAInE,KAAKoE,GAAI,KAAK;KAC5D,IAAMrU,IAAK0Q,EAAE,IAAIT,IACXhQ,IAAKyQ,EAAE,IAAIT;KACjB,IAAI,CAAC1P,EAAOP,CAAE,KAAK,CAACO,EAAON,CAAE,GAAG;MAE9B,AADAiV,EAAK,MAAM,GACX,IAAQ;MACR;KACF;KACA,IAAMjC,IACJgC,EAAM,UAAU,KAAK,IAAIrL,IAAQ,GAAGqG,IAAIlQ,EAAE,OAAOA,EAAE,OAAO,CAAC,OAC3D,IACI2J,IAAIgK,EAAEzD,CAAC,GACP4E,IAAMf,EAAE9T,CAAE,GACV8U,IAAMhB,EAAE7T,CAAE,GAEV4N,IACJtN,EAAOqU,CAAK,KAAK,KAAK,IAAIA,IAAQE,CAAG,IAAI,KAAK,IAAIF,IAAQC,CAAG,IACzDC,IACAD,GACAE,IAASlH,MAAUiH,IAAMD,IAAMC;KAGrC,AAFAI,EAAK,KAAKxL,GAAGmE,GAAOoF,CAAE,GAClB8B,MAAWlH,KAAOqH,EAAK,KAAKxL,GAAGqL,GAAQ9B,CAAE,GAC7C,IAAQ8B;IACV;IAGA,IAAMK,IAAa;KAAC9B,EAAG;KAAIA,EAAG;KAAIA,EAAG;KAAI;IAAG,GACtC+B,IAAsB,CAAC;IAC7B,KAAK,IAAM,CAACpB,GAAQnL,MAAQ,CAC1B,CAACoM,EAAK,IAAI,GAAG,GACb,CAACA,EAAK,MAAM,GAAG,CACjB,GACE,AAAIjB,EAAO,QAAQ,KACjBoB,EAAM,KAAKpB,EAAO,KAAK,GAAGnL,EAAI,IAAI,GAAGsM,GAAMb,IAAY,GAAG,CAAC;IAM/D,OAJIW,EAAK,GAAG,QAAQ,KAClBG,EAAM,KAAKH,EAAK,GAAG,KAAK,KAAK,GAAGI,GAASf,CAAS,CAAC,GACjDW,EAAK,KAAK,QAAQ,KACpBG,EAAM,KAAKH,EAAK,KAAK,KAAK,KAAK,GAAGK,GAAWhB,CAAS,CAAC,GAClDc;GACT;GAEF,IAAIjE,EAAK,OAAOhS,GAAO;IAKrB,IAHoBkD,EAAQ,MACzB,MAAOkT,EAAG,WAAWA,EAAG,SAAS,YAAYnM,GAAUmM,CAAE,CAExD,KAAe5R,KAAmB,GAAG;KACvC,IAAMgL,KAAKiF,IAAS3E,KAAO;KAC3B,EAAO,MAAM,GAAI,MAAO;MACtB,IAAM+E,IAAS,IAAIwB,GAAU;MAC7B,KAAK,IAAIxF,IAAImE,GAAInE,KAAKoE,GAAI,KAAK;OAC7B,IAAM/C,IAAM5B,EAAK,OAAOO,KAAKC,GAAUnQ,GAAGkQ,CAAC;OAC3C,IAAI,EAAEqB,IAAM,IAAI;OAChB,IAAMlC,IAAIyE,IAAUvC,IAAM1N,KAAoBgL,GACxC,CAAC3B,GAAGC,KAAKwI,GAAWtG,GAAGyE,CAAM;OACnC,EAAO,KACLN,EAAQ,KAAKG,EAAEzD,CAAC,CAAC,GACjBhD,GACAC,GACAwC,EAAK,MAAMO,MAAMP,EAAK,KAAKO,KACvB2D,EAAa,KACbA,EAAa,IACnB;MACF;MACA,OAAO,CAACK,EAAO,KAAK,IAAI,GAAGN,CAAa,CAAC;KAC3C,CAAC;IACH;IAEA,KAAK,IAAMhI,KAAKlJ,IAAU;KACxB,IAAM6N,IAAOF,GAAYzE,CAAC,GACpBxL,IAAQuE,GAAQiH,EAAE,KAAK;KAC7B,EAAO,KACL6I,GACE7I,EAAE,QACFA,EAAE,KACFxL,GACAwL,EAAE,OACF,IACC,MACCgK,GAAUlI,GAAO4C,GAAc5C,GAAOlF,GAAO+H,CAAI,CAAC,IAAImD,CAC1D,CACF;IACF;IAEA,IAAI5G,MAAM,UAAUA,MAAM,UAAUA,MAAM,YAAY;KACpD,IAAM+I,IAAYlR,GAAQlF,EAAO;KASjC,IARIqN,MAAM,UACRmG,EAAO,MAAM,GAAI,GAAI,MAAW;MAC9B,IAAM6C,IAAO,IAAIC,GAAW5G,GAAK2E,CAAM;MACvC,KAAK,IAAI5D,IAAIkE,IAAS,KAAK,IAAIpU,EAAE,IAAIqU,IAAK,CAAC,IAAIA,GAAInE,KAAKoE,GAAI,KAC1D,EAAK,KAAKX,EAAEzD,CAAC,GAAG6D,EAAEpE,EAAK,MAAMO,EAAE,GAAG4D,CAAM;MAC1C,OAAOgC,EAAK,QAAQ,IAAI,CAACA,EAAK,KAAK,IAAI,GAAGD,GAAW,GAAI,CAAC,IAAI,CAAC;KACjE,CAAC,GAEC/I,MAAM,YAAY;MACpB,IAAMkJ,IAAKjC,EAAEtD,GAAc,CAAC;MAC5B,EAAO,MAAM,GAAI,GAAI,MAAW;OAC9B,IAAMwF,IAAS,IAAIF,GAAW5G,GAAK2E,CAAM,GACnCoC,IAAW,IAAIH,GAAW5G,GAAK2E,CAAM,GACrCqC,IAAS,IAAIhC,GAAWhF,GAAK2E,CAAM,GACnCsC,IAAW,IAAIjC,GAAWhF,GAAK2E,CAAM,GACvCuC,IAAK,KACLC,IAAK,KACHC,KAAS,GAAW,MAAc;QAKtC,AAJAN,EAAO,KAAKtM,GAAG,KAAK,IAAI0F,GAAG2G,CAAE,GAAGA,CAAE,GAClCE,EAAS,KAAKvM,GAAG,KAAK,IAAI0F,GAAG2G,CAAE,GAAGA,CAAE,GAChC3G,KAAK2G,IAAIG,EAAO,KAAKxM,GAAG0F,CAAC,IACxB8G,EAAO,MAAM,GACd9G,KAAK2G,IAAII,EAAS,KAAKzM,GAAG0F,CAAC,IAC1B+G,EAAS,MAAM;OACtB;OACA,KAAK,IAAIlG,IAAIkE,IAAS,KAAK,IAAIpU,EAAE,IAAIqU,IAAK,CAAC,IAAIA,GAAInE,KAAKoE,GAAI,KAAK;QAC/D,IAAM3K,IAAIgK,EAAEzD,CAAC,GACPb,IAAI0E,EAAEpE,EAAK,MAAMO,EAAE;QACzB,IAAI1P,EAAO8V,CAAE,MAAMA,IAAKN,MAAO3G,IAAI2G,KAAM,GAAG;SAC1C,IAAM/L,KAAK+L,IAAKM,MAAOjH,IAAIiH;SAC3B,EAAMD,KAAM1M,IAAI0M,KAAMpM,GAAG+L,CAAE;QAC7B;QAGA,AAFAO,EAAM5M,GAAG0F,CAAC,GACV,IAAK1F,GACL,IAAK0F;OACP;OACA,IAAMjE,IAAoB,CAAC;OAQ3B,OAPI6K,EAAO,QAAQ,KACjB7K,EAAI,KACF6K,EAAO,KAAK,KAAK,GAAG/C,GAAI,GAAI,GAC5BgD,EAAS,KAAK,KAAK,GAAG/C,GAAM,GAAI,CAClC,GACEgD,EAAO,QAAQ,KAAG/K,EAAI,KAAK+K,EAAO,KAAK,MAAM,GAAGjD,GAAI,CAAC,CAAC,GACtDkD,EAAS,QAAQ,KAAGhL,EAAI,KAAKgL,EAAS,KAAK,MAAM,GAAGjD,GAAM,CAAC,CAAC,GACzD/H;MACT,CAAC;KACH,OACE,EAAO,KAAK6I,IAAW,MAAMtE,EAAK,MAAMO,IAAI2F,GAAW,CAAC,CAAC;IAE7D,OAAO;KACL,IAAMW,IAAS1J,MAAM,iBACf2J,IAAO3J,MAAM,QACb4J,IAAOlD,EAAQ,MACfmD,IAAOnD,EAAQ;KACrB,EAAO,MAAM,GAAI,MAAO;MACtB,IAAMoD,IAAQ,IAAIlB,GAAU,GACtBmB,IAAS,IAAInB,GAAU,GACvBoB,IAAO,IAAIpB,GAAU,GACrBqB,IAAQ,IAAIrB,GAAU,GACtBsB,IAAO,KAAK,IAAIN,GAAM,KAAK,OAAOC,IAAOD,KAAQ,CAAC,CAAC;MACzD,KAAK,IAAI,IAAIrC,GAAI,KAAKC,GAAI,KAAK;OAC7B,IAAM2C,IAAItH,EAAK,KAAK,IACdd,IAAIc,EAAK,KAAK,IACd7D,IAAI6D,EAAK,IAAI,IACb/D,KAAI+D,EAAK,MAAM;OACrB,IAAI,CAACnP,EAAOyW,CAAC,KAAK,CAACzW,EAAOoL,EAAC,GAAG;OAI9B,IAAMxL,MAHSoW,IACX5K,OAAM,IAAI,IAAI+D,EAAK,MAAM,IAAI,KAAKsH,KAClCrL,MAAKqL,KACc7D,IAAME,GACvB4D,KAAK1D,EAAQ,KAAKG,EAAE,CAAC,CAAC,GACtB,CAACwD,IAAIC,MAAMzB,GAAW5B,EAAElF,CAAC,GAAGkF,EAAEjI,CAAC,CAAC;OACtC,IAAI2K,GAAM;QACR,IAAM3F,IAAQuG,GAAWF,IAAIC,IAAIjI,GAAK2E,CAAM;QAC5C,AAAIhD,KAAO8F,EAAM,KAAKM,IAAIpG,EAAM,IAAIA,EAAM,IAAI1Q,EAAK;QACnD,KAAK,IAAM,CAACoI,GAAO8O,MAAS,CAC1B,CAACL,GAAG,EAAE,GACN,CAACrL,IAAG,CAAC,CACP,GAAY;SACV,IAAMyD,IAAI,KAAK,MAAM0E,EAAEvL,CAAK,IAAIkO,IAAO,CAAC;SACxC,AAAIrH,IAAIF,KAAOE,IAAIqH,IAAO5C,KAC1BiD,EAAM,KACJG,KAAKI,KAAQZ,IAAO,IAAIM,IAAO,IAC/B3H,GACAA,IAAIqH,GACJtW,EACF;QACF;QACA;OACF;OACA,IAAM,CAACmX,IAAIC,MAAM7B,GAAW5B,EAAEkD,CAAC,GAAGlD,EAAEnI,EAAC,CAAC;OACtC,IAAI+K,KAAQD,GAAM;QAChB,IAAM5F,IAAQuG,GAAWF,IAAIC,IAAIjI,GAAK2E,CAAM;QAC5C,AAAIhD,KAAO8F,EAAM,KAAKM,IAAIpG,EAAM,IAAIA,EAAM,IAAI1Q,EAAK;QACnD;OACF;OACA,IAAIoW,KAAU5K,KAAIqL,GAAG;QACnB,IAAMQ,IAA+B,CACnC,CAACN,IAAII,EAAE,GACP,CAACC,IAAIJ,EAAE,CACT;QACA,KAAK,IAAM,CAAClK,GAAGC,MAAMsK,GAAU;SAC7B,IAAM3G,IAAQ3D,IAAID,IAAImK,GAAWnK,GAAGC,GAAGgC,GAAK2E,CAAM,IAAI;SACtD,AAAIhD,KAAO8F,EAAM,KAAKM,IAAIpG,EAAM,IAAIA,EAAM,IAAI1Q,EAAK;QACrD;QACA,IAAMsX,IAAQL,GAAWE,IAAIC,IAAIrI,GAAK2E,CAAM;QAC5C,AAAI4D,MACFd,EAAM,KACJM,KAAKP,IAAO,IAAID,IAAO,GACvBgB,EAAM,IACNA,EAAM,IACNtX,EACF,GACAwW,EAAM,KACJM,KAAKP,IAAO,IAAID,IAAO,GACvBgB,EAAM,IACNA,EAAM,IACNtX,EACF;QAEF,KAAK,IAAMiP,KAAK,CAACkI,IAAIC,KAAKd,CAAI,GAC5B,AAAIrH,KAAKF,KAAOE,IAAIqH,KAAQ5C,KAC1BgD,EAAK,KAAKI,IAAI7H,GAAGA,IAAIqH,GAAMtW,EAAK;QAEpC;OACF;OACA,IAAM0Q,KAAQuG,GAAWF,IAAIC,IAAIjI,GAAK2E,CAAM;OAC5C,AAAIhD,MAAO8F,EAAM,KAAKM,IAAIpG,GAAM,IAAIA,GAAM,IAAI1Q,EAAK;OACnD,IAAMuX,KAAMN,GAAWE,IAAIC,IAAIrI,GAAK2E,CAAM;OAC1C,AAAI6D,MAAKd,EAAO,KAAKK,IAAIS,GAAI,IAAIA,GAAI,IAAIvX,EAAK;MAChD;MACA,IAAMkV,IAAsB,CAACsB,EAAM,KAAK,KAAK,GAAGF,IAAO,CAAC,CAAC;MAIzD,OAHIG,EAAO,SAAOvB,EAAM,KAAKuB,EAAO,KAAK,KAAK,GAAGF,IAAO,CAAC,CAAC,GACtDG,EAAK,SAAOxB,EAAM,KAAKwB,EAAK,KAAK,KAAK,GAAGH,IAAO,CAAC,CAAC,GAClDI,EAAM,SAAOzB,EAAM,KAAKyB,EAAM,KAAK,KAAK,GAAGC,IAAO,CAAC,CAAC,GACjD1B;KACT,CAAC;IACH;GACF;GAGA,IAAMhH,KACJ+C,EAAK,OAAOhS,IACRkD,EAAQ,QAAQ,MAAOkT,EAAG,WAAWA,EAAG,SAAS,QAAQ,IACzDpE,EAAK,QACH,CAACA,EAAK,KAAK,IACX,CAAC;GACT,KAAK,IAAM9H,KAAS+E,IAAa;IAC/B,IAAI,CAAChF,GAAUC,CAAK,GAAG;IACvB,IAAM2L,IAAQ3L,EAAM,OACd,CAACqO,GAAOC,MAAWtO,EAAM;IAC/B,IAAI2L,KAASlV,EAAE,SAAS4X,KAASC,IAAS;KACxC,EAAO,KACL5C,GACEC,GACAjK,GAAW1B,CAAK,GAChB5E,GAAQiG,GAAQgN,EAAM,KAAK,CAAC,GAC5BjT,GAAQiG,GAAQiN,GAAQ,KAAK,CAAC,GAC9BD,EAAM,KACR,CACF;KACA;IACF;IACA,KAAK,IAAMxM,KAAO7B,EAAM,SACtB,IAAI6B,EAAI,SAAS,UAAU;KACzB,IAAM0M,IAAK/D,EAAE,CAAC;KACd,EAAO,MAAM,GAAI,MAAO;MACtB,IAAMG,IAAS,IAAIwB,GAAU;MAC7B,KAAK,IAAIxF,IAAImE,GAAInE,KAAKoE,GAAI,KAAK;OAC7B,IAAM/C,IAAM5B,EAAK,OAAOO,KAAKC,GAAUnQ,GAAGkQ,CAAC;OAC3C,IAAI,EAAEqB,IAAM,IAAI;OAChB,IAAMT,IAAQuG,GACZ,GAAG1B,GAAW5B,EAAExC,CAAG,GAAGuG,CAAE,GACxB3I,GACA2E,CACF;OACA,AAAIhD,KACFoD,EAAO,KACLV,EAAQ,KAAKG,EAAEzD,CAAC,CAAC,GACjBY,EAAM,IACNA,EAAM,IACNnB,EAAK,MAAMO,MAAMP,EAAK,KAAKO,KACvB2D,EAAa,KACbA,EAAa,IACnB;MACJ;MACA,OAAO,CAACK,EAAO,KAAK,IAAI,GAAGN,CAAa,CAAC;KAC3C,CAAC;IACH,OAAO,IAAIxI,EAAI,SAAS,aAAa;KACnC,IAAM0M,IAAK/D,EAAE,CAAC,GACRgE,IAAS;MAAE,IAAI3E;MAAK,MAAME;KAAM,GAChC0E,IAAQ;MACZ,IAAI3E,EAAU4E,EAAI1E,GAAIL,GAAI,GAAI,CAAC;MAC/B,MAAMG,EAAU4E,EAAI1E,GAAIJ,GAAM,GAAI,CAAC;KACrC,GACMpI,IAAMI,GAAMC,CAAG;KACrB,EAAO,MAAM,GAAI,MAAO;MACtB,IAAMuF,IAAI9F,GAAY7K,GAAGoL,EAAI,QAAQL,CAAG,GAClCmJ,IAAS,IAAIwB,GAAU;MAC7B,KAAK,IAAIxF,IAAImE,GAAInE,KAAKoE,GAAI,KAAK;OAC7B,IAAM9L,IAAQmI,EAAE,KAAKT;OACrB,IAAI,CAAC1P,EAAOgI,CAAK,GAAG;OACpB,IAAM0J,IAAOhC,IAAI,IAAIS,EAAE,KAAKT,IAAI,KAAK1H,GAC/BpI,IACJoI,KAAS,IACLA,KAAS0J,IACP6F,EAAO,KACPC,EAAM,KACRxP,KAAS0J,IACP6F,EAAO,OACPC,EAAM,MAER/X,IAAK,KAAK,IAAI,GAAGO,EAAOmQ,EAAE,IAAIT,EAAE,IAAIS,EAAE,IAAIT,KAAK1H,CAAK,GACpDtI,IAAK,KAAK,IAAI,GAAGM,EAAOmQ,EAAE,IAAIT,EAAE,IAAIS,EAAE,IAAIT,KAAK1H,CAAK,GACpDsI,IAAQuG,GACZ,GAAIrX,EAAE,QACF2V,GAAW5B,EAAE7T,CAAE,GAAG6T,EAAE9T,CAAE,CAAC,IACvB0V,GAAW5B,EAAEvL,CAAK,GAAGsP,CAAE,GAC3B3I,GACA2E,CACF;OACA,AAAIhD,KACFoD,EAAO,KAAKV,EAAQ,KAAKG,EAAEzD,CAAC,CAAC,GAAGY,EAAM,IAAIA,EAAM,IAAI1Q,CAAK;MAC7D;MACA,OAAO,CAAC8T,EAAO,KAAK,IAAI,GAAGN,CAAa,CAAC;KAC3C,CAAC;IACH,OAAO,IAAIxI,EAAI,SAAS,QAAQ;KAC9B,IAAM8M,IAAQ9M,EAAI,QACdiI,EAAU1O,GAAQiG,GAAQQ,EAAI,KAAK,CAAC,CAAC,IACrC,GACE+M,IAASpY,EAAMmD,IAAUlD,EAAE,OAAO,KAAM,MAAM,GAAG,GACjDoY,IAAOD,IAASzE;KACtB,EAAO,MAAM,GAAI,MAAO;MACtB,IAAMQ,IAAS,IAAIwB,GAAU;MAC7B,KAAK,IAAIxF,IAAImE,GAAInE,KAAKoE,GAAI,KAAK;OAC7B,IAAM9L,IAAQxI,EAAE,QACZoL,EAAI,OAAO,KAAK,IAAIpD,EAAE,IAAI,GAAGkI,IAAIlQ,EAAE,OAAOA,EAAE,OAAO,CAAC,KACpDoL,EAAI,OAAO8E;OACf,IAAI,CAAC1P,EAAOgI,CAAK,GAAG;OACpB,IAAM6G,IAAI0E,EAAEvL,CAAK;OACjB,IAAI6G,IAAIF,KAAOE,IAAIyE,GAAQ;OAC3B,IAAM1T,IAAQ8X,MAAU1P,KAASmH,EAAK,MAAMO,KAAKkD,IAAME;OACvD,EAAO,KAAKK,EAAEzD,CAAC,GAAGb,IAAI+I,GAAM/I,IAAI+I,GAAMhY,CAAK;MAC7C;MACA,OAAO8T,EAAO,QAAQ,CAACA,EAAO,KAAK,IAAI,GAAGkE,GAAM,GAAGD,CAAM,CAAC,IAAI,CAAC;KACjE,CAAC;IACH,OAAO;KACL,IAAM/X,IAAQuE,GAAQiG,GAAQQ,EAAI,KAAK,CAAC;KACxC,EAAO,KACLqJ,GACErJ,EAAI,QACJD,GAAMC,CAAG,GACT;MAAChL,EAAM;MAAIA,EAAM;MAAIA,EAAM;MAAIA,EAAM,KAAKgL,EAAI;KAAK,GACnDA,EAAI,OACJA,EAAI,KACN,CACF;IACF;GAEJ;EACF;EACA,OAAO6H;CACT,GAGMoF,MACJ,GACA,GACA,GACA,MACiB;EACjB,IAAMC,IAAW,KAAK,IAAItY,EAAE,IAAIA,EAAE,OAAO,CAAC,GACpCsV,IAAQlB,IACVpU,EAAE,QAAQA,EAAE,MAAMA,EAAE,QAAQA,EAAE,KAC5BuH,EAAGvH,EAAE,MAAMA,EAAE,MAAM,EAAI,IACvB,CAAC,IACHsY,KAAYtY,EAAE,KACZuH,EAAGvH,EAAE,IAAIsY,GAAU,EAAK,IACxB,CAAC,GACDC,IAAU,EAAE/T;EAClB,OAAO8Q,EAAM,KAAK,GAAM,OAAO;GAC7B,GAAGkD;GACH,KAAK,IAAI/O,EAAM,GAAGkF,EAAE,GAAG6J,EAAK,KAAK,GAAGA,EAAK,MAAMpE,IAAS,UAAU;GAClE;EACF,EAAE;CACJ,GAEMqE,MAAc,GAAmB,MAAgB;EACrD,IAAI,CAACvU,GAAU;EACf,IAAMwU,IAASxU,EAAS;EACxB,EAAawU,GAAQ;GACnB,MAAM;GACN,KAAK;GACL,OAAO,GAAGtV,EAAM;GAChB,QAAQ,GAAGC,EAAM;EACnB,CAAC;EACD,IAAMsV,IAAK,KAAK,IAAI,GAAG,KAAK,MAAMvV,IAAQsQ,CAAG,CAAC,GACxCkF,IAAK,KAAK,IAAI,GAAG,KAAK,MAAMvV,IAAQqQ,CAAG,CAAC;EAE9C,KADIgF,EAAO,UAAUC,KAAMD,EAAO,WAAWE,MAAI1U,EAAS,OAAOyU,GAAIC,CAAE,GACnE5Y,GAAG;GACL,IAAM+I,IAAM;IACV4P;IACAC;IACAlF;IACAxQ;IACAC;IACAnD,EAAE;IACFqB,GAAM;IACNwB;IACAmB;IACAC;IACAJ;IACAxC,GAAM,MAAM,aAAaoP,GAAc,IAAI;IAC3C,GAAGhN,EAAM,KACN,MACC,GAAGsI,EAAE,GAAG,GAAGA,EAAE,IAAI,GAAGA,EAAE,OAAO,GAAGA,EAAE,MAAM,IAAI,GAAGA,EAAE,MAAM,IAAI,GAAGA,EAAE,MAAM,KAAK,GAAGA,EAAE,MAAM,MAC1F;IACA,GAAGxJ,EAAQ,KAAK,MAAO,GAAGkT,EAAG,GAAG,GAAGnM,GAAUmM,CAAE,GAAG;GACpD,CAAC,CAAC,KAAK,GAAG;GACV,AAAI1M,MAAQzE,KAQDC,OAAczB,OACvB,KAAYA,IACZuB,GAAO,SAAS,GAAG,MAAM;IACvB,EAAE,OAAOgU,GAASvM,EAAE,IAAIhC,GAAG9J,GAAG,EAAI;GACpC,CAAC,MAXD,KAAU+I,GACV,KAAYjG,IACZ,KAASkQ,GAAahT,GAAG0T,CAAG,CAAC,CAAC,KAAK,OAAQ;IAAE;IAAI,MAAM,CAAC;IAAG,MAAM,CAAC;GAAE,EAAE,GACtErP,GAAO,SAAS,GAAG,MAAM;IAEvB,AADA,EAAE,OAAOgU,GAASvM,EAAE,IAAIhC,GAAG9J,GAAG,EAAK,GACnC,EAAE,OAAOqY,GAASvM,EAAE,IAAIhC,GAAG9J,GAAG,EAAI;GACpC,CAAC;EAOL,OAEE,AADA,KAAS,CAAC,GACV,KAAU;EAEZ,IAAMsV,IAAQjR,GAAO,SAAS,MAAM,CAAC,GAAGyH,EAAE,MAAM,GAAGA,EAAE,IAAI,CAAC;EAC1D,EAAS,OAAOwJ,GAAO;GACrB,WAAW;IAAE,QAAQ,IAAIqD;IAAI,SAAS;IAAI,QAAQ,KAAKC;IAAI,SAAS;GAAE;GACtE,OAAOD;GACP,QAAQC;GACR;EACF,CAAC;CACH,GAIMC,MAAc,GAA2B,MAAgB;EAC7D,IAAMC,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMvV,KAAQmQ,CAAG,CAAC,GACvC7E,IAAI,KAAK,IAAI,GAAG,KAAK,MAAMrL,KAASkQ,CAAG,CAAC;EAI9C,AAHIgF,EAAO,UAAUI,MAAG,EAAO,QAAQA,IACnCJ,EAAO,WAAW7J,MAAG,EAAO,SAASA,IACzC,EAAO,MAAM,QAAQ,GAAGtL,GAAM,KAC9B,EAAO,MAAM,SAAS,GAAGC,GAAO;CAClC,GAEMuV,MACJ,GACA,GACA,GACA,GACA,GACA,MACG;EAEH,AADAzG,EAAI,UAAU,GACV,OAAOA,EAAI,aAAc,aAAYA,EAAI,UAAU3I,GAAG0F,GAAGyJ,GAAGjK,GAAG8B,CAAC,IAC/D2B,EAAI,KAAK3I,GAAG0F,GAAGyJ,GAAGjK,CAAC;CAC1B,GAGMmK,MACJ,GACA,GACA,GACA,GACA,MACG;EACH,IAAMC,IAAO1P,EAAM,QAAQ2P,EAAE,IACvBC,IAAO5P,EAAM,QAAQ2P,EAAE;EAC7B,IAAI,CAACD,KAAQ,CAACE,GAAM;EACpB,IAAMC,IAAKvO,GAAY7K,GAAGiZ,EAAK,QAAQ9N,GAAM8N,CAAI,CAAC,GAC5CI,IAAKxO,GAAY7K,GAAGmZ,EAAK,QAAQhO,GAAMgO,CAAI,CAAC,GAC5CtI,IAAYoI,EAAK,OACjBtE,IAAQ,KAAK,KAAK,KAAK,IAAI9D,CAAS,IAAI7Q,EAAE,IAAI,IAAI,GAClDyL,IAAO,KAAK,IAAI,GAAGzL,EAAE,MAAM6Q,IAAY,IAAI8D,IAAQ,EAAE,GACrDC,IAAK,KAAK,IAAI5U,EAAE,MAAMA,EAAE,MAAM6Q,IAAY,IAAI8D,IAAQ,EAAE,GACxD2E,IAAQjR,EAAIuC,GAAQsO,EAAE,KAAK,GAAGA,EAAE,OAAO,GACvCK,IAAQlR,EAAIuC,GAAQsO,EAAE,cAAcA,EAAE,KAAK,GAAGA,EAAE,OAAO;EAI7D,AAHA5G,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAK,GAAGjB,EAAK,KAAKjO,GAAOiO,EAAK,MAAM,GACxCiB,EAAI,KAAK;EACT,IAAIkH,IAA+C,CAAC,GAChDC,IAAO,GACLC,UAAc;GAClB,IAAIF,EAAI,SAAS,GAAG;IAGlB,AAFA,EAAI,YAAYC,KAAQ,IAAIH,IAAQC,GACpCjH,EAAI,UAAU,GACdkH,EAAI,SAAS,GAAG,MACd1P,IAAIwI,EAAI,OAAOvG,EAAE,GAAGA,EAAE,EAAE,IAAIuG,EAAI,OAAOvG,EAAE,GAAGA,EAAE,EAAE,CAClD;IACA,KAAK,IAAI4C,IAAI6K,EAAI,SAAS,GAAG7K,KAAK,GAAG,KAAK;KACxC,IAAM5C,IAAIyN,EAAI7K;KACd,AAAI5C,KAAGuG,EAAI,OAAOvG,EAAE,GAAGA,EAAE,EAAE;IAC7B;IAEA,AADAuG,EAAI,UAAU,GACdA,EAAI,KAAK;GACX;GACA,IAAM,CAAC;EACT;EACA,KAAK,IAAIpC,IAAIzE,GAAMyE,KAAK0E,GAAI,KAAK;GAC/B,IAAM1H,IAAIkM,EAAG,KAAKlJ,IACZ/C,IAAIkM,EAAG,KAAKnJ;GAClB,IAAI,CAAC1P,EAAO0M,CAAC,KAAK,CAAC1M,EAAO2M,CAAC,GAAG;IAE5B,AADAuM,EAAM,GACN,IAAO;IACP;GACF;GACA,IAAM/P,IAAIH,EAAIyG,GAAYjQ,GAAGkQ,CAAC,IAAIW,CAAS,GACrC8I,IAAK3F,EAAI3C,EAAK,OAAOnE,CAAC,GACtB8I,IAAKhC,EAAI3C,EAAK,OAAOlE,CAAC,GACtBL,IAAII,KAAKC,IAAI,IAAI,IACjB+E,IAAOsH,EAAIA,EAAI,SAAS;GAC9B,IAAItH,KAAQpF,MAAM2M,GAAM;IAEtB,IAAMG,IAAK1H,EAAK,KAAKA,EAAK,IACpB,IAAI0H,KAAMA,KAAMD,IAAK3D,KACrBkB,IAAKhF,EAAK,KAAKvI,IAAIuI,EAAK,KAAK,GAC7B2H,IAAK3H,EAAK,MAAMyH,IAAKzH,EAAK,MAAM;IAGtC,AAFAsH,EAAI,KAAK;KAAE,GAAGtC;KAAI,IAAI2C;KAAI,IAAIA;IAAG,CAAC,GAClCH,EAAM,GACNF,EAAI,KAAK;KAAE,GAAGtC;KAAI,IAAI2C;KAAI,IAAIA;IAAG,CAAC;GACpC;GAEA,AADA,IAAO/M,GACP0M,EAAI,KAAK;IAAE;IAAG;IAAI;GAAG,CAAC;EACxB;EAEA,AADAE,EAAM,GACNpH,EAAI,QAAQ;CACd,GAGMwH,MAAsB,GAA+B,MAAe;EACxE,IAAI,CAAC9Y,EAAQ,iBAAiBkI,GAAK,KAAA,OAAU;EAC7C,IAAM6Q,IAAe,CAAC,GAClBC,IAAU;EACd,KAAK,IAAI9J,IAAI,KAAK,IAAI,GAAGlQ,EAAE,KAAK,CAAC,GAAGkQ,KAAK,KAAK,IAAIlQ,EAAE,IAAIA,EAAE,IAAI,GAAG,KAAK;GACpE,IAAMia,IAAM,KAAK,MAAMvP,GAAM1K,EAAE,KAAK,KAAKkQ,EAAE,IAAIjN,EAAG;GAClD,IAAIzC,EAAOwZ,CAAO,KAAKC,MAAQD,GAAS;IACtC,IAAMrQ,IAAI,KAAK,MAAMH,EAAI0G,IAAIlQ,EAAE,OAAO,EAAG,CAAC,IAAI;IAG9C,IAFI2J,IAAI,KAAKA,IAAIvG,KAAO2W,EAAG,KAAKpQ,CAAC,GAE7BoQ,EAAG,SAAS3W,IAAQ,GAAG;GAC7B;GACA,IAAU6W;EACZ;EACA,IAAKF,EAAG,QAIR;GAHAzH,EAAI,KAAK,GACT,EAAI,cAAc/J,EAAMzE,EAAM,WAAW,EAAG,GAC5CwO,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAU;GACd,KAAK,IAAM3I,KAAKoQ,GAEd,AADAzH,EAAI,OAAO3I,GAAG,CAAC,GACf2I,EAAI,OAAO3I,GAAGtG,CAAK;GAGrB,AADAiP,EAAI,OAAO,GACXA,EAAI,QAAQ;EANE;CAOhB,GAEM4H,WAA2D;EAC/D,IAAMC,IAASnZ,EAAQ;EAEvB,OADKmZ,IACEA,MAAW,KAAO,CAAC,IAAIA,IADV;CAEtB,GAGMC,MAAsB,GAA+B,MAAe;EACxE,IAAMnD,IAAIiD,GAAe,GACnBhL,IAAQzL,EAAM;EACpB,IAAI,CAACwT,KAAK,CAAC/H,KAAS,CAAClN,EAAM,WAAW;EACtC,IAAMqY,IAAOta,EAAM,KAAK,MAAMkX,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG,GAC7ClO,IAAM;GACV/I,EAAE;GACFA,EAAE;GACFA,EAAE;GACFqa;GACApD,EAAE,aAAa;GACfpU;GACAC;EACF,CAAC,CAAC,KAAK,GAAG;EACV,IAAI,CAACqE,MAAWA,GAAQ,QAAQ4B,GAAK;GAEnC,IAAM4G,IAAO3P,EAAE,QAAQ4P,GAAa1N,IAASF,GAAOgG,EAAE,GAAGhI,EAAE,KAAK,IAAIgC;GACpE,KAAU;IACR;IACA,QAAQsY,GAAc3K,GAAM;KAC1B,MAAM3P,EAAE;KACR,IAAIA,EAAE;KACN;KACA,WAAWiX,EAAE;IACf,CAAC;GACH;EACF;EACA,IAAMtG,IAAIxJ,GAAQ;EAClB,IAAIwJ,EAAE,MAAM,GAAG;EACf,IAAI4J,IAAU;EACd,KAAK,IAAIzQ,IAAI,GAAGA,IAAIuQ,GAAM,KACxB,IAAU,KAAK,IAAIE,IAAU5J,EAAE,GAAG7G,MAAM,MAAM6G,EAAE,KAAK7G,MAAM,EAAE;EAC/D,IAAI,EAAEyQ,IAAU,IAAI;EACpB,IAAMlQ,IAAOjH,IAAQrD,EAAMkX,EAAE,SAAS,KAAM,KAAM,EAAG,GAC/CuD,KAAavD,EAAE,QAAQ,aAAa,SACpC1B,IAAU5Q,GAAQiG,GAAQqM,EAAE,WAAW,IAAI,CAAC,GAC5CzB,IAAY7Q,GAAQiG,GAAQqM,EAAE,aAAa,MAAM,CAAC;EAIxD,AAHA3E,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAK,GAAGpD,EAAM,KAAK9L,GAAO8L,EAAM,MAAM,GAC1CoD,EAAI,KAAK;EACT,KAAK,IAAIxI,IAAI,GAAGA,IAAIuQ,GAAM,KAAK;GAC7B,IAAMnH,IAAKvC,EAAE,GAAG7G,MAAM,GAChBqJ,IAAOxC,EAAE,KAAK7G,MAAM;GAC1B,IAAI,EAAEoJ,IAAKC,IAAO,IAAI;GACtB,IAAM2E,IAAK9D,EAAI9E,EAAM,OAAOyB,EAAE,MAAM7G,IAAI6G,EAAE,IAAI,GACxC8J,IAAKzG,EAAI9E,EAAM,OAAOyB,EAAE,OAAO7G,IAAI,KAAK6G,EAAE,IAAI,GAC9CxB,IAAM,KAAK,IAAI2I,GAAI2C,CAAE,GACrB,IAAI,KAAK,IACb,GACA,KAAK,IAAIA,IAAK3C,CAAE,IAAK,OAAK,IAAI2C,IAAK3C,CAAE,IAAI,EAC3C,GAEMrP,IADSqB,KAAK6G,EAAE,iBAAiB7G,KAAK6G,EAAE,cACvB,MAAO,KACxB+J,IAAYxH,IAAKqH,IAAWlQ,GAC5BsQ,IAAcxH,IAAOoH,IAAWlQ,GAChCL,IAAOwQ,IAAYpX,IAAQ,GAC3BwX,IAAMJ,IAAY,KAAK;GAG7B,AAFA,EAAI,YAAYjS,EAAMgN,GAAS9M,CAAK,GACpC6J,EAAI,SAAS,KAAK,IAAItI,GAAMA,IAAO4Q,IAAMF,CAAQ,GAAGvL,GAAKuL,GAAU,CAAC,GACpE,EAAI,YAAYnS,EAAMiN,GAAW/M,CAAK;GACtC,IAAMoS,KAAQ7Q,IAAO4Q,IAAMF;GAC3B,EAAI,SACF,KAAK,IAAIG,IAAOA,KAAQD,IAAMD,CAAU,GACxCxL,GACAwL,GACA,CACF;EACF;EAEA,IAAMtL,IACJ,KAAK,MAAM2E,EAAI9E,EAAM,OAAOyB,EAAE,OAAOA,EAAE,MAAM,MAAOA,EAAE,IAAI,CAAC,IAAI;EAOjE,AANA,EAAI,cAActI,EAAI4O,EAAE,YAAYzX,IAAS,EAAG,GAChD,EAAI,YAAY,GAChB8S,EAAI,UAAU,GACdA,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC,GACnBiD,EAAI,OAAO,GACXA,EAAI,QAAQ;CACd,GAEMwI,MACJ,GACA,GACA,MACG;EACH,IAAMC,IAAOxS,EAAMzE,EAAM,IAAI,GACvBkX,IAAWha,EAAQ,SAAS;EAElC,IADA,EAAI,YAAY,GACZga,GAAU;GAEZ,AADA,EAAI,cAAcD,GAClBzI,EAAI,UAAU;GACd,KAAK,IAAM,KAAKyE,GAAO;IACrB,IAAMpN,IAAI,KAAK,MAAM,EAAE,CAAC,IAAI;IAE5B,AADA2I,EAAI,OAAO3I,GAAG,CAAC,GACf2I,EAAI,OAAO3I,GAAGtG,CAAK;GACrB;GACA,KAAK,IAAMgO,KAAQ5N,GACjB,KAAK,IAAMwG,KAAKoH,EAAK,OAAO;IAC1B,IAAMhC,IAAI,KAAK,MAAMuG,GAAUvE,EAAK,OAAOpH,CAAC,CAAC,IAAI;IACjD,AAAIoF,IAAIgC,EAAK,MAAM,KAAKhC,IAAIgC,EAAK,MAAMA,EAAK,SAAS,MACrDiB,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC;GACrB;GAEF,EAAI,OAAO;EACb;EAEA,IAAIrO,EAAQ,WAAW;GACrB,IAAMkO,IAAQzL,EAAM;GAOpB,AANA6O,EAAI,KAAK,GACT,EAAI,OAAOnJ,GAAK,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI/F,IAAQ,EAAE,CAAC,GAAG,GAAG,GAC3D,EAAI,YAAYmF,EAAMzE,EAAM,MAAM,GAAI,GACtC,EAAI,YAAY,UAChB,EAAI,eAAe,UACnBwO,EAAI,SAAStR,EAAQ,WAAWoC,IAAQ,GAAG8L,EAAM,MAAMA,EAAM,SAAS,CAAC,GACvEoD,EAAI,QAAQ;EACd;EAEA,KAAK,IAAMjB,KAAQ5N,GAAO;GACxB,IAAM8F,IAAQ8H,EAAK;GACnB,IAAI9H,GAAO,SAASD,GAAUC,CAAK,GAAG;IACpC,IAAMnJ,IAAQuE,GAAQiG,GAAQrB,EAAM,QAAQ,EAAE,EAAE,SAAS9J,EAAO,CAAC,GAC3Dwb,IAAK1R,EAAM,MAAM,KAAK,MAAM,KAAK,MAAMyK,EAAI3C,EAAK,OAAOlE,CAAC,CAAC,IAAI,EAAG;IAatE,AAZI5D,EAAM,YAAY0R,EAAG,WAAW,MAClC,EAAI,YAAY1S,EAAMnI,GAAO,GAAI,GACjCkS,EAAI,SACF,GACA,KAAK,IAAI2I,EAAG,IAAIA,EAAG,EAAE,GACrB7X,GACA,KAAK,IAAI6X,EAAG,KAAKA,EAAG,EAAE,CACxB,IAEF3I,EAAI,KAAK,GACTA,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtB,EAAI,cAAc/J,EAAMzE,EAAM,WAAW,GAAI,GAC7CwO,EAAI,UAAU;IACd,KAAK,IAAMjD,KAAK4L,GACd,AAAI5L,IAAIgC,EAAK,OAAOhC,IAAIgC,EAAK,MAAMA,EAAK,WACxCiB,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC;IAGrB,AADAiD,EAAI,OAAO,GACXA,EAAI,QAAQ;GACd;EACF;EACA,IAAItS,GAAG;GACL,GAAmBsS,GAAKtS,CAAC;GACzB,KAAK,IAAMuJ,KAAShH,GAAS;IAC3B,IAAI,CAACgH,EAAM,MAAM,UAAU,CAACD,GAAUC,CAAK,GAAG;IAC9C,IAAM8H,IAAO9H,EAAM,UACf9F,EAAM,KACNA,EAAM,MAAM,MAAMsI,EAAE,UAAUxC,CAAK;IACvC,IAAI8H,GACF,KAAK,IAAM6H,KAAK3P,EAAM,OAAO,GAAU+I,GAAKtS,GAAGqR,GAAM9H,GAAO2P,CAAC;GACjE;GACA,IAAMhK,IAAQzL,EAAM;GACpB,IAAIyL,KAASA,EAAM,MAAM,SAAS,aAAaxM,GAAS,QAAQ;IAE9D,IAAM2M,IAAI,KAAK,MAAMuG,GAAU1G,EAAM,OAAO,CAAC,CAAC,IAAI;IAClD,AAAIG,IAAIH,EAAM,OAAOG,IAAIH,EAAM,MAAMA,EAAM,WACzCoD,EAAI,KAAK,GACT,EAAI,cAAc/J,EAAMzE,EAAM,WAAW,EAAG,GAC5CwO,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAU,GACdA,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC,GACnBiD,EAAI,OAAO,GACXA,EAAI,QAAQ;GAEhB;GACA,GAAmBA,GAAKtS,CAAC;EAC3B;EAGA,AADA,EAAI,cAAcuI,EAAMzE,EAAM,IAAI,GAClCwO,EAAI,UAAU;EACd,KAAK,IAAMjB,KAAQ5N,EAAM,MAAM,CAAC,GAAG;GACjC,IAAM4L,IAAI,KAAK,MAAMgC,EAAK,GAAG,IAAI;GAEjC,AADAiB,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAO/O,IAAO8L,CAAC;EACrB;EAKA,AAJAiD,EAAI,OAAO,KAAK,MAAMlP,CAAK,IAAI,IAAK,CAAC,GACrCkP,EAAI,OAAO,KAAK,MAAMlP,CAAK,IAAI,IAAKI,EAAM,GAC1C8O,EAAI,OAAO,GAAG,KAAK,MAAMjP,CAAK,IAAI,EAAG,GACrCiP,EAAI,OAAO/O,IAAO,KAAK,MAAMF,CAAK,IAAI,EAAG,GACzCiP,EAAI,OAAO;CACb,GAGM4I,MACJ,GACA,GACA,GACA,GACA,GACA,MACG;EACH,IAAMrM,IAAImG,IAAS,KAAK,IAClB7F,IAAMpP,EAAM,KAAK,MAAMsP,IAAI,CAAC,GAAG,GAAGhM,IAAQwL,CAAC;EASjD,AARAkK,GAAUzG,GAAKlP,IAAQ,GAAG+L,GAAK7L,KAAQ,GAAGuL,GAAG,CAAC,GAC9C,EAAI,YAAYvO,GAChBgS,EAAI,KAAK,GACT,EAAI,YAAY6I,GAChB,EAAI,YAAY,QAChB,EAAI,eAAe,UACnB,EAAI,OAAOhS,GAAKrF,EAAM,UAAU,GAAG,GACnCwO,EAAI,SAAS8I,GAAMhY,IAAQ,GAAG+L,IAAM,GAAG,GACnC6F,MACF,EAAI,OAAO7L,GAAKrF,EAAM,WAAW,CAAC,GAClCwO,EAAI,SAAS0C,GAAQ5R,IAAQ,GAAG+L,IAAM,EAAE;CAE5C,GAEMkM,MAAiB,MACrB5X,EAAM,EAAE,EAAE,MAAM,SAAS,YACrBiP,GAAclC,GAAS/M,EAAM,EAAE,CAAC,OAAO+E,CAAK,GAAGf,CAAM,IACrDqB,EAAYN,CAAK,GAEjBqN,MAAa,MAA2B;EAC5C,IAAIV,EAAK,OAAO,OAAO9M,EAAI8M,EAAK,KAAK;EACrC,IAAMmG,IAAOnG,EAAK,QAAQ;EAK1B,OAJkC9M,EAA9BiT,MAAS,eAAyBnT,GAAM,IACxCmT,MAAS,aAAuBlT,GAAQ,IACxCkT,MAAS,UAAoB9b,KAC7B8b,MAAS,SAAmB7b,KACrB0V,EAAK,SAAS,SAAS/M,GAAQ,IAAID,GAAM,CAJP;CAK/C,GAEMoT,MAAa,MACjBjV,GAAc,IAAI6O,EAAK,EAAE,KAAKA,EAAK,OAE/BqG,WAAuB;EAC3B,IAAI,CAAC5X,MAAO,CAACH,EAAM,QAAQ,OAAO;EAClC,IAAIoB,MAAkB,MAAM;GAC1B,IAAM4E,IAAQ5E,GACR4W,IAAMhS,KAAS,KAAKA,IAAQzB,EAAE,IAAIuD,GAAQ,CAAC,CAAC,MAAM9B,KAAS;GACjE,OAAO;IAAE;IAAO,MAAMhG,EAAM;IAAI,GAAGuQ,EAAIvQ,EAAM,EAAE,CAAC,OAAOgY,CAAG;IAAG,OAAOA;GAAI;EAC1E;EACA,IAAI,CAAC7W,KAAWgC,IAAe;GAC7B,IAAM6C,IAAQ,KAAK,MAAM4B,GAAezE,GAAc,IAAI,CAAC,GACrDsI,IAAQtI,GAAc;GAC5B,OAAO;IACL;IACA,MAAMnD,EAAM;IACZ,GAAGjD,EAAO0O,CAAK,IAAI8E,EAAIvQ,EAAM,EAAE,CAAC,OAAOyL,CAAK,IAAI;IAChD;GACF;EACF;EACA,IAAI,CAACtK,KAAWA,EAAQ,IAAIxB,KAASwB,EAAQ,IAAIvB,GAAO,OAAO;EAC/D,IAAMgO,IAAOjC,GAAOxK,EAAQ,CAAC;EAC7B,IAAI,CAACyM,GAAM,OAAO;EAClB,IAAM5H,IAAQ,KAAK,MAAMC,GAAQ9E,EAAQ,CAAC,CAAC,GACvCyK,IAAIzK,EAAQ,GACZsK,IAAQwM,GAAQrK,EAAK,OAAOhC,CAAC;EACjC,IACEgC,EAAK,OAAOhS,KACZ2B,EAAQ,cAAc,UACtByI,KAAS,KACTA,IAAQzB,EAAE,KACVrC,OAAS,UACT;GACA,IAAM0H,IAAI9B,GAAQ,GACdoQ,IAAO;GACX,KAAK,IAAMnT,KAAS;IAClB6E,EAAE,KAAK5D;IACP4D,EAAE,KAAK5D;IACP4D,EAAE,IAAI5D;IACN4D,EAAE,MAAM5D;GACV,GAAG;IACD,IAAMmS,IAAK5H,EAAI3C,EAAK,OAAO7I,CAAK;IAChC,AAAI,KAAK,IAAIoT,IAAKhX,EAAQ,CAAC,IAAI+W,MAC7B,IAAO,KAAK,IAAIC,IAAKhX,EAAQ,CAAC,GAC9B,IAAIgX,GACJ,IAAQpT;GAEZ;EACF;EACA,OAAO;GAAE;GAAO;GAAM;GAAG;EAAM;CACjC,GAEMqT,MAAU,MACdpY,EAAM,MAAM,MAAMsI,EAAE,QAAQc,KAAMxN,EAAM,KAAK,MAEzCyc,MAAiB,MAChBzK,IACE;EACL,GAAG7H;EACH,IAAI,MAAMwK,EAAI3C,EAAK,OAAOtF,CAAC;EAC3B,OAAOV;EACP,MAAM;EACN,OAAOjI;EACP,KAAKiO,EAAK;EACV,QAAQA,EAAK,MAAMA,EAAK;CAC1B,IATkB,MAYd0K,MAAc,GAAc,MAAe;EAC/C,IAAMjQ,IAAI/D,GAAO,GACXiU,IAAM,KAAK,IAAIC,CAAE,GACjBC,IAAkB,CAAC,GACnBC,IAAO,KAAK,MAAMH,IAAM/Y,EAAG,GAC3BmZ,IAAQ,KAAK,MAAOJ,IAAM/Y,KAAOoZ,EAAI,GACrCC,IAAU,KAAK,MAAON,IAAMK,KAAQ1R,EAAM;EAIhD,OAHIwR,KAAMD,EAAM,KAAK5b,EAAKwL,EAAE,MAAM,EAAE,OAAOqQ,EAAK,CAAC,CAAC,GAC9CC,KAAOF,EAAM,KAAK5b,EAAKwL,EAAE,OAAO,EAAE,OAAOsQ,EAAM,CAAC,CAAC,GACjDE,KAAW,CAACH,KAAMD,EAAM,KAAK5b,EAAKwL,EAAE,SAAS,EAAE,OAAOwQ,EAAQ,CAAC,CAAC,GAC7D,GAAGhc,EAAKyH,GAAO,CAAC,CAAC,MAAM,EAAE,OAAO0F,EAAK,CAAC,EAAE,IAAIyO,EAAM,KAAK,GAAG,KAAK5b,EAAKwL,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;CACpG,GAGMyQ,MAAiB,GAAY,MACjClL,EAAK,OAAOhS,IAAQyJ,EAAYN,CAAK,IAAIiK,GAAapB,GAAM7I,CAAK,GAG7DgU,MAAc,MAAkB;EACpC,IAAMC,IAAO,MAAM,CAAC/T,GAAU;EAC9B,OAAO,QAAQ,KAAK,MAAMwG,IAAQuN,CAAI,IAAIA,EAAA,CAAM,QAAQ/T,GAAU,CAAC,CAAC;CACtE,GAGMgU,MACJ,GACA,GACA,GACA,GACA,GACA,IAAqC,aAClC;EACH,EAAI,OAAOvT,GAAKrF,EAAM,UAAU,GAAG;EACnC,IAAMgV,IAAIxG,EAAI,YAAY8I,CAAI,CAAC,CAAC,QAAQ,IAClC3L,IAAO1P,EACX4c,MAAU,WAAWhT,IAAImP,IAAI,IAAI6D,MAAU,UAAUhT,IAAImP,IAAInP,GAC7D,GACA,KAAK,IAAI,GAAGvG,IAAQ0V,IAAI,CAAC,CAC3B;EAQA,OAPAC,GAAUzG,GAAK7C,GAAMJ,GAAGyJ,GAAG,IAAI,EAAE,GACjC,EAAI,YAAY8D,GAChBtK,EAAI,KAAK,GACT,EAAI,YAAYnS,GAAOyc,CAAS,GAChC,EAAI,YAAY,UAChB,EAAI,eAAe,UACnBtK,EAAI,SAAS8I,GAAM3L,IAAOqJ,IAAI,GAAGzJ,IAAI,IAAI,GAClCyJ;CACT,GAGM+D,MACJ,GACA,GACA,GACA,GACA,OAEArW,GAAc,KAAK;EAAE;EAAG;EAAG;EAAG;EAAG;CAAO,CAAC,GAClCC,OAAkBD,GAAc,SAAS,IAG5CsW,MACJ,GACA,MACG;EACH,IAAMjT,IAAQ7B,EAAE,GACVsD,IAAOzB,IAAQ7H,EAAM,MAAM6H,IAAQ,KAAK,KACxCkT,IAAMjX,IAAQ,CAAC,GAAGT,GAAUS,CAAK,IAAIT;EAC3C,IAAI,CAAC0X,EAAI,QAAQ;EACjB,IAAMjR,IAAI/D,GAAO,GACXiV,IAAW;GACf,QAAQlR,EAAE;GACV,MAAMA,EAAE;GACR,YAAYA,EAAE;GACd,QAAQA,EAAE;GACV,MAAMA,EAAE;GACR,OAAOA,EAAE;EACX;EACA,KAAK,IAAMuF,KAAQ5N,GAAO;GACxB,IAAMwZ,IAASnB,GAAczK,CAAI;GACjC,IAAI,CAAC4L,GAAQ;GACb,IAAMC,IAAMH,EAAI,QAAQ,OAAO1P,EAAE,QAAQhO,OAAWgS,EAAK,EAAE;GAC3D,IAAK6L,EAAI,QAIT;IAHA5K,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAK,GAAGjB,EAAK,KAAKjO,GAAOiO,EAAK,MAAM,GACxCiB,EAAI,KAAK;IACT,KAAK,IAAMrB,KAAWiM,GAAK;KACzB,IAAMvF,IAAMwF,GACV7K,GACArB,GACAgM,GACA;MACE,GAAGG;MACH,OAAO/U,EAAI4I,EAAQ,SAASxR,EAAO;MACnC,MAAM0J,GAAKrF,EAAM,UAAU,GAAG;MAC9B,YAAYA,EAAM;MAClB,cAAc,MAAUyY,GAAclL,GAAM7I,CAAK;MACjD,gBAAgB,MAAUkK,GAAclK,GAAOf,CAAM;MACrD;MACA;MACA,aAAaqE,EAAE;MACf;MACA,MAAMuF,EAAK,OAAOhS,IAAQiM,IAAO;MACjC;KACF,GACA;MACE,UAAU2F,MAAYnL,KAASmL,EAAQ,OAAOrL;MAC9C,SAASqL,EAAQ,OAAOpL;KAC1B,CACF;KACA,AAAI8R,KAAKzR,GAAU,IAAI+K,EAAQ,IAAI0G,CAAG;IACxC;IACA,EAAI,QAAQ;GA3BH;EA4BX;CACF,GAEM0F,MACJ,GACA,GACA,MACG;EACH,IAAMnO,IAAQzL,EAAM;EACpB,IAAI,CAACyL,GAAO;EACZ,KAAgB,CAAC;EACjB,IAAMrF,IAAQ7B,EAAE,GACVoT,IAAO7S,EAAMzE,EAAM,IAAI,GACvBwZ,IAAQ/U,EAAMzE,EAAM,SAAS,GAC7ByZ,IAAQhV,EAAMzE,EAAM,UAAU,GAC9B0Z,IAAMnV,EAAIF,GAAM,CAAC,GACjBsV,IAAQpV,EAAID,GAAQ,CAAC,GACrB0D,IAAI/D,GAAO;EASjB,IANAuK,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAK,GAAGpD,EAAM,KAAK9L,GAAO8L,EAAM,MAAM,GAC1CoD,EAAI,KAAK,GAIPtS,KACAgB,EAAQ,mBAAmB,MAC3BK,GAAM,MAAM,UACZA,GAAM,MAAM,UACZA,GAAM,MAAM,YACZ;GACA,IAAInB,IAAK,WACLD,IAAK,UACLyd,IAAM,IACNC,IAAM;GACV,KAAK,IAAIzN,IAAIlQ,EAAE,IAAIkQ,KAAKlQ,EAAE,IAAI,KAK5B,AAJIA,EAAE,KAAK,KAAKkQ,KAAKhQ,MACnB,IAAKF,EAAE,KAAK,KAAKkQ,IACjB,IAAMA,IAEJlQ,EAAE,KAAK,IAAIkQ,KAAKjQ,MAClB,IAAKD,EAAE,KAAK,IAAIkQ,IAChB,IAAMA;GAMV,AAHA,EAAI,OAAO/G,GAAKrF,EAAM,QAAQ,GAC9B,EAAI,YAAYwZ,GAChB,EAAI,cAAcA,GAClB,EAAI,YAAY;GAChB,KAAK,IAAM,CAACpN,GAAG1H,GAAO+Q,MAAU,CAC9B;IAACmE;IAAKxd;IAAI;GAAK,GACf;IAACyd;IAAK1d;IAAI;GAAI,CAChB,GAAY;IACV,IAAIiQ,IAAI,KAAK,CAAC1P,EAAOgI,CAAK,GAAG;IAC7B,IAAMmB,IAAIH,EAAIyG,GAAYjQ,GAAGkQ,CAAC,CAAC,GACzB0N,IAAQ9U,EAAYN,CAAK,GACzBsQ,IAAIxG,EAAI,YAAYsL,CAAK,CAAC,CAAC,OAC7BvO,IAAItP,EACNiU,EAAI9E,EAAM,OAAO1G,CAAK,KAAK+Q,IAAQ,IAAI,KACvCrK,EAAM,MAAM,GACZA,EAAM,MAAMA,EAAM,SAAS,CAC7B,GAEM2O,IAAY,KAAK,IAAIlU,GAAGA,KAAKA,IAAIvG,IAAQ,KAAM,MAAM0V,IAAI,KAAKA,EAAE;IACtE,KAAK,IAAMgF,KAAOC,IAChB,AACEF,IAAYC,EAAI,SAChBzO,IAAI,IAAIyO,EAAI,UACZzO,IAAI,IAAIyO,EAAI,OACZA,EAAI,SAAS,KAAK5O,EAAM,MAAMA,EAAM,SAAS,MAE7C,IAAI4O,EAAI,SAAS;IAGrB,IAAME,IAAY5a,IAAQ,KAAKuG,IAAI,KAAKmP,IAClCmF,IAAWtU,IAAI,KAAKmP,IAAI,GACxBoF,KACHF,IAAY,KAAKrU,IAAIvG,IAAQ,OAC9B6a,KAAY,KAAK,IAAI,GAAGD,CAAS,GAC7BpD,IAAMsD,IAAW,KAAK;IAM5B,AALA,EAAI,eAAe,UACnB,EAAI,YAAY,QAChB5L,EAAI,UAAU,GACdA,EAAI,OAAO3I,GAAG0F,CAAC,GACfiD,EAAI,OAAO3I,IAAIiR,IAAM,IAAIvL,CAAC,GAC1BiD,EAAI,OAAO;IACX,IAAM6L,IAAKpe,EAAMme,IAAWvU,IAAI,KAAKmP,IAAInP,IAAI,IAAI,GAAGvG,IAAQ0V,IAAI,CAAC;IACjE,EAAI,SAAS8E,GAAOO,GAAI9O,CAAC;GAC3B;EACF;EAGA,IAAIrP,KAAKgB,EAAQ,SAAS,QAAQ;GAChC,IAAMod,oBAAQ,IAAI,IAAoB;GAEtC,AADA,EAAI,OAAOjV,GAAKrF,EAAM,UAAU,GAAG,GACnC,EAAI,YAAY;GAChB,IAAMua,IAAOrd,EAAQ,QAAQ,SAAS;GACtC,KAAK,IAAMsd,KAAUtd,EAAQ,SAAS;IACpC,IAAMyI,IAAQ4B,GAAeiT,EAAO,IAAI;IACxC,IAAI7U,IAAQ,KAAKA,IAAQI,IAAQ,GAAG;IACpC,IAAMqG,IAAI,KAAK,MAAMzG,IAAQzJ,EAAE,IAAI;IACnC,IAAIkQ,IAAIlQ,EAAE,MAAMkQ,IAAIlQ,EAAE,IAAI;IAC1B,IAAM2J,IAAI,KAAK,MAAMH,EAAIyG,GAAYjQ,GAAGkQ,CAAC,CAAC,CAAC,GACrCqO,IAAOD,EAAO,SAAS,QACvBle,IAAQke,EAAO,QAAQjW,EAAIiW,EAAO,KAAK,IAAIC,IAAOd,IAAQD,GAC1DzU,IAAM,GAAGmH,EAAE,GAAGqO,KACd3N,IAASwN,EAAM,IAAIrV,CAAG,KAAK;IACjC,EAAM,IAAIA,GAAK6H,KAAU0N,EAAO,QAAQ,CAACD,IAAO,KAAK,GAAG;IACxD,IAAMG,IAASxK,EAAI9E,EAAM,OAAOqP,IAAOve,EAAE,KAAK,KAAKkQ,KAAKlQ,EAAE,KAAK,IAAIkQ,EAAE,GAC/D0K,IAAM2D,IAAO,KAAK,GAClBE,IAAMD,IAAS5D,KAAO,IAAIhK;IAgBhC,AAfA,EAAI,YAAYxQ,GAChBkS,EAAI,UAAU,GACdA,EAAI,OAAO3I,GAAG8U,CAAG,GACjBnM,EAAI,OAAO3I,IAAI,KAAK8U,IAAM7D,IAAM,CAAC,GACjCtI,EAAI,OAAO3I,IAAI,GAAG8U,IAAM7D,IAAM,CAAC,GAC/BtI,EAAI,OAAO3I,IAAI,GAAG8U,IAAM7D,IAAM,EAAE,GAChCtI,EAAI,OAAO3I,IAAI,GAAG8U,IAAM7D,IAAM,EAAE,GAChCtI,EAAI,OAAO3I,IAAI,GAAG8U,IAAM7D,IAAM,CAAC,GAC/BtI,EAAI,OAAO3I,IAAI,KAAK8U,IAAM7D,IAAM,CAAC,GACjCtI,EAAI,UAAU,GACdA,EAAI,KAAK,GACLgM,EAAO,QAAQ,CAACD,MAClB,EAAI,eAAeE,IAAO,WAAW,OACrCjM,EAAI,SAASgM,EAAO,MAAM3U,GAAG8U,IAAM7D,IAAM,EAAE,IAEzC0D,EAAO,UAAU,KAAA,KAAa9d,EAAO8d,EAAO,KAAK,MACnDhM,EAAI,UAAU,GACdA,EAAI,IAAI3I,GAAGqK,EAAI9E,EAAM,OAAOoP,EAAO,KAAK,GAAG,GAAG,GAAG,KAAK,KAAK,CAAC,GAC5DhM,EAAI,KAAK,GACT,EAAI,YAAY,KAChB,EAAI,cAAciL,GAClBjL,EAAI,OAAO;GAEf;EACF;EASA,AARAA,EAAI,QAAQ,GAGZwK,GAAcxK,GAAK;GAAE;GAAM,YAAYiL;GAAO,IAAIC;GAAK,MAAMC;EAAM,CAAC,GAEpEnL,EAAI,KAAK,GACTA,EAAI,UAAU,GACdA,EAAI,KAAK,GAAGpD,EAAM,KAAK9L,GAAO8L,EAAM,MAAM,GAC1CoD,EAAI,KAAK;EAET,IAAMoM,IAAY7U,IAAQ7H,EAAM,MAAM6H,IAAQ,KAAK;EACnD,KAAK,IAAMsL,KAAQnU,EAAQ,cAAc,CAAC,GAAG;GAC3C,IAAM+K,IAAIwP,GAAUpG,CAAI,GAClB9F,IAAI,KAAK,MAAM2E,EAAI9E,EAAM,OAAOnD,CAAC,CAAC,IAAI;GAC5C,IAAI,CAACvL,EAAO6O,CAAC,KAAKA,IAAIH,EAAM,OAAOG,IAAIH,EAAM,MAAMA,EAAM,QAAQ;GACjE,IAAM9O,IAAQyV,GAAUV,CAAI,GACtBmG,IAAOnG,EAAK,QAAQ,QACpBwJ,IACJxJ,EAAK,cACJmG,MAAS,cAAcA,MAAS,SAAS,UAAU;GActD,AAbAhJ,EAAI,KAAK,GACT,EAAI,cAAclS,GAClB,EAAI,YACFmG,OAAgB4O,EAAK,MACpBpQ,GAAS,SAAS,WAAWA,EAAQ,KAAK,OAAOoQ,EAAK,MACtDrQ,GAAU,SAAS,UAAUA,EAAS,OAAOqQ,EAAK,KAC/C,MACA,GACNyJ,GAAQtM,GAAKqM,GAAW,CAAC,GACzBrM,EAAI,UAAU,GACdA,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC,GACnBiD,EAAI,OAAO,GACXA,EAAI,QAAQ;GAEZ,IAAMuM,IAAW/e,GAAkBwb,IAC7BwD,IAAQ3J,EAAK,UAAU0J,IAAW/S,EAAE+S,KAAY,KAChD3C,IAKA,CAAC;GAIP,IAHI4C,KAAO5C,EAAM,KAAK;IAAE,MAAM4C;IAAO,MAAM1e;IAAO,OAAOD,GAAOC,CAAK;GAAE,CAAC,GACpE+U,EAAK,aAAa,KAAA,KAAaA,EAAK,aAAa,MACnD+G,EAAM,KAAK;IAAE,MAAM,OAAO/G,EAAK,QAAQ;IAAG,MAAMoI;IAAO;GAAM,CAAC,GAE9DjC,MAAS,cACT,OAAOnG,EAAK,YAAa,YACzB3U,EAAOke,CAAS,GAChB;IACA,IAAMK,KACHL,IAAY3S,KAAKoJ,EAAK,YAAYA,EAAK,SAAS,SAAS,KAAK,IAC3D6J,IAAUD,KAAO,IAAIvB,IAAMC;IACjC,EAAM,KAAK;KACT,MAAM,GAAGsB,KAAO,IAAI,MAAM,MAAMjW,EAAY,KAAK,IAAIiW,CAAG,CAAC;KACzD,MAAMC;KACN,OAAO7e,GAAO6e,CAAO;IACvB,CAAC;GACH;GAGA,IAFI7J,EAAK,eACP+G,EAAM,KAAK;IAAE,MAAM;IAAK,MAAMqB;IAAO;IAAO,QAAQ;GAAK,CAAC,GACxD,CAACrB,EAAM,UAAU,CAAC/G,EAAK,WAAW;GACtC,EAAI,OAAOhM,GAAKrF,EAAM,UAAU,GAAG;GACnC,IAAMmb,IAAS/C,EAAM,KAAK,MACxBgD,EAAK,SAAS,KAAK5M,EAAI,YAAY4M,EAAK,IAAI,CAAC,CAAC,QAAQ,EACxD,GACMC,IAAOhK,EAAK,YAAY,KAAK,GAC7B1G,IAAQwQ,EAAO,QAAQ,GAAG,MAAM/R,IAAIC,GAAG,CAAC,IAAIgS,GAC9CxV,IAAI,KAAK,MAAMvG,IAAQqL,IAAQ,EAAE,GAC/BU,IAAM,KAAK,MAAME,IAAI,GAAG;GAgB9B,IAfIvK,GAAU,SAAS,UAAUA,EAAS,OAAOqQ,EAAK,OAEpD4D,GAAUzG,GAAK3I,IAAI,KAAKwF,IAAM,KAAKV,IAAQ,GAAG,IAAI,CAAC,GACnD,EAAI,cAAcpG,EAAI5I,EAAO,GAC7B,EAAI,YAAY,GAChB6S,EAAI,YAAY,CAAC,CAAC,GAClBA,EAAI,OAAO,IAEbyG,GAAUzG,GAAK3I,IAAI,IAAKwF,IAAM,IAAKV,IAAQ,GAAG,IAAI,CAAC,GACnD,EAAI,YAAY8O,GAChBjL,EAAI,KAAK,GACT,EAAI,cAAclS,GAClB,EAAI,YAAY,GAChBkS,EAAI,YAAY,CAAC,CAAC,GAClBA,EAAI,OAAO,GACP6M,GAAM;IACR,EAAI,YAAY/e;IAChB,KAAK,IAAIuO,IAAI,GAAGA,IAAI,GAAG,KACrB,EAAI,SAAShF,IAAI,GAAGwF,IAAM,IAAIR,IAAI,KAAK,GAAG,GAAG;IAC/C,KAAKwQ;GACP;GAGA,AAFA,EAAI,eAAe,UACnB,EAAI,YAAY,UAChBjD,EAAM,SAAS,GAAM,MAAM;IACzB,IAAMpD,IAAImG,EAAOtQ,MAAM,GACnByQ,IAAWF,EAAK;IAkBpB,AAjBIA,EAAK,WACOrC,GAAalT,GAAGwF,GAAK2J,GAAG,UACpCzR,EAAK,eAAe;KAAE,IAAI8N,EAAK;KAAI;IAAK,CAAC,CAEvC,MAAO,IAAW/U,IACtB,EAAI,YAAYA,GAChBkS,EAAI,SAAS3I,GAAGwF,IAAM,GAAG,GAAG,EAAE,IAE5BiQ,MAAa7B,MACf,EAAI,YAAY6B,GAChB9M,EAAI,SAAS3I,GAAGwF,GAAK2J,GAAG,EAAE,IAE5B,EAAI,YACFoG,EAAK,UAAUE,MAAa7B,IAAQpd,GAAOC,CAAK,IAAI8e,EAAK,OACvDA,EAAK,WAAQ,EAAI,OAAO/V,GAAKrF,EAAM,WAAW,GAAG,GAAG,IACxDwO,EAAI,SAAS4M,EAAK,MAAMvV,IAAImP,IAAI,GAAG3J,KAAO+P,EAAK,SAAS,IAAI,IAAI,GAChE,EAAI,OAAO/V,GAAKrF,EAAM,UAAU,GAAG,GACnC,KAAKgV;GACP,CAAC;EACH;EAGA,IAAMuG,IAAWre,EAAQ,kBAAkB,MAAS6I,IAAQ,GACtDyV,IAASzV,IAAQ,KAAK7H,EAAM,MAAM6H,IAAQ,MAAM7H,EAAM,KAAK6H,IAAQ,IAEnE0V,IACJle,GAAM,MAAM,UAAUA,GAAM,MAAM,SAC9BgH,EAAI5I,EAAO,IACX6f,IACE9B,IACAC;EACR,IAAI4B,GAAU;GACZ,IAAMhQ,IAAI,KAAK,MAAM2E,EAAI9E,EAAM,OAAOwP,CAAS,CAAC,IAAI;GAQpD,AAPApM,EAAI,KAAK,GACT,EAAI,cAAciN,GAClBjN,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAU,GACdA,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC,GACnBiD,EAAI,OAAO,GACXA,EAAI,QAAQ;EACd;EACA,EAAI,QAAQ;EAGZ,IAAMkN,IAA8D,CAAC;EACrE,KAAK,IAAM5T,KAAKlJ,IAAU;GACxB,IAAIoH,IAAID,IAAQ;GAChB,OAAOC,KAAK,KAAK,CAACtJ,EAAOoL,EAAE,OAAO9B,EAAE,IAAG;GACvC,IAAIA,IAAI,GAAG;GACX,IAAMtB,IAAQoD,EAAE,OAAO9B,IACjB2H,IAASnB,GAAcpB,EAAM,OAAO1G,GAAO6H,GAAYzE,CAAC,CAAC,GACzDyD,IAAIuG,GAAU1G,EAAM,OAAOuC,CAAM;GACvC,AAAI,CAACjR,EAAO6O,CAAC,KAAKA,IAAIH,EAAM,OAAOG,IAAIH,EAAM,MAAMA,EAAM,UACzDsQ,EAAc,KAAK;IACjB;IACA,MACEtQ,EAAM,MAAM,SAAS,YACjBwD,GAAcjB,GAAQhK,CAAM,IAC5BqB,EAAYN,CAAK;IACvB,OAAOH,EAAIuD,EAAE,KAAK;GACpB,CAAC;EACH;EAGA,IAAM6T,IAAyC,CAAC;EAChD,KAAK,IAAMtK,KAAQnU,EAAQ,cAAc,CAAC,GACxC,EAAQ,KAAK;GAAE,MAAM3B;GAAO,GAAG2U,EAAI9E,EAAM,OAAOqM,GAAUpG,CAAI,CAAC;EAAE,CAAC;EACpE,KAAK,IAAMlE,KAAW5L,GAAU;GAC9B,IAAMgM,IAAOwK,GAAO5K,EAAQ,IAAI;GAChC,AAAII,KAAQJ,EAAQ,SAAS,oBAAoBA,EAAQ,OAAO,MAC9DwO,EAAQ,KAAK;IACX,MAAMpO,EAAK;IACX,GAAG2C,EAAI3C,EAAK,OAAOJ,EAAQ,OAAO,EAAE,CAAC,KAAK;GAC5C,CAAC;EACL;EACA,KAAK,IAAM2M,KAAS4B,GAClB,EAAQ,KAAK;GAAE,MAAMngB;GAAO,GAAGue,EAAM;EAAE,CAAC;EAS1C,AARIyB,KACFI,EAAQ,KAAK;GACX,MAAMpgB;GACN,GAAG2U,EAAI9E,EAAM,OAAOwP,CAAS,KAAK1d,EAAQ,YAAY,IAAI;EAC5D,CAAC,GACH,EAAI,OAAOmI,GAAKrF,EAAM,QAAQ,GAC9B,EAAI,YAAY,QAChB,EAAI,eAAe,UACnB,EAAI,YAAYwZ;EAChB,KAAK,IAAMjM,KAAQ5N,GACjB,KAAK,IAAMwG,KAAKoH,EAAK,OAAO;GAC1B,IAAMhC,IAAIuG,GAAUvE,EAAK,OAAOpH,CAAC;GACjC,IAAIoF,IAAIgC,EAAK,MAAM,KAAKhC,IAAIgC,EAAK,MAAMA,EAAK,SAAS,GAAG;GACxD,IAAMgB,IAAMrR,EAAQ,aAAaqQ,EAAK,OAAOhS,IAAQ,KAAK;GAC1D,AAAIogB,EAAQ,MAAM,MAAM7T,EAAE,SAASyF,EAAK,MAAM,KAAK,IAAIzF,EAAE,IAAIyD,CAAC,IAAIgD,CAAG,KAErEC,EAAI,SAASG,GAAapB,GAAMpH,CAAC,GAAG7G,IAAQ,GAAGiM,CAAC;EAClD;EAGF,EAAI,YAAY;EAChB,KAAK,IAAM,KAAK0H,GAGd,AAFA,EAAI,OAAO5N,GAAKrF,EAAM,UAAU,EAAE,OAAO,MAAM,GAAG,GAClD,EAAI,YAAY,EAAE,OAAOsX,IAAOkC,GAChChL,EAAI,SAAS,EAAE,MAAM,EAAE,GAAGjP,IAAQpE,KAAY,CAAC;EAIjD,KAAK,IAAMkW,KAAQnU,EAAQ,cAAc,CAAC,GAAG;GAC3C,IAAM+K,IAAIwP,GAAUpG,CAAI,GAClB9F,IAAI2E,EAAI9E,EAAM,OAAOnD,CAAC;GAC5B,IAAI,CAACvL,EAAO6O,CAAC,KAAKA,IAAIH,EAAM,OAAOG,IAAIH,EAAM,MAAMA,EAAM,QAAQ;GACjE,IAAM0N,IAAY/G,GAAUV,CAAI;GAChC,GAAU7C,GAAKjD,GAAGgM,GAActP,CAAC,GAAG6Q,GAAWzc,GAAOyc,CAAS,CAAC;EAClE;EACA,KAAK,IAAM3L,KAAW5L,GAAU;GAC9B,IAAMgM,IAAOwK,GAAO5K,EAAQ,IAAI;GAChC,IAAI,CAACI,KAAQJ,EAAQ,SAAS,oBAAoB,CAACA,EAAQ,OAAO,IAChE;GACF,IAAMlF,IAAIkF,EAAQ,OAAO,EAAE,CAAC,OACtB5B,IAAI2E,EAAI3C,EAAK,OAAOtF,CAAC;GAC3B,IAAIsD,IAAIgC,EAAK,OAAOhC,IAAIgC,EAAK,MAAMA,EAAK,QAAQ;GAChD,IAAMuL,IAAYvU,EAAI4I,EAAQ,SAASxR,EAAO;GAC9C,GACE6S,GACAjD,GACAgC,EAAK,OAAOhS,IAAQgc,GAActP,CAAC,IAAIwQ,GAAclL,GAAMtF,CAAC,GAC5D6Q,GACAzc,GAAOyc,CAAS,CAClB;EACF;EACA,KAAK,IAAMgB,KAAS4B,GAClB,GAAUlN,GAAKsL,EAAM,GAAGA,EAAM,MAAMA,EAAM,OAAOzd,GAAOyd,EAAM,KAAK,CAAC;EAEtE,IAAIyB,GAAU;GACZ,IAAIrK;GACJ,IAAIhU,EAAQ,WAAW;IACrB,IAAM6Q,IAAK7I,GAAU,GACf6R,IAAQ7Y,EAAM,KAAK6H,IAAQ,IAC7B6V,IAAM7E,IAAQhJ,EAAG;IACrB,IAAIA,EAAG,SAAS,SAAS;KACvB,IAAM8N,IAAO,IAAI,KAAK9E,CAAK;KAC3B,IAAM,KAAK,IACT8E,EAAK,eAAe,GACpBA,EAAK,YAAY,IAAI9N,EAAG,OACxB8N,EAAK,WAAW,GAChBA,EAAK,YAAY,GACjBA,EAAK,cAAc,CACrB;IACF;IACA,IAASC,GAAgBF,IAAM,KAAK,IAAI,GAAG5T,CAAC;GAC9C;GACA,GACEwG,GACA0B,EAAI9E,EAAM,OAAOwP,CAAS,GAC1BrD,GAAcqD,CAAS,GACvBa,GACApf,GAAOof,CAAS,GAChBvK,CACF;EACF;EAIA,IAAM6K,IAAS3Q,EAAM,MAAMA,EAAM,SAAS;EAC1C,IAAIjI,IAAe;GACjB,IAAM0C,IAAI/E,KAAWA,EAAQ,KAAKxB,IAAQwB,EAAQ,IAAI;GAWtD,AAVIpE,EAAOmJ,CAAC,MACV,EAAI,YAAYpB,EAAMzE,EAAM,YAAY,GAAI,GAC5CwO,EAAI,SAAS3I,GAAG,GAAGvG,IAAQuG,GAAGtG,CAAK,GACnC,EAAI,cAAcgF,EAAI5I,EAAO,GAC7B,EAAI,YAAY,KAChB6S,EAAI,UAAU,GACdA,EAAI,OAAO,KAAK,MAAM3I,CAAC,IAAI,IAAK,CAAC,GACjC2I,EAAI,OAAO,KAAK,MAAM3I,CAAC,IAAI,IAAKtG,CAAK,GACrCiP,EAAI,OAAO,IAEboK,GAAKpK,GAAKxG,EAAE,YAAY1I,IAAQ,GAAGyc,GAAQxX,EAAI5I,EAAO,CAAC;EACzD,OAAO,AAAIuH,KAAU6C,KACnB6S,GACEpK,GACAhS,EAAKwL,EAAE,QAAQ,EACb,MAAMgU,GACJpV,GAAM1I,EAAM,KAAK6H,IAAQ,EAAE,GAC3BX,GAAK,GACLzB,CACF,EACF,CAAC,GACDrE,IAAQ,GACRyc,GACAxX,EAAI5I,EAAO,CACb;EAIF,IAAIqF,KAAY+E,GAAO;GACrB,IAAI/E,EAAS,SAAS,UAAU;IAC9B,IAAM1E,IAAQ0E,EAAS,SAAS,QAAQ0Y,IAAMC,GACxCpO,IAAI,KAAK,MAAM2E,EAAI9E,EAAM,OAAOpK,EAAS,KAAK,CAAC,IAAI;IACzD,AAAItE,EAAO6O,CAAC,KAAKA,KAAKH,EAAM,OAAOG,KAAKH,EAAM,MAAMA,EAAM,WACxDoD,EAAI,KAAK,GACT,EAAI,cAAclS,GAClB,EAAI,YAAY,KAChBkS,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAU,GACdA,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC,GACnBiD,EAAI,OAAO,GACXA,EAAI,QAAQ,GACZoK,GACEpK,GACAhS,EAAKwE,EAAS,SAAS,QAAQgH,EAAE,WAAWA,EAAE,WAAW,EACvD,OAAOhD,EAAYhE,EAAS,KAAK,EACnC,CAAC,GACD1B,IAAQ,IACRrD,EAAMsP,IAAI,IAAIH,EAAM,MAAM,GAAGA,EAAM,MAAMA,EAAM,SAAS,EAAE,GAC1D9O,GACA,OACF,GACA8a,GACE5I,GACAjD,GACAgM,GAAcvW,EAAS,KAAK,GAC5B1E,GACAD,GAAOC,CAAK,CACd;GAEJ;GAEA,AAAI,CAAC4G,KAAU,CAACC,MACdyV,GAAKpK,GAAKxG,EAAE,WAAW,GAAG+T,GAAQtX,EAAMzE,EAAM,MAAM,GAAI,GAAG,MAAM;EACrE;EAGA,IAAMic,IAAQvE,GAAe;EAC7B,IAAIuE,KAAS/f,KAAK,CAACiH,IAAe;GAChC,IAAM0C,IAAI,KAAK,MAAMH,EAAIuW,EAAM,KAAK,CAAC,IAAI;GAMzC,AALAzN,EAAI,KAAK,GACT,EAAI,cAAc/J,EAAMzE,EAAM,WAAW,GAAI,GAC7C,EAAI,YAAY,GAChBwO,EAAI,YAAY,CAAC,GAAG,CAAC,CAAC,GACtBA,EAAI,UAAU,GACV3I,KAAK,KAAKA,KAAKvG,MACjBkP,EAAI,OAAO3I,GAAG,CAAC,GACf2I,EAAI,OAAO3I,GAAGtG,CAAK;GAErB,IAAMgM,IAAI,KAAK,MAAM0Q,EAAM,CAAC,IAAI;GAUhC,AAREvf,EAAO6O,CAAC,KACRA,KAAK0Q,EAAM,KAAK,OAChB1Q,KAAK0Q,EAAM,KAAK,MAAMA,EAAM,KAAK,WAEjCzN,EAAI,OAAO,GAAGjD,CAAC,GACfiD,EAAI,OAAOlP,GAAOiM,CAAC,IAErBiD,EAAI,OAAO,GACXA,EAAI,QAAQ;GACZ,IAAM0N,IAAUzX,EAAMzE,EAAM,IAAI;GAChC,IACEtD,EAAOuf,EAAM,CAAC,KACdA,EAAM,KAAKA,EAAM,KAAK,OACtBA,EAAM,KAAKA,EAAM,KAAK,MAAMA,EAAM,KAAK,QACvC;IACA,IAAMtO,IAASwO,GAASF,EAAM,KAAK,OAAOA,EAAM,CAAC,GAC3CG,IACJH,EAAM,KAAK,OAAO1gB,IACdgc,GAAczI,GAAWmN,EAAM,KAAK,OAAOtO,CAAM,CAAC,IAClDgB,GAAasN,EAAM,MAAMtO,CAAM;IACrC,GAAUa,GAAKyN,EAAM,GAAGG,GAAWF,GAASzC,CAAK;GACnD;GACA,IAAI5T,KAAK,KAAKA,KAAKvG,KAASyG,GAAO;IACjC,IAAM+T,IAAQkC,GACZpV,GAAMd,GAAOmW,EAAM,KAAK,CAAC,GACzB7W,GAAK,GACLzB,CACF;IACA,EAAI,OAAO0B,GAAKrF,EAAM,UAAU,GAAG;IACnC,IAAMgV,IAAIxG,EAAI,YAAYsL,CAAK,CAAC,CAAC,QAAQ,IACnCnO,IAAO1P,EAAM4J,IAAImP,IAAI,GAAG,GAAGvV,KAAQuV,CAAC;IAO1C,AANAC,GAAUzG,GAAK7C,GAAMpM,IAAQ,GAAGyV,GAAG,IAAI,CAAC,GACxC,EAAI,YAAYkH,GAChB1N,EAAI,KAAK,GACT,EAAI,YAAYiL,GAChB,EAAI,YAAY,UAChB,EAAI,eAAe,UACnBjL,EAAI,SAASsL,GAAOnO,IAAOqJ,IAAI,GAAGzV,IAAQ,EAAE;GAC9C;GAEA,IACErC,EAAQ,cACR4D,KACAmb,EAAM,KAAK,OAAO1gB,KAClBmB,EAAOuf,EAAM,CAAC,KACdpa,OAAS,YACT,CAACZ,KACD8E,GACA;IACA,IACMsW,IAAK/c,IAAQ,KAAO,GACpBgd,IAAKrgB,EACT,KAAK,MAAMggB,EAAM,IAAI,CAAQ,GAC7B7Q,EAAM,MAAM,GACZA,EAAM,MAAMA,EAAM,SAAS,KAAO,CACpC,GACMmR,IAAa7D,GAAWuD,EAAM,KAAK,GACnCzI,IAAO+I,IAAa3B,IAAY,QAAQ,QACxC4B,IAAQzD,GAAasD,GAAIC,GAAI,IAAM,UACvC/Y,EAAK,eAAe;KAAE,OAAOgZ;KAAY;IAAK,CAAC,CACjD;IAYA,AAXAtH,GAAUzG,GAAK6N,GAAIC,GAAI,IAAM,IAAM,CAAC,GACpC,EAAI,YAAYE,IAAQjY,EAAI5I,EAAO,IAAIugB,GACvC1N,EAAI,KAAK,GACT,EAAI,cAAcgO,IAAQngB,GAAOkI,EAAI5I,EAAO,CAAC,IAAI8d,GACjD,EAAI,YAAY,KAChBjL,EAAI,UAAU,GACdA,EAAI,OAAO6N,IAAK,GAAGC,IAAK,CAAQ,GAChC9N,EAAI,OAAO6N,IAAK,KAAO,GAAGC,IAAK,CAAQ,GACvC9N,EAAI,OAAO6N,IAAK,GAAUC,IAAK,CAAC,GAChC9N,EAAI,OAAO6N,IAAK,GAAUC,IAAK,KAAO,CAAC,GACvC9N,EAAI,OAAO,GACPgO,KACF5D,GACEpK,GACAhS,EAAKgX,MAAS,QAAQxL,EAAE,WAAWA,EAAE,WAAW,EAC9C,OAAOhD,EAAYuX,CAAU,EAC/B,CAAC,GACDF,IAAK,GACLC,IAAK,GACL9I,MAAS,QAAQkG,IAAMC,GACvB,OACF;GAEJ;EACF;CACF,GAII8C,KAAY,IAEZxC,KAAgE,CAAC,GAC/DyC,qBAAa,IAAI,IAAuB,GACxCC,qBAAc,IAAI,IAA4B,GAE9CC,MAAa,MAAe;EAChC,IAAI/I,IAAM8I,GAAY,IAAI5T,CAAE;EAsB5B,OArBK8K,MAGH,IAAMxW,GAAK,OAAO;GAChB,UAAU;GACV,MAAM;GACN,SAAS;GACT,eAAe;GACf,YAAY;GACZ,KAAK;GACL,UAAU;GACV,UAAU;GACV,UAAU;GACV,YAAY;GACZ,oBAAoB;GACpB,YAAY;GACZ,eAAe;EACjB,CAAC,GACDO,GAAQ,YAAYiW,CAAG,GACvB8I,GAAY,IAAI5T,GAAI8K,CAAG,IAElBA;CACT,GAEMgJ,MACJ,GACA,GACA,GACA,MACG;EACH,IAAM7C,IAAM3c,GAAK,OAAO;GACtB,SAAS;GACT,UAAU;GACV,YAAY;GACZ,WAAW;GACX,UAAU;GACV,UAAU;GACV,WAAW;GACX,SAAS;GACT,cAAc;GACd,YACE;EACJ,CAAC,GACGyf,IAAmC;EACvC,IAAIrX,GA2BF,AA1BA,IAASpI,GAAK,UAAU;GACtB,KAAK;GACL,QAAQ;GACR,eAAe;GACf,OAAO;GACP,YAAY;GACZ,cAAc;GACd,GAAGT;EACL,CAAC,GACD,EAAO,OAAO,UACd,EAAO,cAAcoe,GACrB8B,EAAO,aACL,cACAtgB,EAAKyH,GAAO,CAAC,CAAC,iBAAiB,EAAE,MAAM+W,EAAM,CAAC,CAChD,GACA8B,EAAO,iBAAiB,UAAU,MAAU;GAC1C,EAAM,gBAAgB;GACtB,IAAM1U,IAAO,CAAC5C,GAAUC,CAAK;GAI7B,AAHA9G,GAAW,IAAI8G,EAAM,IAAI2C,CAAI,GAC7B7E,EAAK,mBAAmB;IAAE,IAAIkC,EAAM;IAAI,SAAS2C;GAAK,CAAC,GACvD2U,GAAc,GACdpU,EAAW;EACb,CAAC,GACDmU,EAAO,iBAAiB,gBAAgB,MACtCpZ,EAAM,gBAAgB,CACxB,GACAsW,EAAI,YAAY8C,CAAM;OACjB,IAAI9B,GAAO;GAChB,IAAMlB,IAAQzc,GAAK,QAAQ;IAAE,YAAY;IAAO,GAAGT;GAAS,CAAC;GAE7D,AADA,EAAM,cAAcoe,GACpBhB,EAAI,YAAYF,CAAK;EACvB;EACA,IAAM5S,IAA4B,CAAC;EACnC,KAAK,IAAIlB,IAAI,GAAGA,IAAIgX,GAAS,KAAK;GAChC,IAAMzW,IAAOlJ,GAAK,QAAQT,EAAQ;GAElC,AADAod,EAAI,YAAYzT,CAAI,GACpBW,EAAO,KAAKX,CAAI;EAClB;EAEA,OADAsN,EAAI,YAAYmG,CAAG,GACZ;GAAE;GAAK;GAAQ;EAAO;CAC/B,GAEMiD,WAAqB;EACzB,GAAW,MAAM;EACjB,KAAK,IAAMpJ,KAAO8I,GAAY,OAAO,GAAG,EAAI,OAAO;EAEnD,IADAA,GAAY,MAAM,GACdzf,EAAQ,WAAW,IAAO;EAC9B,IAAMggB,IAAWN,GAAUrhB,CAAK,GAC1B4hB,IAAO,CACXjgB,EAAQ,QACRA,EAAQ,QAAQ,cACb,OAAOA,EAAQ,aAAc,WAAWA,EAAQ,YAAY,GACjE,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,KAAK;EACb,GAAW,IAAI,QAAQ2f,GAAUK,GAAUC,GAAM,MAAM,CAAC,CAAC;EACzD,KAAK,IAAM1X,KAAShH,GAAS;GAC3B,IAAM2e,IAAQ3X,EAAM,cAAc,IAAIA,EAAM,QAAQ;GACpD,AAAIA,EAAM,WAAWA,EAAM,SAAS,WAClCiX,GAAW,IAAIjX,EAAM,IAAIoX,GAAUK,GAAUG,GAAQ5X,CAAK,GAAGA,GAAO,CAAC,CAAC,IAC7DA,EAAM,WACfiX,GAAW,IACTjX,EAAM,IACNoX,GAAUK,GAAUG,GAAQ5X,CAAK,GAAGA,GAAO2X,CAAK,CAClD;EAEJ;EACA,KAAK,IAAMtV,KAAKlJ,IACd,GAAW,IAAI,WAAWkJ,EAAE,MAAM+U,GAAUK,GAAU,IAAI,MAAM,CAAC,CAAC;EACpE,KAAK,IAAMzX,KAAShH,GAClB,AAAIgH,EAAM,WACViX,GAAW,IACTjX,EAAM,IACNoX,GACED,GAAUnX,EAAM,EAAE,GAClB4X,GAAQ5X,CAAK,GACbA,GACAA,EAAM,cAAc,IAAIA,EAAM,QAAQ,MACxC,CACF;CAEJ,GAGM4X,MAAW,MACf5X,EAAM,SAAS,WACXxB,GAAO,CAAC,CAAC,SACTwB,EAAM,WACJ,GAAGxB,GAAO,CAAC,CAACwB,EAAM,UAAU,GAAGA,EAAM,UACrCA,EAAM,OAER6X,MACJ,GACA,GACA,MACG;EACH,IAAI,CAAC/W,GAAM;EACX,AAAIA,EAAK,gBAAgB+Q,MAAM,EAAK,cAAcA;EAClD,IAAMxP,IAAIxL,KAAS;EACnB,AAAIiK,EAAK,MAAM,UAAUuB,MAAG,EAAK,MAAM,QAAQA;CACjD,GAEMiV,WAAsB;EAC1B,IAAM9X,IAAM;GACV/H,EAAQ,WAAW;GACnBA,EAAQ;GACRA,EAAQ;GACR,GAAGuB,EAAQ,KAAK,MAAM,GAAGuK,EAAE,GAAG,GAAGqU,GAAQrU,CAAC,EAAE,GAAGA,EAAE,QAAQ,QAAQ;GACjE,GAAGpK,GAAS,KAAK,MAAMkJ,EAAE,EAAE;GAC3BjE,GAAM;GACN3G,EAAQ,QAAQ;EAClB,CAAC,CAAC,KAAK,GAAG;EAKV,IAJI+H,MAAQwX,OACV,KAAYxX,GACZgY,GAAa,IAEX/f,EAAQ,WAAW,IAAO;EAC9B,KAAK,IAAMqQ,KAAQ5N,GAAO;GACxB,IAAMkU,IAAM8I,GAAY,IAAIpP,EAAK,EAAE;GACnC,IAAI,CAACsG,GAAK;GACV,EAAI,MAAM,MAAM,GAAGtG,EAAK,MAAM,EAAE;GAEhC,IAAMgQ,IAAW,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMje,IAAQ,EAAE,CAAC,EAAE;GACzD,AAAIuU,EAAI,MAAM,aAAa0J,MAAU,EAAI,MAAM,WAAWA;GAC1D,IAAMC,IAAY,GAAG,KAAK,IAAI,IAAI,KAAK,MAAMjQ,EAAK,SAAS,EAAE,CAAC,EAAE;GAChE,AAAIsG,EAAI,MAAM,cAAc2J,MAAW,EAAI,MAAM,YAAYA;EAC/D;EACA,IAAMN,IAAWP,GAAY,IAAIphB,CAAK,GAChCkiB,IAAWP,IACb,MAAM,KACJA,EAAS,WACR,OAAS;GACR,OAAOA,EAAS,aAAalD,EAAI,aAAaA,EAAI;GAClD,KAAKkD,EAAS,YAAYlD,EAAI;GAC9B,QAAQkD,EAAS,YAAYlD,EAAI,YAAYA,EAAI;EACnD,EACF,IACA,CAAC,GAGC0D,IACJD,EAAS,WAAWxD,GAAY,UAChCwD,EAAS,MAAM,GAAK,MAAM;GACxB,IAAMtT,IAAS8P,GAAYjU;GAC3B,OACE,CAACmE,KACDA,EAAO,UAAU6P,EAAI,SACrB7P,EAAO,QAAQ6P,EAAI,OACnB7P,EAAO,WAAW6P,EAAI;EAE1B,CAAC;EAEH,AADA,KAAcyD,GACVC,KAAO/U,EAAW;EACtB,IAAM5C,IAAQ7B,EAAE,GACV+X,IAAQvE,GAAe,GACvB/R,IAAQ1J,EACZggB,KAASA,EAAM,SAAS,KAAKA,EAAM,QAAQlW,IACvCkW,EAAM,QACNlW,IAAQ,GACZ,GACA,KAAK,IAAI,GAAGA,IAAQ,CAAC,CACvB,GACMiC,IAAI/D,GAAO,GACX0O,IAAO+J,GAAW,IAAI,MAAM,GAC5BhD,IAAMnV,EAAIF,GAAM,CAAC,GACjBsV,IAAQpV,EAAID,GAAQ,CAAC;EAC3B,IAAIqO,KAAQ5M,GAAO;GACjB,IAAMwD,IAAI9B,GAAQ,GACZ0L,IAAI5J,EAAE,KAAK5D,IACXmC,IAAIyB,EAAE,MAAM5D,IACZgY,IAAYhY,IAAQ,IAAI4D,EAAE,MAAM5D,IAAQ,KAAKwN,GAC7CyK,IAAS9V,IAAI6V,GACbrhB,IAAQwL,KAAKqL,IAAIuG,IAAMC,GACvBpT,IAAOoM,EAAK,OAAO,IACnBkL,IAAO;IACX,CAAC7V,EAAE,MAAMuB,EAAE,KAAK5D,EAAM;IACtB,CAACqC,EAAE,MAAMuB,EAAE,KAAK5D,EAAM;IACtB,CAACqC,EAAE,KAAKuB,EAAE,IAAI5D,EAAM;IACpB,CAACqC,EAAE,OAAOF,CAAC;GACb,CAAC,CACE,KACE,CAACgW,GAAMpZ,OACN,gBAAgB7H,GAAK,4DAA4DkhB,GAAW,OAAOD,CAAI,CAAC,EAAE,4BAA4BxhB,EAAM,IAAIyhB,GAAW/Y,EAAYN,CAAe,CAAC,EAAE,eAC7L,CAAC,CACA,KAAK,EAAE,GACJsZ,IAAML,IAAaC,IAASD,IAAa,MAAM,KAQ/CvV,IAAO,GAAGyV,IAAO,gBAJYhhB,GAAK,IAHrBmL,EAAE,SACjB,2DAA2D+V,GAAW/V,EAAE,MAAM,EAAE,WAChF,GACmD,qBAAqB4V,KAAU,IAAIlE,IAAMC,EAAM,IAAIiE,KAAU,IAAI,MAAM,MAAMG,GAAW/Y,EAAY,KAAK,IAAI4Y,CAAM,CAAC,CAAC,EAAE,IAAIG,GAAWnP,GAAcoP,GAAKra,CAAM,CAAC,EAAE,mBAC7MzF,EAAM,YACd,gBAAgBrB,GAAK,4DAA4DkhB,GAAW/V,EAAE,MAAM,EAAE,SAAS+V,GAAWhP,GAAa7Q,EAAM,OAAOyH,IAAQhC,CAAM,CAAC,EAAE,WACrK;GAEJ,AAAI4C,KAAQA,EAAK,QAAQ,SAAS6B,MAChC,EAAK,YAAYA,GACjB,EAAK,QAAQ,OAAOA,GACpB,EAAK,MAAM,UAAU,eACrB,EAAK,MAAM,YAAY,OACvB,EAAK,MAAM,WAAW;EAE1B;EACA,KAAK,IAAM3C,KAAShH,GAAS;GAC3B,IAAMub,IAAM0C,GAAW,IAAIjX,EAAM,EAAE;GACnC,IAAI,CAACuU,GAAK;GACV,IAAMiE,IAAQzY,GAAUC,CAAK;GAE7B,AADA,EAAI,IAAI,MAAM,UAAUwY,IAAQ,MAAM,OAClCjE,EAAI,WACNA,EAAI,OAAO,aAAa,gBAAgB,OAAOiE,CAAK,CAAC,GACrD,EAAI,OAAO,MAAM,iBAAiBA,IAAQ,SAAS;GAErD,IAAMb,IAAQ3X,EAAM,QAAQ;GAC5B,IAAIA,EAAM,aAAa;IAErB,IAAM6B,IAAM7B,EAAM,QAAQ,MAAM,MAAM/I,EAAOyW,EAAE,OAAOxN,EAAM,CAAC;IAC7D,GACEqU,EAAI,OAAO,IACXiE,KAASlY,KAASuB,IAAM2H,GAAexJ,GAAO6B,EAAI,OAAO3B,EAAM,IAAI,IACnE2B,IAAM/C,EAAIuC,GAAQQ,EAAI,KAAK,CAAC,IAAI,KAAA,CAClC;IACA;GACF;GACA,EAAM,QAAQ,SAAS,GAAK,MAAM;IAEhC,IAAMf,IACJyT,EAAI,OAAOvU,EAAM,SAAS,UAAUO,IAAIoX,IAAQ,KAAKA,IAAQpX;IAC/D,IAAI,CAACiY,KAAS,CAAClY,GAAO;KACpB,GAAQQ,GAAM,EAAE;KAChB;IACF;IACA,IAAIe,EAAI,SAAS,UAAU;KACzB,IAAMQ,IAAI5J,EAAM,MAAMyH,MAAUzH,EAAM,KAAKyH,KAAS+T,IAAMC;KAC1D,GAAQpT,GAAMwI,GAAa7Q,EAAM,OAAOyH,IAAQhC,CAAM,GAAGmE,CAAC;KAC1D;IACF;IAEA,IAAMoW,IAASvY,IAAQ2B,EAAI,OACrB5C,IAAQwZ,KAAU,KAAKA,IAASnY,IAAQuB,EAAI,OAAO4W,KAAU,KAC/D5hB,IAAQgL,EAAI,QAAQ/C,EAAIuC,GAAQQ,EAAI,KAAK,CAAC,IAAI,KAAA;IAElD,AADIA,EAAI,SAAS,gBAAa,IAAQ5C,KAAS,IAAIgV,IAAMC,IACrDrS,EAAI,SAAS,UAAU,CAACA,EAAI,UAC9B,IAAQ5C,KAASxG,EAAM,MAAMyH,KAAS+T,IAAMC;IAC9C,IAAMwE,IACJ1Y,EAAM,QAAQ,SAAS,KAAK,CAACA,EAAM,cAAc,GAAG6B,EAAI,MAAM,KAAK;IACrE,GAAQf,GAAM,GAAG4X,IAASlP,GAAexJ,GAAOf,CAAK,KAAKpI,CAAK;GACjE,CAAC;EACH;EACA,KAAK,IAAMwL,KAAKlJ,IAAU;GACxB,IAAMob,IAAM0C,GAAW,IAAI,WAAW5U,EAAE,IAAI;GAC5C,IAAI,CAACkS,GAAK;GACV,IAAMtV,IAAQoD,EAAE,OAAOnC,IACjB8G,IAAOF,GAAYzE,CAAC,GACpBkW,IAAMthB,EAAO+P,CAAI,KAAK/H,IAAQ+H,IAAO,KAAK,MAAM;GACtD,GACEuN,EAAI,OAAO,IACX,GAAGlS,EAAE,KAAK,GAAG9C,EAAYN,CAAK,EAAE,GAAGkK,GAAcoP,GAAKra,CAAM,KAC5DY,EAAIuD,EAAE,KAAK,CACb;EACF;CACF,GAEMiW,MAAc,MAClBzG,EAAK,QAAQ,YAAY,MACvB8G,MAAO,MACH,UACAA,MAAO,MACL,SACAA,MAAO,MACL,SACA,QACV,GAIIzV,UAAmB;EACvB,AAAIvL,MAAakD,OACjB,KAAUrD,IAAK,wBACXA,GAAI,sBAAsBohB,EAAK,IAC9B,iBAAiBA,GAAM,KAAK,IAAI,CAAC,GAAG,EAAE;CAC7C,GAEMC,MAAW,MAAgB;EAC/B,IAAIC,IAAS;EACb,IAAIld,IAAY;GACd,IAAM8E,IAAI,KAAK,IAAI,IAAIqY,IAAMnd,GAAW,SAAS,GAAG,GAC9Cod,IAAQ,KAAK,IAAItY,MAAM;GAE7B,AADA,IAAQ9E,GAAW,QAAQA,GAAW,KAAKA,GAAW,QAAQod,GAC1DtY,KAAK,IAAG,KAAa,OACpB,IAAS;EAChB;EACA,IAAI/E,IAAS;GACX,IAAMsd,IAAK,KAAK,IAAI,IAAIF,IAAMpd,GAAQ,CAAC;GACvC,GAAQ,IAAIod;GACZ,IAAMrU,IAAS9K;GAIf,AAHA,KAAU+B,GAAQ,IAAIsd,IAAMtf,GAC5B,GAAQ,KAAK,KAAK,IAAI,CAACsf,IAAK,GAAG,GAC/BlT,GAAU,GACN,KAAK,IAAIpK,GAAQ,CAAC,IAAI,OAAQ/B,MAAU8K,IAAQ,KAAU,OACzD,IAAS;EAChB;EACA,OAAOoU;CACT,GAEMI,MAAe,MAAkC;EACrD,EAAI,OAAOtZ,GAAKrF,EAAM,UAAU,GAAG;EACnC,IAAI4e,IAAS;EACb,KAAK,IAAMrR,KAAQ5N,GACjB,KAAK,IAAMwG,KAAKoH,EAAK,OACnB,IAAS,KAAK,IAAIqR,GAAQpQ,EAAI,YAAYG,GAAapB,GAAMpH,CAAC,CAAC,CAAC,CAAC,KAAK;EAE1E,IAAMJ,IAAQ7B,EAAE;EAChB,AAAI6B,MACF,IAAS,KAAK,IACZ6Y,GACApQ,EAAI,YAAY+I,GAAcrZ,EAAM,MAAM6H,IAAQ,EAAE,CAAC,CAAC,CAAC,KACzD,GACI7I,EAAQ,cACV,IAAS,KAAK,IAAI0hB,GAAQpQ,EAAI,YAAY,UAAU,CAAC,CAAC,KAAK;EAE/D,IAAM9D,IAAS,KAAK,IAAItP,IAAU,KAAK,KAAKwjB,IAAS,EAAE,CAAC;EAExD,CAAIlU,IAASlL,MAASkL,IAASlL,KAAQ,QAAI,KAAQkL;CACrD;CAEA,SAAS2T,GAAM,GAAc;EAK3B,IAJA,KAAU,GACNjhB,OACJ,KAAQI,EAAK,aACb,KAASA,EAAK,cACViC,MAAS,KAAKC,MAAU,IAAG;EAE/B,IAAMmf,IAAYP,GAChB,OAAO,cAAgB,MAAc,YAAY,IAAI,IAF1CE,KAAO,KAAK,IAAI,CAG7B,GACM5O,IAAM3S,IAAK,oBAAoB;EAGrC,AAFAiL,GAAY,GACZ6M,GAAWrX,IAAYkS,CAAG,GAC1BmF,GAAWpX,IAAYiS,CAAG;EAC1B,IAAMH,IAAK/R,GAAW,WAAW,IAAI,GAC/BohB,IAAKnhB,GAAW,WAAW,IAAI;EACrC,IAAQ,KAAK,IAAI,GAAG+B,KAASvE,EAAS;EACtC,KAAK,IAAI4jB,IAAO,GAAGA,IAAO,GAAG,KAAQ;GAMnC,AALA,IAAQ,KAAK,IAAI,GAAGtf,KAAQD,EAAK,GACjC+K,GAAY,GACRjJ,MAAc0d,GAAW1d,EAAY,GACzCkK,GAAU,GACV,KAAME,GAAe,GACrB4B,GAAUxN,EAAG;GACb,KAAK,IAAMyN,KAAQ5N,GAAO;IACxB,IAAMsT,IAAQgM,GAAW1R,EAAK,OAAOA,EAAK,OAAOhS,IAAQ,KAAK,EAAE,GAE1DyR,IAAQO,EAAK,OAAO,OACpB2R,IAAQ3R,EAAK,OAAO;IAK1B,AAJA,EAAK,QACHP,KAASkS,IACL,CAAC,GAAGA,IAAQlS,EAAM,KAAKA,EAAM,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM5D,IAAIC,CAAC,IAC1D4J,EAAM,QACZ,EAAK,OAAOA,EAAM;GACpB;GACA,IAAM9I,IAAS3K;GAEf,IADIsf,KAAIH,GAAYG,CAAE,GAClBtf,OAAU2K,GAAQ;EACxB;EACA,IAAMjO,IAAI4D;EACV,KAAe;EACf,IAAMmT,IAAQ6L,IAAKhR,GAAU5R,GAAG4iB,CAAE,IAAI,CAAC;EA0BvC,AAzBAnK,GAAWzY,GAAG0T,CAAG,GACbH,MACFA,EAAG,aAAaG,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACpCH,EAAG,UAAU,GAAG,GAAGhQ,IAAOC,EAAM,GAChCsX,GAAgBvH,GAAIvT,GAAG+W,CAAK,IAE1B6L,MACFA,EAAG,aAAalP,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC,GACpCkP,EAAG,UAAU,GAAG,GAAGrf,IAAOC,EAAM,GAChC6Z,GAAgBuF,GAAI5iB,GAAG+W,CAAK,IAE9B8J,GAAc,GACdoC,GAAW,GACXC,GAAc,GACdC,GAAe,GACfC,GAAS,GAGPxe,KACA,CAACG,KACDse,GAASze,EAAQ,GAAGA,EAAQ,CAAC,MAAM6B,OAEnC6c,GAAa1e,EAAQ,GAAGA,EAAQ,CAAC,GACjC6H,EAAW,IAETkW,KAAWlW,EAAW;CAC5B;CAEA,IAAMwW,WAAmB;EACvB,IAAMpZ,IAAQ7B,EAAE,GACVkH,IAAQzL,EAAM,IACd8f,IAAO1Z,IAAQ,KAAKqF,KAAS1F,EAAIK,IAAQ,CAAC,IAAIzG,IAAQF,IAAU;EAEtE,IADA,GAAK,MAAM,UAAUqgB,IAAO,SAAS,QACjCA,KAAQrU,GAAO;GAEjB,AADA,GAAK,MAAM,OAAO,GAAG9L,IAAQ,GAAG,KAChC,GAAK,MAAM,MAAM,GAAG8L,EAAM,MAAMA,EAAM,SAAS,GAAG;GAClD,IAAMkM,IAAOrT,GAAO,CAAC,CAAC;GACtB,AAAIpG,GAAK,aAAa,YAAY,MAAMyZ,MACtCzZ,GAAK,aAAa,cAAcyZ,CAAI,GACpC,GAAK,QAAQA;EAEjB;CACF,GAEMoI,WAA0C;EAC9C,IAAM/X,IAAOtI,IAAQC,IAAQF;EAC7B,OAAO;GAAE;GAAM,IAAIC;GAAO,UAAUyG,GAAO6B,CAAI;GAAG,QAAQ7B,GAAOzG,CAAK;EAAE;CAC1E,GAEMigB,WAAiB;EACrB,IAAMvZ,IAAQ7B,EAAE;EAChB,IAAI,CAAC6B,GAAO;EACZ,IAAMiH,IAAQ0S,GAAa;EAU3B,CARE,CAAC9c,MACD,KAAK,IAAIA,GAAU,OAAOoK,EAAM,IAAI,IAAI,QACxC,KAAK,IAAIpK,GAAU,KAAKoK,EAAM,EAAE,IAAI,UAEpC,KAAYA,GACPnK,MAAaU,EAAK,sBAAsByJ,CAAK,IAEpD,KAAc,IACVA,EAAM,OAAO,MAAMhK,OAAiB9E,EAAM,KAAK,OACjD,KAAeA,EAAM,KAAK,IAC1BqF,EAAK,kBAAkB;GAAE,WAAWrF,EAAM,KAAK;GAAI;EAAM,CAAC;EAE5D,IAAM+d,IAAQvE,GAAe,GAEvB0B,IAAM6C,MAAUnb,KAAWC,MAAkB,QAAQkb,IAAQ,MAC7DhX,IAAMmU,IAAM,GAAGA,EAAI,MAAM,GAAGA,EAAI,MAAM,GAAGA,EAAI,KAAK,OAAO;EAC/D,IAAInU,MAAQlC,IAAe;GAEzB,IADA,KAAgBkC,GACZ,CAACmU,GACH,EAAK,iBAAiB,IAAI;QACrB;IACL,IAAM1V,IAA+B;KACnC,OAAO0V,EAAI;KACX,MAAMtT,GAAOsT,EAAI,KAAK;KACtB,KACEA,EAAI,SAAS,KAAKA,EAAI,QAAQrT,IAC1B4Z,GAAQzhB,GAAOkb,EAAI,KAAK,IACxB;KACN,OAAOA,EAAI;KACX,MAAMA,EAAI,KAAK;KACf,GAAG1T,EAAI0T,EAAI,KAAK;KAChB,GAAGA,EAAI;IACT;IACA,EAAK,iBAAiB1V,CAAK;GAC7B;EACF;CACF,GAIMkc,MAAS,MAAgD;EAC7D,IAAMC,IAAOriB,EAAK,sBAAsB;EACxC,OAAO;GAAE,GAAGkG,EAAM,UAAUmc,EAAK;GAAM,GAAGnc,EAAM,UAAUmc,EAAK;EAAI;CACrE,GAEMb,MAAc,MAAwC;EAG1D,AAFA,IAAU1f,KAAS0N,EAAM,KAAKA,EAAM,OACpC,IAAQA,EAAM,IACdxB,GAAU;CACZ,GAOMsU,MAAU,GAAW,MAAmB;EAC5C,IAAM/Z,IAAQ7B,EAAE;EAChB,AAAI6B,KAASyD,GAAgB,MAAG,IAAI,KAAK,IAAIlK,GAAOoG,EAAIK,IAAQ,CAAC,CAAC;EAClE,IAAM2U,IAAS9U,GAAQC,CAAC;EAOxB,AANA,KAAoBka,GACpBvU,GAAU,GACV,IAAQkP,KAAUpb,IAAQuG,KAAKzG,GAC/BoM,GAAU,GACV,KAAU,MACV,KAAa,MACb7C,EAAW;CACb,GAEMqX,MAAY,GAAW,GAAW,MAAoC;EAC1E,IAAMra,IAAQ,KAAK,MAAMC,GAAQC,CAAC,CAAC;EACnC,OAAO;GAAE,MAAMC,GAAOH,CAAK;GAAG,OAAOiS,GAAQrK,EAAK,OAAOhC,CAAC;EAAE;CAC9D,GAEM0U,MAAW,GAA0B,MAAoB;EAC7D,AAAI7X,MAASvG,OACb,KAAOuG,GACP,IAAQ,MACR,KAAc,GACV8X,KAAQ3c,EAAK,qBAAqB6E,CAAI,GAC1CO,EAAW;CACb,GAEMwX,MAAU,MAAsB;EACpC,AAAIpX,MAAOjH,OACX,KAAWiH,GACX,KAAc,IACdxF,EAAK,iBAAiBwF,CAAE,GACxBJ,EAAW;CACb,GAIMyX,YAAqC;EACzC,SAAS1e,GAAU,SAAS;EAC5B,SAASC,GAAU,SAAS;CAC9B,IAEM0e,WAAiB;EACrB,IAAMC,IAAQF,GAAU,GAClBnb,IAAM,GAAGqb,EAAM,QAAQ,GAAGA,EAAM;EACtC,AAAIrb,MAAQrD,OACZ,KAAUqD,GACV1B,EAAK,cAAc+c,CAAK;CAC1B,GAGMC,MAAkB,GAAiC,IAAS,OAAS;EAczE,AAbInY,MAAS3G,OACXC,GAAU,KAAKD,EAAS,GACpBC,GAAU,SAAS9F,MAAe8F,GAAU,MAAM,GACtD,GAAU,SAAS,GACnB,KAAY0G,IAEd,IAAWA,GACP8X,MACF,KAAkB9X,GAClB7E,EAAK,kBAAkB6E,CAAI,IAEzBtG,MAAY,CAACsG,EAAK,MAAM,MAAMmB,EAAE,OAAOzH,EAAQ,KAAGqe,GAAO,IAAI,GACjEE,GAAS,GACT1X,EAAW;CACb,GAGM6X,MAAmB,MAAoC;EAQ3D,AAPA,KAAYpY,GACZ,IAAWA,GACX,KAAkBA,GAClB,IAAQ,MACJtG,MAAY,CAACsG,EAAK,MAAM,MAAMmB,EAAE,OAAOzH,EAAQ,KAAGqe,GAAO,IAAI,GACjE5c,EAAK,kBAAkB6E,CAAI,GAC3BiY,GAAS,GACT1X,EAAW;CACb,GAEM8X,WAAa;EACjB,IAAMC,IAAWhf,GAAU,IAAI;EAC/B,AAAKgf,MACDre,MAASse,GAAY,EAAK,GAC9Bhf,GAAU,KAAKF,EAAS,GACxB+e,GAAgBE,CAAQ;CAC1B,GAEME,WAAa;EACjB,IAAMxY,IAAOzG,GAAU,IAAI;EAC3B,AAAKyG,MACL1G,GAAU,KAAKD,EAAS,GACxB+e,GAAgBpY,CAAI;CACtB,GAEMyY,MAAiB,GAAY,MAA+B;EAChE,AAAKtf,EAAS,MAAM,MAAMgI,EAAE,OAAOR,CAAE,KACrCwX,GACEhf,EAAS,KAAK,MACZgI,EAAE,OAAOR,IAAK;GAAE,GAAGQ;GAAG,GAAGuX;GAAO,IAAIvX,EAAE;GAAI,MAAMA,EAAE;EAAK,IAAIA,CAC7D,CACF;CACF,GAEMwX,MAAiB,MAAe;EACpC,AAAKxf,EAAS,MAAM,MAAMgI,EAAE,OAAOR,CAAE,MACjCjH,OAAaiH,KAAIoX,GAAO,IAAI,GAChCI,GAAehf,EAAS,QAAQ,MAAMgI,EAAE,OAAOR,CAAE,CAAC;CACpD,GAGMiY,MACJ,GACA,GACA,MAC0B;EAC1B,IAAMzV,IAAI2E,EAAI3C,EAAK,OAAO0T,EAAM,KAAK,GAC/BC,IAAO,KAAK,IAAI,IAAI3T,EAAK,SAAS,GAAI,GACtC4T,IAASvJ,GAAQrK,EAAK,OAAOhC,KAAK6V,IAAO,KAAK,KAAKF,CAAI,GACvDG,IAAOzJ,GAAQrK,EAAK,OAAOhC,KAAK6V,IAAO,IAAI,MAAMF,CAAI,GACrDvX,IAAO,KAAK,IAAI,GAAG,KAAK,MAAOrK,IAAQ,MAAQF,CAAO,CAAC,GACvDwc,IAAM9V,GAAO,KAAK,MAAMyB,GAAe0Z,EAAM,IAAI,CAAC,IAAItX,CAAI;EAChE,OAAO;GACLsX;GACA;IAAE,MAAMrF;IAAK,OAAOlD,GAAWyI,CAAM;GAAE;GACvC;IAAE,MAAMvF;IAAK,OAAOlD,GAAW2I,CAAI;GAAE;EACvC;CACF,GAEMC,WAAoB;EACxB,IAAI,CAACtf,GAAO;EACZ,IAAMuf,IAAOvf;EAMb,AALA,IAAQ,MACR,KAAc,GACdue,GAAe,CAAC,GAAGhf,GAAUggB,CAAI,CAAC,GAClCpB,GAAOoB,EAAK,EAAE,GACTrkB,EAAQ,mBAAiB+iB,GAAQ,UAAU,EAAI,GAChDsB,EAAK,SAAS,UAAQC,GAAWD,EAAK,IAAI,EAAI;CACpD,GAGME,WAAuB;EAC3B,IAAI,CAACzf,GAAO;EAEZ,IADA,MACIC,MAAe,GAAG;GACpB,GAAY;GACZ;EACF;EACA,IAAMuF,IAAOxF,EAAM,OAAOA,EAAM,OAAO,SAAS;EAChD,AAAIwF,MAAM,IAAQ;GAAE,GAAGxF;GAAO,QAAQ,CAAC,GAAGA,EAAM,QAAQwF,CAAI;EAAE;CAChE,GAGMka,MAAe,GAAW,MAAc;EAC5C,IAAMnU,IAAOwK,GAAO7V,EAAS;EAC7B,AAAI,CAACF,KAAS,CAACuL,KAAQtL,MAAe,MACtC,IAAQ;GACN,GAAGD;GACH,QAAQ,CAAC,GAAGA,EAAM,OAAO,MAAM,GAAG,EAAE,GAAGge,GAASna,GAAG0F,GAAGgC,CAAI,CAAC;EAC7D;CACF,GAEMoU,MAAW,GAAW,MAAc;EACxC,IAAMvW,IAAQzL,EAAM;EACpB,IAAI,CAACyL,KAASvF,IAAIvG,GAAO,OAAO;EAChC,KAAK,IAAM+R,KAAQnU,EAAQ,cAAc,CAAC,GACxC,IAAKmU,EAAK,aACN,KAAK,IAAInB,EAAI9E,EAAM,OAAOqM,GAAUpG,CAAI,CAAC,IAAI9F,CAAC,KAAK,GAAG,OAAO8F;EAEnE,OAAO;CACT,GAEMuQ,MAAgB,GAAW,MAAc;EAC7C,IAAI/b,IAAIvG,GAAO,OAAO;EACtB,IAAMiO,IAAOjC,GAAOC,CAAC,GACf4N,IAASnB,GAAczK,CAAI;EACjC,IAAI,CAACA,KAAQ,CAAC4L,GAAQ,OAAO;EAC7B,KAAK,IAAI,IAAI5X,EAAS,SAAS,GAAG,KAAK,GAAG,KAAK;GAC7C,IAAM4L,IAAU5L,EAAS;GACzB,IAAI,CAAC4L,MAAYA,EAAQ,QAAQ5R,OAAWgS,EAAK,IAAI;GACrD,IAAMsU,IAAMC,EACV3U,GACAgM,GACA;IAAE;IAAG;GAAE,GACP,GACA/W,GAAU,IAAI+K,EAAQ,EAAE,CAC1B;GACA,IAAI0U,GAAK,OAAO;IAAE;IAAS;IAAK;GAAK;EACvC;EACA,OAAO;CACT,GAEMtC,MAAY,GAAW,MAC3B7c,GAAc,WACX,MAAMmD,KAAKwD,EAAE,KAAKxD,KAAKwD,EAAE,IAAIA,EAAE,KAAKkC,KAAKlC,EAAE,KAAKkC,KAAKlC,EAAE,IAAIA,EAAE,CAChE,GAEI0Y,MAAe,MAAc;EACjC,KAAK,IAAI/b,IAAI,GAAGA,IAAIrG,EAAM,QAAQ,KAChC,IAAI,KAAK,IAAIA,EAAMqG,EAAE,CAAC,MAAMuF,CAAC,KAAK,GAAG,OAAOvF;EAE9C,OAAO;CACT,GAIMgc,WAAuB;EAE3B,AADA,EAAO,MAAM,SAAS,QACtB,EAAO,MAAM,SAAS,GAAG,KAAK,IAAI,IAAIhkB,EAAO,eAAe,CAAC,EAAE;CACjE,GAEMqhB,WAAuB;EAC3B,IAAI,CAAChd,IAAS;EACd,IAAM0G,IAAK1G,GAAQ,IACb8K,IAAU5L,EAAS,MAAM,MAAMgI,EAAE,OAAOR,CAAE,GAC1CwE,IAAOJ,IAAU4K,GAAO5K,EAAQ,IAAI,IAAI,MACxCuN,IAASvN,GAAS,OAAO;EAC/B,IAAI,CAACA,KAAW,CAACI,KAAQ,CAACmN,GAAQ;EAClC,IAAM7U,IAAIH,EAAI6B,GAAemT,EAAO,IAAI,CAAC,GACnCnP,IAAI2E,EAAI3C,EAAK,OAAOmN,EAAO,KAAK;EAEtC,AADA,EAAO,MAAM,OAAO,GAAGze,EAAM4J,GAAG,GAAG,KAAK,IAAI,GAAGvG,IAAQ,GAAG,CAAC,EAAE,KAC7D,EAAO,MAAM,MAAM,GAAGrD,EAAMsP,GAAG,GAAG,KAAK,IAAI,GAAGhM,IAAQ,EAAE,CAAC,EAAE;CAC7D;CAEA,SAASiiB,GAAW,GAAY,GAAkB;EAChD,IAAMrU,IAAU5L,EAAS,MAAM,MAAMgI,EAAE,OAAOR,CAAE;EAChD,AAAKoE,KAAW,GAAQ,WACxB,KAAU;GAAE;GAAI;EAAQ,GACxB,EAAO,QAAQ8U,IAAU,KAAM9U,EAAQ,QAAQ,IAC/C,EAAO,cAAclJ,GAAO,CAAC,CAAC,MAC9BjG,EAAO,aAAa,cAAciG,GAAO,CAAC,CAAC,QAAQ,GACnD,EAAO,MAAM,UAAU,SACvBob,GAAe,GACf2C,GAAe,GACfhkB,EAAO,MAAM,GACbA,EAAO,OAAO,GACd2K,EAAW;CACb;CAEA,SAASgY,GAAY,GAAiB;EACpC,IAAI,CAACte,IAAS;EACd,IAAM,EAAE,OAAI,eAAYA;EAExB,AADA,KAAU,MACV,EAAO,MAAM,UAAU;EACvB,IAAMiV,IAAOtZ,EAAO,MAAM,QAAQ,QAAQ,EAAE,GACtCmP,IAAU5L,EAAS,MAAM,MAAMgI,EAAE,OAAOR,CAAE;EAChD,IAAIoE,KAAW8U,MAAY,CAACC,KAAU,CAAC5K,IAAO;GAE5C,IAAMoJ,IAAWhf,GAAU,IAAI;GAC/B,GAAgBgf,KAAYnf,EAAS,QAAQ,MAAMgI,EAAE,OAAOR,CAAE,CAAC;EACjE,OAAO,IAAIoE,KAAW+U,KAAU5K,OAAUnK,EAAQ,QAAQ,KAAK;GAC7D,IAAI8U,GAAS;IAEX,IAAM7Z,IAAO7G,EAAS,KAAK,MAAOgI,EAAE,OAAOR,IAAK;KAAE,GAAGQ;KAAG;IAAK,IAAIA,CAAE;IAInE,AAHA,KAAYnB,GACZ,IAAWA,GACX,KAAkBA,GAClB7E,EAAK,kBAAkB6E,CAAI;GAC7B,OACE,GAAcW,GAAI,EAAE,QAAK,CAAC;EAE9B;EAGA,CAFIhM,EAAI,kBAAkBiB,KAAUjB,EAAI,kBAAkBA,EAAI,SAC5DS,EAAK,MAAM,GACbmL,EAAW;CACb;CAeA,AAbA3K,EAAO,iBAAiB,YAAY,MAAU;EAE5C,AADA0F,EAAM,gBAAgB,GAClBA,EAAM,QAAQ,WAAW,CAACA,EAAM,YAClCA,EAAM,eAAe,GACrBid,GAAY,EAAI,KACPjd,EAAM,QAAQ,aACvBA,EAAM,eAAe,GACrBid,GAAY,EAAK;CAErB,CAAC,GACD3iB,EAAO,iBAAiB,SAASgkB,EAAc,GAC/ChkB,EAAO,iBAAiB,cAAc2iB,GAAY,EAAI,CAAC,GACvD3iB,EAAO,iBAAiB,gBAAgB,MAAU0F,EAAM,gBAAgB,CAAC,GACzE1F,EAAO,iBAAiB,aAAa,MAAU0F,EAAM,gBAAgB,CAAC;CAItE,IAAMye,MAAQ,GAAc,IAAO,IAAI,IAAQ,QAC7C,mGAAmG1iB,EAAM,kDAAkD2iB,IAAO,sBAAsBA,EAAK,KAAK,GAAG,+BAA+BC,EAAK,YAErOC,MACJ,GACA,GACA,GACA,MACG;EACH,IAAMxF,IAAS/f,EAAI,cAAc,QAAQ;EAWzC,OAVA,EAAO,OAAO,UACd+f,EAAO,aAAa,cAAchD,CAAK,GACvC,EAAO,QAAQA,GACXyI,MAAY,KAAA,KACdzF,EAAO,aAAa,gBAAgB,OAAOyF,CAAO,CAAC,GACrD,EAAO,YAAYC,GACnB1F,EAAO,iBAAiB,UAAU,MAAU;GAE1C,AADApZ,EAAM,gBAAgB,GACtB+e,EAAQ;EACV,CAAC,GACM3F;CACT,GAEM4F,WAAkB;EACtB,IAAMnc,IAAOxJ,EAAI,cAAc,MAAM;EAErC,OADA,EAAK,YAAY,OACVwJ;CACT,GAEMoc,MAAgB,MAA4B;EAChD,EAAQ,cAAc;EACtB,IAAM3a,IAAI/D,GAAO;EACjB,EAAQ,aAAa,cAAc+D,EAAE,SAAS;EAC9C,IAAMe,IAAKoE,EAAQ,IACbqE,IAAuB,CAAC;EAC9B,IAAI,CAACrE,EAAQ,QAAQ;GACnB,IAAM7Q,IAAQiI,EAAI4I,EAAQ,SAASxR,EAAO,GACpCinB,IAASN,GACbta,EAAE,OACF,kFAAkF1L,EAAM,mEAClF;IAGJ,AAFA,KAAc,CAACiG,IACf,KAAa,IACb6c,GAAc;GAChB,CACF;GAEA,AADAwD,EAAO,aAAa,iBAAiB,OAAOrgB,EAAW,CAAC,GACxDiP,EAAM,KAAKoR,CAAM;GACjB,IAAMnjB,IAAQ0N,EAAQ,aAAa,KAC7BgO,IAAS;IAAC;IAAG;IAAG;IAAG;GAAC;GAC1B,EAAM,KACJmH,GACE,GAAGta,EAAE,UAAU,IAAIvI,EAAM,KACzB,GAAG0iB,GAAK,WAAW,IAAI,KAAK,IAAI,GAAG1iB,CAAK,CAAC,EAAE,+CAA+CA,EAAM,gBAE9FohB,GAAc9X,GAAI,EAChB,WAAWoS,EAAO,MAAM,MAAMnG,IAAIvV,CAAK,KAAK0b,EAAO,GACrD,CAAC,CACL,CACF;GACA,IAAMN,IAAY1N,EAAQ,aAAa;GAuCvC,AAtCAqE,EAAM,KACJ8Q,GACEta,EAAE,WACFma,GACE,WACAtH,MAAc,WACV,YACAA,MAAc,WACZ,UACA,IACNA,MAAc,WAAW,MAAM,GACjC,SAEEgG,GAAc9X,GAAI,EAChB,WACEjN,IACGA,GAAY,QAAQ+e,CAAS,IAAI,KAAK/e,GAAY,QAEzD,CAAC,CACL,CACF,GACI+mB,EAAW1V,EAAQ,IAAI,KACzBqE,EAAM,KACJ8Q,GACEta,EAAE,MACF,kPACM6Y,GAAc9X,GAAI,EAAE,MAAMoE,EAAQ,SAAS,GAAM,CAAC,GACxDA,EAAQ,SAAS,EACnB,CACF,GAEEA,EAAQ,SAAS,UACnBqE,EAAM,KACJ8Q,GAActa,EAAE,UAAUma,GAAK,8BAA8B,SAC3DX,GAAWzY,GAAI,EAAK,CACtB,CACF,GAEFyI,EAAM,KAAKkR,GAAU,CAAC;EACxB;EAWA,IAVAlR,EAAM,KACJ8Q,GACEta,EAAE,MACFmF,EAAQ,SACJgV,GAAK,4CAA4C,IACjDA,GAAK,6CAA6C,SAChDtB,GAAc9X,GAAI,EAAE,QAAQ,CAACoE,EAAQ,OAAO,CAAC,GACnD,CAAC,CAACA,EAAQ,MACZ,CACF,GACI,CAACA,EAAQ,QAAQ;GACnB,IAAM2V,IAASR,GACbta,EAAE,QACFma,GAAK,qDAAqD,SACpDpB,GAAchY,CAAE,CACxB;GAEA,AADA,EAAO,MAAM,QAAQ,gCACrByI,EAAM,KAAKsR,CAAM;EACnB;EAEA,IADA/kB,EAAQ,OAAO,GAAGyT,CAAK,GACnBjP,MAAe,CAAC4K,EAAQ,QAAQ;GAClC,IAAM4V,IAAU1lB,GAAK,OAAO;IAC1B,UAAU;IACV,MAAM;IACN,KAAK;IACL,SAAS;IACT,KAAK;IACL,SAAS;IACT,cAAc;IACd,QACE;IACF,YAAY;IACZ,WAAW;GACb,CAAC;GACD,KAAK,IAAMf,KAAST,IAAS;IAC3B,IAAMihB,IAASwF,GACb,GAAGta,EAAE,MAAM,GAAG1L,KACd,kFAAkFA,EAAM,kBAClF;KAEJ,AADA,KAAc,IACdukB,GAAc9X,GAAI,EAAE,SAAM,CAAC;IAC7B,IACCoE,EAAQ,SAAS,GAAA,CAAI,YAAY,MAAM7Q,CAC1C;IACA,EAAQ,YAAYwgB,CAAM;GAC5B;GACA,EAAQ,YAAYiG,CAAO;EAC7B;CACF;CAEA,SAAS3D,KAAgB;EACvB,IAAMjS,IAAUrL,KACZP,EAAS,MAAM,MAAMgI,EAAE,OAAOzH,EAAQ,IACtC,KAAA,GACEyL,IAAOJ,IAAU4K,GAAO5K,EAAQ,IAAI,IAAI,MACxCgM,IAASnB,GAAczK,CAAI,GAC3ByV,IAAW/hB,GAAS,SAAS,aAAaA,EAAQ;EACxD,IACE,CAACkM,KACD,CAACI,KACD,CAAC4L,KACDjc,EAAQ,mBAAmB,MAC3BmF,MACA2gB,KACAhhB,GACA;GAGA,AAFA,EAAQ,MAAM,UAAU,QACxB,KAAa,IACb,KAAc;GACd;EACF;EACA,IAAMiD,IAAM;GACVkI,EAAQ;GACRA,EAAQ;GACRA,EAAQ;GACRA,EAAQ;GACRA,EAAQ;GACRA,EAAQ;GACR5K;GACAoB;GACAzD;EACF,CAAC,CAAC,KAAK,GAAG;EAKV,AAJI+E,MAAQ3C,OACV,KAAa2C,GACb0d,GAAaxV,CAAO,IAEtB,EAAQ,MAAM,UAAU;EAExB,IAAM8V,IAAMC,EAAa/V,GAASgM,GAAQ/W,GAAU,IAAI+K,EAAQ,EAAE,CAAC,GAC7D0G,IAAMzR,GAAU,IAAI+K,EAAQ,EAAE;EACpC,AAAIA,EAAQ,SAAS,UAAU0G,KAC7BoP,EAAI,KAAK;GAAE,GAAGpP,EAAI,IAAIA,EAAI;GAAG,GAAGA,EAAI,IAAIA,EAAI;EAAE,CAAC;EACjD,IAAIsP,IAAK,UACLC,IAAK,WACLpP,IAAK,UACL2C,IAAK;EACT,KAAK,IAAM1O,KAAKgb,GAId,AAHA,IAAK,KAAK,IAAIE,GAAIlnB,EAAMgM,EAAE,GAAG,GAAG3I,CAAK,CAAC,GACtC,IAAK,KAAK,IAAI8jB,GAAInnB,EAAMgM,EAAE,GAAG,GAAG3I,CAAK,CAAC,GACtC,IAAK,KAAK,IAAI0U,GAAI/X,EAAMgM,EAAE,GAAGsF,EAAK,KAAKA,EAAK,MAAMA,EAAK,MAAM,CAAC,GAC9D,IAAK,KAAK,IAAIoJ,GAAI1a,EAAMgM,EAAE,GAAGsF,EAAK,KAAKA,EAAK,MAAMA,EAAK,MAAM,CAAC;EAEhE,AAAIJ,EAAQ,SAAS,qBACnB,IAAK7N,IAAQ,KACb,IAAKA,IAAQ;EAEf,IAAM0V,IAAIjX,EAAQ,eAAe,KAC3BgN,IAAIhN,EAAQ,gBAAgB,IAC5B4N,IAAO1P,GAAOknB,IAAKC,KAAM,IAAIpO,IAAI,GAAG,GAAG,KAAK,IAAI,GAAG1V,IAAQ0V,IAAI,CAAC,CAAC,GACnE3J,IAAM2I,IAAKjJ,IAAI;EAInB,AAFIM,IAAM,MAAG,IAAMsL,IAAK,KACxB,EAAQ,MAAM,OAAO,GAAG,KAAK,MAAMhL,CAAI,EAAE,KACzC,EAAQ,MAAM,MAAM,GAAG,KAAK,MAAM1P,EAAMoP,GAAK,GAAG,KAAK,IAAI,GAAG9L,IAAQwL,IAAI,CAAC,CAAC,CAAC,EAAE;CAC/E;CAMA,AAJAhN,EAAQ,iBAAiB,gBAAgB,MAAU2F,EAAM,gBAAgB,CAAC,GAC1E3F,EAAQ,iBAAiB,aAAa,MAAU2F,EAAM,gBAAgB,CAAC,GAEvE3F,EAAQ,iBAAiB,gBAAgB,MAAU2F,EAAM,gBAAgB,CAAC,GAC1E3F,EAAQ,iBAAiB,sBAAsB;EAI7C,AAHA,IAAU,MACV,KAAU,MACV,EAAK,MAAM,SAAS,WACpB4K,EAAW;CACb,CAAC;CAID,IAAM0a,YAAyC;EAC7C,QAAQ,CAAC,CAACngB;EACV,SAASC;EACT,SAAS,CAAC,CAACD,GAAQ;EACnB,OAAOA,GAAQ,SAASE;EACxB,OAAOc,EAAE;EACT,OAAOhB,IAASA,EAAO,OAAO,SAASgB,EAAE;EACzC,MAAMA,EAAE,IAAIhG,EAAM,KAAKgG,EAAE,IAAI,KAAK;CACpC,IAEMof,WAAmB/f,EAAK,gBAAgB8f,GAAY,CAAC,GAErDE,MAAa,GAAgB,OAAmB;EACpD,MAAM5b,EAAK,KAAK,SAAS,GAAG5B,CAAK;EACjC,MAAM4B,EAAK,KAAK,SAAS,GAAG5B,CAAK;EACjC,MAAM4B,EAAK,KAAK,SAAS,GAAG5B,CAAK;EACjC,KAAK4B,EAAK,IAAI,SAAS,GAAG5B,CAAK;EAC/B,OAAO4B,EAAK,MAAM,SAAS,GAAG5B,CAAK;EACnC,QAAQ4B,EAAK,OAAO,SAAS,GAAG5B,CAAK;CACvC,IAGMyd,MAAY,GAAkB,MAAkB;EACpD,IAAMC,IAAYvF,EAAO;EAOzB,AANAxU,GAASxL,GAAOqlB,GAAUrF,GAAQnY,CAAK,CAAC,GACxC,EAAM,YAAY0d,GAClB,KAAUplB,GAAc,GACxB,KAAYA,GAAc,GAC1B,KAAU,GACV,KAAe,KACfmK,GAAgB,CAAC;CACnB,GAEMkb,WAAwB;EAE5B,AADIxgB,GAAQ,SAAO,cAAcA,EAAO,KAAK,GACzCA,MACF,EAAO,QAAQ,MACf,EAAO,UAAU;CAErB,GAEMygB,MAAe,MAAkB;EAErC,IADA,KAAgB,IACZ,CAACzgB,GAAQ;GACX,IAAI,CAACgB,EAAE,GAAG;GACV,IAAMga,IAAS/f,GAAY;GAG3B,AAFAuL,GAASwU,GAAQqF,GAAUrlB,GAAOgG,EAAE,CAAC,CAAC,GACtC,EAAO,YAAYhG,EAAM,WACzB,IAAS;IAAE;IAAQ,SAAS;IAAO,OAAOkF;IAAa,OAAO;GAAK;EACrE;EACA,GAAgB;EAChB,IAAM6a,IAAQhiB,EAAM,KAAK,MAAM0J,CAAK,IAAI,GAAG,GAAGzC,EAAO,OAAO,MAAM;EAElE,AADAsgB,GAAStgB,EAAO,QAAQ+a,CAAK,GAC7B,IAAQA,IAAQ,KAAK/gB,EAAQ,eAAe;EAC5C,KAAK,IAAM0M,KAAShK,GAAO,OAAO,GAAG,EAAM,OAAO;EAClD,GAAW;CACb,GAEMgkB,MAAgB,MAAkB;EACtC,IAAI,CAAC1gB,GAAQ;EACb,IAAMgb,IAAShb,EAAO,QAChBiH,IAASjG,EAAE,GACXgG,IAASV,GAAgB,GAC3B7B,IAAO;EACX,KAAK,IAAI3B,IAAI,GAAGA,IAAID,KAAS7B,EAAE,IAAIga,EAAO,QAAQ,KAAK;GACrD,IAAM9T,IAAKrP,GAAYmD,GAAOyhB,GAAQzB,GAAQha,EAAE,CAAC,CAAC;GAClD,AAAIyD,IAAO,MAAG,IAAOyC;EACvB;EAOA,AANA,EAAM,YAAY8T,EAAO,WACrBvW,KAAQ,MACNuC,MAAQ,KAAShG,EAAE,IAAIiG,IAC3B3B,GAAgBb,CAAI,IAElBzD,EAAE,KAAKga,EAAO,UAAQwF,GAAgB,GAC1CJ,GAAW;CACb,GAEMO,MAAc,MAAmB;EACrC,IAAI,CAAC3gB,GAAQ;EAGb,IAFI4gB,MAAU,KAAA,KAAaA,IAAQ,MAAG,EAAO,QAAQ,KAAcA,IACnEJ,GAAgB,GACZxf,EAAE,KAAKhB,EAAO,OAAO,QAAQ;GAC/B,GAAW;GACX;EACF;EACA,IAAM6gB,IAAW,KAAK,IAAI,IAAI,MAAO7gB,EAAO,KAAK,GAC3C8gB,IAAU,KAAK,IAAI,GAAG,KAAK,MAAO9gB,EAAO,QAAQ6gB,IAAY,GAAI,CAAC;EAGxE,AAFA,EAAO,UAAU,IACjB,EAAO,QAAQ,kBAAkBH,GAAaI,CAAO,GAAGD,CAAQ,GAChET,GAAW;CACb,GAGMW,MAAa,MAAqB;EACtC,IAAMC,IAAa/gB;EAEnB,IADA,KAAgB,IACZ,CAACD,GAAQ;GACX,AAAIghB,MACFZ,GAAW,GACX3a,EAAW;GAEb;EACF;EACA,GAAgB;EAChB,IAAMuV,IAAShb,EAAO;EAGtB,AAFA,IAAS,MACLihB,KAASX,GAAStF,GAAQA,EAAO,MAAM,GAC3CoF,GAAW;CACb,GAIM9D,MAAgB,GAAW,MAAc;EAC7C,IAAI4E,IAAS;EACb,KAAc;EACd,IAAIC,IAA2B,MACzBvH,IAAS7b,IAAU,KAAKse,GAAS1Z,GAAG0F,CAAC;EAE3C,IADIuR,MAAWna,OAAe,KAAgBma,IAC1C7b,GAAS,SAAS,SAASA,EAAQ,OAAO,IAAS;OAClD,IAAI6b,KAAU,GAAG,IAAS;OAC1B,IAAI3Z,MAAiB0C,KAAKvG,KAASiM,KAAKhM,GAAO,IAAS;OACxD,IAAIwiB,GAAYxW,CAAC,IAAI,GAAG,IAAS;OACjC,IAAI1F,IAAIvG,KAASiM,IAAIhM,GAAO,IAAS;OACrC,IAAIgM,IAAIhM,GAAO,IAAS;OACxB,IAAIsC,OAAS,UAAU;GAC1B,IAAMwP,IAAOsQ,GAAQ9b,GAAG0F,CAAC;GACzB,IAAI8F,GAEF,AADA,IAAS,aACT,KAAcA,EAAK;QACd;IACL,IAAMwQ,IAAMD,GAAa/b,GAAG0F,CAAC;IAC7B,AAAIsW,MACF,IAAYA,EAAI,QAAQ,IACxB,IAASA,EAAI,QAAQ,SACjB,YACAA,EAAI,IAAI,SAAS,WACf,SACA;GAEV;EACF;EAEA,AADIwC,MAActiB,OAAS,KAAUsiB,IACjC7mB,EAAK,MAAM,WAAW4mB,MAAQ,EAAK,MAAM,SAASA;CACxD,GAEME,MAAiB,MAAwB;EAC7C,IAAI5gB,EAAM,WAAW,KAAKA,EAAM,gBAAgB,SAAS;EACzD,IAAM,EAAE,MAAG,SAAMkc,GAAMlc,CAAK;EAW5B,IAVA,IAAU;GAAE;GAAG;EAAE,GACjB,IAAgB,MACZ1C,KAAUujB,GAAY,EAAI,GAC9B,KAAU,MACV,KAAa,MACTliB,MAASse,GAAY,EAAI,GACzBpe,OACF,KAAc,IACdoG,EAAW,IAETjF,EAAM,gBAAgB,YACxBxC,GAAQ,IAAIwC,EAAM,WAAW;GAAE;GAAG;EAAE,CAAC,GACjCxC,GAAQ,SAAS,IAAG;GACtB,IAAM,CAACkI,GAAGC,KAAK,CAAC,GAAGnI,GAAQ,OAAO,CAAC;GAEnC,AADA,KAAQ;IAAE,UAAU,KAAK,MAAMkI,EAAE,IAAIC,EAAE,GAAGD,EAAE,IAAIC,EAAE,CAAC;IAAG;GAAQ,GAC9D,IAAU;GACV;EACF;EAEF,IAAI;GACF,EAAK,kBAAkB3F,EAAM,SAAS;EACxC,QAAQ,CAER;EACA,IAAMoZ,IAASyC,GAAS1Z,GAAG0F,CAAC,GACtB4V,IAASze,GAAcoa;EAC7B,IAAIqE,GAAQ;GACV,IAAU;IAAE,MAAM;IAAU,QAAQA,EAAO;GAAO;GAClD;EACF;EACA,IAAIhe,MAAiB0C,KAAKvG,KAASiM,KAAKhM,GAAO;GAC7C,GAAY,KAAK,IAAI2E,EAAE,IAAI,GAAG,KAAK,MAAM0B,GAAQC,CAAC,CAAC,CAAC,CAAC;GACrD;EACF;EACA,IAAM2e,IAAMzC,GAAYxW,CAAC;EACzB,IAAIiZ,IAAM,GAAG;GACX,IAAMhP,IAAQ7V,EAAM6kB,IAAM,IACpB/O,IAAQ9V,EAAM6kB;GACpB,IAAU;IACR,MAAM;IACN,OAAOA;IACP;IACA,OAAOhP,EAAM;IACb,OAAOC,EAAM;GACf;GACA;EACF;EACA,IAAI5P,IAAIvG,KAASiM,IAAIhM,GAAO;GAC1B,IAAMgO,IAAOjC,GAAOC,CAAC;GACrB,AAAIgC,MACF,IAAU;IACR,MAAM;IACN;IACA;IACA,KAAKA,EAAK,MAAM;IAChB,KAAKA,EAAK,MAAM;GAClB;GACF;EACF;EACA,IAAIhC,IAAIhM,GAAO;GACb,IAAU;IAAE,MAAM;IAAS;IAAG;GAAQ;GACtC;EACF;EACA,IAAMgO,IAAOjC,GAAOC,CAAC;EACrB,IAAI1J,OAAS,YAAY0L,KAAQrJ,EAAE,GAAG;GACpC,IAAIlC,GAAO;IAKT,AAHA0f,GAAY7b,GAAG0F,CAAC,GAChBkW,GAAe,GACf,IAAU,MACV9Y,EAAW;IACX;GACF;GACA,IAAMnF,IAAO3B,IACPqX,IAAWuL,EAAWjhB,CAAI,GAE1B4G,IAAK8O,IAAWvZ,EAAM,KAAK4N,GAC3BkF,IAAQuN,GAASna,GAAG5J,EAAMsP,GAAGnB,EAAG,KAAKA,EAAG,MAAMA,EAAG,MAAM,GAAGA,CAAE,GAC5Dsa,IAAUC,EAAYnhB,CAAI;GAgBhC,IAfA,KAAY4G,EAAG,IACf,IAAQ;IACN,IAAI,WAAW,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,EAAEjI;IAC5C;IACA,QAAQ+W,IACJ8H,GACE;KAAE,GAAGvO;KAAO,OAAOiG,GAAWjG,EAAM,KAAK;IAAE,GAC3CrI,GACA5G,MAAS,cACX,IACAkhB,MAAY,IACV,CAACjS,CAAK,IACN,CAACA,GAAOA,CAAK;IACnB,GAAIrI,EAAG,OAAO7O,IAA0B,CAAC,IAAnB,EAAE,MAAM6O,EAAG,GAAG;GACtC,GACIsa,MAAY,GAAG;IACjB,GAAY;IACZ;GACF;GAGA,AAFA,KAAcA,IAAU,GACxB,IAAU;IAAE,MAAM;IAAU,MAAMta;IAAI;IAAG;IAAG,OAAO;GAAM,GACzDzB,EAAW;GACX;EACF;EACA,IAAI9G,OAAS,UAAU;GACrB,IAAMwP,IAAOsQ,GAAQ9b,GAAG0F,CAAC;GACzB,IAAI8F,GAAM;IACR,IAAU;KAAE,MAAM;KAAS;KAAM,YAAYA,EAAK;IAAM;IACxD;GACF;GACA,IAAMwQ,IAAMD,GAAa/b,GAAG0F,CAAC;GAC7B,IAAIsW,GAAK;IAEP,AADA1B,GAAO0B,EAAI,QAAQ,EAAE,GAChBA,EAAI,QAAQ,WACf,IAAU;KACR,MAAM;KACN,IAAIA,EAAI,QAAQ;KAChB,MAAMA,EAAI;KACV,QAAQA,EAAI,IAAI,SAAS,WAAWA,EAAI,IAAI,QAAQ;KACpD;KACA;KACA,UAAUA,EAAI;KACd,OAAO;IACT;IAEF;GACF;EACF;EACA,IAAU;GACR,MAAM;GACN;GACA;GACA;GACA;GACA,OAAO;GACP,OAAOhc;GACP,OAAO0F;GACP,OAAO7H,EAAM;GACb,UAAU;EACZ;CACF,GAEMkhB,MAAiB,MAAwB;EAC7C,IAAM,EAAE,MAAG,SAAMhF,GAAMlc,CAAK;EAE5B,IADA,IAAU;GAAE;GAAG;EAAE,GACbA,EAAM,gBAAgB,WAAWxC,GAAQ,IAAIwC,EAAM,SAAS,MAC9DxC,GAAQ,IAAIwC,EAAM,WAAW;GAAE;GAAG;EAAE,CAAC,GACjCvC,MAASD,GAAQ,SAAS,IAAG;GAC/B,IAAM,CAACkI,GAAGC,KAAK,CAAC,GAAGnI,GAAQ,OAAO,CAAC,GAC7B2jB,IAAW,KAAK,MAAMzb,EAAE,IAAIC,EAAE,GAAGD,EAAE,IAAIC,EAAE,CAAC,GAC1CtD,IAAQ7B,EAAE,GACV4gB,IACJ/e,KAASyD,GAAgB,IACrB,KAAK,IAAIlK,GAAOoG,EAAIK,IAAQ,CAAC,CAAC,KAC7BqD,EAAE,IAAIC,EAAE,KAAK,GACdqR,IAAS9U,GAAQkf,CAAG;GAK1B,AAJA,IAAW3jB,GAAM,UAAU0jB,IAAY,KAAK,IAAI,GAAG1jB,GAAM,QAAQ,GACjEqK,GAAU,GACV,IAAQkP,KAAUpb,IAAQwlB,KAAO1lB,GACjCoM,GAAU,GACV7C,EAAW;GACX;EACF;EAEF,IAAMyD,IAAInL;EACV,IAAI,CAACmL,GAAG;GAGN,AAFIpK,KAAO0f,GAAY7b,GAAG0F,CAAC,GAC3BiU,GAAa3Z,GAAG0F,CAAC,GACjB5C,EAAW;GACX;EACF;EACA,QAAQyD,EAAE,MAAV;GACE,KAAK,OAAO;IACV,IAAMwE,IAAK/K,IAAIuG,EAAE;IACjB,IAAI,CAACA,EAAE,SAAS,KAAK,MAAMwE,GAAIrF,IAAIa,EAAE,CAAC,IAAI,GAAG;IAI7C,AAHA,EAAE,QAAQ,IACV,IAAQA,EAAE,QAAQwE,IAAKxR,GACnBgN,EAAE,QAAQ,CAACA,EAAE,KAAK,MAAM,QAAM2Y,GAAS3Y,EAAE,KAAK,OAAOb,IAAIa,EAAE,KAAK,GACpE,EAAE,QAAQb;IACV,IAAMmT,IAAK,KAAK,IAAI,GAAGhb,EAAM,YAAY0I,EAAE,KAAK;IAKhD,AAJA,EAAE,WAAW,OAAQvG,IAAIuG,EAAE,SAASsS,KAAM,KAAMtS,EAAE,UAClD,EAAE,QAAQvG,GACV,EAAE,QAAQnC,EAAM,WAChB8H,GAAU,GACV,EAAK,MAAM,SAAS;IACpB;GACF;GACA,KAAK,SAAS;IACZ,IAAM5B,IAAQwC,EAAE,KAAK;IAGrB,AAFA,EAAM,MAAMA,EAAE,KACd,EAAM,MAAMA,EAAE,KACd4Y,GAAUpb,GAAO,KAAK,KAAK2B,IAAIa,EAAE,KAAK,IAAK,CAAC;IAC5C;GACF;GACA,KAAK,SAAS;IACZ,IAAM6Y,IAAY5lB;IAIlB,AAHA,IAAU+M,EAAE,UAAU,KAAK,KAAKvG,IAAIuG,EAAE,KAAK,IAAK,GAChDZ,GAAU,GACV,IAAQyZ,GACRzZ,GAAU;IACV;GACF;GACA,KAAK,aAAa;IAChB,IAAM0Z,IAAK3Z,IAAIa,EAAE,GACXoJ,IAAQ7V,EAAMyM,EAAE,QAAQ,IACxBqJ,IAAQ9V,EAAMyM,EAAE;IACtB,IAAI,CAACoJ,KAAS,CAACC,GAAO;IACtB,IAAM9K,IAAQyB,EAAE,QAAQA,EAAE,OACpB+Y,IAAYlpB,EAAMmQ,EAAE,QAAQ8Y,GAAI5pB,IAAUqP,IAAQrP,EAAQ;IAEhE,AADAuE,GAAY,IAAI4V,EAAM,IAAI0P,CAAS,GAC/B3P,EAAM,OAAOja,KAAOsE,GAAY,IAAI2V,EAAM,IAAI7K,IAAQwa,CAAS;IACnE;GACF;GACA,KAAK;IACH,GAAc,IAAI/Y,EAAE,KAAK,IAAIsM,GAAWd,GAAQjY,EAAM,EAAE,CAAC,OAAO4L,CAAC,CAAC,CAAC;IACnE;GAEF,KAAK,WAAW;IACd,IAAI,CAACa,EAAE,SAAS,KAAK,MAAMvG,IAAIuG,EAAE,GAAGb,IAAIa,EAAE,CAAC,IAAI,GAAG;IAClD,EAAE,QAAQ;IACV,IAAMxC,IAAQwC,EAAE,KAAK,OACjBgZ;IACJ,IAAIhZ,EAAE,UAAU,GACd,IAASiZ,GAAWjZ,EAAE,UAAUA,EAAE,QAAQ4T,GAASna,GAAG0F,GAAGa,EAAE,IAAI,CAAC;SAC3D;KACL,IAAMkZ,IAAK,KAAK,MAAM1f,GAAQC,CAAC,IAAID,GAAQwG,EAAE,CAAC,CAAC,GACzCmZ,IAAKpJ,GAASvS,GAAO2B,CAAC,IAAI4Q,GAASvS,GAAOwC,EAAE,CAAC;KACnD,IAASA,EAAE,SAAS,OAAO,KAAK,OAAO;MACrC,MAAMtG,GAAO,KAAK,MAAMyB,GAAeU,EAAE,IAAI,CAAC,IAAIqd,CAAE;MACpD,OAAOxW,GAAWlF,GAAO8C,GAAS9C,GAAO3B,EAAE,KAAK,IAAIsd,CAAE;KACxD,EAAE;IACJ;IACA,IAAWhkB,EAAS,KAAK,MAAOgI,EAAE,OAAO6C,EAAE,KAAK;KAAE,GAAG7C;KAAG;IAAO,IAAIA,CAAE;IACrE;GACF;GACA,KAAK;IAEH,AADI,KAAK,MAAM1D,IAAIuG,EAAE,GAAGb,IAAIa,EAAE,CAAC,KAAK,MAAG,EAAE,QAAQ,KACjDsV,GAAY7b,GAAG0F,CAAC;IAChB;GAEF,SACE,GAAa1F,GAAG0F,CAAC;EAErB;EACA,EAAW;CACb,GAEMia,MAAe,MAAwB;EAE3C,AADAtkB,GAAQ,OAAOwC,EAAM,SAAS,GAC1BxC,GAAQ,OAAO,MAAG,KAAQ;EAC9B,IAAMkL,IAAInL;EACV,IAAU;EACV,IAAM,EAAE,MAAG,SAAM2e,GAAMlc,CAAK;EAE5B,IADIA,EAAM,gBAAgB,YAAS,IAAU,OACzC,CAAC0I,GAAG;GACN,EAAW;GACX;EACF;EACA,QAAQA,EAAE,MAAV;GACE,KAAK;IACH,IAAKA,EAAE,OAWA,AACLlP,EAAQ,kBAAkB,MAC1BwG,EAAM,YAAY0I,EAAE,QAAQ,MAC5B,KAAK,IAAIA,EAAE,QAAQ,IAAI,QAEvB,KAAU;KACR,GAAGA,EAAE;KACL,GACE,OAAO,cAAgB,MACnB,YAAY,IAAI,IAChB,KAAK,IAAI;IACjB;SAtBY;KACZ,AAAItK,MAAUqe,GAAO,IAAI;KACzB,IAAM5S,IAAOjC,GAAOC,CAAC;KACrB,AAAIgC,KAAQ1H,KAAKvG,KACfiE,EAAK,SAAS;MACZ,OAAO,KAAK,MAAMqC,GAAQC,CAAC,CAAC;MAC5B,MAAMC,GAAO,KAAK,MAAMF,GAAQC,CAAC,CAAC,CAAC;MACnC,OAAO+R,GAAQrK,EAAK,OAAOhC,CAAC;MAC5B,MAAMgC,EAAK;KACb,CAAC;IAEL;IAaA;GACF,KAAK,SAAS;IACZ,IAAMnF,IAAO5F,GAAc,IAAI4J,EAAE,KAAK,EAAE;IACxC,AAAIhE,MAAS,KAAA,KAAaA,MAASgE,EAAE,aACnC7I,EAAK,aAAa;KAChB,IAAI6I,EAAE,KAAK;KACX,OAAOhE;KACP,eAAegE,EAAE;KACjB,MAAMA,EAAE;IACV,CAAC,IAED5J,GAAc,OAAO4J,EAAE,KAAK,EAAE;IAEhC;GACF;GACA,KAAK;IACH,AAAIA,EAAE,SAAOmU,GAAehf,CAAQ;IACpC;GACF,KAAK;IAEH,AAAI6K,EAAE,SAAOqV,GAAe;IAC5B;GACF,KAAK,UACH,AAAIlC,GAAS1Z,GAAG0F,CAAC,KAAK,KAAGa,EAAE,OAAO;EAItC;EAEA,AADAoT,GAAa3Z,GAAG0F,CAAC,GACjB5C,EAAW;CACb,GAEM8c,MAAkB,MAAwB;EAC9C,AAAIxkB,KAAWyC,EAAM,gBAAgB,YACrC,IAAU,MACV,KAAU,MACV,KAAc,MACdiF,EAAW;CACb,GAEM+c,MAAW,MAAsB;EACrC,IAAMva,IAAOjO,EAAQ,SAAS;EAC9B,IAAIiO,MAAS,QAAQ;EACrB,IAAM,EAAE,SAAMyU,GAAMlc,CAAK,GACnBiiB,IAAOjiB,EAAM,cAAc,IAAI,KAAKA,EAAM,cAAc,IAAIpE,IAAQ,GACpEsR,IAAKlN,EAAM,SAASiiB,GACpBT,IAAKxhB,EAAM,SAASiiB,GACpBC,IAAWliB,EAAM,WAAWA,EAAM;EACxC,IAAIyH,MAAS,cAAc,CAACya,KAAY,KAAK,IAAIhV,CAAE,KAAK,KAAK,IAAIsU,CAAE,GACjE;EAGF,IAFAxhB,EAAM,eAAe,GACrB,IAAgB,MACZ,KAAK,IAAIkN,CAAE,IAAI,KAAK,IAAIsU,CAAE,KAAKxhB,EAAM,UAAU;GAIjD,AAHA,MAAU,KAAK,IAAIkN,CAAE,IAAI,KAAK,IAAIsU,CAAE,IAAItU,IAAKsU,KAAM9lB,GACnDoM,GAAU,GACV,KAAU,MACV7C,EAAW;GACX;EACF;EACA,IAAMoX,IAAS,KAAK,IAAI,CAACmF,KAAMxhB,EAAM,UAAU,MAAO,MAAO;EAC7D,GAAO,KAAK,IAAImC,GAAGvG,CAAK,GAAGygB,CAAM;CACnC,GAEM8F,MAAiB,MAAsB;EAC3C,IAAM,EAAE,MAAG,SAAMjG,GAAMlc,CAAK,GACtBme,IAAMhgB,OAAS,WAAW+f,GAAa/b,GAAG0F,CAAC,IAAI;EACrD,IAAIsW,GAAK,QAAQ,SAAS,QAAQ;GAChC,GAAWA,EAAI,QAAQ,IAAI,EAAK;GAChC;EACF;EACA,IAAIhc,IAAIvG,KAASiM,IAAIhM,GAAO;GAC1B,IAAMgO,IAAOjC,GAAOC,CAAC;GACrB,AAAIgC,MAAM,EAAK,MAAM,OAAO;EAC9B,OAAO,IAAIhC,IAAIhM,GAEb,AADA,IAAUrC,EAAQ,cAAc,GAChC4oB,GAAS,iBAAiB,EAAI;OAE9B,KAAK,IAAMlc,KAAShK,GAAO,OAAO,GAAG,EAAM,OAAO;EAEpD,EAAW;CACb,GAEMmmB,MAAY,MAAkB;EAClC,IAAIpgB,IAAQ,KAAKA,KAASzB,EAAE,GAAG;EAC/B,IAAMqF,IAAI9B,GAAQ,GACZO,IAAI/D,GAAO;EACjB,GAAK,cAAczH,EAAKwL,EAAE,cAAc;GACtC,MAAMgU,GAAoBpV,GAAM1I,EAAM,KAAKyH,EAAM,GAAGP,GAAK,GAAGzB,CAAM;GAClE,MAAMqB,EAAYuE,EAAE,KAAK5D,EAAM;GAC/B,MAAMX,EAAYuE,EAAE,KAAK5D,EAAM;GAC/B,KAAKX,EAAYuE,EAAE,IAAI5D,EAAM;GAC7B,OAAOX,EAAYuE,EAAE,MAAM5D,EAAM;EACnC,CAAC;CACH,GAEMqgB,MAAO,MAAiB;EAC5B,GAAK,cAAc1O;CACrB,GAGM2O,YACH/oB,EAAQ,cAAc,CAAC,EAAA,CAAG,QACxB,MAASmU,EAAK,aAAaA,EAAK,WACnC,GAEI6U,MAAa,MAA2B;EAC5C,IAAMjhB,IAAMjJ,GAAkBqV,EAAK,QAAQ;EAC3C,OAAOA,EAAK,UAAUpM,IAAMhB,GAAO,CAAC,CAACgB,KAAO;CAC9C,GAGMsf,MAAe,MAAqB;EAKxC,AAJIvjB,GAAU,SAAS,UAAUmjB,MAC3BnjB,EAAS,aAAa,KAAA,IAAWwB,GAAc,OAAOxB,EAAS,EAAE,IAChEwB,GAAc,IAAIxB,EAAS,IAAIA,EAAS,QAAQ,IAEvD,IAAW;CACb,GAGMmlB,MAAc,MAAkC;EACpD,IAAMpgB,IAAQ7B,EAAE;EAChB,IACE,CAAChH,EAAQ,cACT,CAAC6I,KACDrC,EAAM,UACNA,EAAM,WACNA,EAAM,SAEN,OAAO;EACT,IAAMsE,IAAI/D,GAAO,GACXgB,IAAMvB,EAAM,IAAI,WAAW,IAAIA,EAAM,IAAI,YAAY,IAAIA,EAAM,KAC/D0iB,KAAa,GAAsB,MACvC5pB,EAAKgX,MAAS,QAAQxL,EAAE,WAAWA,EAAE,WAAW,EAC9C,OAAOhD,EAAYN,CAAK,EAC1B,CAAC;EACH,IAAIO,MAAQ,OAAOA,MAAQ,KAAK;GAC9B,GAAY,EAAI;GAChB,IAAMgX,IAAQvE,GAAe,GACvBtN,IACJ6R,KAASA,EAAM,KAAK,OAAO1gB,KAASmB,EAAOuf,EAAM,KAAK,IAClDA,EAAM,QACN/d,EAAM,MAAM6H,IAAQ,IACpByN,IAAOvO,MAAQ,MAAM,QAAQ;GAGnC,OAFA,IAAW;IAAE,MAAM;IAAU;IAAM,OAAOyT,GAAWtO,CAAE;GAAE,GACzD4b,GAAI,GAAGI,EAAU5S,GAAMxS,EAAS,KAAK,EAAE,IAAIgH,EAAE,WAAW,GACjD;EACT;EACA,IAAI/C,MAAQ,KAAK;GACf,IAAMohB,IAAQJ,GAAS;GACvB,IAAI,CAACI,EAAM,QAAQ,OAAO;GAC1B,IAAMC,IAAUtlB,GAAU,SAAS,SAASA,EAAS,KAAK;GAC1D,GAAY,EAAI;GAChB,IAAMoJ,IAAKic,EAAM,WAAW,MAAShV,EAAK,OAAOiV,CAAO,GAClD3N,IAAOjV,EAAM,WAAW,KAAK,GAO7B2N,IAAOgV,EALXjc,IAAK,IACDuO,IAAO,IACL,IACA0N,EAAM,SAAS,KAChBjc,IAAKuO,IAAO0N,EAAM,UAAUA,EAAM;GAEzC,IAAI,CAAChV,GAAM,OAAO;GAClB,IAAW;IACT,MAAM;IACN,IAAIA,EAAK;IACT,OAAOoG,GAAUpG,CAAI;IACrB,UAAU7O,GAAc,IAAI6O,EAAK,EAAE;GACrC;GACA,IAAMyM,IAAOthB,EAAKwL,EAAE,WAAW;IAC7B,OAAOke,GAAU7U,CAAI;IACrB,OAAOrM,EAAYyS,GAAUpG,CAAI,CAAC;GACpC,CAAC;GAUD,OATA2U,GACE;IACElI;IACAzM,EAAK,YAAYrJ,EAAE,YAAY;IAC/BqJ,EAAK,cAAcrJ,EAAE,kBAAkB;GACzC,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,IAAI,CACd,GACO;EACT;EACA,IAAI,CAAChH,GAAU,OAAO;EACtB,IAAMulB,IAAWvlB,EAAS,SAAS,SAASA,EAAS,KAAK,MACpDwlB,KAAUtpB,EAAQ,cAAc,CAAC,EAAA,CAAG,MACvC,MAASmU,EAAK,OAAOkV,CACxB;EACA,QAAQ7iB,EAAM,KAAd;GACE,KAAK;GACL,KAAK,aAAa;IAChB,IAAMwP,IACJ,MAAM,CAACtO,GAAU,KAChBlB,EAAM,WAAW,KAAK,MACtBA,EAAM,QAAQ,YAAY,IAAI;IACjC,IAAI1C,EAAS,SAAS,UAEpB,AADA,EAAS,QAAQ0X,GAAW1X,EAAS,QAAQkS,CAAI,GACjD8S,GAAII,EAAUplB,EAAS,MAAMA,EAAS,KAAK,CAAC;SACvC,IAAIwlB,GAAQ,WAAW;KAC5B,IAAMpe,IAAOsQ,GAAWjB,GAAU+O,CAAM,IAAItT,CAAI;KAEhD,AADA1Q,GAAc,IAAIgkB,EAAO,IAAIpe,CAAI,GACjC4d,GAAIhhB,EAAYoD,CAAI,CAAC;IACvB;IACA,OAAO;GACT;GACA,KAAK,SAAS;IACZ,IAAIpH,EAAS,SAAS,UAAU;KAC9B,IAAM,EAAE,UAAO,YAASA;KAIxB,OAHAujB,GAAY,EAAK,GACjBhhB,EAAK,eAAe;MAAE;MAAO;KAAK,CAAC,GACnCyiB,GAAIxpB,EAAKwL,EAAE,aAAa,EAAE,OAAOhD,EAAYoG,CAAK,EAAE,CAAC,CAAC,GAC/C;IACT;IACA,IAAM2L,IAAQ/V,EAAS;IACvB,GAAY,EAAK;IACjB,IAAMoH,IAAOoe,IAAShkB,GAAc,IAAIgkB,EAAO,EAAE,IAAI,KAAA;IAUrD,OATIA,KAAUpe,MAAS,KAAA,KAAaA,MAAS2O,MAC3CxT,EAAK,aAAa;KAChB,IAAIijB,EAAO;KACX,OAAOpe;KACP,eAAe2O;KACf,MAAMyP;IACR,CAAC,GACDR,GAAIxpB,EAAKwL,EAAE,aAAa,EAAE,OAAOhD,EAAYoD,CAAI,EAAE,CAAC,CAAC,IAEhD;GACT;GACA,KAAK,UAUH,OATIpH,EAAS,SAAS,WAAUglB,GAAIhe,EAAE,cAAc,IAC3Cwe,KACPR,GACExpB,EAAKwL,EAAE,WAAW;IAChB,OAAOke,GAAUM,CAAM;IACvB,OAAOxhB,EAAYhE,EAAS,KAAK;GACnC,CAAC,CACH,GACFujB,GAAY,EAAI,GACT;GACT,KAAK;GACL,KAAK,aAMH,OALIiC,GAAQ,gBACVjC,GAAY,EAAI,GAChBhhB,EAAK,eAAe;IAAE,IAAIijB,EAAO;IAAI,MAAMA;GAAO,CAAC,GACnDR,GAAIhe,EAAE,cAAc,IAEf;GACT,SACE,OAAO;EACX;CACF;CAmHA,AAXAxK,EAAK,iBAAiB,eAAe8mB,EAAa,GAClD9mB,EAAK,iBAAiB,eAAeonB,EAAa,GAClDpnB,EAAK,iBAAiB,aAAagoB,EAAW,GAC9ChoB,EAAK,iBAAiB,iBAAiBgoB,EAAW,GAClDhoB,EAAK,iBAAiB,gBAAgBioB,EAAc,GACpDjoB,EAAK,iBAAiB,SAASkoB,IAAS,EAAE,SAAS,GAAM,CAAC,GAC1DloB,EAAK,iBAAiB,YAAYqoB,EAAa,GAC/CroB,EAAK,iBAAiB,YA7GH,MAAyB;EAC1C,IAAIkG,EAAM,WAAWlG,KAAQ2oB,GAAWziB,CAAK,GAAG;GAE9C,AADAA,EAAM,eAAe,GACrBiF,EAAW;GACX;EACF;EACA,KAAKjF,EAAM,WAAWA,EAAM,YAAY,CAACA,EAAM,QAAQ;GACrD,IAAMuB,IAAMvB,EAAM,IAAI,YAAY;GAClC,CAAIuB,MAAQ,OAAOA,MAAQ,SACrBA,MAAQ,OAAOvB,EAAM,WAAUkd,GAAK,IACnCH,GAAK,GACV/c,EAAM,eAAe;GAEvB;EACF;EACA,IAAMqC,IAAQ7B,EAAE,GACVuiB,IAAO,KAAK,IAAI,GAAG,KAAK,MAAMnnB,IAAQF,IAAU,CAAC,CAAC,GAClDsnB,KAAQ,MAAkB;GAC9B,IAAgBzqB,EAAM0J,GAAO,GAAG,KAAK,IAAI,GAAGI,IAAQ,CAAC,CAAC;GACtD,IAAMF,IAAIH,EAAI3E,CAAa;GAI3B,AAHI8E,IAAIzG,MAAS,MAAUA,IAAUyG,KAAKzG,IAAU,IAChDyG,IAAIvG,IAAQF,MAAS,MAAUyG,IAAIvG,IAAQF,KAAWA,IAAU,IACpEoM,GAAU,GACVua,GAAShlB,CAAa;EACxB,GACMulB,IAAUvlB,KAAiB,KAAK,IAAIgF,IAAQ,GAAG,KAAK,MAAM1G,CAAK,CAAC;EACtE,QAAQqE,EAAM,KAAd;GACE,KAAK;IACH,EAAK4iB,KAAW5iB,EAAM,WAAW,KAAK,EAAE;IACxC;GACF,KAAK;IACH,EAAK4iB,KAAW5iB,EAAM,WAAW,KAAK,EAAE;IACxC;GACF,KAAK;IACH,EAAK4iB,IAAUG,CAAI;IACnB;GACF,KAAK;IACH,EAAKH,IAAUG,CAAI;IACnB;GACF,KAAK;IACH,EAAK,CAAC;IACN;GACF,KAAK;IAEH,AADAC,EAAK3gB,IAAQ,CAAC,GACd+f,GAAS,iBAAiB,EAAI;IAC9B;GACF,KAAK;GACL,KAAK;GACL,KAAK;IACH,GAAO/kB,MAAkB,OAA4BzB,IAArBoG,EAAI3E,CAAa,GAAW,GAAG;IAC/D;GACF,KAAK;GACL,KAAK;GACL,KAAK;IACH,GAAOA,MAAkB,OAA4BzB,IAArBoG,EAAI3E,CAAa,GAAW,IAAI,GAAG;IACnE;GACF,KAAK;IACH,AAAIwB,KAAa,KAAc,KACtBY,KAAe8gB,GAAU,EAAK,IAC9BjiB,KACP,IAAQ,MACR,KAAc,KACLH,OAAS,WACXC,KAAUqe,GAAO,IAAI,IACzB,IAAgB,OAFSF,GAAQ,UAAU,EAAI;IAGpD;GACF,KAAK;GACL,KAAK,aAAa;IAChB,IAAMkB,IAAS5f,EAAS,MAAM,MAAMgI,EAAE,OAAOzH,EAAQ;IACrD,IAAI,CAACqf,KAAUA,EAAO,QAAQ;IAC9B,GAAcA,EAAO,EAAE;IACvB;GACF;GACA,SACE;EACJ;EAEA,AADAzd,EAAM,eAAe,GACrBiF,EAAW;CACb,CA+B0C,GAC1CnL,EAAK,iBAAiB,eA9BA;EACpB,IAAImpB,IAAW;EACf,IAAI;GACF,IAAWnpB,EAAK,QAAQ,gBAAgB;EAC1C,QAAQ,CAER;EACA,AAAImpB,MACF,EAAK,MAAM,YAAY,mBAAmBliB,EAAMzE,EAAM,SAAS,EAAG;CACtE,CAqBsC,GACtCxC,EAAK,iBAAiB,cArBD;EAMnB,AALA,EAAK,MAAM,YAAY,IACnBwD,MACFujB,GAAY,EAAI,GAChB5b,EAAW,IAET5H,MAAkB,SACpB,IAAgB,MAChB4H,EAAW;CAEf,CAWoC,GACpC9K,GAAK,iBAAiB,gBAAgB,MAAU6F,EAAM,gBAAgB,CAAC,GACvE7F,GAAK,iBAAiB,eAAeioB,GAAS,iBAAiB,EAAI,CAAC;CAEpE,IAAMc,KACJ,OAAO,kBAAmB,aACtB,IAAI,qBAAqBje,EAAW,CAAC,IACrC;CACN,IAAgB,QAAQnL,CAAI;CAE5B,IAAMqpB,WAAqB;EACzB,IAAIzpB,IAAW;EACf,IAAMgL,IAAOnI,EAAUzC,CAAI;EAI3B,AAHIspB,EAAmB9mB,GAAOoI,CAAI,KAAG,MACrC,IAAQA,GACR,KAAY,IACZO,EAAW;CACb,GACMoe,KAAeC,EAAWH,EAAY,GAGxCI,KAAwC;CAC5C,AAAI,OAAO,oBAAqB,cAAczpB,EAAK,kBACjD,KAAe,IAAI,uBAAuB;EACxC,IAAIN,EAAQ,QAAQ;EACpB,IAAMiN,IAASxG;EAEf,AADAK,GAAa,GACTL,MAAWwG,MACf,KAAY,IACZ,MACA+c,GAAY,GACZve,EAAW;CACb,CAAC,GACDse,GAAa,QAAQzpB,EAAK,cAAc,iBAAiB;EACvD,YAAY;EACZ,iBAAiB,CAAC,MAAM;CAC1B,CAAC;CAMH,IAAM2pB,WAA0C;EAC9C,IAAI/pB,IAAW,OAAO;EAOtB,AALIkD,OACErD,IAAK,uBAAsBA,GAAI,qBAAqBqD,EAAO,IAC1D,aAAaA,EAAO,GACzB,KAAU,IAEZ+d,GAAM;EACN,IAAMzO,IAAM3S,IAAK,oBAAoB,GAC/B2X,IAAS7X,EAAI,cAAc,QAAQ;EAEzC,AADA,EAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM0C,KAAQmQ,CAAG,CAAC,GAClD,EAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAMlQ,KAASkQ,CAAG,CAAC;EACpD,IAAMpB,IAAMoG,EAAO,WAAW,IAAI;EAClC,IAAI,CAACpG,GAAK,OAAO;EAEjB,AADA,EAAI,YAAY/J,EAAMzE,EAAM,UAAU,GACtCwO,EAAI,SAAS,GAAG,GAAGoG,EAAO,OAAOA,EAAO,MAAM;EAC9C,IAAI;GAUF,AATApG,EAAI,UAAU9Q,IAAY,GAAG,CAAC,GAC1B0C,KACFoO,EAAI,UACFpO,EAAS,QACT,GACA,GACA,KAAK,MAAMd,IAAQsQ,CAAG,GACtB,KAAK,MAAMrQ,IAAQqQ,CAAG,CACxB,GACFpB,EAAI,UAAU7Q,IAAY,GAAG,CAAC;EAChC,QAAQ,CAER;EAEA,EAAI,aAAaiS,GAAK,GAAG,GAAGA,GAAK,GAAG,CAAC;EACrC,IAAMwX,IAAS5pB,EAAK,sBAAsB,GACpC6pB,IAAOpqB,MAAO;EAgBpB,OAfAW,GAAQ,iBAAiB,cAAc,CAAC,CAAC,SAAS,MAAY;GAC5D,IAAM0Z,IAAOgQ,EAAQ,eAAe;GACpC,IAAIA,EAAQ,SAAS,UAAU,CAAChQ,EAAK,KAAK,KAAK,CAAC+P,GAAM;GACtD,IAAMxH,IAAOyH,EAAQ,sBAAsB,GACrCC,IAAWF,EAAK,iBAAiBC,CAAO;GAK9C,AAJA,EAAI,OAAO,GAAGC,EAAS,WAAW,GAAGA,EAAS,SAAS,GAAGA,EAAS,cACnE,EAAI,YAAYA,EAAS,SAAS9iB,EAAMzE,EAAM,IAAI,GAClD,EAAI,YAAY,QAChB,EAAI,eAAe,UACnBwO,EAAI,SACF8I,GACAuI,EAAK,OAAOuH,EAAO,MACnBvH,EAAK,MAAMuH,EAAO,MAAMvH,EAAK,SAAS,CACxC;EACF,CAAC,GACMjL;CACT,GAEI4S,KAAa,IACXC,WAAqB;EACzB,IAAMrf,IAAOrL,EAAI,sBAAsBS;EACvC,AAAI4K,MAASof,OACb,KAAapf,GACb,EAAK,MAAM,aAAaA,IAAO3D,EAAMzE,EAAM,UAAU,IAAI,IACzDuD,EAAK,oBAAoB6E,CAAI,GAC7BO,EAAW;CACb;CACA,EAAI,iBAAiB,oBAAoB8e,EAAY;CAIrD,IAAMC,KAAe,OAAO,oBAAkC,IAAI,IAAI,MAAM;EAC1E,IAAMC,IAAQ,EAAEtnB,IACV+H,IAAO,MAAMwf,EACjB1qB,EAAQ,YAAY,cACd2qB,EAAiB9qB,CAAG,IACzB,MAAS;GACR,AAAIK,MAAagD,GAAU,SAASoX,MACpCpX,EAAS,QAAQ,GACjBA,EAAS,OAAO,OAAO,GACvB,IAAW,MACXsnB,mBAAkB,IAAI,IAAI,CAAC,GAAGI,GAAStQ,CAAI,CAAC,CAAC;EAC/C,GACAsQ,CACF;EACA,IAAI1qB,MAAauqB,MAAUtnB,IAAe;GACxC,GAAM,QAAQ;GACd;EACF;EAaA,AAZID,MACFA,EAAS,QAAQ,GACjBA,EAAS,OAAO,OAAO,IAEzB,IAAWgI,GACX,KAAU,IACNA,MACF,EAAK,QAAQ,WAAWA,EAAK,MAC7B5K,EAAK,aAAa4K,EAAK,QAAQzK,EAAU,GACzC4F,EAAK,YAAY6E,EAAK,IAAI,IAE5BzH,GAAayH,GAAM,QAAQ,IAAI,GAC/BO,EAAW;CACb,GAIMue,WAAoB;EACxB,IAAMa,IAAS7qB,EAAQ,UAAU;EACjC,EAAK,aACH,cACAA,EAAQ,aAAaV,EAAKyH,GAAO,CAAC,CAAC,OAAO,EAAE,UAAO,CAAC,CAAC,CAAC,KAAK,CAC7D;EACA,IAAM+jB,IAAY,CAAC,CAAC9qB,EAAQ,aAAaA,EAAQ,kBAAkB;EAGnE,AAFI8qB,KAAa,CAAC/kB,OAChB,KAAiB,YAAY0F,GAAY,GAAI,IAC3C,CAACqf,KAAa/kB,OAChB,cAAcA,EAAc,GAC5B,KAAiB;CAErB,GAEMglB,MAAgB,MAAyC;EAC7D,IAAM7f,IAAOlL;EACb,GAAa;EACb,IAAMgrB,IACJ9f,EAAK,YAAY+f,GAAW/f,EAAK,QAAQ,IAAIA,EAAK,WAAW,KAAA,GACzDggB,IACJ,CAAC,CAAC1H,MACDtY,EAAK,cAAcsY,EAAS,aAAawH,MAAa1hB;EAIzD,IAHA,KAAO0hB,IACH,CAACxH,KAAYtY,EAAK,eAAesY,EAAS,eAAY9X,GAAe,GAErEwf,GAAa,KAAK,IAAM3iB,KAAShH,GAAS,GAAW,IAAIgH,GAAO,CAAC;EAYrE,KAXI,CAACib,KAAYtY,EAAK,YAAYsY,EAAS,YAASzX,GAAgB,GAChEb,EAAK,SAAS,CAACsY,KAAYtY,EAAK,SAASsY,EAAS,SAChDxd,KAAQ+gB,GAAU,EAAK,GACvBvD,IAAU7W,GAAgBzB,EAAK,IAAI,IAClCqB,GAAYrB,EAAK,IAAI,KACjB,CAACA,EAAK,QAAQsY,GAAU,SAC7Bxd,KAAQ+gB,GAAU,EAAK,GAC3Bxa,GAAY,CAAC,CAAC,IAEZiX,KAAYtY,EAAK,eAAesY,EAAS,cAActY,EAAK,eAC9D,IAAUA,EAAK,aACbsY,KAAYtY,EAAK,cAAcsY,EAAS,WAAW;GACrD,IAAMtV,IAAQxL,GAAO,IAAIrE,CAAK;GAC9B,AAAI6P,MAAO,EAAM,OAAO;EAC1B;EAeA,IAbEhD,EAAK,YACLA,EAAK,aAAa5G,OACjB,CAACkf,KAAYtY,EAAK,aAAasY,EAAS,cAErCA,IAAUH,GAAenY,EAAK,UAAU,EAAK,IAC5C,IAAW,KAAYA,EAAK,WAGjCsY,MACCtY,EAAK,eAAe,eAAesY,EAAS,eAAe,aAE5DT,GAAQ7X,EAAK,eAAe,UAAU,EAAK,GAEzCsY,KAAYtY,EAAK,eAAesY,EAAS,eAC3Cle,GAAc,MAAM,GAEhBxB,GAAU,SAAS,SAAQ;GAC7B,IAAM+H,IAAK/H,EAAS,IACdqQ,IAAO4U,GAAS,CAAC,CAAC,MAAM,MAAMje,EAAE,OAAOe,CAAE;GAC/C,IAAWsI,IACP;IAAE,MAAM;IAAQ;IAAI,OAAOA,EAAK;IAAO,UAAU,KAAA;GAAU,IAC3D;EACN;EAWF,AATIjJ,EAAK,aAAY5K,EAAK,aAAa,qBAAqBb,EAAU,KAEpEa,EAAK,gBAAgB,mBAAmB,GACpCwD,KAAUujB,GAAY,EAAI,IAE5B7D,KAAYtY,EAAK,eAAesY,EAAS,eAC3C,KAAU,KAAK,IAAIniB,IAAS,CAAC,IAC/B,MACA2oB,GAAY,GACZve,EAAW;CACb;CAGA,AADAsf,GAAa,IAAI,GACjBP,GAAkB;CAClB,IAAMW,KAAkBC,QAChBprB,EAAQ,gBACR,KAAKwqB,GAAa,CAC1B,GAIM5B,KAAiC;EACrC,WAAW,GAAM;GACf,IAAI1oB,IAAW;GACf,IAAMsjB,IAAWxjB;GAGjB,AAFA,IAAU,EAAE,GAAGkL,EAAK,GACpB6f,GAAavH,CAAQ,IAChBtY,EAAK,YAAY,aAAasY,EAAS,YAAY,WACtDgH,GAAkB;EACtB;EACA,QAAQ,GAAM;GAEZ,AADIxkB,KAAQ+gB,GAAU,EAAK,GAC3Bxa,GAAYE,CAAI;EAClB;EACA,OAAO,GAAK;GACV,IAAIzG,GAAQ;IAEV,GAAYA,EAAO,QAAQyU,CAAG;IAC9B;GACF;GACA,IAAMxN,IAASjG,EAAE,GACXgG,IAASV,GAAgB,GACzBY,IAAKrP,GAAYmD,GAAOyZ,CAAG;GACjC,AAAIvN,IAAK,MACLlG,EAAE,IAAIiG,KAAUD,MAAQ,KAAShG,EAAE,IAAIiG,IAC3C3B,GAAgB4B,CAAE;EACpB;EACA,WAAW,GAAM;GACf,IAAIlH,GAAQ;IACV,GAAYA,EAAO,QAAQyG,CAAI;IAC/B;GACF;GACA,IAAMQ,IAASjG,EAAE,GACXgG,IAASV,GAAgB,GACzBY,IAAKpP,GAAYkD,GAAOyL,CAAI;GAClC,AAAIS,IAAK,MACLF,MAAQ,KAAShG,EAAE,IAAIiG,IAC3B3B,GAAgB4B,CAAE;EACpB;EACA,YAAY,GAAM;GAChB,AAAIlH,KAAQslB,GAAatlB,EAAO,QAAQyG,CAAI;GAC5C,IAAMW,IAAQrP,GAAaiD,GAAOyL,CAAI;GACtC,AAAKW,MACL,KAAUjM,GAAc,GACxB,KAAYA,GAAc,GAC1B,KAAU,GACV,KAASiM,GACLvJ,MAAkB,SAAM,KAAiBuJ,IAC7C9B,GAAgB,CAAC;EACnB;EACA,mBAAmBtE,EAAE;EACrB,SAAS,MACPyB,KAAS,KAAKA,IAAQzB,EAAE,IAAIyb,GAAQzhB,GAAO,KAAK,MAAMyH,CAAK,CAAC,IAAI;EAClE,iBAAiB,IAAgB,IAAM;GACrC,IAAMwb,IAASjd,EAAE,IAAI,KAAKhH,EAAQ,eAAe;GAgBjD,AAfA,KAAU,MAERurB,KACA/rB,EAAO2C,CAAK,KACZ,KAAK,IAAI8hB,IAAS9hB,CAAK,IAAID,IAAUE,IAAQ,IAE7C,KAAa;IACX,MAAMD;IACN,IAAI8hB;IACJ,OACE,OAAO,cAAgB,MAAc,YAAY,IAAI,IAAI,KAAK,IAAI;GACtE,IAEA,IAAQA,GAEVxY,EAAW;EACb;EACA,aAAa;GACX,IAAM5C,IAAQ7B,EAAE;GAChB,AAAK6B,KACL+f,GAAS,gBAAgB;IACvB,MAAM;IACN,IAAI/f,IAAQ,KAAK7I,EAAQ,eAAe;GAC1C,CAAC;EACH;EACA,uBAAuBwiB,GAAa;EACpC,gBAAgB,EAAE,SAAM,SAAM;GAC5B,AAAM5O,IAAKnJ,MACX,KAAU,MACV,KAAa,MACb,KAAe;IAAE;IAAM;GAAG,GAC1BqX,GAAW1d,EAAY,GACvBqH,EAAW;EACb;EACA,sBAAsB;GACpB,IAAMqE,IAAQ0S,GAAa;GAC3B,OAAO;IAAE,MAAMzZ,GAAW+G,EAAM,IAAI;IAAG,IAAI/G,GAAW+G,EAAM,EAAE;GAAE;EAClE;EACA,oBAAoB,EAAE,SAAM,SAAM;GAChC,AAAK9I,EAAE,KAAO4M,IAAKnJ,KACnBme,GAAS,gBAAgB;IACvB,MAAM1f,GAAgBuB,CAAI;IAC1B,IAAIvB,GAAgB0K,CAAE;GACxB,CAAC;EACH;EACA,aAAa,GAAM,GAAO;GAGxB,AAFA,KACEzK,MAAS,QAAQ,CAAC3J,EAAO2J,CAAI,IAAI,OAAO;IAAE;IAAM,OAAO+E,KAAS;GAAI,GACtEzC,EAAW;EACb;EACA,aAAa,GAAM;GACjB,IAAU;IAAE,GAAGzL;IAAS,WAAWiO;GAAK;GACxC,IAAMC,IAAQxL,GAAO,IAAIrE,CAAK;GAE9B,AADI6P,MAAO,EAAM,OAAO,KACxBzC,EAAW;EACb;EACA,mBAAmB;GACjB,KAAK,IAAMiB,KAAShK,GAAO,OAAO,GAAG,EAAM,OAAO;GAClD,EAAW;EACb;EACA,iBAAiB,MAASqgB,GAAQ7X,GAAM,EAAI;EAC5C,sBAAsBvG;EACtB,mBAAmBN;EACnB,YAAY,GAAM;GAChB,GAAe6G,GAAM,EAAK;EAC5B;EACA;EACA;EACA,gBAAgB,MAAO+X,GAAOpX,CAAE;EAChC;EACA;EACA,cAAcqX;EACd,YAAY,GAAM;GAChB,IAAI,CAAClc,EAAE,KAAK,CAAChB,GAAQ;GACrB,IAAImD,MAAS,KAAA,GAAW;IAItB,AAHInD,KAAQ+gB,GAAU,EAAI,GAC1B,KAAgB,IAChBX,GAAW,GACX3a,EAAW;IACX;GACF;GACA,IAAMuV,IAAShb,IAASA,EAAO,SAAShF;GACxC,GAAYoI,GAAY4X,EAAO,MAAMA,EAAO,QAAQ7X,CAAI,CAAC;EAC3D;EACA,aAAa,IAAQ,MAAMud,GAAa,KAAK,IAAI,GAAG,KAAK,MAAM7d,CAAK,CAAC,CAAC;EACtE,aAAa,MAAU8d,GAAWC,CAAK;EACvC,cAAc;GACZ,AAAK5gB,MACLwgB,GAAgB,GAChBJ,GAAW;EACb;EACA,kBAAkBW,GAAU,EAAI;EAChC,gBAAgBZ;EAChB,UAAU,IAAO,aAAa,GAAS;GACrC,OAAO8D,GAAQ,CAAC,EAAE,UAAU3jB,GAAMklB,CAAO,KAAK;EAChD;EACA,OAAO,IAAO,aAAa,GAAS;GAClC,IAAM9T,IAASuS,GAAQ;GACvB,OAAO,IAAI,SAAS,MAAY;IAC9B,AAAI,CAACvS,KAAU,OAAOA,EAAO,UAAW,aAAY/T,EAAQ,IAAI,IAC3D+T,EAAO,OAAO/T,GAAS2C,GAAMklB,CAAO;GAC3C,CAAC;EACH;EACA,MAAM,oBAAoB;GACxB,AAAI,OAAOlrB,EAAK,qBAAsB,cACpC,MAAMA,EAAK,kBAAkB;EACjC;EACA,MAAM,iBAAiB;GACrB,AACET,EAAI,sBAAsBS,KAC1B,OAAOT,EAAI,kBAAmB,cAE9B,MAAMA,EAAI,eAAe;EAC7B;EACA,oBAAoBA,EAAI,sBAAsBS;EAC9C,oBAAoB,GAAI,GAAS;GAE/B,AADAmB,GAAW,IAAIoK,GAAI4f,CAAO,GAC1BhgB,EAAW;EACb;EACA,mBAAmBvI,GAAU,QAAQ;EACrC;EACA;EACA,cAAcuI,EAAW;EACzB,GAAG,GAAM,GAAU;GACjB,IAAIigB,IAAMtlB,GAAU,IAAIE,CAAI;GAG5B,OAFKolB,KAAKtlB,GAAU,IAAIE,GAAO,oBAAM,IAAI,IAAI,CAAE,GAC/ColB,EAAI,IAAIC,CAAkC,SAC7BD,EAAI,OAAOC,CAAkC;EAC5D;EACA,UAAU;GACR,AAAIzrB,OACJ,KAAY,IACRkD,OACErD,IAAK,uBAAsBA,GAAI,qBAAqBqD,EAAO,IAC1D,aAAaA,EAAO,IAEvB2C,MAAgB,cAAcA,EAAc,GAC5CC,GAAQ,SAAO,cAAcA,EAAO,KAAK,GAC7CnG,EAAI,oBAAoB,oBAAoB0qB,EAAY,GACxDb,IAAgB,WAAW,GAC3ByB,GAAgB,GAChBtB,GAAa,GACbE,IAAc,WAAW,GACzBzpB,EAAK,oBAAoB,SAASkoB,EAAO,GACzCtlB,GAAU,QAAQ,GAClB,IAAW,MACXO,GAAa,IAAI,GACjB2C,GAAU,MAAM,GAChB9F,EAAK,OAAO;EACd;CACF;CAOA,OANAzB,GAAU,IAAI+pB,IAAU,EACtB,aAAa,GAAO;EAElB,AADA,KAAc,IACdA,GAAS,oBAAoB9Y,CAAK;CACpC,EACF,CAAC,GACM8Y;AACT"}
|