@draftbit/core 54.0.4-11e01d.2 → 54.0.4-6c949a.2
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/lib/commonjs/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js +1 -1
- package/lib/commonjs/components/MediaPlayer/MediaPlaybackWrapper.js +1 -1
- package/lib/commonjs/components/MediaPlayer/MediaPlayerCommon.js +1 -1
- package/lib/commonjs/components/MediaPlayer/VideoPlayer/VideoPlayer.js +1 -1
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.d.ts +1 -3
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js +54 -69
- package/lib/typescript/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.d.ts +2 -3
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.js +21 -19
- package/lib/typescript/src/components/MediaPlayer/MediaPlaybackWrapper.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.d.ts +4 -5
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.js +26 -3
- package/lib/typescript/src/components/MediaPlayer/MediaPlayerCommon.js.map +1 -1
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.d.ts +4 -14
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.js +62 -125
- package/lib/typescript/src/components/MediaPlayer/VideoPlayer/VideoPlayer.js.map +1 -1
- package/lib/typescript/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -5
- package/src/components/MediaPlayer/AudioPlayer/HeadlessAudioPlayer.tsx +72 -84
- package/src/components/MediaPlayer/MediaPlaybackWrapper.tsx +24 -21
- package/src/components/MediaPlayer/MediaPlayerCommon.ts +34 -8
- package/src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx +86 -213
|
@@ -1,131 +1,83 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { setAudioModeAsync } from "expo-audio";
|
|
2
|
+
import { Platform } from "react-native";
|
|
3
|
+
import { Video as VideoPlayerComponent, ResizeMode as ExpoResizeMode, VideoFullscreenUpdate, Audio, } from "expo-av";
|
|
5
4
|
import { extractSizeStyles } from "../../../utilities";
|
|
6
5
|
import MediaPlaybackWrapper from "../MediaPlaybackWrapper";
|
|
7
|
-
import { normalizeBase64Source, useSourceDeepCompareEffect,
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
import { mapToMediaPlayerStatus, normalizeBase64Source, useSourceDeepCompareEffect, } from "../MediaPlayerCommon";
|
|
7
|
+
// Setting playsInSilentModeIOS prop directly on Video component is unreliable,
|
|
8
|
+
// so we need to set the audio mode globally before playing.
|
|
9
|
+
// See:
|
|
10
|
+
// https://github.com/expo/expo/issues/7485
|
|
11
|
+
// https://stackoverflow.com/questions/57371543/how-to-fix-video-play-but-dont-have-sound-on-ios-with-expo
|
|
12
|
+
const triggerAudio = async (ref) => {
|
|
13
|
+
if (ref && (ref === null || ref === void 0 ? void 0 : ref.current) && Platform.OS === "ios") {
|
|
14
|
+
await Audio.setAudioModeAsync({ playsInSilentModeIOS: true });
|
|
15
|
+
ref.current.play();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const VideoPlayer = React.forwardRef(({ style, resizeMode = "contain", posterResizeMode = "cover", onPlaybackStatusUpdate: onPlaybackStatusUpdateProp, onPlaybackFinish, source, playsInSilentModeIOS = false, ...rest }, ref) => {
|
|
19
|
+
const [videoMediaObject, setVideoMediaObject] = React.useState();
|
|
17
20
|
const [isPlaying, setIsPlaying] = React.useState(false);
|
|
18
21
|
const [isFullscreen, setIsFullscreen] = React.useState(false);
|
|
19
|
-
const [
|
|
22
|
+
const [currentSource, setCurrentSource] = React.useState();
|
|
20
23
|
const mediaPlaybackWrapperRef = React.useRef(null);
|
|
21
24
|
const sizeStyles = extractSizeStyles(style);
|
|
22
|
-
|
|
23
|
-
player.muted = isMuted;
|
|
24
|
-
}, [player, isMuted]);
|
|
25
|
-
React.useEffect(() => {
|
|
26
|
-
player.loop = isLooping;
|
|
27
|
-
}, [player, isLooping]);
|
|
28
|
-
React.useEffect(() => {
|
|
29
|
-
player.volume = volume;
|
|
30
|
-
}, [player, volume]);
|
|
31
|
-
React.useEffect(() => {
|
|
32
|
-
player.playbackRate = rate;
|
|
33
|
-
}, [player, rate]);
|
|
34
|
-
// Refs so statusChange can read latest shouldPlay/positionMillis
|
|
35
|
-
const shouldPlayRef = React.useRef(shouldPlay);
|
|
36
|
-
const positionMillisRef = React.useRef(positionMillis);
|
|
37
|
-
shouldPlayRef.current = shouldPlay;
|
|
38
|
-
positionMillisRef.current = positionMillis;
|
|
39
|
-
const hasAppliedInitialState = React.useRef(false);
|
|
40
|
-
React.useEffect(() => {
|
|
41
|
-
const timeUpdateSub = player.addListener("timeUpdate", (status) => {
|
|
42
|
-
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(mapToMediaPlayerStatus(status, player));
|
|
43
|
-
});
|
|
44
|
-
const playingChangeSub = player.addListener("playingChange", ({ isPlaying: playing }) => {
|
|
45
|
-
setIsPlaying(playing);
|
|
46
|
-
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(mapPlayerToMediaPlayerStatus(player));
|
|
47
|
-
});
|
|
48
|
-
const playToEndSub = player.addListener("playToEnd", () => {
|
|
49
|
-
onPlaybackFinish === null || onPlaybackFinish === void 0 ? void 0 : onPlaybackFinish();
|
|
50
|
-
});
|
|
51
|
-
const statusChangeSub = player.addListener("statusChange", ({ status, error }) => {
|
|
52
|
-
if (status === "readyToPlay") {
|
|
53
|
-
setShowPoster(false);
|
|
54
|
-
if (!hasAppliedInitialState.current) {
|
|
55
|
-
hasAppliedInitialState.current = true;
|
|
56
|
-
if (positionMillisRef.current) {
|
|
57
|
-
player.currentTime = positionMillisRef.current / 1000;
|
|
58
|
-
}
|
|
59
|
-
if (shouldPlayRef.current) {
|
|
60
|
-
player.play();
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const mappedStatus = mapPlayerToMediaPlayerStatus(player);
|
|
65
|
-
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(status === "error" && error
|
|
66
|
-
? { ...mappedStatus, isError: true, error: error.message }
|
|
67
|
-
: mappedStatus);
|
|
68
|
-
});
|
|
69
|
-
return () => {
|
|
70
|
-
timeUpdateSub.remove();
|
|
71
|
-
playingChangeSub.remove();
|
|
72
|
-
playToEndSub.remove();
|
|
73
|
-
statusChangeSub.remove();
|
|
74
|
-
};
|
|
75
|
-
}, []);
|
|
76
|
-
// Replace video source when it changes (deep comparison on URI to avoid unnecessary reloads)
|
|
77
|
-
const isFirstSourceRender = React.useRef(true);
|
|
78
|
-
useSourceDeepCompareEffect(() => {
|
|
79
|
-
if (isFirstSourceRender.current) {
|
|
80
|
-
isFirstSourceRender.current = false;
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
hasAppliedInitialState.current = false;
|
|
84
|
-
player.replace(normalizeBase64Source(source, "video"));
|
|
85
|
-
}, [source]);
|
|
86
|
-
let mappedVideoContentFit;
|
|
25
|
+
let mappedResizeMode;
|
|
87
26
|
switch (resizeMode) {
|
|
88
27
|
case "contain":
|
|
89
|
-
|
|
28
|
+
mappedResizeMode = ExpoResizeMode.CONTAIN;
|
|
90
29
|
break;
|
|
91
30
|
case "cover":
|
|
92
|
-
|
|
31
|
+
mappedResizeMode = ExpoResizeMode.COVER;
|
|
93
32
|
break;
|
|
94
33
|
case "stretch":
|
|
95
|
-
|
|
34
|
+
mappedResizeMode = ExpoResizeMode.STRETCH;
|
|
96
35
|
break;
|
|
97
36
|
}
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
37
|
+
const onPlaybackStatusUpdate = (status) => {
|
|
38
|
+
const mappedStatus = mapToMediaPlayerStatus(status);
|
|
39
|
+
onPlaybackStatusUpdateProp === null || onPlaybackStatusUpdateProp === void 0 ? void 0 : onPlaybackStatusUpdateProp(mappedStatus);
|
|
40
|
+
if (status.isLoaded) {
|
|
41
|
+
if (status.didJustFinish) {
|
|
42
|
+
onPlaybackFinish === null || onPlaybackFinish === void 0 ? void 0 : onPlaybackFinish();
|
|
43
|
+
}
|
|
44
|
+
setIsPlaying(status.isPlaying);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const onFullscreenUpdate = (fullscreenUpdate) => {
|
|
48
|
+
switch (fullscreenUpdate) {
|
|
49
|
+
case VideoFullscreenUpdate.PLAYER_DID_PRESENT:
|
|
50
|
+
case VideoFullscreenUpdate.PLAYER_WILL_PRESENT:
|
|
101
51
|
setIsFullscreen(true);
|
|
102
52
|
break;
|
|
103
|
-
case
|
|
53
|
+
case VideoFullscreenUpdate.PLAYER_DID_DISMISS:
|
|
54
|
+
case VideoFullscreenUpdate.PLAYER_WILL_DISMISS:
|
|
104
55
|
setIsFullscreen(false);
|
|
105
56
|
break;
|
|
106
57
|
}
|
|
107
58
|
};
|
|
108
59
|
const toggleFullscreen = React.useCallback(async () => {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
else {
|
|
115
|
-
await ((_b = videoPlayerRef.current) === null || _b === void 0 ? void 0 : _b.enterFullscreen());
|
|
116
|
-
}
|
|
60
|
+
if (isFullscreen) {
|
|
61
|
+
await (videoMediaObject === null || videoMediaObject === void 0 ? void 0 : videoMediaObject.dismissFullscreenPlayer());
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
await (videoMediaObject === null || videoMediaObject === void 0 ? void 0 : videoMediaObject.presentFullscreenPlayer());
|
|
117
65
|
}
|
|
118
|
-
}, [isFullscreen]);
|
|
66
|
+
}, [isFullscreen, videoMediaObject]);
|
|
119
67
|
const updateAudioMode = React.useCallback(async () => {
|
|
120
68
|
try {
|
|
121
|
-
await setAudioModeAsync({
|
|
122
|
-
|
|
69
|
+
await Audio.setAudioModeAsync({
|
|
70
|
+
playsInSilentModeIOS,
|
|
123
71
|
});
|
|
124
72
|
}
|
|
125
73
|
catch (e) {
|
|
126
74
|
console.error("Failed to set audio mode. Error details:", e);
|
|
127
75
|
}
|
|
128
76
|
}, [playsInSilentModeIOS]);
|
|
77
|
+
React.useEffect(() => {
|
|
78
|
+
if (isPlaying)
|
|
79
|
+
triggerAudio(mediaPlaybackWrapperRef);
|
|
80
|
+
}, [mediaPlaybackWrapperRef, isPlaying]);
|
|
129
81
|
React.useImperativeHandle(ref, () => {
|
|
130
82
|
var _a, _b, _c, _d;
|
|
131
83
|
return ({
|
|
@@ -139,34 +91,19 @@ const VideoPlayer = React.forwardRef(({ style, resizeMode = "contain", posterRes
|
|
|
139
91
|
// Include 'isPlaying' as dependency because 'togglePlayback' changes when it changes
|
|
140
92
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
141
93
|
[toggleFullscreen, isPlaying]);
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
94
|
+
useSourceDeepCompareEffect(() => {
|
|
95
|
+
const updateSource = async () => {
|
|
96
|
+
const finalSource = await normalizeBase64Source(source, "video");
|
|
97
|
+
setCurrentSource(finalSource);
|
|
98
|
+
};
|
|
99
|
+
updateSource();
|
|
100
|
+
}, [source]);
|
|
101
|
+
return (React.createElement(MediaPlaybackWrapper, { media: videoMediaObject, isPlaying: isPlaying, ref: mediaPlaybackWrapperRef, onTogglePlayback: updateAudioMode },
|
|
102
|
+
React.createElement(VideoPlayerComponent
|
|
103
|
+
// https://docs.expo.dev/versions/latest/sdk/av/#example-video to see why ref is handled this way
|
|
104
|
+
, {
|
|
105
|
+
// https://docs.expo.dev/versions/latest/sdk/av/#example-video to see why ref is handled this way
|
|
106
|
+
ref: (component) => setVideoMediaObject(component), style: style, videoStyle: sizeStyles, resizeMode: mappedResizeMode, posterStyle: [sizeStyles, { resizeMode: posterResizeMode }], onPlaybackStatusUpdate: onPlaybackStatusUpdate, onFullscreenUpdate: (e) => onFullscreenUpdate(e.fullscreenUpdate), source: currentSource, ...rest })));
|
|
152
107
|
});
|
|
153
|
-
function mapPlayerToMediaPlayerStatus(player) {
|
|
154
|
-
return {
|
|
155
|
-
isPlaying: player.playing,
|
|
156
|
-
isLoading: player.status === "loading",
|
|
157
|
-
isBuffering: player.status === "loading",
|
|
158
|
-
currentPositionMillis: player.currentTime * 1000,
|
|
159
|
-
durationMillis: player.duration * 1000,
|
|
160
|
-
bufferedDurationMillis: player.bufferedPosition * 1000,
|
|
161
|
-
isError: player.status === "error",
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
export function mapToMediaPlayerStatus(status, player) {
|
|
165
|
-
return {
|
|
166
|
-
...mapPlayerToMediaPlayerStatus(player),
|
|
167
|
-
currentPositionMillis: status.currentTime * 1000,
|
|
168
|
-
bufferedDurationMillis: status.bufferedPosition * 1000,
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
108
|
export default VideoPlayer;
|
|
172
109
|
//# sourceMappingURL=VideoPlayer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../../../../../src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,
|
|
1
|
+
{"version":3,"file":"VideoPlayer.js","sourceRoot":"","sources":["../../../../../../src/components/MediaPlayer/VideoPlayer/VideoPlayer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAmB,QAAQ,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,KAAK,IAAI,oBAAoB,EAE7B,UAAU,IAAI,cAAc,EAE5B,qBAAqB,EAErB,KAAK,GACN,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,oBAAoB,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,sBAAsB,CAAC;AAmB9B,+EAA+E;AAC/E,4DAA4D;AAC5D,OAAO;AACP,2CAA2C;AAC3C,0GAA0G;AAC1G,MAAM,YAAY,GAAG,KAAK,EAAE,GAA2C,EAAE,EAAE;IACzE,IAAI,GAAG,KAAI,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAA,IAAI,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACjD,MAAM,KAAK,CAAC,iBAAiB,CAAC,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAClC,CACE,EACE,KAAK,EACL,UAAU,GAAG,SAAS,EACtB,gBAAgB,GAAG,OAAO,EAC1B,sBAAsB,EAAE,0BAA0B,EAClD,gBAAgB,EAChB,MAAM,EACN,oBAAoB,GAAG,KAAK,EAC5B,GAAG,IAAI,EACR,EACD,GAAG,EACH,EAAE;IACF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAC3C,KAAK,CAAC,QAAQ,EAA+B,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GACrC,KAAK,CAAC,QAAQ,EAAoB,CAAC;IACrC,MAAM,uBAAuB,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEnE,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,gBAAgB,CAAC;IACrB,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC;YAC1C,MAAM;QACR,KAAK,OAAO;YACV,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC;YACxC,MAAM;QACR,KAAK,SAAS;YACZ,gBAAgB,GAAG,cAAc,CAAC,OAAO,CAAC;YAC1C,MAAM;IACV,CAAC;IAED,MAAM,sBAAsB,GAAG,CAAC,MAAwB,EAAE,EAAE;QAC1D,MAAM,YAAY,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACpD,0BAA0B,aAA1B,0BAA0B,uBAA1B,0BAA0B,CAAG,YAAY,CAAC,CAAC;QAE3C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBACzB,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,EAAI,CAAC;YACvB,CAAC;YACD,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,gBAAuC,EAAE,EAAE;QACrE,QAAQ,gBAAgB,EAAE,CAAC;YACzB,KAAK,qBAAqB,CAAC,kBAAkB,CAAC;YAC9C,KAAK,qBAAqB,CAAC,mBAAmB;gBAC5C,eAAe,CAAC,IAAI,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,qBAAqB,CAAC,kBAAkB,CAAC;YAC9C,KAAK,qBAAqB,CAAC,mBAAmB;gBAC5C,eAAe,CAAC,KAAK,CAAC,CAAC;gBACvB,MAAM;QACV,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACpD,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,uBAAuB,EAAE,CAAA,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,uBAAuB,EAAE,CAAA,CAAC;QACpD,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAErC,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QACnD,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,iBAAiB,CAAC;gBAC5B,oBAAoB;aACrB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3B,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,SAAS;YAAE,YAAY,CAAC,uBAAuB,CAAC,CAAC;IACvD,CAAC,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC,CAAC;IAEzC,KAAK,CAAC,mBAAmB,CACvB,GAAG,EACH,GAAG,EAAE;;QAAC,OAAA,CAAC;YACL,gBAAgB;YAChB,cAAc,EACZ,CAAA,MAAA,uBAAuB,CAAC,OAAO,0CAAE,cAAc,KAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC/D,cAAc,EACZ,CAAA,MAAA,uBAAuB,CAAC,OAAO,0CAAE,cAAc,KAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC/D,KAAK,EAAE,CAAA,MAAA,uBAAuB,CAAC,OAAO,0CAAE,KAAK,KAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC3D,IAAI,EAAE,CAAA,MAAA,uBAAuB,CAAC,OAAO,0CAAE,IAAI,KAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;SAC1D,CAAC,CAAA;KAAA;IACF,qFAAqF;IACrF,uDAAuD;IACvD,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAC9B,CAAC;IAEF,0BAA0B,CAAC,GAAG,EAAE;QAC9B,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;YAC9B,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACjE,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAChC,CAAC,CAAC;QACF,YAAY,EAAE,CAAC;IACjB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,CACL,oBAAC,oBAAoB,IACnB,KAAK,EAAE,gBAAwC,EAC/C,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,uBAAuB,EAC5B,gBAAgB,EAAE,eAAe;QAEjC,oBAAC,oBAAoB;QACnB,iGAAiG;;YAAjG,iGAAiG;YACjG,GAAG,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,mBAAmB,CAAC,SAAS,CAAC,EAClD,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,gBAAgB,EAC5B,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,EAC3D,sBAAsB,EAAE,sBAAsB,EAC9C,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,EACjE,MAAM,EAAE,aAAa,KACjB,IAAI,GACR,CACmB,CACxB,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,WAAW,CAAC"}
|