@camstack/addon-vision 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/addons/animal-classifier/index.d.mts +30 -0
  2. package/dist/addons/animal-classifier/index.d.ts +30 -0
  3. package/dist/addons/animal-classifier/index.js +822 -999
  4. package/dist/addons/animal-classifier/index.js.map +1 -1
  5. package/dist/addons/animal-classifier/index.mjs +7 -242
  6. package/dist/addons/animal-classifier/index.mjs.map +1 -1
  7. package/dist/addons/audio-classification/index.d.mts +36 -0
  8. package/dist/addons/audio-classification/index.d.ts +36 -0
  9. package/dist/addons/audio-classification/index.js +378 -501
  10. package/dist/addons/audio-classification/index.js.map +1 -1
  11. package/dist/addons/audio-classification/index.mjs +4 -224
  12. package/dist/addons/audio-classification/index.mjs.map +1 -1
  13. package/dist/addons/bird-global-classifier/index.d.mts +31 -0
  14. package/dist/addons/bird-global-classifier/index.d.ts +31 -0
  15. package/dist/addons/bird-global-classifier/index.js +825 -1002
  16. package/dist/addons/bird-global-classifier/index.js.map +1 -1
  17. package/dist/addons/bird-global-classifier/index.mjs +7 -248
  18. package/dist/addons/bird-global-classifier/index.mjs.map +1 -1
  19. package/dist/addons/bird-nabirds-classifier/index.d.mts +33 -0
  20. package/dist/addons/bird-nabirds-classifier/index.d.ts +33 -0
  21. package/dist/addons/bird-nabirds-classifier/index.js +825 -1002
  22. package/dist/addons/bird-nabirds-classifier/index.js.map +1 -1
  23. package/dist/addons/bird-nabirds-classifier/index.mjs +7 -289
  24. package/dist/addons/bird-nabirds-classifier/index.mjs.map +1 -1
  25. package/dist/addons/face-detection/index.d.mts +29 -0
  26. package/dist/addons/face-detection/index.d.ts +29 -0
  27. package/dist/addons/face-detection/index.js +934 -1196
  28. package/dist/addons/face-detection/index.js.map +1 -1
  29. package/dist/addons/face-detection/index.mjs +7 -227
  30. package/dist/addons/face-detection/index.mjs.map +1 -1
  31. package/dist/addons/face-recognition/index.d.mts +29 -0
  32. package/dist/addons/face-recognition/index.d.ts +29 -0
  33. package/dist/addons/face-recognition/index.js +807 -1003
  34. package/dist/addons/face-recognition/index.js.map +1 -1
  35. package/dist/addons/face-recognition/index.mjs +6 -197
  36. package/dist/addons/face-recognition/index.mjs.map +1 -1
  37. package/dist/addons/motion-detection/index.d.mts +28 -0
  38. package/dist/addons/motion-detection/index.d.ts +28 -0
  39. package/dist/addons/motion-detection/index.js +111 -214
  40. package/dist/addons/motion-detection/index.js.map +1 -1
  41. package/dist/addons/motion-detection/index.mjs +9 -12
  42. package/dist/addons/motion-detection/index.mjs.map +1 -1
  43. package/dist/addons/object-detection/index.d.mts +31 -0
  44. package/dist/addons/object-detection/index.d.ts +31 -0
  45. package/dist/addons/object-detection/index.js +1082 -1287
  46. package/dist/addons/object-detection/index.js.map +1 -1
  47. package/dist/addons/object-detection/index.mjs +7 -373
  48. package/dist/addons/object-detection/index.mjs.map +1 -1
  49. package/dist/addons/plate-detection/index.d.mts +30 -0
  50. package/dist/addons/plate-detection/index.d.ts +30 -0
  51. package/dist/addons/plate-detection/index.js +868 -1075
  52. package/dist/addons/plate-detection/index.js.map +1 -1
  53. package/dist/addons/plate-detection/index.mjs +7 -230
  54. package/dist/addons/plate-detection/index.mjs.map +1 -1
  55. package/dist/addons/plate-recognition/index.d.mts +31 -0
  56. package/dist/addons/plate-recognition/index.d.ts +31 -0
  57. package/dist/addons/plate-recognition/index.js +505 -684
  58. package/dist/addons/plate-recognition/index.js.map +1 -1
  59. package/dist/addons/plate-recognition/index.mjs +5 -244
  60. package/dist/addons/plate-recognition/index.mjs.map +1 -1
  61. package/dist/addons/segmentation-refiner/index.d.mts +30 -0
  62. package/dist/addons/segmentation-refiner/index.d.ts +30 -0
  63. package/dist/addons/segmentation-refiner/index.js +790 -967
  64. package/dist/addons/segmentation-refiner/index.js.map +1 -1
  65. package/dist/addons/segmentation-refiner/index.mjs +17 -21
  66. package/dist/addons/segmentation-refiner/index.mjs.map +1 -1
  67. package/dist/addons/vehicle-classifier/index.d.mts +31 -0
  68. package/dist/addons/vehicle-classifier/index.d.ts +31 -0
  69. package/dist/addons/vehicle-classifier/index.js +410 -581
  70. package/dist/addons/vehicle-classifier/index.js.map +1 -1
  71. package/dist/addons/vehicle-classifier/index.mjs +16 -20
  72. package/dist/addons/vehicle-classifier/index.mjs.map +1 -1
  73. package/dist/chunk-22BHCDT5.mjs +101 -0
  74. package/dist/{chunk-WG66JYYW.mjs.map → chunk-22BHCDT5.mjs.map} +1 -1
  75. package/dist/chunk-2IOKI4ES.mjs +335 -0
  76. package/dist/{chunk-PIFS7AIT.mjs.map → chunk-2IOKI4ES.mjs.map} +1 -1
  77. package/dist/chunk-7DYHXUPZ.mjs +36 -0
  78. package/dist/{chunk-BS4DKYGN.mjs.map → chunk-7DYHXUPZ.mjs.map} +1 -1
  79. package/dist/chunk-BJTO5JO5.mjs +11 -0
  80. package/dist/chunk-BP7H4NFS.mjs +412 -0
  81. package/dist/{chunk-MGT6RUVX.mjs.map → chunk-BP7H4NFS.mjs.map} +1 -1
  82. package/dist/chunk-BR2FPGOX.mjs +98 -0
  83. package/dist/{chunk-YYDM6V2F.mjs.map → chunk-BR2FPGOX.mjs.map} +1 -1
  84. package/dist/chunk-D6WEHN33.mjs +276 -0
  85. package/dist/chunk-D6WEHN33.mjs.map +1 -0
  86. package/dist/chunk-DRYFGARD.mjs +289 -0
  87. package/dist/chunk-DRYFGARD.mjs.map +1 -0
  88. package/dist/chunk-DUN6XU3N.mjs +72 -0
  89. package/dist/{chunk-XD7WGXHZ.mjs.map → chunk-DUN6XU3N.mjs.map} +1 -1
  90. package/dist/chunk-ESLHNWWE.mjs +387 -0
  91. package/dist/chunk-ESLHNWWE.mjs.map +1 -0
  92. package/dist/chunk-JUQEW6ON.mjs +256 -0
  93. package/dist/chunk-JUQEW6ON.mjs.map +1 -0
  94. package/dist/chunk-KUO2BVFY.mjs +90 -0
  95. package/dist/{chunk-DE7I3VHO.mjs.map → chunk-KUO2BVFY.mjs.map} +1 -1
  96. package/dist/chunk-R5J3WAUI.mjs +645 -0
  97. package/dist/chunk-R5J3WAUI.mjs.map +1 -0
  98. package/dist/chunk-XZ6ZMXXU.mjs +39 -0
  99. package/dist/{chunk-K36R6HWY.mjs.map → chunk-XZ6ZMXXU.mjs.map} +1 -1
  100. package/dist/chunk-YPU4WTXZ.mjs +269 -0
  101. package/dist/chunk-YPU4WTXZ.mjs.map +1 -0
  102. package/dist/chunk-YUCD2TFH.mjs +242 -0
  103. package/dist/chunk-YUCD2TFH.mjs.map +1 -0
  104. package/dist/chunk-ZTJENCFC.mjs +379 -0
  105. package/dist/chunk-ZTJENCFC.mjs.map +1 -0
  106. package/dist/chunk-ZWYXXCXP.mjs +248 -0
  107. package/dist/chunk-ZWYXXCXP.mjs.map +1 -0
  108. package/dist/index.d.mts +183 -0
  109. package/dist/index.d.ts +183 -0
  110. package/dist/index.js +3930 -4449
  111. package/dist/index.js.map +1 -1
  112. package/dist/index.mjs +250 -2698
  113. package/dist/index.mjs.map +1 -1
  114. package/package.json +5 -5
  115. package/dist/chunk-2YMA6QOV.mjs +0 -193
  116. package/dist/chunk-2YMA6QOV.mjs.map +0 -1
  117. package/dist/chunk-3IIFBJCD.mjs +0 -45
  118. package/dist/chunk-BS4DKYGN.mjs +0 -48
  119. package/dist/chunk-DE7I3VHO.mjs +0 -106
  120. package/dist/chunk-F6D2OZ36.mjs +0 -89
  121. package/dist/chunk-F6D2OZ36.mjs.map +0 -1
  122. package/dist/chunk-GAOIFQDX.mjs +0 -59
  123. package/dist/chunk-GAOIFQDX.mjs.map +0 -1
  124. package/dist/chunk-HUIX2XVR.mjs +0 -159
  125. package/dist/chunk-HUIX2XVR.mjs.map +0 -1
  126. package/dist/chunk-K36R6HWY.mjs +0 -51
  127. package/dist/chunk-MBTAI3WE.mjs +0 -78
  128. package/dist/chunk-MBTAI3WE.mjs.map +0 -1
  129. package/dist/chunk-MGT6RUVX.mjs +0 -423
  130. package/dist/chunk-PIFS7AIT.mjs +0 -446
  131. package/dist/chunk-WG66JYYW.mjs +0 -116
  132. package/dist/chunk-XD7WGXHZ.mjs +0 -82
  133. package/dist/chunk-YYDM6V2F.mjs +0 -113
  134. package/dist/chunk-ZK7P3TZN.mjs +0 -286
  135. package/dist/chunk-ZK7P3TZN.mjs.map +0 -1
  136. /package/dist/{chunk-3IIFBJCD.mjs.map → chunk-BJTO5JO5.mjs.map} +0 -0
@@ -1,113 +0,0 @@
1
- import {
2
- __commonJS
3
- } from "./chunk-3IIFBJCD.mjs";
4
-
5
- // src/addons/motion-detection/frame-diff.js
6
- var require_frame_diff = __commonJS({
7
- "src/addons/motion-detection/frame-diff.js"(exports) {
8
- "use strict";
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.detectMotion = detectMotion;
11
- function detectMotion(current, previous, width, height, threshold, minArea) {
12
- const numPixels = width * height;
13
- const mask = new Uint8Array(numPixels);
14
- for (let i = 0; i < numPixels; i++) {
15
- mask[i] = Math.abs((current[i] ?? 0) - (previous[i] ?? 0)) > threshold ? 1 : 0;
16
- }
17
- const labels = new Int32Array(numPixels).fill(0);
18
- const parent = new Int32Array(numPixels + 1).fill(0);
19
- let nextLabel = 1;
20
- function findRoot(x) {
21
- while (parent[x] !== x) {
22
- parent[x] = parent[parent[x]];
23
- x = parent[x];
24
- }
25
- return x;
26
- }
27
- function union(a, b) {
28
- const ra = findRoot(a);
29
- const rb = findRoot(b);
30
- if (ra !== rb)
31
- parent[rb] = ra;
32
- return ra;
33
- }
34
- for (let i = 0; i <= numPixels; i++) {
35
- parent[i] = i;
36
- }
37
- for (let y = 0; y < height; y++) {
38
- for (let x = 0; x < width; x++) {
39
- const idx = y * width + x;
40
- if (!mask[idx])
41
- continue;
42
- const above = y > 0 ? labels[(y - 1) * width + x] ?? 0 : 0;
43
- const left = x > 0 ? labels[y * width + (x - 1)] ?? 0 : 0;
44
- if (above === 0 && left === 0) {
45
- labels[idx] = nextLabel;
46
- parent[nextLabel] = nextLabel;
47
- nextLabel++;
48
- } else if (above !== 0 && left === 0) {
49
- labels[idx] = above;
50
- } else if (above === 0 && left !== 0) {
51
- labels[idx] = left;
52
- } else {
53
- labels[idx] = union(above, left);
54
- }
55
- }
56
- }
57
- for (let i = 0; i < numPixels; i++) {
58
- if (labels[i]) {
59
- labels[i] = findRoot(labels[i]);
60
- }
61
- }
62
- const bboxMap = /* @__PURE__ */ new Map();
63
- for (let y = 0; y < height; y++) {
64
- for (let x = 0; x < width; x++) {
65
- const idx = y * width + x;
66
- const label = labels[idx];
67
- if (!label)
68
- continue;
69
- const diff = Math.abs((current[idx] ?? 0) - (previous[idx] ?? 0));
70
- const existing = bboxMap.get(label);
71
- if (existing) {
72
- existing.minX = Math.min(existing.minX, x);
73
- existing.minY = Math.min(existing.minY, y);
74
- existing.maxX = Math.max(existing.maxX, x);
75
- existing.maxY = Math.max(existing.maxY, y);
76
- existing.count++;
77
- existing.intensitySum += diff;
78
- } else {
79
- bboxMap.set(label, {
80
- minX: x,
81
- minY: y,
82
- maxX: x,
83
- maxY: y,
84
- count: 1,
85
- intensitySum: diff
86
- });
87
- }
88
- }
89
- }
90
- const regions = [];
91
- for (const [, info] of bboxMap) {
92
- if (info.count < minArea)
93
- continue;
94
- regions.push({
95
- bbox: {
96
- x: info.minX,
97
- y: info.minY,
98
- w: info.maxX - info.minX + 1,
99
- h: info.maxY - info.minY + 1
100
- },
101
- pixelCount: info.count,
102
- intensity: info.intensitySum / info.count
103
- });
104
- }
105
- return regions;
106
- }
107
- }
108
- });
109
-
110
- export {
111
- require_frame_diff
112
- };
113
- //# sourceMappingURL=chunk-YYDM6V2F.mjs.map
@@ -1,286 +0,0 @@
1
- import {
2
- require_yolo
3
- } from "./chunk-DE7I3VHO.mjs";
4
- import {
5
- require_object_detection_models
6
- } from "./chunk-MGT6RUVX.mjs";
7
- import {
8
- __commonJS,
9
- __require
10
- } from "./chunk-3IIFBJCD.mjs";
11
-
12
- // src/catalogs/segmentation-models.js
13
- var require_segmentation_models = __commonJS({
14
- "src/catalogs/segmentation-models.js"(exports) {
15
- "use strict";
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.SEGMENTATION_MODELS = void 0;
18
- var types_1 = __require("@camstack/types");
19
- var object_detection_models_js_1 = require_object_detection_models();
20
- var HF_REPO = "camstack/camstack-models";
21
- exports.SEGMENTATION_MODELS = [
22
- // ── YOLO11-seg ───────────────────────────────────────────────
23
- {
24
- id: "yolo11n-seg",
25
- name: "YOLO11 Nano Segmentation",
26
- description: "YOLO11 Nano \u2014 fastest, smallest YOLO11 instance segmentation model",
27
- inputSize: { width: 640, height: 640 },
28
- labels: types_1.COCO_80_LABELS,
29
- formats: {
30
- onnx: {
31
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/onnx/camstack-yolo11n-seg.onnx"),
32
- sizeMB: 11
33
- },
34
- coreml: {
35
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/coreml/camstack-yolo11n-seg.mlpackage"),
36
- sizeMB: 6,
37
- isDirectory: true,
38
- files: object_detection_models_js_1.MLPACKAGE_FILES,
39
- runtimes: ["python"]
40
- },
41
- openvino: {
42
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/openvino/camstack-yolo11n-seg.xml"),
43
- sizeMB: 6,
44
- runtimes: ["python"]
45
- }
46
- }
47
- },
48
- {
49
- id: "yolo11s-seg",
50
- name: "YOLO11 Small Segmentation",
51
- description: "YOLO11 Small \u2014 balanced speed and accuracy for instance segmentation",
52
- inputSize: { width: 640, height: 640 },
53
- labels: types_1.COCO_80_LABELS,
54
- formats: {
55
- onnx: {
56
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/onnx/camstack-yolo11s-seg.onnx"),
57
- sizeMB: 39
58
- },
59
- coreml: {
60
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/coreml/camstack-yolo11s-seg.mlpackage"),
61
- sizeMB: 20,
62
- isDirectory: true,
63
- files: object_detection_models_js_1.MLPACKAGE_FILES,
64
- runtimes: ["python"]
65
- },
66
- openvino: {
67
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/openvino/camstack-yolo11s-seg.xml"),
68
- sizeMB: 20,
69
- runtimes: ["python"]
70
- }
71
- }
72
- },
73
- {
74
- id: "yolo11m-seg",
75
- name: "YOLO11 Medium Segmentation",
76
- description: "YOLO11 Medium \u2014 higher accuracy instance segmentation",
77
- inputSize: { width: 640, height: 640 },
78
- labels: types_1.COCO_80_LABELS,
79
- formats: {
80
- onnx: {
81
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/onnx/camstack-yolo11m-seg.onnx"),
82
- sizeMB: 86
83
- },
84
- coreml: {
85
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/coreml/camstack-yolo11m-seg.mlpackage"),
86
- sizeMB: 43,
87
- isDirectory: true,
88
- files: object_detection_models_js_1.MLPACKAGE_FILES,
89
- runtimes: ["python"]
90
- },
91
- openvino: {
92
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolo11-seg/openvino/camstack-yolo11m-seg.xml"),
93
- sizeMB: 43,
94
- runtimes: ["python"]
95
- }
96
- }
97
- },
98
- // ── YOLOv8-seg — CoreML supported ─────────────────────────────
99
- {
100
- id: "yolov8n-seg",
101
- name: "YOLOv8 Nano Segmentation",
102
- description: "YOLOv8 Nano \u2014 fastest, smallest YOLOv8 instance segmentation model",
103
- inputSize: { width: 640, height: 640 },
104
- labels: types_1.COCO_80_LABELS,
105
- formats: {
106
- onnx: {
107
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/onnx/camstack-yolov8n-seg.onnx"),
108
- sizeMB: 13
109
- },
110
- coreml: {
111
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/coreml/camstack-yolov8n-seg.mlpackage"),
112
- sizeMB: 7,
113
- isDirectory: true,
114
- files: object_detection_models_js_1.MLPACKAGE_FILES,
115
- runtimes: ["python"]
116
- },
117
- openvino: {
118
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/openvino/camstack-yolov8n-seg.xml"),
119
- sizeMB: 7,
120
- runtimes: ["python"]
121
- }
122
- }
123
- },
124
- {
125
- id: "yolov8s-seg",
126
- name: "YOLOv8 Small Segmentation",
127
- description: "YOLOv8 Small \u2014 balanced speed and accuracy for instance segmentation",
128
- inputSize: { width: 640, height: 640 },
129
- labels: types_1.COCO_80_LABELS,
130
- formats: {
131
- onnx: {
132
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/onnx/camstack-yolov8s-seg.onnx"),
133
- sizeMB: 45
134
- },
135
- coreml: {
136
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/coreml/camstack-yolov8s-seg.mlpackage"),
137
- sizeMB: 23,
138
- isDirectory: true,
139
- files: object_detection_models_js_1.MLPACKAGE_FILES,
140
- runtimes: ["python"]
141
- },
142
- openvino: {
143
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/openvino/camstack-yolov8s-seg.xml"),
144
- sizeMB: 23,
145
- runtimes: ["python"]
146
- }
147
- }
148
- },
149
- {
150
- id: "yolov8m-seg",
151
- name: "YOLOv8 Medium Segmentation",
152
- description: "YOLOv8 Medium \u2014 higher accuracy instance segmentation",
153
- inputSize: { width: 640, height: 640 },
154
- labels: types_1.COCO_80_LABELS,
155
- formats: {
156
- onnx: {
157
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/onnx/camstack-yolov8m-seg.onnx"),
158
- sizeMB: 104
159
- },
160
- coreml: {
161
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/coreml/camstack-yolov8m-seg.mlpackage"),
162
- sizeMB: 52,
163
- isDirectory: true,
164
- files: object_detection_models_js_1.MLPACKAGE_FILES,
165
- runtimes: ["python"]
166
- },
167
- openvino: {
168
- url: (0, types_1.hfModelUrl)(HF_REPO, "segmentation/yolov8-seg/openvino/camstack-yolov8m-seg.xml"),
169
- sizeMB: 53,
170
- runtimes: ["python"]
171
- }
172
- }
173
- }
174
- ];
175
- }
176
- });
177
-
178
- // src/shared/postprocess/yolo-seg.js
179
- var require_yolo_seg = __commonJS({
180
- "src/shared/postprocess/yolo-seg.js"(exports) {
181
- "use strict";
182
- Object.defineProperty(exports, "__esModule", { value: true });
183
- exports.sigmoid = sigmoid;
184
- exports.computeRawMask = computeRawMask;
185
- exports.cropAndThresholdMask = cropAndThresholdMask;
186
- exports.yoloSegPostprocess = yoloSegPostprocess;
187
- var yolo_js_1 = require_yolo();
188
- function sigmoid(x) {
189
- return 1 / (1 + Math.exp(-x));
190
- }
191
- function computeRawMask(coeffs, protos, numMaskCoeffs, maskH, maskW) {
192
- const maskSize = maskH * maskW;
193
- const rawMask = new Float32Array(maskSize);
194
- for (let px = 0; px < maskSize; px++) {
195
- let val = 0;
196
- for (let k = 0; k < numMaskCoeffs; k++) {
197
- val += (coeffs[k] ?? 0) * (protos[k * maskSize + px] ?? 0);
198
- }
199
- rawMask[px] = sigmoid(val);
200
- }
201
- return rawMask;
202
- }
203
- function cropAndThresholdMask(rawMask, maskH, maskW, bbox, maskThreshold, maskScale) {
204
- const cropX1 = Math.max(0, Math.floor(bbox.x * maskScale));
205
- const cropY1 = Math.max(0, Math.floor(bbox.y * maskScale));
206
- const cropX2 = Math.min(maskW, Math.ceil((bbox.x + bbox.w) * maskScale));
207
- const cropY2 = Math.min(maskH, Math.ceil((bbox.y + bbox.h) * maskScale));
208
- const cropW = Math.max(1, cropX2 - cropX1);
209
- const cropH = Math.max(1, cropY2 - cropY1);
210
- const data = new Uint8Array(cropW * cropH);
211
- for (let row = 0; row < cropH; row++) {
212
- const srcRow = cropY1 + row;
213
- for (let col = 0; col < cropW; col++) {
214
- const srcCol = cropX1 + col;
215
- const srcIdx = srcRow * maskW + srcCol;
216
- data[row * cropW + col] = (rawMask[srcIdx] ?? 0) > maskThreshold ? 255 : 0;
217
- }
218
- }
219
- return { data, width: cropW, height: cropH };
220
- }
221
- function yoloSegPostprocess(segOutput, options) {
222
- const { detectionOutput, protoOutput, numClasses, numBoxes, numMaskCoeffs, maskHeight, maskWidth } = segOutput;
223
- const { confidence, iouThreshold, labels, scale, padX, padY, originalWidth, originalHeight, maskThreshold = 0.5 } = options;
224
- const yoloInputSize = 640;
225
- const maskScale = maskHeight / yoloInputSize;
226
- const candidates = [];
227
- for (let i = 0; i < numBoxes; i++) {
228
- const cx = detectionOutput[0 * numBoxes + i] ?? 0;
229
- const cy = detectionOutput[1 * numBoxes + i] ?? 0;
230
- const w = detectionOutput[2 * numBoxes + i] ?? 0;
231
- const h = detectionOutput[3 * numBoxes + i] ?? 0;
232
- let bestScore = -Infinity;
233
- let bestClass = 0;
234
- for (let j = 0; j < numClasses; j++) {
235
- const score = detectionOutput[(4 + j) * numBoxes + i] ?? 0;
236
- if (score > bestScore) {
237
- bestScore = score;
238
- bestClass = j;
239
- }
240
- }
241
- if (bestScore < confidence)
242
- continue;
243
- const bbox = {
244
- x: cx - w / 2,
245
- y: cy - h / 2,
246
- w,
247
- h
248
- };
249
- const coeffs = new Float32Array(numMaskCoeffs);
250
- for (let k = 0; k < numMaskCoeffs; k++) {
251
- coeffs[k] = detectionOutput[(4 + numClasses + k) * numBoxes + i] ?? 0;
252
- }
253
- candidates.push({ bbox, score: bestScore, classIdx: bestClass, coeffs });
254
- }
255
- if (candidates.length === 0)
256
- return [];
257
- const keptIndices = (0, yolo_js_1.nms)(candidates, iouThreshold);
258
- return keptIndices.map((idx) => {
259
- const { bbox, score, classIdx, coeffs } = candidates[idx];
260
- const label = labels[classIdx] ?? String(classIdx);
261
- const x = Math.max(0, Math.min(originalWidth, (bbox.x - padX) / scale));
262
- const y = Math.max(0, Math.min(originalHeight, (bbox.y - padY) / scale));
263
- const x2 = Math.max(0, Math.min(originalWidth, (bbox.x + bbox.w - padX) / scale));
264
- const y2 = Math.max(0, Math.min(originalHeight, (bbox.y + bbox.h - padY) / scale));
265
- const finalBbox = { x, y, w: x2 - x, h: y2 - y };
266
- const rawMask = computeRawMask(coeffs, protoOutput, numMaskCoeffs, maskHeight, maskWidth);
267
- const { data: maskData, width: mW, height: mH } = cropAndThresholdMask(rawMask, maskHeight, maskWidth, bbox, maskThreshold, maskScale);
268
- return {
269
- class: label,
270
- originalClass: label,
271
- score,
272
- bbox: finalBbox,
273
- mask: maskData,
274
- maskWidth: mW,
275
- maskHeight: mH
276
- };
277
- });
278
- }
279
- }
280
- });
281
-
282
- export {
283
- require_segmentation_models,
284
- require_yolo_seg
285
- };
286
- //# sourceMappingURL=chunk-ZK7P3TZN.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/catalogs/segmentation-models.ts","../src/shared/postprocess/yolo-seg.ts"],"sourcesContent":["import type { ModelCatalogEntry } from '@camstack/types'\nimport { hfModelUrl, COCO_80_LABELS } from '@camstack/types'\nimport { MLPACKAGE_FILES } from './object-detection-models.js'\n\nconst HF_REPO = 'camstack/camstack-models'\n\nexport const SEGMENTATION_MODELS: readonly ModelCatalogEntry[] = [\n // ── YOLO11-seg ───────────────────────────────────────────────\n {\n id: 'yolo11n-seg',\n name: 'YOLO11 Nano Segmentation',\n description: 'YOLO11 Nano — fastest, smallest YOLO11 instance segmentation model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/onnx/camstack-yolo11n-seg.onnx'),\n sizeMB: 11,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/coreml/camstack-yolo11n-seg.mlpackage'),\n sizeMB: 6,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/openvino/camstack-yolo11n-seg.xml'),\n sizeMB: 6,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11s-seg',\n name: 'YOLO11 Small Segmentation',\n description: 'YOLO11 Small — balanced speed and accuracy for instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/onnx/camstack-yolo11s-seg.onnx'),\n sizeMB: 39,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/coreml/camstack-yolo11s-seg.mlpackage'),\n sizeMB: 20,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/openvino/camstack-yolo11s-seg.xml'),\n sizeMB: 20,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolo11m-seg',\n name: 'YOLO11 Medium Segmentation',\n description: 'YOLO11 Medium — higher accuracy instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/onnx/camstack-yolo11m-seg.onnx'),\n sizeMB: 86,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/coreml/camstack-yolo11m-seg.mlpackage'),\n sizeMB: 43,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolo11-seg/openvino/camstack-yolo11m-seg.xml'),\n sizeMB: 43,\n runtimes: ['python'],\n },\n },\n },\n\n // ── YOLOv8-seg — CoreML supported ─────────────────────────────\n {\n id: 'yolov8n-seg',\n name: 'YOLOv8 Nano Segmentation',\n description: 'YOLOv8 Nano — fastest, smallest YOLOv8 instance segmentation model',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/onnx/camstack-yolov8n-seg.onnx'),\n sizeMB: 13,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/coreml/camstack-yolov8n-seg.mlpackage'),\n sizeMB: 7,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/openvino/camstack-yolov8n-seg.xml'),\n sizeMB: 7,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8s-seg',\n name: 'YOLOv8 Small Segmentation',\n description: 'YOLOv8 Small — balanced speed and accuracy for instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/onnx/camstack-yolov8s-seg.onnx'),\n sizeMB: 45,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/coreml/camstack-yolov8s-seg.mlpackage'),\n sizeMB: 23,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/openvino/camstack-yolov8s-seg.xml'),\n sizeMB: 23,\n runtimes: ['python'],\n },\n },\n },\n {\n id: 'yolov8m-seg',\n name: 'YOLOv8 Medium Segmentation',\n description: 'YOLOv8 Medium — higher accuracy instance segmentation',\n inputSize: { width: 640, height: 640 },\n labels: COCO_80_LABELS,\n formats: {\n onnx: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/onnx/camstack-yolov8m-seg.onnx'),\n sizeMB: 104,\n },\n coreml: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/coreml/camstack-yolov8m-seg.mlpackage'),\n sizeMB: 52,\n isDirectory: true,\n files: MLPACKAGE_FILES,\n runtimes: ['python'],\n },\n openvino: {\n url: hfModelUrl(HF_REPO, 'segmentation/yolov8-seg/openvino/camstack-yolov8m-seg.xml'),\n sizeMB: 53,\n runtimes: ['python'],\n },\n },\n },\n] as const\n","import type { SpatialDetection, BoundingBox } from '@camstack/types'\nimport { nms, iou as _iou } from './yolo.js'\nimport type { YoloPostprocessOptions } from './yolo.js'\n\nexport interface YoloSegOutput {\n /** Detection output: [1, 4 + numClasses + numMaskCoeffs, numBoxes] (row-major, batch dim stripped) */\n readonly detectionOutput: Float32Array\n /** Prototype masks: [1, numMaskCoeffs, maskH, maskW] (batch dim stripped) */\n readonly protoOutput: Float32Array\n readonly numClasses: number\n readonly numBoxes: number\n /** Number of mask prototype coefficients per detection (typically 32) */\n readonly numMaskCoeffs: number\n /** Height of prototype mask grid (typically 160) */\n readonly maskHeight: number\n /** Width of prototype mask grid (typically 160) */\n readonly maskWidth: number\n}\n\nexport interface YoloSegPostprocessOptions extends YoloPostprocessOptions {\n /** Binary mask threshold — pixels above this value become 255, others 0 (default: 0.5) */\n readonly maskThreshold?: number\n}\n\n/** Sigmoid activation: σ(x) = 1 / (1 + e^-x) */\nexport function sigmoid(x: number): number {\n return 1 / (1 + Math.exp(-x))\n}\n\n/**\n * Compute instance segmentation mask for a single detection.\n *\n * @param coeffs [numMaskCoeffs] mask coefficients for this detection\n * @param protos [numMaskCoeffs × maskH × maskW] prototype masks (flat, row-major)\n * @param numMaskCoeffs number of prototype channels (e.g. 32)\n * @param maskH prototype grid height (e.g. 160)\n * @param maskW prototype grid width (e.g. 160)\n * @returns [maskH × maskW] sigmoid-activated raw mask values in [0, 1]\n */\nexport function computeRawMask(\n coeffs: Float32Array,\n protos: Float32Array,\n numMaskCoeffs: number,\n maskH: number,\n maskW: number,\n): Float32Array {\n const maskSize = maskH * maskW\n const rawMask = new Float32Array(maskSize)\n\n // mask_raw[y * maskW + x] = sum_k( coeffs[k] * protos[k * maskSize + y * maskW + x] )\n // Then apply sigmoid element-wise.\n for (let px = 0; px < maskSize; px++) {\n let val = 0\n for (let k = 0; k < numMaskCoeffs; k++) {\n val += (coeffs[k] ?? 0) * (protos[k * maskSize + px] ?? 0)\n }\n rawMask[px] = sigmoid(val)\n }\n\n return rawMask\n}\n\n/**\n * Crop a flat [maskH × maskW] mask to a bounding box region (in mask coordinate space),\n * threshold to binary, and return the cropped Uint8Array along with its dimensions.\n *\n * @param rawMask [maskH × maskW] sigmoid-activated values in [0, 1]\n * @param maskH full mask grid height\n * @param maskW full mask grid width\n * @param bbox detection bounding box in the inference input space (e.g. 640×640 letterboxed)\n * @param maskThreshold threshold above which a pixel is considered foreground (default 0.5)\n * @param maskScale ratio of mask resolution to inference resolution (e.g. 160/640 = 0.25)\n * @returns { data: Uint8Array, width, height } of the cropped binary mask\n */\nexport function cropAndThresholdMask(\n rawMask: Float32Array,\n maskH: number,\n maskW: number,\n bbox: BoundingBox,\n maskThreshold: number,\n maskScale: number,\n): { readonly data: Uint8Array; readonly width: number; readonly height: number } {\n const cropX1 = Math.max(0, Math.floor(bbox.x * maskScale))\n const cropY1 = Math.max(0, Math.floor(bbox.y * maskScale))\n const cropX2 = Math.min(maskW, Math.ceil((bbox.x + bbox.w) * maskScale))\n const cropY2 = Math.min(maskH, Math.ceil((bbox.y + bbox.h) * maskScale))\n\n const cropW = Math.max(1, cropX2 - cropX1)\n const cropH = Math.max(1, cropY2 - cropY1)\n\n const data = new Uint8Array(cropW * cropH)\n\n for (let row = 0; row < cropH; row++) {\n const srcRow = cropY1 + row\n for (let col = 0; col < cropW; col++) {\n const srcCol = cropX1 + col\n const srcIdx = srcRow * maskW + srcCol\n data[row * cropW + col] = (rawMask[srcIdx] ?? 0) > maskThreshold ? 255 : 0\n }\n }\n\n return { data, width: cropW, height: cropH }\n}\n\n/**\n * YOLO-seg postprocessing: run detection filtering + NMS, then decode instance masks.\n *\n * The seg detection tensor has layout [1, 4 + numClasses + numMaskCoeffs, numBoxes]:\n * rows 0–3 : cx, cy, w, h\n * rows 4 to 4+C-1 : class scores\n * rows 4+C to end : mask coefficients (32)\n *\n * Steps:\n * 1. Filter boxes by confidence threshold, collecting mask coefficients per candidate.\n * 2. Run NMS across all candidates.\n * 3. For each surviving detection, compute the instance mask and attach it.\n */\nexport function yoloSegPostprocess(\n segOutput: YoloSegOutput,\n options: YoloSegPostprocessOptions,\n): SpatialDetection[] {\n const {\n detectionOutput,\n protoOutput,\n numClasses,\n numBoxes,\n numMaskCoeffs,\n maskHeight,\n maskWidth,\n } = segOutput\n\n const {\n confidence,\n iouThreshold,\n labels,\n scale,\n padX,\n padY,\n originalWidth,\n originalHeight,\n maskThreshold = 0.5,\n } = options\n\n // The mask resolution to inference resolution scale factor (e.g. 160/640 = 0.25)\n // We derive the inference size from scale/pad context: the letterboxed input is typically 640×640\n // but we receive coordinates in that space already, so we use maskHeight / inferH.\n // Since all YOLO-seg models use 640×640 input and 160×160 proto, the ratio is always 160/640.\n // We compute it generically from the known prototype dims + fixed YOLO input of 640.\n const yoloInputSize = 640\n const maskScale = maskHeight / yoloInputSize\n\n interface Candidate {\n readonly bbox: BoundingBox\n readonly score: number\n readonly classIdx: number\n readonly coeffs: Float32Array\n }\n\n const candidates: Candidate[] = []\n\n for (let i = 0; i < numBoxes; i++) {\n const cx = detectionOutput[0 * numBoxes + i] ?? 0\n const cy = detectionOutput[1 * numBoxes + i] ?? 0\n const w = detectionOutput[2 * numBoxes + i] ?? 0\n const h = detectionOutput[3 * numBoxes + i] ?? 0\n\n let bestScore = -Infinity\n let bestClass = 0\n\n for (let j = 0; j < numClasses; j++) {\n const score = detectionOutput[(4 + j) * numBoxes + i] ?? 0\n if (score > bestScore) {\n bestScore = score\n bestClass = j\n }\n }\n\n if (bestScore < confidence) continue\n\n const bbox: BoundingBox = {\n x: cx - w / 2,\n y: cy - h / 2,\n w,\n h,\n }\n\n // Extract mask coefficients for this box\n const coeffs = new Float32Array(numMaskCoeffs)\n for (let k = 0; k < numMaskCoeffs; k++) {\n coeffs[k] = detectionOutput[(4 + numClasses + k) * numBoxes + i] ?? 0\n }\n\n candidates.push({ bbox, score: bestScore, classIdx: bestClass, coeffs })\n }\n\n if (candidates.length === 0) return []\n\n const keptIndices = nms(candidates, iouThreshold)\n\n return keptIndices.map((idx) => {\n const { bbox, score, classIdx, coeffs } = candidates[idx]!\n const label = labels[classIdx] ?? String(classIdx)\n\n // Scale bbox back from letterbox space to original image coords\n const x = Math.max(0, Math.min(originalWidth, (bbox.x - padX) / scale))\n const y = Math.max(0, Math.min(originalHeight, (bbox.y - padY) / scale))\n const x2 = Math.max(0, Math.min(originalWidth, (bbox.x + bbox.w - padX) / scale))\n const y2 = Math.max(0, Math.min(originalHeight, (bbox.y + bbox.h - padY) / scale))\n const finalBbox: BoundingBox = { x, y, w: x2 - x, h: y2 - y }\n\n // Decode instance mask using the letterbox-space bbox (before coord scaling)\n const rawMask = computeRawMask(coeffs, protoOutput, numMaskCoeffs, maskHeight, maskWidth)\n const { data: maskData, width: mW, height: mH } = cropAndThresholdMask(\n rawMask,\n maskHeight,\n maskWidth,\n bbox,\n maskThreshold,\n maskScale,\n )\n\n return {\n class: label,\n originalClass: label,\n score,\n bbox: finalBbox,\n mask: maskData,\n maskWidth: mW,\n maskHeight: mH,\n } satisfies SpatialDetection\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AACA,QAAA,UAAA,UAAA,iBAAA;AACA,QAAA,+BAAA;AAEA,QAAM,UAAU;AAEH,YAAA,sBAAoD;;MAE/D;QACE,IAAI;QACJ,MAAM;QACN,aAAa;QACb,WAAW,EAAE,OAAO,KAAK,QAAQ,IAAG;QACpC,QAAQ,QAAA;QACR,SAAS;UACP,MAAM;YACJ,MAAK,GAAA,QAAA,YAAW,SAAS,wDAAwD;YACjF,QAAQ;;UAEV,QAAQ;YACN,MAAK,GAAA,QAAA,YAAW,SAAS,+DAA+D;YACxF,QAAQ;YACR,aAAa;YACb,OAAO,6BAAA;YACP,UAAU,CAAC,QAAQ;;UAErB,UAAU;YACR,MAAK,GAAA,QAAA,YAAW,SAAS,2DAA2D;YACpF,QAAQ;YACR,UAAU,CAAC,QAAQ;;;;MAIzB;QACE,IAAI;QACJ,MAAM;QACN,aAAa;QACb,WAAW,EAAE,OAAO,KAAK,QAAQ,IAAG;QACpC,QAAQ,QAAA;QACR,SAAS;UACP,MAAM;YACJ,MAAK,GAAA,QAAA,YAAW,SAAS,wDAAwD;YACjF,QAAQ;;UAEV,QAAQ;YACN,MAAK,GAAA,QAAA,YAAW,SAAS,+DAA+D;YACxF,QAAQ;YACR,aAAa;YACb,OAAO,6BAAA;YACP,UAAU,CAAC,QAAQ;;UAErB,UAAU;YACR,MAAK,GAAA,QAAA,YAAW,SAAS,2DAA2D;YACpF,QAAQ;YACR,UAAU,CAAC,QAAQ;;;;MAIzB;QACE,IAAI;QACJ,MAAM;QACN,aAAa;QACb,WAAW,EAAE,OAAO,KAAK,QAAQ,IAAG;QACpC,QAAQ,QAAA;QACR,SAAS;UACP,MAAM;YACJ,MAAK,GAAA,QAAA,YAAW,SAAS,wDAAwD;YACjF,QAAQ;;UAEV,QAAQ;YACN,MAAK,GAAA,QAAA,YAAW,SAAS,+DAA+D;YACxF,QAAQ;YACR,aAAa;YACb,OAAO,6BAAA;YACP,UAAU,CAAC,QAAQ;;UAErB,UAAU;YACR,MAAK,GAAA,QAAA,YAAW,SAAS,2DAA2D;YACpF,QAAQ;YACR,UAAU,CAAC,QAAQ;;;;;MAMzB;QACE,IAAI;QACJ,MAAM;QACN,aAAa;QACb,WAAW,EAAE,OAAO,KAAK,QAAQ,IAAG;QACpC,QAAQ,QAAA;QACR,SAAS;UACP,MAAM;YACJ,MAAK,GAAA,QAAA,YAAW,SAAS,wDAAwD;YACjF,QAAQ;;UAEV,QAAQ;YACN,MAAK,GAAA,QAAA,YAAW,SAAS,+DAA+D;YACxF,QAAQ;YACR,aAAa;YACb,OAAO,6BAAA;YACP,UAAU,CAAC,QAAQ;;UAErB,UAAU;YACR,MAAK,GAAA,QAAA,YAAW,SAAS,2DAA2D;YACpF,QAAQ;YACR,UAAU,CAAC,QAAQ;;;;MAIzB;QACE,IAAI;QACJ,MAAM;QACN,aAAa;QACb,WAAW,EAAE,OAAO,KAAK,QAAQ,IAAG;QACpC,QAAQ,QAAA;QACR,SAAS;UACP,MAAM;YACJ,MAAK,GAAA,QAAA,YAAW,SAAS,wDAAwD;YACjF,QAAQ;;UAEV,QAAQ;YACN,MAAK,GAAA,QAAA,YAAW,SAAS,+DAA+D;YACxF,QAAQ;YACR,aAAa;YACb,OAAO,6BAAA;YACP,UAAU,CAAC,QAAQ;;UAErB,UAAU;YACR,MAAK,GAAA,QAAA,YAAW,SAAS,2DAA2D;YACpF,QAAQ;YACR,UAAU,CAAC,QAAQ;;;;MAIzB;QACE,IAAI;QACJ,MAAM;QACN,aAAa;QACb,WAAW,EAAE,OAAO,KAAK,QAAQ,IAAG;QACpC,QAAQ,QAAA;QACR,SAAS;UACP,MAAM;YACJ,MAAK,GAAA,QAAA,YAAW,SAAS,wDAAwD;YACjF,QAAQ;;UAEV,QAAQ;YACN,MAAK,GAAA,QAAA,YAAW,SAAS,+DAA+D;YACxF,QAAQ;YACR,aAAa;YACb,OAAO,6BAAA;YACP,UAAU,CAAC,QAAQ;;UAErB,UAAU;YACR,MAAK,GAAA,QAAA,YAAW,SAAS,2DAA2D;YACpF,QAAQ;YACR,UAAU,CAAC,QAAQ;;;;;;;;;;;;;ACnI3B,YAAA,UAAA;AAcA,YAAA,iBAAA;AAmCA,YAAA,uBAAA;AA2CA,YAAA,qBAAA;AApHA,QAAA,YAAA;AAwBA,aAAgB,QAAQ,GAAS;AAC/B,aAAO,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7B;AAYA,aAAgB,eACd,QACA,QACA,eACA,OACA,OAAa;AAEb,YAAM,WAAW,QAAQ;AACzB,YAAM,UAAU,IAAI,aAAa,QAAQ;AAIzC,eAAS,KAAK,GAAG,KAAK,UAAU,MAAM;AACpC,YAAI,MAAM;AACV,iBAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,kBAAQ,OAAO,CAAC,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,KAAK;QAC1D;AACA,gBAAQ,EAAE,IAAI,QAAQ,GAAG;MAC3B;AAEA,aAAO;IACT;AAcA,aAAgB,qBACd,SACA,OACA,OACA,MACA,eACA,WAAiB;AAEjB,YAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC;AACzD,YAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC;AACzD,YAAM,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC;AACvE,YAAM,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC;AAEvE,YAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,MAAM;AACzC,YAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,MAAM;AAEzC,YAAM,OAAO,IAAI,WAAW,QAAQ,KAAK;AAEzC,eAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,cAAM,SAAS,SAAS;AACxB,iBAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,gBAAM,SAAS,SAAS;AACxB,gBAAM,SAAS,SAAS,QAAQ;AAChC,eAAK,MAAM,QAAQ,GAAG,KAAK,QAAQ,MAAM,KAAK,KAAK,gBAAgB,MAAM;QAC3E;MACF;AAEA,aAAO,EAAE,MAAM,OAAO,OAAO,QAAQ,MAAK;IAC5C;AAeA,aAAgB,mBACd,WACA,SAAkC;AAElC,YAAM,EACJ,iBACA,aACA,YACA,UACA,eACA,YACA,UAAS,IACP;AAEJ,YAAM,EACJ,YACA,cACA,QACA,OACA,MACA,MACA,eACA,gBACA,gBAAgB,IAAG,IACjB;AAOJ,YAAM,gBAAgB;AACtB,YAAM,YAAY,aAAa;AAS/B,YAAM,aAA0B,CAAA;AAEhC,eAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,cAAM,KAAK,gBAAgB,IAAI,WAAW,CAAC,KAAK;AAChD,cAAM,KAAK,gBAAgB,IAAI,WAAW,CAAC,KAAK;AAChD,cAAM,IAAI,gBAAgB,IAAI,WAAW,CAAC,KAAK;AAC/C,cAAM,IAAI,gBAAgB,IAAI,WAAW,CAAC,KAAK;AAE/C,YAAI,YAAY;AAChB,YAAI,YAAY;AAEhB,iBAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,gBAAM,QAAQ,iBAAiB,IAAI,KAAK,WAAW,CAAC,KAAK;AACzD,cAAI,QAAQ,WAAW;AACrB,wBAAY;AACZ,wBAAY;UACd;QACF;AAEA,YAAI,YAAY;AAAY;AAE5B,cAAM,OAAoB;UACxB,GAAG,KAAK,IAAI;UACZ,GAAG,KAAK,IAAI;UACZ;UACA;;AAIF,cAAM,SAAS,IAAI,aAAa,aAAa;AAC7C,iBAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,iBAAO,CAAC,IAAI,iBAAiB,IAAI,aAAa,KAAK,WAAW,CAAC,KAAK;QACtE;AAEA,mBAAW,KAAK,EAAE,MAAM,OAAO,WAAW,UAAU,WAAW,OAAM,CAAE;MACzE;AAEA,UAAI,WAAW,WAAW;AAAG,eAAO,CAAA;AAEpC,YAAM,eAAc,GAAA,UAAA,KAAI,YAAY,YAAY;AAEhD,aAAO,YAAY,IAAI,CAAC,QAAO;AAC7B,cAAM,EAAE,MAAM,OAAO,UAAU,OAAM,IAAK,WAAW,GAAG;AACxD,cAAM,QAAQ,OAAO,QAAQ,KAAK,OAAO,QAAQ;AAGjD,cAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,gBAAgB,KAAK,IAAI,QAAQ,KAAK,CAAC;AACtE,cAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,iBAAiB,KAAK,IAAI,QAAQ,KAAK,CAAC;AACvE,cAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,gBAAgB,KAAK,IAAI,KAAK,IAAI,QAAQ,KAAK,CAAC;AAChF,cAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,iBAAiB,KAAK,IAAI,KAAK,IAAI,QAAQ,KAAK,CAAC;AACjF,cAAM,YAAyB,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,EAAC;AAG3D,cAAM,UAAU,eAAe,QAAQ,aAAa,eAAe,YAAY,SAAS;AACxF,cAAM,EAAE,MAAM,UAAU,OAAO,IAAI,QAAQ,GAAE,IAAK,qBAChD,SACA,YACA,WACA,MACA,eACA,SAAS;AAGX,eAAO;UACL,OAAO;UACP,eAAe;UACf;UACA,MAAM;UACN,MAAM;UACN,WAAW;UACX,YAAY;;MAEhB,CAAC;IACH;;;","names":[]}