@simprints/simface-sdk 0.12.1 → 0.14.1
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/dist/services/face-detection.js +17 -1
- package/dist/services/face-detection.js.map +1 -1
- package/dist/services/face-quality.d.ts +4 -0
- package/dist/services/face-quality.js +71 -12
- package/dist/services/face-quality.js.map +1 -1
- package/dist/services/sharpness.d.ts +36 -0
- package/dist/services/sharpness.js +97 -0
- package/dist/services/sharpness.js.map +1 -0
- package/dist/shared/capture-runtime.d.ts +4 -0
- package/dist/shared/capture-runtime.js +12 -0
- package/dist/shared/capture-runtime.js.map +1 -1
- package/dist/shared/capture-session.js +4 -1
- package/dist/shared/capture-session.js.map +1 -1
- package/dist/simface-sdk.js +1019 -906
- package/dist/simface-sdk.umd.cjs +23 -23
- package/dist/types/index.d.ts +2 -1
- package/package.json +1 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FaceDetector, FilesetResolver } from '@mediapipe/tasks-vision';
|
|
2
2
|
import { evaluateFaceQuality } from './face-quality.js';
|
|
3
|
+
import { computeSharpnessScore } from './sharpness.js';
|
|
3
4
|
const WASM_CDN = 'https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/wasm';
|
|
4
5
|
const MODEL_URL = 'https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite';
|
|
5
6
|
// Minimum confidence to consider a face detected
|
|
@@ -40,13 +41,28 @@ export async function assessFaceQuality(imageElement) {
|
|
|
40
41
|
height: imageElement.naturalHeight,
|
|
41
42
|
});
|
|
42
43
|
}
|
|
44
|
+
// Reusable offscreen canvas for sharpness computation (avoids allocation per frame)
|
|
45
|
+
let sharpnessCanvas = null;
|
|
43
46
|
export async function assessFaceQualityForVideo(videoElement, timestamp) {
|
|
44
47
|
const detector = await getVideoDetector();
|
|
45
48
|
const result = detector.detectForVideo(videoElement, timestamp);
|
|
49
|
+
const detections = mapDetections(result.detections);
|
|
46
50
|
return evaluateFaceQuality({
|
|
47
|
-
detections
|
|
51
|
+
detections,
|
|
48
52
|
width: videoElement.videoWidth,
|
|
49
53
|
height: videoElement.videoHeight,
|
|
54
|
+
resolveSharpnessScore: detections.length === 1 && detections[0].boundingBox
|
|
55
|
+
? () => {
|
|
56
|
+
const bbox = detections[0].boundingBox;
|
|
57
|
+
sharpnessCanvas ?? (sharpnessCanvas = document.createElement('canvas'));
|
|
58
|
+
return computeSharpnessScore(videoElement, {
|
|
59
|
+
x: bbox.originX,
|
|
60
|
+
y: bbox.originY,
|
|
61
|
+
width: bbox.width,
|
|
62
|
+
height: bbox.height,
|
|
63
|
+
}, sharpnessCanvas);
|
|
64
|
+
}
|
|
65
|
+
: undefined,
|
|
50
66
|
});
|
|
51
67
|
}
|
|
52
68
|
function mapDetections(detections) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-detection.js","sourceRoot":"","sources":["../../src/services/face-detection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"face-detection.js","sourceRoot":"","sources":["../../src/services/face-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,10 @@ interface FaceQualityInput {
|
|
|
18
18
|
width: number;
|
|
19
19
|
height: number;
|
|
20
20
|
detections: FaceDetectionSnapshot[];
|
|
21
|
+
/** Normalised sharpness score (0–1) for the face region. Omit when unavailable (e.g. image mode). */
|
|
22
|
+
sharpnessScore?: number;
|
|
23
|
+
/** Lazily compute sharpness only after framing and pose checks pass. */
|
|
24
|
+
resolveSharpnessScore?: () => number;
|
|
21
25
|
}
|
|
22
26
|
export declare function evaluateFaceQuality(input: FaceQualityInput): FaceQualityResult;
|
|
23
27
|
export {};
|
|
@@ -1,20 +1,31 @@
|
|
|
1
|
+
import { MIN_SHARPNESS_SCORE } from './sharpness.js';
|
|
1
2
|
const MIN_FACE_AREA_RATIO = 0.1;
|
|
2
3
|
const MAX_FACE_AREA_RATIO = 0.42;
|
|
3
4
|
const IDEAL_FACE_AREA_RATIO = 0.24;
|
|
4
5
|
const CENTER_TOLERANCE_X = 0.14;
|
|
5
6
|
const CENTER_TOLERANCE_Y = 0.18;
|
|
7
|
+
/** Yaw: max horizontal nose offset / interocular distance. */
|
|
6
8
|
const MAX_NOSE_OFFSET_RATIO = 0.12;
|
|
9
|
+
/** Roll: max eye vertical difference / interocular distance. */
|
|
10
|
+
const MAX_EYE_TILT_RATIO = 0.2;
|
|
11
|
+
/** Pitch ceiling: live BlazeFace signal shows higher ratios when the chin is tucked / looking down. */
|
|
12
|
+
const MAX_PITCH_RATIO = 0.95;
|
|
13
|
+
/** Pitch floor: live BlazeFace signal shows lower ratios when the chin is raised / looking up. */
|
|
14
|
+
const MIN_PITCH_RATIO = 0.2;
|
|
15
|
+
/** Image-mode sharpness is unavailable, so do not penalise captures for a missing live-video metric. */
|
|
16
|
+
const DEFAULT_SHARPNESS_SCORE = 1;
|
|
7
17
|
const KEYPOINT_RIGHT_EYE = 0;
|
|
8
18
|
const KEYPOINT_LEFT_EYE = 1;
|
|
9
19
|
const KEYPOINT_NOSE = 2;
|
|
10
20
|
export function evaluateFaceQuality(input) {
|
|
11
|
-
const { detections, width, height } = input;
|
|
21
|
+
const { detections, width, height, sharpnessScore, resolveSharpnessScore } = input;
|
|
12
22
|
if (detections.length === 0) {
|
|
13
23
|
return createQualityResult({
|
|
14
24
|
hasFace: false,
|
|
15
25
|
faceCount: 0,
|
|
16
26
|
confidence: 0,
|
|
17
27
|
captureScore: 0,
|
|
28
|
+
sharpnessScore: 0,
|
|
18
29
|
isCentered: false,
|
|
19
30
|
passesQualityChecks: false,
|
|
20
31
|
feedback: 'no-face',
|
|
@@ -27,6 +38,7 @@ export function evaluateFaceQuality(input) {
|
|
|
27
38
|
faceCount: detections.length,
|
|
28
39
|
confidence: detections[0]?.confidence ?? 0,
|
|
29
40
|
captureScore: 0,
|
|
41
|
+
sharpnessScore: 0,
|
|
30
42
|
isCentered: false,
|
|
31
43
|
passesQualityChecks: false,
|
|
32
44
|
feedback: 'multiple-faces',
|
|
@@ -41,6 +53,7 @@ export function evaluateFaceQuality(input) {
|
|
|
41
53
|
faceCount: 1,
|
|
42
54
|
confidence: detection.confidence,
|
|
43
55
|
captureScore: 0,
|
|
56
|
+
sharpnessScore: 0,
|
|
44
57
|
isCentered: false,
|
|
45
58
|
passesQualityChecks: false,
|
|
46
59
|
feedback: 'face-unclear',
|
|
@@ -68,34 +81,50 @@ export function evaluateFaceQuality(input) {
|
|
|
68
81
|
if (faceCenterY > 0.5 + CENTER_TOLERANCE_Y) {
|
|
69
82
|
return createFrameAdjustmentResult(detection.confidence, 'move-up', 'Move your face slightly up.');
|
|
70
83
|
}
|
|
71
|
-
const
|
|
72
|
-
if (
|
|
73
|
-
return createFrameAdjustmentResult(detection.confidence,
|
|
84
|
+
const poseFeedback = detectPoseFeedback(detection.keypoints);
|
|
85
|
+
if (poseFeedback) {
|
|
86
|
+
return createFrameAdjustmentResult(detection.confidence, poseFeedback.feedback, poseFeedback.message);
|
|
87
|
+
}
|
|
88
|
+
const resolvedSharpness = sharpnessScore ?? resolveSharpnessScore?.() ?? DEFAULT_SHARPNESS_SCORE;
|
|
89
|
+
if (resolvedSharpness < MIN_SHARPNESS_SCORE) {
|
|
90
|
+
return createQualityResult({
|
|
91
|
+
hasFace: true,
|
|
92
|
+
faceCount: 1,
|
|
93
|
+
confidence: detection.confidence,
|
|
94
|
+
captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio, resolvedSharpness),
|
|
95
|
+
sharpnessScore: resolvedSharpness,
|
|
96
|
+
isCentered: true,
|
|
97
|
+
passesQualityChecks: false,
|
|
98
|
+
feedback: 'too-blurry',
|
|
99
|
+
message: 'Hold still so the image is not blurry.',
|
|
100
|
+
});
|
|
74
101
|
}
|
|
75
102
|
return createQualityResult({
|
|
76
103
|
hasFace: true,
|
|
77
104
|
faceCount: 1,
|
|
78
105
|
confidence: detection.confidence,
|
|
79
|
-
captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio),
|
|
106
|
+
captureScore: calculateCaptureScore(detection.confidence, faceCenterX, faceCenterY, faceAreaRatio, resolvedSharpness),
|
|
107
|
+
sharpnessScore: resolvedSharpness,
|
|
80
108
|
isCentered: true,
|
|
81
109
|
passesQualityChecks: true,
|
|
82
110
|
feedback: 'good',
|
|
83
111
|
message: 'Hold still. Capturing automatically...',
|
|
84
112
|
});
|
|
85
113
|
}
|
|
86
|
-
function
|
|
114
|
+
function detectPoseFeedback(keypoints) {
|
|
87
115
|
const rightEye = keypoints[KEYPOINT_RIGHT_EYE];
|
|
88
116
|
const leftEye = keypoints[KEYPOINT_LEFT_EYE];
|
|
89
117
|
const nose = keypoints[KEYPOINT_NOSE];
|
|
90
118
|
if (!rightEye || !leftEye || !nose) {
|
|
91
119
|
return null;
|
|
92
120
|
}
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
if (eyeDistance === 0) {
|
|
121
|
+
const eyeDistanceX = Math.abs(leftEye.x - rightEye.x);
|
|
122
|
+
if (eyeDistanceX === 0) {
|
|
96
123
|
return null;
|
|
97
124
|
}
|
|
98
|
-
|
|
125
|
+
// Yaw: horizontal nose offset relative to eye midpoint
|
|
126
|
+
const eyeMidpointX = (rightEye.x + leftEye.x) / 2;
|
|
127
|
+
const noseOffsetRatio = (nose.x - eyeMidpointX) / eyeDistanceX;
|
|
99
128
|
if (noseOffsetRatio <= -MAX_NOSE_OFFSET_RATIO) {
|
|
100
129
|
return {
|
|
101
130
|
feedback: 'turn-left',
|
|
@@ -108,6 +137,35 @@ function detectTurnFeedback(keypoints) {
|
|
|
108
137
|
message: 'Turn slightly right so your face points at the camera.',
|
|
109
138
|
};
|
|
110
139
|
}
|
|
140
|
+
// Roll: head tilt detected via eye vertical difference
|
|
141
|
+
const eyeTiltRatio = (rightEye.y - leftEye.y) / eyeDistanceX;
|
|
142
|
+
if (eyeTiltRatio >= MAX_EYE_TILT_RATIO) {
|
|
143
|
+
return {
|
|
144
|
+
feedback: 'tilt-left',
|
|
145
|
+
message: 'Straighten your head — it is tilting to the right.',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (eyeTiltRatio <= -MAX_EYE_TILT_RATIO) {
|
|
149
|
+
return {
|
|
150
|
+
feedback: 'tilt-right',
|
|
151
|
+
message: 'Straighten your head — it is tilting to the left.',
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// Pitch: nose vertical offset relative to eye midpoint
|
|
155
|
+
const eyeMidpointY = (rightEye.y + leftEye.y) / 2;
|
|
156
|
+
const pitchRatio = (nose.y - eyeMidpointY) / eyeDistanceX;
|
|
157
|
+
if (pitchRatio >= MAX_PITCH_RATIO) {
|
|
158
|
+
return {
|
|
159
|
+
feedback: 'look-up',
|
|
160
|
+
message: 'Raise your chin slightly so your face points at the camera.',
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (pitchRatio <= MIN_PITCH_RATIO) {
|
|
164
|
+
return {
|
|
165
|
+
feedback: 'look-down',
|
|
166
|
+
message: 'Lower your chin slightly so your face points at the camera.',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
111
169
|
return null;
|
|
112
170
|
}
|
|
113
171
|
function createFrameAdjustmentResult(confidence, feedback, message) {
|
|
@@ -116,6 +174,7 @@ function createFrameAdjustmentResult(confidence, feedback, message) {
|
|
|
116
174
|
faceCount: 1,
|
|
117
175
|
confidence,
|
|
118
176
|
captureScore: 0,
|
|
177
|
+
sharpnessScore: 0,
|
|
119
178
|
isCentered: false,
|
|
120
179
|
passesQualityChecks: false,
|
|
121
180
|
feedback,
|
|
@@ -125,12 +184,12 @@ function createFrameAdjustmentResult(confidence, feedback, message) {
|
|
|
125
184
|
function createQualityResult(result) {
|
|
126
185
|
return result;
|
|
127
186
|
}
|
|
128
|
-
function calculateCaptureScore(confidence, faceCenterX, faceCenterY, faceAreaRatio) {
|
|
187
|
+
function calculateCaptureScore(confidence, faceCenterX, faceCenterY, faceAreaRatio, sharpnessScore) {
|
|
129
188
|
const xPenalty = Math.abs(faceCenterX - 0.5) / CENTER_TOLERANCE_X;
|
|
130
189
|
const yPenalty = Math.abs(faceCenterY - 0.5) / CENTER_TOLERANCE_Y;
|
|
131
190
|
const centerScore = 1 - Math.min((xPenalty + yPenalty) / 2, 1);
|
|
132
191
|
const maxAreaDistance = Math.max(Math.abs(IDEAL_FACE_AREA_RATIO - MIN_FACE_AREA_RATIO), Math.abs(MAX_FACE_AREA_RATIO - IDEAL_FACE_AREA_RATIO));
|
|
133
192
|
const sizeScore = 1 - Math.min(Math.abs(faceAreaRatio - IDEAL_FACE_AREA_RATIO) / maxAreaDistance, 1);
|
|
134
|
-
return Number((confidence * 0.
|
|
193
|
+
return Number((confidence * 0.40 + centerScore * 0.25 + sizeScore * 0.10 + sharpnessScore * 0.25).toFixed(4));
|
|
135
194
|
}
|
|
136
195
|
//# sourceMappingURL=face-quality.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-quality.js","sourceRoot":"","sources":["../../src/services/face-quality.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"face-quality.js","sourceRoot":"","sources":["../../src/services/face-quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image sharpness estimation via Laplacian variance.
|
|
3
|
+
*
|
|
4
|
+
* A sharp image has strong edges (high second-derivative response) and
|
|
5
|
+
* therefore a high variance in the Laplacian-filtered output. A blurry
|
|
6
|
+
* image has weak edges and low variance.
|
|
7
|
+
*/
|
|
8
|
+
export interface SharpnessRegion {
|
|
9
|
+
x: number;
|
|
10
|
+
y: number;
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
}
|
|
14
|
+
/** Minimum sharpness score (0–1) below which a frame is considered too blurry. */
|
|
15
|
+
export declare const MIN_SHARPNESS_SCORE = 0.15;
|
|
16
|
+
/**
|
|
17
|
+
* Compute a normalised sharpness score (0–1) for the given video frame.
|
|
18
|
+
*
|
|
19
|
+
* The score is the Laplacian variance of the face region, clamped and
|
|
20
|
+
* mapped to [0, 1] using {@link REFERENCE_VARIANCE} as the ceiling.
|
|
21
|
+
*
|
|
22
|
+
* @param video The video element to sample from.
|
|
23
|
+
* @param region The face bounding box in pixel coordinates.
|
|
24
|
+
* @param canvas An optional reusable offscreen canvas (avoids allocation per call).
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeSharpnessScore(video: HTMLVideoElement, region: SharpnessRegion, canvas?: HTMLCanvasElement): number;
|
|
27
|
+
/**
|
|
28
|
+
* Compute the Laplacian variance of an ImageData buffer.
|
|
29
|
+
*
|
|
30
|
+
* 1. Convert RGBA → luminance using BT.601 luma weights.
|
|
31
|
+
* 2. Convolve with the 3×3 Laplacian kernel: [[0,1,0],[1,-4,1],[0,1,0]]
|
|
32
|
+
* 3. Return the variance of the filtered values.
|
|
33
|
+
*
|
|
34
|
+
* Exported for direct unit-testing with synthetic ImageData.
|
|
35
|
+
*/
|
|
36
|
+
export declare function laplacianVariance(imageData: ImageData, grayBuffer?: Float32Array): number;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image sharpness estimation via Laplacian variance.
|
|
3
|
+
*
|
|
4
|
+
* A sharp image has strong edges (high second-derivative response) and
|
|
5
|
+
* therefore a high variance in the Laplacian-filtered output. A blurry
|
|
6
|
+
* image has weak edges and low variance.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Reference Laplacian variance used to normalise the raw variance into a
|
|
10
|
+
* 0–1 score. Values at or above this are mapped to 1.0. This was tuned
|
|
11
|
+
* empirically against 640×480 webcam frames; it may need adjustment for
|
|
12
|
+
* significantly different resolutions.
|
|
13
|
+
*/
|
|
14
|
+
const REFERENCE_VARIANCE = 800;
|
|
15
|
+
const GRAY_BUFFER_GROWTH_FACTOR = 1.5;
|
|
16
|
+
/** Minimum sharpness score (0–1) below which a frame is considered too blurry. */
|
|
17
|
+
export const MIN_SHARPNESS_SCORE = 0.15;
|
|
18
|
+
const grayBuffersByCanvas = new WeakMap();
|
|
19
|
+
/**
|
|
20
|
+
* Compute a normalised sharpness score (0–1) for the given video frame.
|
|
21
|
+
*
|
|
22
|
+
* The score is the Laplacian variance of the face region, clamped and
|
|
23
|
+
* mapped to [0, 1] using {@link REFERENCE_VARIANCE} as the ceiling.
|
|
24
|
+
*
|
|
25
|
+
* @param video The video element to sample from.
|
|
26
|
+
* @param region The face bounding box in pixel coordinates.
|
|
27
|
+
* @param canvas An optional reusable offscreen canvas (avoids allocation per call).
|
|
28
|
+
*/
|
|
29
|
+
export function computeSharpnessScore(video, region, canvas) {
|
|
30
|
+
const target = canvas ?? document.createElement('canvas');
|
|
31
|
+
target.width = region.width;
|
|
32
|
+
target.height = region.height;
|
|
33
|
+
const ctx = target.getContext('2d');
|
|
34
|
+
if (!ctx)
|
|
35
|
+
return 0;
|
|
36
|
+
ctx.drawImage(video, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height);
|
|
37
|
+
const imageData = ctx.getImageData(0, 0, region.width, region.height);
|
|
38
|
+
const grayBuffer = canvas ? getReusableGrayBuffer(canvas, region.width * region.height) : undefined;
|
|
39
|
+
const variance = Math.max(laplacianVariance(imageData, grayBuffer), 0);
|
|
40
|
+
return Math.min(Math.max(variance / REFERENCE_VARIANCE, 0), 1);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Compute the Laplacian variance of an ImageData buffer.
|
|
44
|
+
*
|
|
45
|
+
* 1. Convert RGBA → luminance using BT.601 luma weights.
|
|
46
|
+
* 2. Convolve with the 3×3 Laplacian kernel: [[0,1,0],[1,-4,1],[0,1,0]]
|
|
47
|
+
* 3. Return the variance of the filtered values.
|
|
48
|
+
*
|
|
49
|
+
* Exported for direct unit-testing with synthetic ImageData.
|
|
50
|
+
*/
|
|
51
|
+
export function laplacianVariance(imageData, grayBuffer) {
|
|
52
|
+
const { data, width, height } = imageData;
|
|
53
|
+
// --- Step 1: grayscale luminance ---
|
|
54
|
+
const pixelCount = width * height;
|
|
55
|
+
const gray = grayBuffer && grayBuffer.length >= pixelCount
|
|
56
|
+
? grayBuffer
|
|
57
|
+
: new Float32Array(pixelCount);
|
|
58
|
+
for (let i = 0; i < pixelCount; i++) {
|
|
59
|
+
const offset = i * 4;
|
|
60
|
+
// ITU-R BT.601 luma weights
|
|
61
|
+
gray[i] = data[offset] * 0.299 + data[offset + 1] * 0.587 + data[offset + 2] * 0.114;
|
|
62
|
+
}
|
|
63
|
+
// --- Step 2: Laplacian convolution (skip 1-pixel border) ---
|
|
64
|
+
const innerPixels = (width - 2) * (height - 2);
|
|
65
|
+
if (innerPixels <= 0)
|
|
66
|
+
return 0;
|
|
67
|
+
let sum = 0;
|
|
68
|
+
let sumSq = 0;
|
|
69
|
+
for (let y = 1; y < height - 1; y++) {
|
|
70
|
+
for (let x = 1; x < width - 1; x++) {
|
|
71
|
+
const idx = y * width + x;
|
|
72
|
+
const lap = gray[idx - width] + // top
|
|
73
|
+
gray[idx - 1] + // left
|
|
74
|
+
-4 * gray[idx] + // center
|
|
75
|
+
gray[idx + 1] + // right
|
|
76
|
+
gray[idx + width]; // bottom
|
|
77
|
+
sum += lap;
|
|
78
|
+
sumSq += lap * lap;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// variance = E[X²] - E[X]²
|
|
82
|
+
const mean = sum / innerPixels;
|
|
83
|
+
return Math.max(sumSq / innerPixels - mean * mean, 0);
|
|
84
|
+
}
|
|
85
|
+
function getReusableGrayBuffer(canvas, pixelCount) {
|
|
86
|
+
const existing = grayBuffersByCanvas.get(canvas);
|
|
87
|
+
if (existing && existing.length >= pixelCount) {
|
|
88
|
+
return existing;
|
|
89
|
+
}
|
|
90
|
+
const nextSize = existing
|
|
91
|
+
? Math.max(pixelCount, Math.ceil(existing.length * GRAY_BUFFER_GROWTH_FACTOR))
|
|
92
|
+
: pixelCount;
|
|
93
|
+
const next = new Float32Array(nextSize);
|
|
94
|
+
grayBuffersByCanvas.set(canvas, next);
|
|
95
|
+
return next;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=sharpness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharpness.js","sourceRoot":"","sources":["../../src/services/sharpness.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,10 @@ export declare class CameraAccessError extends Error {
|
|
|
6
6
|
}
|
|
7
7
|
export interface ReusableFrameCapture {
|
|
8
8
|
captureBlob: (video: HTMLVideoElement) => Promise<Blob>;
|
|
9
|
+
/** Snapshot the current video frame to an internal working canvas. */
|
|
10
|
+
captureWorkingFrame: (video: HTMLVideoElement) => void;
|
|
11
|
+
/** Copy the working canvas to the best-frame canvas, replacing any previous best. */
|
|
12
|
+
promoteWorkingToBest: () => void;
|
|
9
13
|
storeBestFrame: (video: HTMLVideoElement) => void;
|
|
10
14
|
hasStoredBestFrame: () => boolean;
|
|
11
15
|
storedBestFrameToBlob: () => Promise<Blob>;
|
|
@@ -78,6 +78,18 @@ export function createReusableFrameCapture() {
|
|
|
78
78
|
drawFrame(video, workingCanvas);
|
|
79
79
|
return canvasToBlob(workingCanvas);
|
|
80
80
|
},
|
|
81
|
+
captureWorkingFrame(video) {
|
|
82
|
+
drawFrame(video, workingCanvas);
|
|
83
|
+
},
|
|
84
|
+
promoteWorkingToBest() {
|
|
85
|
+
if (!workingCanvas.width || !workingCanvas.height) {
|
|
86
|
+
throw new Error('No working frame to promote.');
|
|
87
|
+
}
|
|
88
|
+
bestFrameCanvas.width = workingCanvas.width;
|
|
89
|
+
bestFrameCanvas.height = workingCanvas.height;
|
|
90
|
+
getContext(bestFrameCanvas).drawImage(workingCanvas, 0, 0);
|
|
91
|
+
hasStoredBestFrame = true;
|
|
92
|
+
},
|
|
81
93
|
storeBestFrame(video) {
|
|
82
94
|
drawFrame(video, bestFrameCanvas);
|
|
83
95
|
hasStoredBestFrame = true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-runtime.js","sourceRoot":"","sources":["../../src/shared/capture-runtime.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAG1C,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAG,mBAAmB,CAAC;QAIlC,IAAI,OAAO,EAAE,KAAK,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;gBACnC,YAAY,EAAE,IAAI;gBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"capture-runtime.js","sourceRoot":"","sources":["../../src/shared/capture-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -187,6 +187,9 @@ export class CameraCaptureSessionController {
|
|
|
187
187
|
this.analysisInFlight = true;
|
|
188
188
|
this.lastAnalysisTimestamp = timestamp;
|
|
189
189
|
try {
|
|
190
|
+
// Snapshot the current frame BEFORE the async assessment so that
|
|
191
|
+
// the stored image matches the frame that was actually evaluated.
|
|
192
|
+
this.frameCapture.captureWorkingFrame(this.videoElement);
|
|
190
193
|
const qualityResult = await this.assessLiveQuality(this.videoElement, timestamp);
|
|
191
194
|
if (this.stopped)
|
|
192
195
|
return;
|
|
@@ -197,7 +200,7 @@ export class CameraCaptureSessionController {
|
|
|
197
200
|
this.countdownStartedAt = timestamp;
|
|
198
201
|
}
|
|
199
202
|
if (qualityResult.captureScore > this.bestCaptureScore) {
|
|
200
|
-
this.frameCapture.
|
|
203
|
+
this.frameCapture.promoteWorkingToBest();
|
|
201
204
|
this.bestCaptureScore = qualityResult.captureScore;
|
|
202
205
|
this.bestQualityResult = qualityResult;
|
|
203
206
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture-session.js","sourceRoot":"","sources":["../../src/shared/capture-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE7F,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AA8E9B,MAAM,OAAO,8BAA8B;IAuBzC,YAAY,OAA8C;QAbzC,iBAAY,GAAG,0BAA0B,EAAE,CAAC;QAErD,YAAO,GAAG,KAAK,CAAC;QAGhB,qBAAgB,GAAkB,IAAI,CAAC;QACvC,oBAAe,GAAkB,IAAI,CAAC;QACtC,qBAAgB,GAAG,KAAK,CAAC;QACzB,0BAAqB,GAAG,CAAC,CAAC;QAC1B,uBAAkB,GAAkB,IAAI,CAAC;QACzC,qBAAgB,GAAG,CAAC,CAAC,CAAC;QACtB,sBAAiB,GAA6B,IAAI,CAAC;QAGzD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,yBAAyB,CAAC;QAChF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,kBAAkB,CAAC;QACzE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAC7B,eAAe,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM;gBACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAC5B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAChC,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;SAC1D,CAAC,CAAC,CAAC;QAEJ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,uEAAuE;QACvE,kEAAkE;QAClE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;YACrB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAC7B,eAAe,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM;gBACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAC5B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAClE,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;SAC1D,CAAC,CAAC,CAAC;QAEJ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAChC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAEO,mBAAmB;QACzB,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,EAAE;YACnB,YAAY,EAAE,SAAS;YACvB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,OAMvB;QACC,OAAO;YACL,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC;YACjD,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;YAC5C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;YAC9C,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI;SACvE,CAAC;IACJ,CAAC;IAEO,kBAAkB,CACxB,IAAU,EACV,aAAuC,EACvC,OAGC;QAED,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,OAAO,EAAE,eAAe;mBACpC,aAAa,EAAE,OAAO;mBACtB,8CAA8C;YACnD,YAAY,EAAE,OAAO,EAAE,YAAY;mBAC9B,CAAC,aAAa;oBACf,CAAC,CAAC,aAAa,CAAC,mBAAmB;wBACjC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,OAAO;oBACX,CAAC,CAAC,QAAQ,CAAC;YACf,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,aAAa;YACb,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,aAAa,EAAE,mBAAmB,KAAK,KAAK;YACxD,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,YAAoB;QAC5B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,OAAO;YACrB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,YAAY;YACZ,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,KAAgC;QAC3C,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACxE,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC;QAClG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,EAAE,EAAE;gBACjE,KAAK,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC7C,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAEvC,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YACjF,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;gBAAE,OAAO;YAEhE,IAAI,aAAa,CAAC,mBAAmB,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;oBACrC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,CAAC;gBAED,IAAI,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACvD,IAAI,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"capture-session.js","sourceRoot":"","sources":["../../src/shared/capture-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAE7F,OAAO,EACL,iCAAiC,EACjC,yBAAyB,EACzB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AA8E9B,MAAM,OAAO,8BAA8B;IAuBzC,YAAY,OAA8C;QAbzC,iBAAY,GAAG,0BAA0B,EAAE,CAAC;QAErD,YAAO,GAAG,KAAK,CAAC;QAGhB,qBAAgB,GAAkB,IAAI,CAAC;QACvC,oBAAe,GAAkB,IAAI,CAAC;QACtC,qBAAgB,GAAG,KAAK,CAAC;QACzB,0BAAqB,GAAG,CAAC,CAAC;QAC1B,uBAAkB,GAAkB,IAAI,CAAC;QACzC,qBAAgB,GAAG,CAAC,CAAC,CAAC;QACtB,sBAAiB,GAA6B,IAAI,CAAC;QAGzD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,yBAAyB,CAAC;QAChF,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,kBAAkB,CAAC;QACzE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAC7B,eAAe,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM;gBACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAC5B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAChC,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;SAC1D,CAAC,CAAC,CAAC;QAEJ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,uEAAuE;QACvE,kEAAkE;QAClE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;YACrB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAC7B,eAAe,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM;gBACnC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAC5B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAClE,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;SAC1D,CAAC,CAAC,CAAC;QAEJ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;IAChC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAEO,mBAAmB;QACzB,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,EAAE;YACnB,YAAY,EAAE,SAAS;YACvB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,OAMvB;QACC,OAAO;YACL,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC;YACjD,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;YAC5C,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;YAC9C,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI;SACvE,CAAC;IACJ,CAAC;IAEO,kBAAkB,CACxB,IAAU,EACV,aAAuC,EACvC,OAGC;QAED,OAAO;YACL,KAAK,EAAE,SAAS;YAChB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,OAAO,EAAE,eAAe;mBACpC,aAAa,EAAE,OAAO;mBACtB,8CAA8C;YACnD,YAAY,EAAE,OAAO,EAAE,YAAY;mBAC9B,CAAC,aAAa;oBACf,CAAC,CAAC,aAAa,CAAC,mBAAmB;wBACjC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,OAAO;oBACX,CAAC,CAAC,QAAQ,CAAC;YACf,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,aAAa;YACb,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,EAAE;YAChB,UAAU,EAAE,aAAa,EAAE,mBAAmB,KAAK,KAAK;YACxD,YAAY,EAAE,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,YAAoB;QAC5B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,YAAY;YAC7B,YAAY,EAAE,OAAO;YACrB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,YAAY;YACZ,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,KAAgC;QAC3C,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACxE,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC;QAClG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,EAAE,EAAE;gBACjE,KAAK,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,SAAiB;QAC7C,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjF,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAEvC,IAAI,CAAC;YACH,iEAAiE;YACjE,kEAAkE;YAClE,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAEzD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;YACjF,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;gBAAE,OAAO;YAEhE,IAAI,aAAa,CAAC,mBAAmB,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;oBACrC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;gBACtC,CAAC;gBAED,IAAI,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACvD,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;oBACzC,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC,YAAY,CAAC;oBACnD,IAAI,CAAC,iBAAiB,GAAG,aAAa,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;gBACrC,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAChC,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,yBAAyB,EACjE,CAAC,CACF,CAAC;gBAEF,IAAI,iBAAiB,IAAI,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;oBAC7B,eAAe,EAAE,2BAA2B,CAC1C,SAAS,EACT,IAAI,CAAC,kBAAkB,EACvB,aAAa,CACd;oBACD,YAAY,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBACvE,iBAAiB;oBACjB,aAAa;iBACd,CAAC,CAAC,CAAC;YACN,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;oBAC7B,eAAe,EAAE,aAAa,CAAC,OAAO;oBACtC,YAAY,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBACvE,aAAa;iBACd,CAAC,CAAC,CAAC;YACN,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;gBACzE,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;YACD,OAAO;QACT,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;QAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE;YACjD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE;YACjD,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO;QAChF,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,IAAI,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM;YAAE,OAAO;QAChF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE;YACrD,eAAe,EAAE,0BAA0B,CAAC,aAAa,CAAC;YAC1D,YAAY,EAAE,aAAa,EAAE,mBAAmB,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;SACjF,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;YAC7B,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,sBAAsB;YACjD,YAAY,EAAE,QAAQ;YACtB,cAAc,EAAE,0BAA0B;SAC3C,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,uBAAuB;QAC7B,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YAClC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACnD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC;IAC3C,CAAC;CACF;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAU;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACtC,OAAO,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|