@scanly/core 2.0.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.
Files changed (226) hide show
  1. package/README.md +3 -0
  2. package/dist/barcode/contracts.d.ts +44 -0
  3. package/dist/barcode/contracts.d.ts.map +1 -0
  4. package/dist/barcode/contracts.js +33 -0
  5. package/dist/barcode/contracts.js.map +1 -0
  6. package/dist/barcode/format-selection.d.ts +12 -0
  7. package/dist/barcode/format-selection.d.ts.map +1 -0
  8. package/dist/barcode/format-selection.js +32 -0
  9. package/dist/barcode/format-selection.js.map +1 -0
  10. package/dist/barcode/format.d.ts +7 -0
  11. package/dist/barcode/format.d.ts.map +1 -0
  12. package/dist/barcode/format.js +20 -0
  13. package/dist/barcode/format.js.map +1 -0
  14. package/dist/barcode/index.d.ts +5 -0
  15. package/dist/barcode/index.d.ts.map +1 -0
  16. package/dist/barcode/index.js +5 -0
  17. package/dist/barcode/index.js.map +1 -0
  18. package/dist/barcode/retail.d.ts +16 -0
  19. package/dist/barcode/retail.d.ts.map +1 -0
  20. package/dist/barcode/retail.js +95 -0
  21. package/dist/barcode/retail.js.map +1 -0
  22. package/dist/contracts/engine.d.ts +84 -0
  23. package/dist/contracts/engine.d.ts.map +1 -0
  24. package/dist/contracts/engine.js +2 -0
  25. package/dist/contracts/engine.js.map +1 -0
  26. package/dist/contracts/errors.d.ts +17 -0
  27. package/dist/contracts/errors.d.ts.map +1 -0
  28. package/dist/contracts/errors.js +31 -0
  29. package/dist/contracts/errors.js.map +1 -0
  30. package/dist/contracts/frame.d.ts +37 -0
  31. package/dist/contracts/frame.d.ts.map +1 -0
  32. package/dist/contracts/frame.js +77 -0
  33. package/dist/contracts/frame.js.map +1 -0
  34. package/dist/contracts/operator.d.ts +46 -0
  35. package/dist/contracts/operator.d.ts.map +1 -0
  36. package/dist/contracts/operator.js +14 -0
  37. package/dist/contracts/operator.js.map +1 -0
  38. package/dist/contracts/result.d.ts +135 -0
  39. package/dist/contracts/result.d.ts.map +1 -0
  40. package/dist/contracts/result.js +2 -0
  41. package/dist/contracts/result.js.map +1 -0
  42. package/dist/contracts/validator.d.ts +15 -0
  43. package/dist/contracts/validator.d.ts.map +1 -0
  44. package/dist/contracts/validator.js +2 -0
  45. package/dist/contracts/validator.js.map +1 -0
  46. package/dist/index.d.ts +29 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +28 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/industrial/candidate-region.d.ts +15 -0
  51. package/dist/industrial/candidate-region.d.ts.map +1 -0
  52. package/dist/industrial/candidate-region.js +108 -0
  53. package/dist/industrial/candidate-region.js.map +1 -0
  54. package/dist/industrial/coordinate-transform.d.ts +9 -0
  55. package/dist/industrial/coordinate-transform.d.ts.map +1 -0
  56. package/dist/industrial/coordinate-transform.js +42 -0
  57. package/dist/industrial/coordinate-transform.js.map +1 -0
  58. package/dist/industrial/decode-candidate-conflict.d.ts +8 -0
  59. package/dist/industrial/decode-candidate-conflict.d.ts.map +1 -0
  60. package/dist/industrial/decode-candidate-conflict.js +97 -0
  61. package/dist/industrial/decode-candidate-conflict.js.map +1 -0
  62. package/dist/industrial/difficulty-diagnosis.d.ts +15 -0
  63. package/dist/industrial/difficulty-diagnosis.d.ts.map +1 -0
  64. package/dist/industrial/difficulty-diagnosis.js +291 -0
  65. package/dist/industrial/difficulty-diagnosis.js.map +1 -0
  66. package/dist/industrial/index.d.ts +13 -0
  67. package/dist/industrial/index.d.ts.map +1 -0
  68. package/dist/industrial/index.js +13 -0
  69. package/dist/industrial/index.js.map +1 -0
  70. package/dist/industrial/memory.d.ts +28 -0
  71. package/dist/industrial/memory.d.ts.map +1 -0
  72. package/dist/industrial/memory.js +65 -0
  73. package/dist/industrial/memory.js.map +1 -0
  74. package/dist/industrial/pixels.d.ts +44 -0
  75. package/dist/industrial/pixels.d.ts.map +1 -0
  76. package/dist/industrial/pixels.js +295 -0
  77. package/dist/industrial/pixels.js.map +1 -0
  78. package/dist/industrial/recovery-pipeline.d.ts +26 -0
  79. package/dist/industrial/recovery-pipeline.d.ts.map +1 -0
  80. package/dist/industrial/recovery-pipeline.js +149 -0
  81. package/dist/industrial/recovery-pipeline.js.map +1 -0
  82. package/dist/industrial/recovery-planner.d.ts +10 -0
  83. package/dist/industrial/recovery-planner.d.ts.map +1 -0
  84. package/dist/industrial/recovery-planner.js +107 -0
  85. package/dist/industrial/recovery-planner.js.map +1 -0
  86. package/dist/industrial/recovery-route-registry.d.ts +12 -0
  87. package/dist/industrial/recovery-route-registry.d.ts.map +1 -0
  88. package/dist/industrial/recovery-route-registry.js +15 -0
  89. package/dist/industrial/recovery-route-registry.js.map +1 -0
  90. package/dist/industrial/recovery-routes.d.ts +89 -0
  91. package/dist/industrial/recovery-routes.d.ts.map +1 -0
  92. package/dist/industrial/recovery-routes.js +280 -0
  93. package/dist/industrial/recovery-routes.js.map +1 -0
  94. package/dist/industrial/scan-evidence.d.ts +5 -0
  95. package/dist/industrial/scan-evidence.d.ts.map +1 -0
  96. package/dist/industrial/scan-evidence.js +63 -0
  97. package/dist/industrial/scan-evidence.js.map +1 -0
  98. package/dist/industrial/scanner-diagnostics.d.ts +19 -0
  99. package/dist/industrial/scanner-diagnostics.d.ts.map +1 -0
  100. package/dist/industrial/scanner-diagnostics.js +35 -0
  101. package/dist/industrial/scanner-diagnostics.js.map +1 -0
  102. package/dist/industrial/types.d.ts +189 -0
  103. package/dist/industrial/types.d.ts.map +1 -0
  104. package/dist/industrial/types.js +2 -0
  105. package/dist/industrial/types.js.map +1 -0
  106. package/dist/node.d.ts +2 -0
  107. package/dist/node.d.ts.map +1 -0
  108. package/dist/node.js +2 -0
  109. package/dist/node.js.map +1 -0
  110. package/dist/qr/candidate-dedupe.d.ts +6 -0
  111. package/dist/qr/candidate-dedupe.d.ts.map +1 -0
  112. package/dist/qr/candidate-dedupe.js +27 -0
  113. package/dist/qr/candidate-dedupe.js.map +1 -0
  114. package/dist/qr/candidate-generation.d.ts +46 -0
  115. package/dist/qr/candidate-generation.d.ts.map +1 -0
  116. package/dist/qr/candidate-generation.js +277 -0
  117. package/dist/qr/candidate-generation.js.map +1 -0
  118. package/dist/qr/decode-pipeline.d.ts +14 -0
  119. package/dist/qr/decode-pipeline.d.ts.map +1 -0
  120. package/dist/qr/decode-pipeline.js +615 -0
  121. package/dist/qr/decode-pipeline.js.map +1 -0
  122. package/dist/qr/geometry.d.ts +24 -0
  123. package/dist/qr/geometry.d.ts.map +1 -0
  124. package/dist/qr/geometry.js +64 -0
  125. package/dist/qr/geometry.js.map +1 -0
  126. package/dist/qr/grayscale.d.ts +13 -0
  127. package/dist/qr/grayscale.d.ts.map +1 -0
  128. package/dist/qr/grayscale.js +46 -0
  129. package/dist/qr/grayscale.js.map +1 -0
  130. package/dist/qr/image-loader-node.d.ts +4 -0
  131. package/dist/qr/image-loader-node.d.ts.map +1 -0
  132. package/dist/qr/image-loader-node.js +26 -0
  133. package/dist/qr/image-loader-node.js.map +1 -0
  134. package/dist/qr/index.d.ts +15 -0
  135. package/dist/qr/index.d.ts.map +1 -0
  136. package/dist/qr/index.js +15 -0
  137. package/dist/qr/index.js.map +1 -0
  138. package/dist/qr/jsqr-decoder.d.ts +10 -0
  139. package/dist/qr/jsqr-decoder.d.ts.map +1 -0
  140. package/dist/qr/jsqr-decoder.js +18 -0
  141. package/dist/qr/jsqr-decoder.js.map +1 -0
  142. package/dist/qr/preprocess.d.ts +18 -0
  143. package/dist/qr/preprocess.d.ts.map +1 -0
  144. package/dist/qr/preprocess.js +165 -0
  145. package/dist/qr/preprocess.js.map +1 -0
  146. package/dist/qr/region-detection.d.ts +25 -0
  147. package/dist/qr/region-detection.d.ts.map +1 -0
  148. package/dist/qr/region-detection.js +129 -0
  149. package/dist/qr/region-detection.js.map +1 -0
  150. package/dist/qr/result-normalizer.d.ts +9 -0
  151. package/dist/qr/result-normalizer.d.ts.map +1 -0
  152. package/dist/qr/result-normalizer.js +70 -0
  153. package/dist/qr/result-normalizer.js.map +1 -0
  154. package/dist/qr/rotate.d.ts +5 -0
  155. package/dist/qr/rotate.d.ts.map +1 -0
  156. package/dist/qr/rotate.js +51 -0
  157. package/dist/qr/rotate.js.map +1 -0
  158. package/dist/qr/types.d.ts +186 -0
  159. package/dist/qr/types.d.ts.map +1 -0
  160. package/dist/qr/types.js +67 -0
  161. package/dist/qr/types.js.map +1 -0
  162. package/dist/qr/zxing-decoder.d.ts +8 -0
  163. package/dist/qr/zxing-decoder.d.ts.map +1 -0
  164. package/dist/qr/zxing-decoder.js +33 -0
  165. package/dist/qr/zxing-decoder.js.map +1 -0
  166. package/dist/runtime/artifacts.d.ts +16 -0
  167. package/dist/runtime/artifacts.d.ts.map +1 -0
  168. package/dist/runtime/artifacts.js +52 -0
  169. package/dist/runtime/artifacts.js.map +1 -0
  170. package/dist/runtime/builtin-operators.d.ts +12 -0
  171. package/dist/runtime/builtin-operators.d.ts.map +1 -0
  172. package/dist/runtime/builtin-operators.js +487 -0
  173. package/dist/runtime/builtin-operators.js.map +1 -0
  174. package/dist/runtime/capabilities.d.ts +32 -0
  175. package/dist/runtime/capabilities.d.ts.map +1 -0
  176. package/dist/runtime/capabilities.js +18 -0
  177. package/dist/runtime/capabilities.js.map +1 -0
  178. package/dist/runtime/engine-registry.d.ts +19 -0
  179. package/dist/runtime/engine-registry.d.ts.map +1 -0
  180. package/dist/runtime/engine-registry.js +136 -0
  181. package/dist/runtime/engine-registry.js.map +1 -0
  182. package/dist/runtime/execution-budget.d.ts +25 -0
  183. package/dist/runtime/execution-budget.d.ts.map +1 -0
  184. package/dist/runtime/execution-budget.js +41 -0
  185. package/dist/runtime/execution-budget.js.map +1 -0
  186. package/dist/runtime/frame-lease.d.ts +10 -0
  187. package/dist/runtime/frame-lease.d.ts.map +1 -0
  188. package/dist/runtime/frame-lease.js +17 -0
  189. package/dist/runtime/frame-lease.js.map +1 -0
  190. package/dist/runtime/frame-normalization.d.ts +13 -0
  191. package/dist/runtime/frame-normalization.d.ts.map +1 -0
  192. package/dist/runtime/frame-normalization.js +21 -0
  193. package/dist/runtime/frame-normalization.js.map +1 -0
  194. package/dist/runtime/memory-budget.d.ts +32 -0
  195. package/dist/runtime/memory-budget.d.ts.map +1 -0
  196. package/dist/runtime/memory-budget.js +109 -0
  197. package/dist/runtime/memory-budget.js.map +1 -0
  198. package/dist/runtime/operator-registry.d.ts +11 -0
  199. package/dist/runtime/operator-registry.d.ts.map +1 -0
  200. package/dist/runtime/operator-registry.js +19 -0
  201. package/dist/runtime/operator-registry.js.map +1 -0
  202. package/dist/runtime/result-policies.d.ts +21 -0
  203. package/dist/runtime/result-policies.d.ts.map +1 -0
  204. package/dist/runtime/result-policies.js +62 -0
  205. package/dist/runtime/result-policies.js.map +1 -0
  206. package/dist/runtime/router.d.ts +45 -0
  207. package/dist/runtime/router.d.ts.map +1 -0
  208. package/dist/runtime/router.js +202 -0
  209. package/dist/runtime/router.js.map +1 -0
  210. package/dist/runtime/scenario-compiler.d.ts +32 -0
  211. package/dist/runtime/scenario-compiler.d.ts.map +1 -0
  212. package/dist/runtime/scenario-compiler.js +131 -0
  213. package/dist/runtime/scenario-compiler.js.map +1 -0
  214. package/dist/runtime/scenario-runtime.d.ts +4 -0
  215. package/dist/runtime/scenario-runtime.d.ts.map +1 -0
  216. package/dist/runtime/scenario-runtime.js +32 -0
  217. package/dist/runtime/scenario-runtime.js.map +1 -0
  218. package/dist/runtime/session.d.ts +40 -0
  219. package/dist/runtime/session.d.ts.map +1 -0
  220. package/dist/runtime/session.js +117 -0
  221. package/dist/runtime/session.js.map +1 -0
  222. package/dist/runtime/validator-registry.d.ts +11 -0
  223. package/dist/runtime/validator-registry.d.ts.map +1 -0
  224. package/dist/runtime/validator-registry.js +16 -0
  225. package/dist/runtime/validator-registry.js.map +1 -0
  226. package/package.json +39 -0
@@ -0,0 +1,97 @@
1
+ import { buildScanEvidence, geometryEvidence } from "./scan-evidence.js";
2
+ export class DecodeCandidateResolver {
3
+ resolve(candidates, options = {}) {
4
+ const valid = candidates.filter((candidate) => candidate.validation.decoderValidation && candidate.validation.formatStructuralValidity !== false);
5
+ let rejectedCount = candidates.length - valid.length;
6
+ const clusters = spatialClusters(valid);
7
+ const confirmedCandidates = [];
8
+ const conflicts = [];
9
+ for (const cluster of clusters) {
10
+ const groups = groupByPayload(cluster);
11
+ if (groups.length === 1) {
12
+ if (sufficientSingleGroupEvidence(groups[0], options.temporalObservations))
13
+ confirmedCandidates.push(best(groups[0], options.temporalObservations));
14
+ else
15
+ rejectedCount += groups[0].length;
16
+ continue;
17
+ }
18
+ const ranked = groups.map((group) => ({ group, candidate: best(group, options.temporalObservations), score: priority(group, options.temporalObservations) })).sort((left, right) => right.score - left.score);
19
+ const winner = ranked[0];
20
+ const runnerUp = ranked[1];
21
+ const winnerChecksum = winner.group.some((candidate) => candidate.validation.checksumValidated === true);
22
+ const runnerChecksum = runnerUp.group.some((candidate) => candidate.validation.checksumValidated === true);
23
+ const winnerRoutes = new Set(winner.group.map((candidate) => candidate.route)).size;
24
+ if ((winnerChecksum && !runnerChecksum && winner.score - runnerUp.score >= 20) || (winnerRoutes >= 2 && winner.score - runnerUp.score >= 25)) {
25
+ confirmedCandidates.push(winner.candidate);
26
+ }
27
+ else {
28
+ const key = cluster.map(candidateKey).sort().join("|");
29
+ const conflict = { key, candidates: cluster, reason: "conflicting payload/format candidates lack decisive independent evidence" };
30
+ conflicts.push(conflict);
31
+ }
32
+ }
33
+ return {
34
+ candidates: [...candidates],
35
+ ...(confirmedCandidates[0] ? { confirmed: confirmedCandidates[0] } : {}),
36
+ confirmedCandidates,
37
+ conflicts,
38
+ rejectedCount,
39
+ };
40
+ }
41
+ }
42
+ function spatialClusters(candidates) {
43
+ const clusters = [];
44
+ for (const candidate of candidates) {
45
+ const cluster = clusters.find((current) => current.some((entry) => overlaps(entry, candidate)));
46
+ if (cluster)
47
+ cluster.push(candidate);
48
+ else
49
+ clusters.push([candidate]);
50
+ }
51
+ return clusters;
52
+ }
53
+ function overlaps(left, right) {
54
+ const a = bounds(left.geometry);
55
+ const b = bounds(right.geometry);
56
+ if (!a || !b)
57
+ return true;
58
+ const intersection = Math.max(0, Math.min(a.right, b.right) - Math.max(a.left, b.left)) * Math.max(0, Math.min(a.bottom, b.bottom) - Math.max(a.top, b.top));
59
+ const smaller = Math.min((a.right - a.left) * (a.bottom - a.top), (b.right - b.left) * (b.bottom - b.top));
60
+ return smaller <= 0 || intersection / smaller >= 0.25;
61
+ }
62
+ function bounds(points) {
63
+ if (!points?.length)
64
+ return undefined;
65
+ const xs = points.map((point) => point.x);
66
+ const ys = points.map((point) => point.y);
67
+ return { left: Math.min(...xs), top: Math.min(...ys), right: Math.max(...xs), bottom: Math.max(...ys) };
68
+ }
69
+ function groupByPayload(candidates) {
70
+ const groups = new Map();
71
+ for (const candidate of candidates) {
72
+ const key = candidateKey(candidate);
73
+ const group = groups.get(key) ?? [];
74
+ group.push(candidate);
75
+ groups.set(key, group);
76
+ }
77
+ return [...groups.values()];
78
+ }
79
+ function candidateKey(candidate) { return `${candidate.format}\u0000${candidate.payload}`; }
80
+ function sufficientSingleGroupEvidence(group, temporalObservations = 1) {
81
+ const primary = group[0];
82
+ const routeAgreement = new Set(group.map((candidate) => candidate.route)).size;
83
+ if (["qr_code", "data_matrix", "pdf417"].includes(primary.format))
84
+ return true;
85
+ return routeAgreement >= 2 || temporalObservations >= 2;
86
+ }
87
+ function best(group, temporalObservations = 1) { return [...group].sort((left, right) => candidatePriority(right, temporalObservations) - candidatePriority(left, temporalObservations))[0]; }
88
+ function priority(group, temporalObservations = 1) { return candidatePriority(best(group, temporalObservations), temporalObservations) + buildScanEvidence(group, temporalObservations).independentRouteAgreement * 12; }
89
+ function candidatePriority(candidate, temporalObservations = 1) {
90
+ return (candidate.validation.checksumValidated === true ? 100 : 0)
91
+ + (candidate.validation.formatStructuralValidity !== false ? 30 : 0)
92
+ + (candidate.validation.decoderValidation ? 30 : 0)
93
+ + Math.min(20, temporalObservations * 4)
94
+ + geometryEvidence(candidate) * 20
95
+ + (candidate.validation.errorCorrectionEvidence ?? 0) * 20;
96
+ }
97
+ //# sourceMappingURL=decode-candidate-conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode-candidate-conflict.js","sourceRoot":"","sources":["../../src/industrial/decode-candidate-conflict.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { NormalizedFrame } from "../contracts/frame.js";
2
+ import type { BarcodeDifficultyDiagnosis, RecoveryQualityEvidence } from "./types.js";
3
+ export interface BarcodeDifficultyAnalyzerOptions {
4
+ sampleTarget?: number;
5
+ }
6
+ /**
7
+ * Bounded, deterministic routing analysis. The output is heuristic evidence,
8
+ * not a Ground Truth annotation and not a claim that any route will decode.
9
+ */
10
+ export declare class BarcodeDifficultyAnalyzer {
11
+ private readonly options;
12
+ constructor(options?: BarcodeDifficultyAnalyzerOptions);
13
+ analyze(frame: NormalizedFrame, runtime?: RecoveryQualityEvidence): BarcodeDifficultyDiagnosis;
14
+ }
15
+ //# sourceMappingURL=difficulty-diagnosis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"difficulty-diagnosis.d.ts","sourceRoot":"","sources":["../../src/industrial/difficulty-diagnosis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,0BAA0B,EAE1B,uBAAuB,EAExB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gCAAgC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,qBAAa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,GAAE,gCAAqC;IAE3E,OAAO,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,GAAE,uBAA4B,GAAG,0BAA0B;CAkJnG"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Bounded, deterministic routing analysis. The output is heuristic evidence,
3
+ * not a Ground Truth annotation and not a claim that any route will decode.
4
+ */
5
+ export class BarcodeDifficultyAnalyzer {
6
+ options;
7
+ constructor(options = {}) {
8
+ this.options = options;
9
+ }
10
+ analyze(frame, runtime = {}) {
11
+ const target = clampInteger(this.options.sampleTarget ?? 2_048, 256, 4_096);
12
+ const step = Math.max(1, Math.floor(Math.sqrt((frame.width * frame.height) / target)));
13
+ const columns = Math.max(1, Math.ceil(frame.width / step));
14
+ const rows = Math.max(1, Math.ceil(frame.height / step));
15
+ const values = new Float64Array(columns * rows);
16
+ let sum = 0;
17
+ let sumSquares = 0;
18
+ let clippedHigh = 0;
19
+ let clippedLow = 0;
20
+ let horizontalGradient = 0;
21
+ let verticalGradient = 0;
22
+ let gradientSquares = 0;
23
+ let transitionCount = 0;
24
+ let isolatedEdges = 0;
25
+ let diagonalGradient = 0;
26
+ let chromaSum = 0;
27
+ let inkCount = 0;
28
+ let inkLeft = columns;
29
+ let inkRight = 0;
30
+ let inkTop = rows;
31
+ let inkBottom = 0;
32
+ let horizontalBorderInk = 0;
33
+ let horizontalBorderSamples = 0;
34
+ let verticalBorderInk = 0;
35
+ let verticalBorderSamples = 0;
36
+ const rowInkLeft = new Int32Array(rows);
37
+ rowInkLeft.fill(columns);
38
+ const rowInkRight = new Int32Array(rows);
39
+ rowInkRight.fill(-1);
40
+ for (let row = 0; row < rows; row += 1) {
41
+ const y = Math.min(frame.height - 1, row * step);
42
+ for (let column = 0; column < columns; column += 1) {
43
+ const x = Math.min(frame.width - 1, column * step);
44
+ const color = rgb(frame, x, y);
45
+ const value = color.red * 0.2126 + color.green * 0.7152 + color.blue * 0.0722;
46
+ chromaSum += (Math.max(color.red, color.green, color.blue) - Math.min(color.red, color.green, color.blue)) / 255;
47
+ const index = row * columns + column;
48
+ values[index] = value;
49
+ sum += value;
50
+ sumSquares += value * value;
51
+ if (value >= 248)
52
+ clippedHigh += 1;
53
+ if (value <= 7)
54
+ clippedLow += 1;
55
+ if (row === 0 || row === rows - 1) {
56
+ horizontalBorderSamples += 1;
57
+ if (value < 180)
58
+ horizontalBorderInk += 1;
59
+ }
60
+ if (column === 0 || column === columns - 1) {
61
+ verticalBorderSamples += 1;
62
+ if (value < 180)
63
+ verticalBorderInk += 1;
64
+ }
65
+ if (value < 180) {
66
+ inkCount += 1;
67
+ inkLeft = Math.min(inkLeft, column);
68
+ inkRight = Math.max(inkRight, column);
69
+ inkTop = Math.min(inkTop, row);
70
+ inkBottom = Math.max(inkBottom, row);
71
+ rowInkLeft[row] = Math.min(rowInkLeft[row], column);
72
+ rowInkRight[row] = Math.max(rowInkRight[row], column);
73
+ }
74
+ if (column > 0) {
75
+ const gradient = Math.abs(value - values[index - 1]);
76
+ horizontalGradient += gradient;
77
+ gradientSquares += gradient * gradient;
78
+ if (gradient >= 34)
79
+ transitionCount += 1;
80
+ if (gradient >= 70)
81
+ isolatedEdges += 1;
82
+ }
83
+ if (row > 0) {
84
+ const gradient = Math.abs(value - values[index - columns]);
85
+ verticalGradient += gradient;
86
+ gradientSquares += gradient * gradient;
87
+ if (gradient >= 34)
88
+ transitionCount += 1;
89
+ if (gradient >= 70)
90
+ isolatedEdges += 1;
91
+ }
92
+ if (row > 0 && column > 0)
93
+ diagonalGradient += Math.abs(value - values[index - columns - 1]);
94
+ }
95
+ }
96
+ const count = Math.max(1, values.length);
97
+ const mean = sum / count;
98
+ const standardDeviation = Math.sqrt(Math.max(0, sumSquares / count - mean * mean));
99
+ const adjacencyCount = Math.max(1, rows * Math.max(0, columns - 1) + columns * Math.max(0, rows - 1));
100
+ const gradientMean = (horizontalGradient + verticalGradient) / adjacencyCount;
101
+ const gradientEnergy = Math.sqrt(gradientSquares / adjacencyCount) / 255;
102
+ const transitionRatio = transitionCount / adjacencyCount;
103
+ const anisotropy = Math.abs(horizontalGradient - verticalGradient) / Math.max(1, horizontalGradient + verticalGradient);
104
+ let specularEdges = 0;
105
+ for (let row = 1; row < rows - 1; row += 1)
106
+ for (let column = 1; column < columns - 1; column += 1) {
107
+ const index = row * columns + column;
108
+ if (values[index] >= 248 && [values[index - 1], values[index + 1], values[index - columns], values[index + columns]].some((value) => value > 30 && value < 225))
109
+ specularEdges += 1;
110
+ }
111
+ const glareRatio = runtime.glareRatio ?? Math.min(clippedHigh / count, specularEdges / count * 3);
112
+ const brightness = runtime.brightness ?? mean / 255;
113
+ const globalContrast = Math.min(1, standardDeviation / 96);
114
+ const edgeDensity = runtime.edgeDensity ?? Math.min(1, gradientMean / 64);
115
+ const blurSignal = runtime.blurScore === undefined ? gradientEnergy : runtime.blurScore;
116
+ const local = localDistribution(values, columns, rows);
117
+ const contrast = runtime.contrast ?? Math.min(globalContrast, Math.min(1, local.localDeviation / 128));
118
+ const diagonalSkew = Math.abs(diagonalGradient / Math.max(1, (rows - 1) * (columns - 1)) - gradientMean) / 96;
119
+ const envelope = perspectiveEnvelope(rowInkLeft, rowInkRight, columns);
120
+ const perspectiveScore = Math.min(1, Math.max(local.horizontalImbalance, local.verticalImbalance) * 1.35 + diagonalSkew * 0.8 + envelope.centerRange * 2.5 + envelope.widthVariation * 4);
121
+ const curvatureScore = Math.min(1, Math.abs(local.centerEdgeRatio - 1) * 0.9 + local.columnVariation * 0.4);
122
+ const estimatedPixelsPerModule = transitionRatio <= 0.01 ? 32 : Math.max(0.5, step / transitionRatio / 20);
123
+ const inkAreaRatio = inkCount < 4 ? 1 : ((inkRight - inkLeft + 1) * (inkBottom - inkTop + 1)) / Math.max(1, columns * rows);
124
+ const damageScore = Math.min(1, (isolatedEdges / adjacencyCount) * 0.7 + local.flatBlockRatio * 0.18 + local.blockVariation * 0.12);
125
+ const occlusionScore = Math.min(1, local.flatBlockRatio * Math.min(1, edgeDensity * 2.5));
126
+ const colorFringe = chromaSum / count;
127
+ const screenScore = Math.min(1, colorFringe * 2.8 + Math.max(0, local.periodicity - 0.72) * Math.max(0, transitionRatio - 0.2) * 2);
128
+ const dpmLikelihood = clamp01((1 - contrast) * 0.35 + glareRatio * 0.25 + edgeDensity * 0.25 + damageScore * 0.15);
129
+ const horizontalBorderInkRatio = horizontalBorderInk / Math.max(1, horizontalBorderSamples);
130
+ const verticalBorderInkRatio = verticalBorderInk / Math.max(1, verticalBorderSamples);
131
+ const busyBorderRatio = frame.width / Math.max(1, frame.height) >= 2 ? verticalBorderInkRatio : Math.max(horizontalBorderInkRatio, verticalBorderInkRatio);
132
+ const blur = levelFromHighBad(blurSignal, [0.28, 0.16, 0.08]);
133
+ const motionBlur = (runtime.motionEstimate ?? 0) > 0.12 || (transitionRatio > 0.025 && anisotropy > 0.38)
134
+ ? levelFromScore(Math.max(runtime.motionEstimate ?? 0, anisotropy), [0.12, 0.28, 0.48])
135
+ : "none";
136
+ const underexposure = levelFromScore(1 - brightness, [0.78, 0.88, 0.95]);
137
+ const overexposure = levelFromScore(brightness, [0.86, 0.93, 0.975]);
138
+ const glare = levelFromScore(glareRatio, [0.025, 0.1, 0.24]);
139
+ const lowContrast = levelFromScore(1 - contrast, [0.68, 0.82, 0.92]);
140
+ const perspectiveDistortion = levelFromScore(perspectiveScore, [0.16, 0.34, 0.58]);
141
+ const curvature = levelFromScore(curvatureScore, [0.06, 0.16, 0.32]);
142
+ const smallModule = levelFromScore(Math.max(1 / Math.max(0.25, estimatedPixelsPerModule), inkCount >= 4 ? Math.max(0, 0.32 - inkAreaRatio) * 3 : 0), [0.22, 0.38, 0.7]);
143
+ const printingDamage = levelFromScore(damageScore, [0.18, 0.38, 0.62]);
144
+ const occlusion = levelFromScore(occlusionScore, [0.12, 0.3, 0.55]);
145
+ const screenMoiré = levelFromScore(screenScore, [0.18, 0.4, 0.66]);
146
+ const routeScores = [
147
+ ["low-contrast", severity(lowContrast) * 4 + severity(underexposure) * 0.35 + severity(overexposure) * 0.2],
148
+ ["illumination", local.illuminationVariation * 20 + severity(underexposure) * 0.2],
149
+ ["glare", severity(glare)],
150
+ ["blur", Math.max(severity(blur), severity(motionBlur))],
151
+ ["perspective", severity(perspectiveDistortion)],
152
+ ["curved", severity(curvature)],
153
+ ["small-module", severity(smallModule)],
154
+ ["damaged", severity(printingDamage) + severity(occlusion) * 0.35],
155
+ ["quiet-zone", busyBorderRatio * 3],
156
+ ["screen", severity(screenMoiré)],
157
+ ["dpm", dpmLikelihood * 3],
158
+ ];
159
+ const recommendedRoutes = routeScores
160
+ .filter(([, score]) => score >= 0.75)
161
+ .sort((left, right) => right[1] - left[1])
162
+ .map(([route]) => route);
163
+ return {
164
+ blur, motionBlur, underexposure, overexposure, glare, lowContrast,
165
+ perspectiveDistortion, curvature, smallModule, printingDamage, occlusion,
166
+ screenMoiré, dpmLikelihood, recommendedRoutes,
167
+ evidence: {
168
+ brightness, contrast, glareRatio, edgeDensity, gradientEnergy,
169
+ transitionRatio, anisotropy, perspectiveScore, curvatureScore,
170
+ estimatedPixelsPerModule, inkAreaRatio, damageScore, occlusionScore, screenScore, colorFringe, diagonalSkew,
171
+ perspectiveEnvelopeCenterRange: envelope.centerRange, perspectiveEnvelopeWidthVariation: envelope.widthVariation,
172
+ illuminationVariation: local.illuminationVariation,
173
+ busyBorderRatio,
174
+ horizontalBorderInkRatio,
175
+ verticalBorderInkRatio,
176
+ blockBusyBorderRatio: local.busyBorderRatio,
177
+ },
178
+ };
179
+ }
180
+ }
181
+ function localDistribution(values, columns, rows) {
182
+ const blockColumns = Math.min(8, columns);
183
+ const blockRows = Math.min(8, rows);
184
+ const means = [];
185
+ const deviations = [];
186
+ let flatBlocks = 0;
187
+ let borderBusy = 0;
188
+ let borderBlocks = 0;
189
+ const columnMeans = new Array(columns).fill(0);
190
+ for (let column = 0; column < columns; column += 1) {
191
+ for (let row = 0; row < rows; row += 1)
192
+ columnMeans[column] += values[row * columns + column];
193
+ columnMeans[column] /= Math.max(1, rows);
194
+ }
195
+ for (let by = 0; by < blockRows; by += 1) {
196
+ for (let bx = 0; bx < blockColumns; bx += 1) {
197
+ const x0 = Math.floor((bx * columns) / blockColumns);
198
+ const x1 = Math.max(x0 + 1, Math.floor(((bx + 1) * columns) / blockColumns));
199
+ const y0 = Math.floor((by * rows) / blockRows);
200
+ const y1 = Math.max(y0 + 1, Math.floor(((by + 1) * rows) / blockRows));
201
+ let sum = 0;
202
+ let squares = 0;
203
+ let count = 0;
204
+ for (let y = y0; y < y1 && y < rows; y += 1)
205
+ for (let x = x0; x < x1 && x < columns; x += 1) {
206
+ const value = values[y * columns + x];
207
+ sum += value;
208
+ squares += value * value;
209
+ count += 1;
210
+ }
211
+ const mean = sum / Math.max(1, count);
212
+ const deviation = Math.sqrt(Math.max(0, squares / Math.max(1, count) - mean * mean));
213
+ means.push(mean);
214
+ deviations.push(deviation);
215
+ if (deviation < 5)
216
+ flatBlocks += 1;
217
+ if (bx === 0 || by === 0 || bx === blockColumns - 1 || by === blockRows - 1) {
218
+ borderBlocks += 1;
219
+ if (deviation > 28)
220
+ borderBusy += 1;
221
+ }
222
+ }
223
+ }
224
+ const mean = means.reduce((sum, value) => sum + value, 0) / Math.max(1, means.length);
225
+ const variation = Math.sqrt(means.reduce((sum, value) => sum + (value - mean) ** 2, 0) / Math.max(1, means.length)) / 128;
226
+ const left = average(columnMeans.slice(0, Math.max(1, Math.floor(columns / 3))));
227
+ const center = average(columnMeans.slice(Math.floor(columns / 3), Math.max(Math.floor(columns / 3) + 1, Math.ceil(columns * 2 / 3))));
228
+ const right = average(columnMeans.slice(Math.ceil(columns * 2 / 3)));
229
+ const top = average([...values.slice(0, Math.max(columns, Math.floor(values.length / 3)))]);
230
+ const bottom = average([...values.slice(Math.floor(values.length * 2 / 3))]);
231
+ let alternating = 0;
232
+ for (let index = 2; index < columnMeans.length; index += 1) {
233
+ if ((columnMeans[index] - columnMeans[index - 1]) * (columnMeans[index - 1] - columnMeans[index - 2]) < 0)
234
+ alternating += 1;
235
+ }
236
+ return {
237
+ horizontalImbalance: Math.abs(left - right) / 255,
238
+ verticalImbalance: Math.abs(top - bottom) / 255,
239
+ centerEdgeRatio: center / Math.max(1, (left + right) / 2),
240
+ columnVariation: standardDeviation(columnMeans) / 128,
241
+ blockVariation: variation,
242
+ localDeviation: Math.max(0, ...deviations),
243
+ illuminationVariation: Math.min(1, Math.max(Math.abs(left - right) / 255, Math.abs(top - bottom) / 255, Math.abs(center / Math.max(1, (left + right) / 2) - 1) * 0.25)),
244
+ flatBlockRatio: flatBlocks / Math.max(1, means.length),
245
+ busyBorderRatio: borderBusy / Math.max(1, borderBlocks),
246
+ periodicity: alternating / Math.max(1, columnMeans.length - 2),
247
+ };
248
+ }
249
+ function rgb(frame, x, y) {
250
+ const row = y * frame.rowStride;
251
+ if (frame.pixelFormat === "gray8" || frame.pixelFormat === "yuv420") {
252
+ const value = frame.data[row + x] ?? 0;
253
+ return { red: value, green: value, blue: value };
254
+ }
255
+ const channels = frame.pixelFormat === "rgba8888" ? 4 : 3;
256
+ const offset = row + x * channels;
257
+ return { red: frame.data[offset] ?? 0, green: frame.data[offset + 1] ?? 0, blue: frame.data[offset + 2] ?? 0 };
258
+ }
259
+ function levelFromScore(score, thresholds) {
260
+ if (score >= thresholds[2])
261
+ return "high";
262
+ if (score >= thresholds[1])
263
+ return "medium";
264
+ if (score >= thresholds[0])
265
+ return "low";
266
+ return "none";
267
+ }
268
+ function levelFromHighBad(score, thresholds) {
269
+ if (score <= thresholds[2])
270
+ return "high";
271
+ if (score <= thresholds[1])
272
+ return "medium";
273
+ if (score <= thresholds[0])
274
+ return "low";
275
+ return "none";
276
+ }
277
+ function severity(level) { return level === "high" ? 3 : level === "medium" ? 2 : level === "low" ? 1 : 0; }
278
+ function clamp01(value) { return Math.max(0, Math.min(1, value)); }
279
+ function clampInteger(value, minimum, maximum) { return Math.max(minimum, Math.min(maximum, Math.floor(value))); }
280
+ function average(values) { return values.reduce((sum, value) => sum + value, 0) / Math.max(1, values.length); }
281
+ function standardDeviation(values) {
282
+ const mean = average(values);
283
+ return Math.sqrt(values.reduce((sum, value) => sum + (value - mean) ** 2, 0) / Math.max(1, values.length));
284
+ }
285
+ function perspectiveEnvelope(left, right, columns) { const centers = []; const widths = []; for (let row = 0; row < left.length; row += 1)
286
+ if (right[row] >= left[row]) {
287
+ centers.push((left[row] + right[row]) / 2);
288
+ widths.push(right[row] - left[row] + 1);
289
+ } if (centers.length < 3)
290
+ return { centerRange: 0, widthVariation: 0 }; return { centerRange: (Math.max(...centers) - Math.min(...centers)) / Math.max(1, columns), widthVariation: standardDeviation(widths) / Math.max(1, columns) }; }
291
+ //# sourceMappingURL=difficulty-diagnosis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"difficulty-diagnosis.js","sourceRoot":"","sources":["../../src/industrial/difficulty-diagnosis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export * from "./types.js";
2
+ export * from "./memory.js";
3
+ export * from "./coordinate-transform.js";
4
+ export * from "./difficulty-diagnosis.js";
5
+ export * from "./candidate-region.js";
6
+ export * from "./recovery-route-registry.js";
7
+ export * from "./recovery-planner.js";
8
+ export * from "./recovery-routes.js";
9
+ export * from "./scan-evidence.js";
10
+ export * from "./decode-candidate-conflict.js";
11
+ export * from "./recovery-pipeline.js";
12
+ export * from "./scanner-diagnostics.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/industrial/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export * from "./types.js";
2
+ export * from "./memory.js";
3
+ export * from "./coordinate-transform.js";
4
+ export * from "./difficulty-diagnosis.js";
5
+ export * from "./candidate-region.js";
6
+ export * from "./recovery-route-registry.js";
7
+ export * from "./recovery-planner.js";
8
+ export * from "./recovery-routes.js";
9
+ export * from "./scan-evidence.js";
10
+ export * from "./decode-candidate-conflict.js";
11
+ export * from "./recovery-pipeline.js";
12
+ export * from "./scanner-diagnostics.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/industrial/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,28 @@
1
+ export type RecoveryBufferKind = "candidate" | "normalized" | "rectified" | "warp" | "grayscale" | "binary";
2
+ export interface RecoveryMemoryObservation {
3
+ currentBytes: number;
4
+ peakBytes: number;
5
+ activeBuffers: number;
6
+ peakBuffers: number;
7
+ byKind: Readonly<Record<RecoveryBufferKind, number>>;
8
+ }
9
+ export interface RecoveryMemoryLease {
10
+ readonly bytes: number;
11
+ readonly kind: RecoveryBufferKind;
12
+ readonly released: boolean;
13
+ release(): void;
14
+ }
15
+ export declare class RecoveryMemoryAccountant {
16
+ readonly maximumBytes: number;
17
+ private currentBytes;
18
+ private peakBytes;
19
+ private peakBuffers;
20
+ private readonly leases;
21
+ private readonly byKind;
22
+ constructor(maximumBytes: number);
23
+ reserve(bytes: number, kind: RecoveryBufferKind): RecoveryMemoryLease;
24
+ releaseAll(): void;
25
+ get activeBufferCount(): number;
26
+ get observation(): RecoveryMemoryObservation;
27
+ }
28
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/industrial/memory.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5G,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qBAAa,wBAAwB;IASvB,QAAQ,CAAC,YAAY,EAAE,MAAM;IARzC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;gBAEmB,YAAY,EAAE,MAAM;IAIzC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,mBAAmB;IAqBrE,UAAU,IAAI,IAAI;IAClB,IAAI,iBAAiB,IAAI,MAAM,CAA6B;IAC5D,IAAI,WAAW,IAAI,yBAAyB,CAQ3C;CACF"}
@@ -0,0 +1,65 @@
1
+ export class RecoveryMemoryAccountant {
2
+ maximumBytes;
3
+ currentBytes = 0;
4
+ peakBytes = 0;
5
+ peakBuffers = 0;
6
+ leases = new Set();
7
+ byKind = {
8
+ candidate: 0, normalized: 0, rectified: 0, warp: 0, grayscale: 0, binary: 0,
9
+ };
10
+ constructor(maximumBytes) {
11
+ this.maximumBytes = maximumBytes;
12
+ if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 1)
13
+ throw new RangeError("Recovery memory limit must be a positive integer.");
14
+ }
15
+ reserve(bytes, kind) {
16
+ const normalized = Math.max(0, Math.ceil(bytes));
17
+ if (!Number.isSafeInteger(normalized) || this.currentBytes + normalized > this.maximumBytes) {
18
+ throw Object.assign(new Error(`Recovery memory budget exceeded for ${kind}.`), {
19
+ code: "resource_limit_exceeded", requestedBytes: normalized,
20
+ currentBytes: this.currentBytes, maximumBytes: this.maximumBytes,
21
+ });
22
+ }
23
+ const lease = new Lease(normalized, kind, () => {
24
+ if (!this.leases.delete(lease))
25
+ return;
26
+ this.currentBytes -= lease.bytes;
27
+ this.byKind[lease.kind] -= lease.bytes;
28
+ });
29
+ this.leases.add(lease);
30
+ this.currentBytes += normalized;
31
+ this.byKind[kind] += normalized;
32
+ this.peakBytes = Math.max(this.peakBytes, this.currentBytes);
33
+ this.peakBuffers = Math.max(this.peakBuffers, this.leases.size);
34
+ return lease;
35
+ }
36
+ releaseAll() { for (const lease of [...this.leases])
37
+ lease.release(); }
38
+ get activeBufferCount() { return this.leases.size; }
39
+ get observation() {
40
+ return {
41
+ currentBytes: this.currentBytes,
42
+ peakBytes: this.peakBytes,
43
+ activeBuffers: this.leases.size,
44
+ peakBuffers: this.peakBuffers,
45
+ byKind: { ...this.byKind },
46
+ };
47
+ }
48
+ }
49
+ class Lease {
50
+ bytes;
51
+ kind;
52
+ onRelease;
53
+ done = false;
54
+ constructor(bytes, kind, onRelease) {
55
+ this.bytes = bytes;
56
+ this.kind = kind;
57
+ this.onRelease = onRelease;
58
+ }
59
+ get released() { return this.done; }
60
+ release() { if (!this.done) {
61
+ this.done = true;
62
+ this.onRelease();
63
+ } }
64
+ }
65
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/industrial/memory.ts"],"names":[],"mappings":"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"}