@capacitor-community/camera-preview 2.1.0 → 3.1.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/README.md +14 -3
- package/android/build.gradle +15 -10
- package/android/src/androidTest/java/com/getcapacitor/android/ExampleInstrumentedTest.java +3 -3
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraActivity.java +835 -799
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CameraPreview.java +184 -173
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomSurfaceView.java +12 -14
- package/android/src/main/java/com/ahm/capacitor/camera/preview/CustomTextureView.java +16 -18
- package/android/src/main/java/com/ahm/capacitor/camera/preview/Preview.java +327 -323
- package/android/src/main/java/com/ahm/capacitor/camera/preview/TapGestureDetector.java +15 -14
- package/android/src/test/java/com/getcapacitor/ExampleUnitTest.java +4 -3
- package/dist/esm/definitions.d.ts +10 -8
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/web.d.ts +3 -3
- package/dist/esm/web.js +36 -25
- package/dist/esm/web.js.map +1 -1
- package/ios/Plugin/CameraController.swift +107 -129
- package/ios/Plugin/Plugin.swift +76 -90
- package/ios/PluginTests/PluginTests.swift +8 -8
- package/package.json +27 -2
|
@@ -3,21 +3,22 @@ package com.ahm.capacitor.camera.preview;
|
|
|
3
3
|
import android.view.GestureDetector;
|
|
4
4
|
import android.view.MotionEvent;
|
|
5
5
|
|
|
6
|
-
class TapGestureDetector extends GestureDetector.SimpleOnGestureListener{
|
|
7
|
-
private final String TAG = "TapGestureDetector";
|
|
6
|
+
class TapGestureDetector extends GestureDetector.SimpleOnGestureListener {
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
public boolean onDown(MotionEvent e) {
|
|
11
|
-
return false;
|
|
12
|
-
}
|
|
8
|
+
private final String TAG = "TapGestureDetector";
|
|
13
9
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
@Override
|
|
11
|
+
public boolean onDown(MotionEvent e) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
@Override
|
|
16
|
+
public boolean onSingleTapUp(MotionEvent e) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@Override
|
|
21
|
+
public boolean onSingleTapConfirmed(MotionEvent e) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
23
24
|
}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
package com.getcapacitor;
|
|
2
2
|
|
|
3
|
-
import org.junit.Test;
|
|
4
|
-
|
|
5
3
|
import static org.junit.Assert.*;
|
|
6
4
|
|
|
5
|
+
import org.junit.Test;
|
|
6
|
+
|
|
7
7
|
/**
|
|
8
8
|
* Example local unit test, which will execute on the development machine (host).
|
|
9
9
|
*
|
|
10
10
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
|
11
11
|
*/
|
|
12
12
|
public class ExampleUnitTest {
|
|
13
|
+
|
|
13
14
|
@Test
|
|
14
15
|
public void addition_isCorrect() throws Exception {
|
|
15
16
|
assertEquals(4, 2 + 2);
|
|
16
17
|
}
|
|
17
|
-
}
|
|
18
|
+
}
|
|
@@ -4,9 +4,9 @@ export interface CameraPreviewOptions {
|
|
|
4
4
|
parent?: string;
|
|
5
5
|
/** Class name to add to the video preview element (applicable to the web platform only) */
|
|
6
6
|
className?: string;
|
|
7
|
-
/** The preview width in pixels, default window.screen.width
|
|
7
|
+
/** The preview width in pixels, default window.screen.width */
|
|
8
8
|
width?: number;
|
|
9
|
-
/** The preview height in pixels, default window.screen.height
|
|
9
|
+
/** The preview height in pixels, default window.screen.height */
|
|
10
10
|
height?: number;
|
|
11
11
|
/** The x origin, default 0 (applicable to the android and ios platforms only) */
|
|
12
12
|
x?: number;
|
|
@@ -20,7 +20,7 @@ export interface CameraPreviewOptions {
|
|
|
20
20
|
rotateWhenOrientationChanged?: boolean;
|
|
21
21
|
/** Choose the camera to use 'front' or 'rear', default 'front' */
|
|
22
22
|
position?: CameraPosition | string;
|
|
23
|
-
/** Defaults to false - Capture images to a file and return
|
|
23
|
+
/** Defaults to false - Capture images to a file and return the file path instead of returning base64 encoded data */
|
|
24
24
|
storeToFile?: boolean;
|
|
25
25
|
/** Defaults to false - Android Only - Disable automatic rotation of the image, and let the browser deal with it (keep reading on how to achieve it) */
|
|
26
26
|
disableExifHeaderStripping?: boolean;
|
|
@@ -30,9 +30,9 @@ export interface CameraPreviewOptions {
|
|
|
30
30
|
disableAudio?: boolean;
|
|
31
31
|
/** Android Only - Locks device orientation when camera is showing. */
|
|
32
32
|
lockAndroidOrientation?: boolean;
|
|
33
|
-
/** Defaults to false - Android and Web only. Set if
|
|
33
|
+
/** Defaults to false - Android and Web only. Set if camera preview can change opacity. */
|
|
34
34
|
enableOpacity?: boolean;
|
|
35
|
-
/** Defaults to false - Android only. Set if
|
|
35
|
+
/** Defaults to false - Android only. Set if camera preview will support pinch to zoom. */
|
|
36
36
|
enableZoom?: boolean;
|
|
37
37
|
}
|
|
38
38
|
export interface CameraPreviewPictureOptions {
|
|
@@ -40,7 +40,9 @@ export interface CameraPreviewPictureOptions {
|
|
|
40
40
|
height?: number;
|
|
41
41
|
/** The picture width, optional, default 0 (Device default) */
|
|
42
42
|
width?: number;
|
|
43
|
-
/** The picture quality, 0 - 100, default 85
|
|
43
|
+
/** The picture quality, 0 - 100, default 85 on `iOS/Android`.
|
|
44
|
+
*
|
|
45
|
+
* If left undefined, the `web` implementation will export a PNG, otherwise a JPEG will be generated */
|
|
44
46
|
quality?: number;
|
|
45
47
|
}
|
|
46
48
|
export interface CameraSampleOptions {
|
|
@@ -66,7 +68,7 @@ export interface CameraPreviewPlugin {
|
|
|
66
68
|
}>;
|
|
67
69
|
setFlashMode(options: {
|
|
68
70
|
flashMode: CameraPreviewFlashMode | string;
|
|
69
|
-
}): void
|
|
70
|
-
flip(): void
|
|
71
|
+
}): Promise<void>;
|
|
72
|
+
flip(): Promise<void>;
|
|
71
73
|
setOpacity(options: CameraOpacityOptions): Promise<{}>;
|
|
72
74
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { registerPlugin } from '@capacitor/core';
|
|
2
2
|
const CameraPreview = registerPlugin('CameraPreview', {
|
|
3
|
-
web: () => import('./web').then(m => new m.CameraPreviewWeb()),
|
|
3
|
+
web: () => import('./web').then((m) => new m.CameraPreviewWeb()),
|
|
4
4
|
});
|
|
5
5
|
export * from './definitions';
|
|
6
6
|
export { CameraPreview };
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGjD,MAAM,aAAa,GAAG,cAAc,CAAsB,eAAe,EAAE;IACzE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,CAAC;CACjE,CAAC,CAAC;AAEH,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/esm/web.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { WebPlugin } from
|
|
2
|
-
import { CameraPreviewOptions, CameraPreviewPictureOptions, CameraPreviewPlugin, CameraPreviewFlashMode, CameraSampleOptions, CameraOpacityOptions } from
|
|
1
|
+
import { WebPlugin } from '@capacitor/core';
|
|
2
|
+
import { CameraPreviewOptions, CameraPreviewPictureOptions, CameraPreviewPlugin, CameraPreviewFlashMode, CameraSampleOptions, CameraOpacityOptions } from './definitions';
|
|
3
3
|
export declare class CameraPreviewWeb extends WebPlugin implements CameraPreviewPlugin {
|
|
4
4
|
/**
|
|
5
5
|
* track which camera is used based on start options
|
|
@@ -9,7 +9,7 @@ export declare class CameraPreviewWeb extends WebPlugin implements CameraPreview
|
|
|
9
9
|
constructor();
|
|
10
10
|
start(options: CameraPreviewOptions): Promise<{}>;
|
|
11
11
|
stop(): Promise<any>;
|
|
12
|
-
capture(
|
|
12
|
+
capture(options: CameraPreviewPictureOptions): Promise<any>;
|
|
13
13
|
captureSample(_options: CameraSampleOptions): Promise<any>;
|
|
14
14
|
getSupportedFlashModes(): Promise<{
|
|
15
15
|
result: CameraPreviewFlashMode[];
|
package/dist/esm/web.js
CHANGED
|
@@ -1,31 +1,34 @@
|
|
|
1
|
-
import { WebPlugin } from
|
|
1
|
+
import { WebPlugin } from '@capacitor/core';
|
|
2
2
|
export class CameraPreviewWeb extends WebPlugin {
|
|
3
3
|
constructor() {
|
|
4
4
|
super({
|
|
5
|
-
name:
|
|
6
|
-
platforms: [
|
|
5
|
+
name: 'CameraPreview',
|
|
6
|
+
platforms: ['web'],
|
|
7
7
|
});
|
|
8
8
|
}
|
|
9
9
|
async start(options) {
|
|
10
10
|
return new Promise(async (resolve, reject) => {
|
|
11
|
-
await navigator.mediaDevices
|
|
11
|
+
await navigator.mediaDevices
|
|
12
|
+
.getUserMedia({
|
|
12
13
|
audio: !options.disableAudio,
|
|
13
14
|
video: true
|
|
14
|
-
})
|
|
15
|
+
})
|
|
16
|
+
.then((stream) => {
|
|
15
17
|
// Stop any existing stream so we can request media with different constraints based on user input
|
|
16
18
|
stream.getTracks().forEach((track) => track.stop());
|
|
17
|
-
})
|
|
19
|
+
})
|
|
20
|
+
.catch((error) => {
|
|
18
21
|
reject(error);
|
|
19
22
|
});
|
|
20
|
-
const video = document.getElementById(
|
|
23
|
+
const video = document.getElementById('video');
|
|
21
24
|
const parent = document.getElementById(options.parent);
|
|
22
25
|
if (!video) {
|
|
23
|
-
const videoElement = document.createElement(
|
|
24
|
-
videoElement.id =
|
|
25
|
-
videoElement.setAttribute(
|
|
26
|
+
const videoElement = document.createElement('video');
|
|
27
|
+
videoElement.id = 'video';
|
|
28
|
+
videoElement.setAttribute('class', options.className || '');
|
|
26
29
|
// Don't flip video feed if camera is rear facing
|
|
27
30
|
if (options.position !== 'rear') {
|
|
28
|
-
videoElement.setAttribute(
|
|
31
|
+
videoElement.setAttribute('style', '-webkit-transform: scaleX(-1); transform: scaleX(-1);');
|
|
29
32
|
}
|
|
30
33
|
const userAgent = navigator.userAgent.toLowerCase();
|
|
31
34
|
const isSafari = userAgent.includes('safari') && !userAgent.includes('chrome');
|
|
@@ -40,10 +43,13 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
40
43
|
parent.appendChild(videoElement);
|
|
41
44
|
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
|
42
45
|
const constraints = {
|
|
43
|
-
video:
|
|
46
|
+
video: {
|
|
47
|
+
width: { ideal: options.width },
|
|
48
|
+
height: { ideal: options.height }
|
|
49
|
+
}
|
|
44
50
|
};
|
|
45
51
|
if (options.position === 'rear') {
|
|
46
|
-
constraints.video =
|
|
52
|
+
constraints.video.facingMode = 'environment';
|
|
47
53
|
this.isBackCamera = true;
|
|
48
54
|
}
|
|
49
55
|
else {
|
|
@@ -60,12 +66,12 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
60
66
|
}
|
|
61
67
|
}
|
|
62
68
|
else {
|
|
63
|
-
reject({ message:
|
|
69
|
+
reject({ message: 'camera already started' });
|
|
64
70
|
}
|
|
65
71
|
});
|
|
66
72
|
}
|
|
67
73
|
async stop() {
|
|
68
|
-
const video = document.getElementById(
|
|
74
|
+
const video = document.getElementById('video');
|
|
69
75
|
if (video) {
|
|
70
76
|
video.pause();
|
|
71
77
|
const st = video.srcObject;
|
|
@@ -77,12 +83,12 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
77
83
|
video.remove();
|
|
78
84
|
}
|
|
79
85
|
}
|
|
80
|
-
async capture(
|
|
86
|
+
async capture(options) {
|
|
81
87
|
return new Promise((resolve, _) => {
|
|
82
|
-
const video = document.getElementById(
|
|
83
|
-
const canvas = document.createElement(
|
|
88
|
+
const video = document.getElementById('video');
|
|
89
|
+
const canvas = document.createElement('canvas');
|
|
84
90
|
// video.width = video.offsetWidth;
|
|
85
|
-
const context = canvas.getContext(
|
|
91
|
+
const context = canvas.getContext('2d');
|
|
86
92
|
canvas.width = video.videoWidth;
|
|
87
93
|
canvas.height = video.videoHeight;
|
|
88
94
|
// flip horizontally back camera isn't used
|
|
@@ -91,10 +97,15 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
91
97
|
context.scale(-1, 1);
|
|
92
98
|
}
|
|
93
99
|
context.drawImage(video, 0, 0, video.videoWidth, video.videoHeight);
|
|
100
|
+
let base64EncodedImage;
|
|
101
|
+
if (options.quality != undefined) {
|
|
102
|
+
base64EncodedImage = canvas.toDataURL('image/jpeg', options.quality / 100.0).replace('data:image/jpeg;base64,', '');
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
base64EncodedImage = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
|
|
106
|
+
}
|
|
94
107
|
resolve({
|
|
95
|
-
value:
|
|
96
|
-
.toDataURL("image/png")
|
|
97
|
-
.replace("data:image/png;base64,", ""),
|
|
108
|
+
value: base64EncodedImage,
|
|
98
109
|
});
|
|
99
110
|
});
|
|
100
111
|
}
|
|
@@ -111,14 +122,14 @@ export class CameraPreviewWeb extends WebPlugin {
|
|
|
111
122
|
throw new Error('flip not supported under the web platform');
|
|
112
123
|
}
|
|
113
124
|
async setOpacity(_options) {
|
|
114
|
-
const video = document.getElementById(
|
|
125
|
+
const video = document.getElementById('video');
|
|
115
126
|
if (!!video && !!_options['opacity']) {
|
|
116
|
-
video.style.setProperty(
|
|
127
|
+
video.style.setProperty('opacity', _options['opacity'].toString());
|
|
117
128
|
}
|
|
118
129
|
}
|
|
119
130
|
}
|
|
120
131
|
const CameraPreview = new CameraPreviewWeb();
|
|
121
132
|
export { CameraPreview };
|
|
122
|
-
import { registerWebPlugin } from
|
|
133
|
+
import { registerWebPlugin } from '@capacitor/core';
|
|
123
134
|
registerWebPlugin(CameraPreview);
|
|
124
135
|
//# sourceMappingURL=web.js.map
|
package/dist/esm/web.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C,MAAM,OAAO,gBAAiB,SAAQ,SAAS;
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAU5C,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAO7C;QACE,KAAK,CAAC;YACJ,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,CAAC,KAAK,CAAC;SACnB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAA6B;QACvC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,SAAS,CAAC,YAAY;iBACzB,YAAY,CAAC;gBACZ,KAAK,EAAE,CAAC,OAAO,CAAC,YAAY;gBAC5B,KAAK,EAAE,IAAI;aACZ,CAAC;iBACD,IAAI,CAAC,CAAC,MAAmB,EAAE,EAAE;gBAC5B,kGAAkG;gBAClG,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEL,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEvD,IAAI,CAAC,KAAK,EAAE;gBACV,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBACrD,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC;gBAC1B,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAE5D,iDAAiD;gBACjD,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE;oBAC/B,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,uDAAuD,CAAC,CAAC;iBAC7F;gBAED,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;gBACpD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBAE/E,mHAAmH;gBACnH,4EAA4E;gBAC5E,uFAAuF;gBACvF,IAAI,QAAQ,EAAE;oBACZ,YAAY,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;oBAC9C,YAAY,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;oBAC3C,YAAY,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;iBAClD;gBAED,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;gBAEjC,IAAI,SAAS,CAAC,YAAY,IAAI,SAAS,CAAC,YAAY,CAAC,YAAY,EAAE;oBACjE,MAAM,WAAW,GAA2B;wBAC1C,KAAK,EAAE;4BACL,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;4BAC/B,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE;yBAClC;qBACF,CAAC;oBAEF,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE;wBAC9B,WAAW,CAAC,KAA+B,CAAC,UAAU,GAAG,aAAa,CAAC;wBACxE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;qBAC1B;yBAAM;wBACL,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;qBAC3B;oBAED,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,IAAI,CACnD,UAAU,MAAM;wBACd,iDAAiD;wBACjD,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC;wBAChC,YAAY,CAAC,IAAI,EAAE,CAAC;wBACpB,OAAO,CAAC,EAAE,CAAC,CAAC;oBACd,CAAC,EACD,CAAC,GAAG,EAAE,EAAE;wBACN,MAAM,CAAC,GAAG,CAAC,CAAC;oBACd,CAAC,CACF,CAAC;iBACH;aACF;iBAAM;gBACL,MAAM,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;aAC/C;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,KAAK,GAAqB,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;YAEd,MAAM,EAAE,GAAQ,KAAK,CAAC,SAAS,CAAC;YAChC,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;YAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtB,KAAK,CAAC,IAAI,EAAE,CAAC;aACd;YACD,KAAK,CAAC,MAAM,EAAE,CAAC;SAChB;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAoC;QAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;YAChC,MAAM,KAAK,GAAqB,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAEhD,mCAAmC;YAEnC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;YAChC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC;YAElC,2CAA2C;YAC3C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBACtB,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACvC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aACtB;YACD,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YAEpE,IAAI,kBAAkB,CAAC;YAEvB,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE;gBAChC,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;aACrH;iBAAM;gBACL,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;aAC1F;YAED,OAAO,CAAC;gBACN,KAAK,EAAE,kBAAkB;aAC1B,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAA6B;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,sBAAsB;QAG1B,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAwD;QACzE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAA8B;QAC7C,MAAM,KAAK,GAAqB,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACpC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;SACpE;IACH,CAAC;CACF;AAED,MAAM,aAAa,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,iBAAiB,CAAC,aAAa,CAAC,CAAC"}
|