@revideo/2d 0.2.1 → 0.2.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/code/CodeCursor.d.ts +74 -74
- package/lib/code/CodeCursor.js +286 -352
- package/lib/code/CodeDiffer.d.ts +16 -21
- package/lib/code/CodeDiffer.js +41 -39
- package/lib/code/CodeFragment.d.ts +8 -16
- package/lib/code/CodeFragment.js +36 -36
- package/lib/code/CodeHighlighter.d.ts +59 -59
- package/lib/code/CodeHighlighter.js +1 -1
- package/lib/code/CodeMetrics.d.ts +8 -12
- package/lib/code/CodeMetrics.js +24 -26
- package/lib/code/CodeRange.d.ts +5 -21
- package/lib/code/CodeRange.js +124 -131
- package/lib/code/CodeScope.d.ts +8 -18
- package/lib/code/CodeScope.js +61 -59
- package/lib/code/CodeSelection.d.ts +4 -9
- package/lib/code/CodeSelection.js +8 -8
- package/lib/code/CodeSignal.d.ts +47 -74
- package/lib/code/CodeSignal.js +189 -206
- package/lib/code/CodeTokenizer.d.ts +1 -1
- package/lib/code/CodeTokenizer.js +41 -41
- package/lib/code/DefaultHighlightStyle.d.ts +2 -2
- package/lib/code/DefaultHighlightStyle.js +96 -96
- package/lib/code/LezerHighlighter.d.ts +19 -21
- package/lib/code/LezerHighlighter.js +101 -101
- package/lib/code/diff.d.ts +9 -12
- package/lib/code/diff.js +205 -218
- package/lib/code/extractRange.d.ts +4 -7
- package/lib/code/extractRange.js +71 -79
- package/lib/code/index.d.ts +1 -1
- package/lib/code/index.js +1 -1
- package/lib/components/Audio.d.ts +11 -11
- package/lib/components/Audio.js +109 -115
- package/lib/components/Bezier.d.ts +18 -18
- package/lib/components/Bezier.js +75 -86
- package/lib/components/Circle.d.ts +90 -95
- package/lib/components/Circle.js +74 -85
- package/lib/components/Code.d.ts +211 -244
- package/lib/components/Code.js +269 -317
- package/lib/components/CodeBlock.d.ts +67 -109
- package/lib/components/CodeBlock.js +373 -414
- package/lib/components/CubicBezier.d.ts +36 -36
- package/lib/components/CubicBezier.js +49 -52
- package/lib/components/Curve.d.ts +198 -208
- package/lib/components/Curve.js +269 -270
- package/lib/components/Grid.d.ts +42 -47
- package/lib/components/Grid.js +56 -63
- package/lib/components/Icon.d.ts +50 -55
- package/lib/components/Icon.js +50 -58
- package/lib/components/Img.d.ts +79 -86
- package/lib/components/Img.js +181 -193
- package/lib/components/Knot.d.ts +78 -97
- package/lib/components/Knot.js +60 -81
- package/lib/components/Latex.d.ts +12 -12
- package/lib/components/Latex.js +65 -77
- package/lib/components/Layout.d.ts +413 -455
- package/lib/components/Layout.js +681 -666
- package/lib/components/Line.d.ts +49 -61
- package/lib/components/Line.js +193 -216
- package/lib/components/Media.d.ts +35 -35
- package/lib/components/Media.js +134 -135
- package/lib/components/Node.d.ts +830 -875
- package/lib/components/Node.js +1314 -1383
- package/lib/components/Path.d.ts +14 -35
- package/lib/components/Path.js +89 -100
- package/lib/components/Polygon.d.ts +55 -60
- package/lib/components/Polygon.js +66 -71
- package/lib/components/QuadBezier.d.ts +29 -29
- package/lib/components/QuadBezier.js +45 -50
- package/lib/components/Ray.d.ts +28 -28
- package/lib/components/Ray.js +64 -71
- package/lib/components/Rect.d.ts +108 -115
- package/lib/components/Rect.js +72 -78
- package/lib/components/SVG.d.ts +139 -165
- package/lib/components/SVG.js +541 -609
- package/lib/components/Shape.d.ts +35 -44
- package/lib/components/Shape.js +127 -112
- package/lib/components/Spline.d.ts +40 -46
- package/lib/components/Spline.js +175 -190
- package/lib/components/Txt.d.ts +44 -55
- package/lib/components/Txt.js +155 -156
- package/lib/components/TxtLeaf.d.ts +16 -20
- package/lib/components/TxtLeaf.js +158 -177
- package/lib/components/Video.d.ts +41 -41
- package/lib/components/Video.js +135 -138
- package/lib/components/View2D.d.ts +21 -21
- package/lib/components/View2D.js +85 -98
- package/lib/components/index.d.ts +1 -1
- package/lib/components/index.js +1 -1
- package/lib/components/types.d.ts +9 -22
- package/lib/components/types.js +1 -1
- package/lib/curves/ArcSegment.d.ts +24 -36
- package/lib/curves/ArcSegment.js +94 -145
- package/lib/curves/CircleSegment.d.ts +16 -26
- package/lib/curves/CircleSegment.js +49 -56
- package/lib/curves/CubicBezierSegment.d.ts +13 -18
- package/lib/curves/CubicBezierSegment.js +46 -79
- package/lib/curves/CurveDrawingInfo.d.ts +9 -9
- package/lib/curves/CurveDrawingInfo.js +1 -1
- package/lib/curves/CurvePoint.d.ts +13 -13
- package/lib/curves/CurvePoint.js +1 -1
- package/lib/curves/CurveProfile.d.ts +5 -5
- package/lib/curves/CurveProfile.js +1 -1
- package/lib/curves/KnotInfo.d.ts +8 -8
- package/lib/curves/KnotInfo.js +1 -1
- package/lib/curves/LineSegment.d.ts +14 -19
- package/lib/curves/LineSegment.js +42 -42
- package/lib/curves/Polynomial.d.ts +110 -110
- package/lib/curves/Polynomial.js +239 -249
- package/lib/curves/Polynomial2D.d.ts +20 -20
- package/lib/curves/Polynomial2D.js +42 -46
- package/lib/curves/PolynomialSegment.d.ts +37 -42
- package/lib/curves/PolynomialSegment.js +81 -83
- package/lib/curves/QuadBezierSegment.d.ts +12 -12
- package/lib/curves/QuadBezierSegment.js +41 -71
- package/lib/curves/Segment.d.ts +7 -12
- package/lib/curves/Segment.js +3 -2
- package/lib/curves/UniformPolynomialCurveSampler.d.ts +34 -34
- package/lib/curves/UniformPolynomialCurveSampler.js +62 -68
- package/lib/curves/createCurveProfileLerp.d.ts +6 -17
- package/lib/curves/createCurveProfileLerp.js +208 -211
- package/lib/curves/getBezierSplineProfile.d.ts +4 -8
- package/lib/curves/getBezierSplineProfile.js +101 -145
- package/lib/curves/getCircleProfile.d.ts +4 -10
- package/lib/curves/getCircleProfile.js +40 -72
- package/lib/curves/getPathProfile.d.ts +2 -2
- package/lib/curves/getPathProfile.js +112 -135
- package/lib/curves/getPointAtDistance.d.ts +4 -7
- package/lib/curves/getPointAtDistance.js +12 -12
- package/lib/curves/getPolylineProfile.d.ts +4 -8
- package/lib/curves/getPolylineProfile.js +54 -67
- package/lib/curves/getRectProfile.d.ts +4 -9
- package/lib/curves/getRectProfile.js +52 -117
- package/lib/curves/index.d.ts +1 -1
- package/lib/curves/index.js +1 -1
- package/lib/decorators/canvasStyleSignal.d.ts +3 -3
- package/lib/decorators/canvasStyleSignal.js +10 -10
- package/lib/decorators/colorSignal.d.ts +1 -1
- package/lib/decorators/colorSignal.js +7 -7
- package/lib/decorators/compound.d.ts +2 -4
- package/lib/decorators/compound.js +23 -43
- package/lib/decorators/computed.d.ts +1 -1
- package/lib/decorators/computed.js +9 -9
- package/lib/decorators/defaultStyle.d.ts +2 -5
- package/lib/decorators/defaultStyle.js +11 -11
- package/lib/decorators/filtersSignal.d.ts +8 -28
- package/lib/decorators/filtersSignal.js +64 -87
- package/lib/decorators/index.d.ts +1 -1
- package/lib/decorators/index.js +1 -1
- package/lib/decorators/initializers.d.ts +2 -5
- package/lib/decorators/initializers.js +19 -18
- package/lib/decorators/nodeName.d.ts +1 -1
- package/lib/decorators/nodeName.js +4 -4
- package/lib/decorators/signal.d.ts +20 -40
- package/lib/decorators/signal.js +104 -113
- package/lib/decorators/spacingSignal.d.ts +1 -1
- package/lib/decorators/spacingSignal.js +13 -13
- package/lib/decorators/vector2Signal.d.ts +7 -13
- package/lib/decorators/vector2Signal.js +13 -15
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -1
- package/lib/jsx-dev-runtime.d.ts +3 -3
- package/lib/jsx-dev-runtime.js +3 -3
- package/lib/jsx-runtime.d.ts +9 -19
- package/lib/jsx-runtime.js +18 -18
- package/lib/partials/Filter.d.ts +16 -24
- package/lib/partials/Filter.js +69 -69
- package/lib/partials/Gradient.d.ts +24 -30
- package/lib/partials/Gradient.js +58 -69
- package/lib/partials/Pattern.d.ts +9 -14
- package/lib/partials/Pattern.js +24 -30
- package/lib/partials/ShaderConfig.d.ts +74 -81
- package/lib/partials/ShaderConfig.js +23 -22
- package/lib/partials/index.d.ts +1 -1
- package/lib/partials/index.js +1 -1
- package/lib/partials/types.d.ts +6 -19
- package/lib/partials/types.js +1 -1
- package/lib/scenes/Scene2D.d.ts +23 -42
- package/lib/scenes/Scene2D.js +151 -161
- package/lib/scenes/index.d.ts +1 -1
- package/lib/scenes/index.js +1 -1
- package/lib/scenes/makeScene2D.d.ts +5 -7
- package/lib/scenes/makeScene2D.js +10 -10
- package/lib/scenes/useScene2D.d.ts +2 -2
- package/lib/scenes/useScene2D.js +3 -3
- package/lib/utils/CanvasUtils.d.ts +21 -93
- package/lib/utils/CanvasUtils.js +105 -186
- package/lib/utils/diff.d.ts +18 -25
- package/lib/utils/diff.js +87 -84
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +1 -1
- package/lib/utils/is.d.ts +2 -4
- package/lib/utils/is.js +2 -2
- package/lib/utils/makeSignalExtensions.d.ts +4 -11
- package/lib/utils/makeSignalExtensions.js +17 -17
- package/package.json +4 -4
- package/lib/components/AudioTest.d.ts +0 -99
- package/lib/components/AudioTest.d.ts.map +0 -1
- package/lib/components/AudioTest.js +0 -281
package/lib/utils/is.js
CHANGED
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* @param klass - The class to check against.
|
|
6
6
|
*/
|
|
7
7
|
export function is(klass) {
|
|
8
|
-
|
|
8
|
+
return (object) => object instanceof klass;
|
|
9
9
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzL2lzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEVBQUUsQ0FDaEIsS0FBZ0M7SUFFaEMsT0FBTyxDQUFDLE1BQU0sRUFBZSxFQUFFLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQztBQUMxRCxDQUFDIn0=
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzL2lzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLEVBQUUsQ0FDaEIsS0FBZ0M7SUFFaEMsT0FBTyxDQUFDLE1BQU0sRUFBZSxFQUFFLENBQUMsTUFBTSxZQUFZLEtBQUssQ0FBQztBQUMxRCxDQUFDIn0=
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
import {SignalExtensions} from '@revideo/core';
|
|
2
|
-
import {PropertyMetadata} from '../decorators';
|
|
3
|
-
export declare function makeSignalExtensions<
|
|
4
|
-
|
|
5
|
-
TValue extends TSetterValue,
|
|
6
|
-
>(
|
|
7
|
-
meta?: Partial<PropertyMetadata<TValue>>,
|
|
8
|
-
owner?: any,
|
|
9
|
-
name?: string,
|
|
10
|
-
): Partial<SignalExtensions<TSetterValue, TValue>>;
|
|
11
|
-
//# sourceMappingURL=makeSignalExtensions.d.ts.map
|
|
1
|
+
import { SignalExtensions } from '@revideo/core';
|
|
2
|
+
import { PropertyMetadata } from '../decorators';
|
|
3
|
+
export declare function makeSignalExtensions<TSetterValue, TValue extends TSetterValue>(meta?: Partial<PropertyMetadata<TValue>>, owner?: any, name?: string): Partial<SignalExtensions<TSetterValue, TValue>>;
|
|
4
|
+
//# sourceMappingURL=makeSignalExtensions.d.ts.map
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {capitalize} from '@revideo/core';
|
|
1
|
+
import { capitalize } from '@revideo/core';
|
|
2
2
|
export function makeSignalExtensions(meta = {}, owner, name) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
const extensions = {};
|
|
4
|
+
if (name && owner) {
|
|
5
|
+
const setter = meta.setter ?? owner?.[`set${capitalize(name)}`];
|
|
6
|
+
if (setter) {
|
|
7
|
+
extensions.setter = setter.bind(owner);
|
|
8
|
+
}
|
|
9
|
+
const getter = meta.getter ?? owner?.[`get${capitalize(name)}`];
|
|
10
|
+
if (getter) {
|
|
11
|
+
extensions.getter = getter.bind(owner);
|
|
12
|
+
}
|
|
13
|
+
const tweener = meta.tweener ?? owner?.[`tween${capitalize(name)}`];
|
|
14
|
+
if (tweener) {
|
|
15
|
+
extensions.tweener = tweener.bind(owner);
|
|
16
|
+
}
|
|
8
17
|
}
|
|
9
|
-
|
|
10
|
-
if (getter) {
|
|
11
|
-
extensions.getter = getter.bind(owner);
|
|
12
|
-
}
|
|
13
|
-
const tweener = meta.tweener ?? owner?.[`tween${capitalize(name)}`];
|
|
14
|
-
if (tweener) {
|
|
15
|
-
extensions.tweener = tweener.bind(owner);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return extensions;
|
|
18
|
+
return extensions;
|
|
19
19
|
}
|
|
20
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVNpZ25hbEV4dGVuc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzL21ha2VTaWduYWxFeHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRzNELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBMEMsRUFBRSxFQUM1QyxLQUFXLEVBQ1gsSUFBYTtJQUViLE1BQU0sVUFBVSxHQUFvRCxFQUFFLENBQUM7SUFFdkUsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLFVBQVUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLFVBQVUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQyxRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLFVBQVUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMifQ==
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFrZVNpZ25hbEV4dGVuc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzL21ha2VTaWduYWxFeHRlbnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRzNELE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBMEMsRUFBRSxFQUM1QyxLQUFXLEVBQ1gsSUFBYTtJQUViLE1BQU0sVUFBVSxHQUFvRCxFQUFFLENBQUM7SUFFdkUsSUFBSSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLFVBQVUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLEVBQUUsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEUsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLFVBQVUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQyxRQUFRLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLFVBQVUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revideo/2d",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "A 2D renderer for revideo",
|
|
5
5
|
"author": "revideo",
|
|
6
6
|
"homepage": "https://re.video/",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@preact/signals": "^1.2.1",
|
|
32
32
|
"@revideo/internal": "0.0.0",
|
|
33
|
-
"@revideo/ui": "^0.2.
|
|
33
|
+
"@revideo/ui": "^0.2.2",
|
|
34
34
|
"clsx": "^2.0.0",
|
|
35
35
|
"jsdom": "^22.1.0",
|
|
36
36
|
"preact": "^10.19.2",
|
|
@@ -40,10 +40,10 @@
|
|
|
40
40
|
"@codemirror/language": "^6.10.1",
|
|
41
41
|
"@lezer/common": "^1.2.1",
|
|
42
42
|
"@lezer/highlight": "^1.2.0",
|
|
43
|
-
"@revideo/core": "^0.2.
|
|
43
|
+
"@revideo/core": "^0.2.2",
|
|
44
44
|
"code-fns": "^0.8.2",
|
|
45
45
|
"mathjax-full": "^3.2.2",
|
|
46
46
|
"parse-svg-path": "^0.1.2"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "aed6717a2c1364b37c99315a099bab56d8017e99"
|
|
49
49
|
}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import {SerializedVector2, SignalValue, SimpleSignal} from '@revideo/core';
|
|
2
|
-
import {DesiredLength} from '../partials';
|
|
3
|
-
import {Rect, RectProps} from './Rect';
|
|
4
|
-
export interface AudioTestProps extends RectProps {
|
|
5
|
-
/**
|
|
6
|
-
* {@inheritDoc Video.src}
|
|
7
|
-
*/
|
|
8
|
-
src?: SignalValue<string>;
|
|
9
|
-
/**
|
|
10
|
-
* {@inheritDoc Video.alpha}
|
|
11
|
-
*/
|
|
12
|
-
alpha?: SignalValue<number>;
|
|
13
|
-
/**
|
|
14
|
-
* {@inheritDoc Video.smoothing}
|
|
15
|
-
*/
|
|
16
|
-
smoothing?: SignalValue<boolean>;
|
|
17
|
-
/**
|
|
18
|
-
* {@inheritDoc Video.loop}
|
|
19
|
-
*/
|
|
20
|
-
loop?: SignalValue<boolean>;
|
|
21
|
-
/**
|
|
22
|
-
* {@inheritDoc Video.playbackRate}
|
|
23
|
-
*/
|
|
24
|
-
playbackRate?: number;
|
|
25
|
-
/**
|
|
26
|
-
* The starting time for this video in seconds.
|
|
27
|
-
*/
|
|
28
|
-
time?: SignalValue<number>;
|
|
29
|
-
play?: boolean;
|
|
30
|
-
}
|
|
31
|
-
export declare class AudioTest extends Rect {
|
|
32
|
-
private static readonly pool;
|
|
33
|
-
/**
|
|
34
|
-
* The source of this video.
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* Using a local video:
|
|
38
|
-
* ```tsx
|
|
39
|
-
* import video from './example.mp4';
|
|
40
|
-
* // ...
|
|
41
|
-
* view.add(<Video src={video} />)
|
|
42
|
-
* ```
|
|
43
|
-
* Loading an image from the internet:
|
|
44
|
-
* ```tsx
|
|
45
|
-
* view.add(<Video src="https://example.com/video.mp4" />)
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
readonly src: SimpleSignal<string, this>;
|
|
49
|
-
/**
|
|
50
|
-
* The alpha value of this video.
|
|
51
|
-
*
|
|
52
|
-
* @remarks
|
|
53
|
-
* Unlike opacity, the alpha value affects only the video itself, leaving the
|
|
54
|
-
* fill, stroke, and children intact.
|
|
55
|
-
*/
|
|
56
|
-
readonly alpha: SimpleSignal<number, this>;
|
|
57
|
-
/**
|
|
58
|
-
* Whether the video should be smoothed.
|
|
59
|
-
*
|
|
60
|
-
* @remarks
|
|
61
|
-
* When disabled, the video will be scaled using the nearest neighbor
|
|
62
|
-
* interpolation with no smoothing. The resulting video will appear pixelated.
|
|
63
|
-
*
|
|
64
|
-
* @defaultValue true
|
|
65
|
-
*/
|
|
66
|
-
readonly smoothing: SimpleSignal<boolean, this>;
|
|
67
|
-
/**
|
|
68
|
-
* Whether this video should loop upon reaching the end.
|
|
69
|
-
*/
|
|
70
|
-
readonly loop: SimpleSignal<boolean, this>;
|
|
71
|
-
/**
|
|
72
|
-
* The rate at which the video plays, as multiples of the normal speed.
|
|
73
|
-
*
|
|
74
|
-
* @defaultValue 1
|
|
75
|
-
*/
|
|
76
|
-
readonly playbackRate: SimpleSignal<number, this>;
|
|
77
|
-
protected readonly time: SimpleSignal<number, this>;
|
|
78
|
-
protected readonly playing: SimpleSignal<boolean, this>;
|
|
79
|
-
private lastTime;
|
|
80
|
-
constructor({play, ...props}: AudioTestProps);
|
|
81
|
-
isPlaying(): boolean;
|
|
82
|
-
getCurrentTime(): number;
|
|
83
|
-
getDuration(): number;
|
|
84
|
-
protected desiredSize(): SerializedVector2<DesiredLength>;
|
|
85
|
-
completion(): number;
|
|
86
|
-
protected video(): HTMLAudioElement;
|
|
87
|
-
protected seekedVideo(): HTMLAudioElement;
|
|
88
|
-
protected fastSeekedVideo(): HTMLAudioElement;
|
|
89
|
-
protected draw(context: CanvasRenderingContext2D): void;
|
|
90
|
-
protected applyFlex(): void;
|
|
91
|
-
protected setCurrentTime(value: number): void;
|
|
92
|
-
protected setPlaybackRate(playbackRate: number): void;
|
|
93
|
-
play(): void;
|
|
94
|
-
pause(): void;
|
|
95
|
-
seek(time: number): void;
|
|
96
|
-
clampTime(time: number): number;
|
|
97
|
-
protected collectAsyncResources(): void;
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=AudioTest.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"AudioTest.d.ts","sourceRoot":"","sources":["../../src/lib/components/AudioTest.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,iBAAiB,EACjB,WAAW,EACX,YAAY,EAKb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAC,aAAa,EAAC,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAC,IAAI,EAAE,SAAS,EAAC,MAAM,QAAQ,CAAC;AAGvC,MAAM,WAAW,cAAe,SAAQ,SAAS;IAC/C;;OAEG;IACH,GAAG,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACjC;;OAEG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBACa,SAAU,SAAQ,IAAI;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAwC;IAEpE;;;;;;;;;;;;;;OAcG;IACH,SACwB,GAAG,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAExD;;;;;;OAMG;IACH,SAEwB,KAAK,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE1D;;;;;;;;OAQG;IACH,SAEwB,SAAS,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE/D;;OAEG;IACH,SAEwB,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE1D;;;;OAIG;IACH,SAEwB,YAAY,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEjE,mBAE2B,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE5D,mBAE2B,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAEhE,OAAO,CAAC,QAAQ,CAAM;gBAEH,EAAC,IAAI,EAAE,GAAG,KAAK,EAAC,EAAE,cAAc;IAO5C,SAAS,IAAI,OAAO;IAIpB,cAAc,IAAI,MAAM;IAIxB,WAAW,IAAI,MAAM;cAIT,WAAW,IAAI,iBAAiB,CAAC,aAAa,CAAC;IAclD,UAAU,IAAI,MAAM;IAMpC,SAAS,CAAC,KAAK,IAAI,gBAAgB;IAqCnC,SAAS,CAAC,WAAW,IAAI,gBAAgB;IAqBzC,SAAS,CAAC,eAAe,IAAI,gBAAgB;cAyC1B,IAAI,CAAC,OAAO,EAAE,wBAAwB;cAoCtC,SAAS;IAQ5B,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM;IA2BtC,SAAS,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM;IA2BvC,IAAI;IASJ,KAAK;IAML,IAAI,CAAC,IAAI,EAAE,MAAM;IAWjB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;cASnB,qBAAqB;CAIzC"}
|
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
var __decorate =
|
|
2
|
-
(this && this.__decorate) ||
|
|
3
|
-
function (decorators, target, key, desc) {
|
|
4
|
-
var c = arguments.length,
|
|
5
|
-
r =
|
|
6
|
-
c < 3
|
|
7
|
-
? target
|
|
8
|
-
: desc === null
|
|
9
|
-
? (desc = Object.getOwnPropertyDescriptor(target, key))
|
|
10
|
-
: desc,
|
|
11
|
-
d;
|
|
12
|
-
if (typeof Reflect === 'object' && typeof Reflect.decorate === 'function')
|
|
13
|
-
r = Reflect.decorate(decorators, target, key, desc);
|
|
14
|
-
else
|
|
15
|
-
for (var i = decorators.length - 1; i >= 0; i--)
|
|
16
|
-
if ((d = decorators[i]))
|
|
17
|
-
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
};
|
|
20
|
-
var AudioTest_1;
|
|
21
|
-
import {
|
|
22
|
-
BBox,
|
|
23
|
-
DependencyContext,
|
|
24
|
-
PlaybackState,
|
|
25
|
-
clamp,
|
|
26
|
-
isReactive,
|
|
27
|
-
useLogger,
|
|
28
|
-
useThread,
|
|
29
|
-
} from '@revideo/core';
|
|
30
|
-
import {computed, initial, nodeName, signal} from '../decorators';
|
|
31
|
-
import {Rect} from './Rect';
|
|
32
|
-
let AudioTest = (AudioTest_1 = class AudioTest extends Rect {
|
|
33
|
-
constructor({play, ...props}) {
|
|
34
|
-
super(props);
|
|
35
|
-
this.lastTime = -1;
|
|
36
|
-
if (play) {
|
|
37
|
-
this.play();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
isPlaying() {
|
|
41
|
-
return this.playing();
|
|
42
|
-
}
|
|
43
|
-
getCurrentTime() {
|
|
44
|
-
return this.clampTime(this.time());
|
|
45
|
-
}
|
|
46
|
-
getDuration() {
|
|
47
|
-
return this.video().duration;
|
|
48
|
-
}
|
|
49
|
-
desiredSize() {
|
|
50
|
-
const custom = super.desiredSize();
|
|
51
|
-
if (custom.x === null && custom.y === null) {
|
|
52
|
-
const image = this.video();
|
|
53
|
-
return {
|
|
54
|
-
x: 300,
|
|
55
|
-
y: 300,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
return custom;
|
|
59
|
-
}
|
|
60
|
-
completion() {
|
|
61
|
-
console.log('completion of video');
|
|
62
|
-
return this.clampTime(this.time()) / this.video().duration;
|
|
63
|
-
}
|
|
64
|
-
video() {
|
|
65
|
-
const src = this.src();
|
|
66
|
-
console.log('src video', src);
|
|
67
|
-
const key = `${this.key}/${src}`;
|
|
68
|
-
let video = AudioTest_1.pool[key];
|
|
69
|
-
if (!video) {
|
|
70
|
-
console.log('before creating video element');
|
|
71
|
-
video = document.createElement('video');
|
|
72
|
-
document.body.appendChild(video);
|
|
73
|
-
video.addEventListener('ended', () => {
|
|
74
|
-
console.log('Video ended, triggered by event listener haha');
|
|
75
|
-
this.playing(false); // Update the playing state
|
|
76
|
-
// Additional logic for when audio ends
|
|
77
|
-
});
|
|
78
|
-
console.log('after creating video element');
|
|
79
|
-
video.src = src;
|
|
80
|
-
AudioTest_1.pool[key] = video;
|
|
81
|
-
}
|
|
82
|
-
if (video.readyState < 2) {
|
|
83
|
-
DependencyContext.collectPromise(
|
|
84
|
-
new Promise(resolve => {
|
|
85
|
-
const listener = () => {
|
|
86
|
-
resolve();
|
|
87
|
-
video.removeEventListener('canplay', listener);
|
|
88
|
-
};
|
|
89
|
-
video.addEventListener('canplay', listener);
|
|
90
|
-
}),
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
return video;
|
|
94
|
-
}
|
|
95
|
-
seekedVideo() {
|
|
96
|
-
console.log('in seekedVideo');
|
|
97
|
-
const video = this.video();
|
|
98
|
-
const time = this.clampTime(this.time());
|
|
99
|
-
video.playbackRate = this.playbackRate();
|
|
100
|
-
if (!video.paused) {
|
|
101
|
-
video.pause();
|
|
102
|
-
}
|
|
103
|
-
if (this.lastTime === time) {
|
|
104
|
-
return video;
|
|
105
|
-
}
|
|
106
|
-
this.setCurrentTime(time);
|
|
107
|
-
return video;
|
|
108
|
-
}
|
|
109
|
-
fastSeekedVideo() {
|
|
110
|
-
const video = this.video();
|
|
111
|
-
const time = this.clampTime(this.time());
|
|
112
|
-
video.playbackRate = this.playbackRate();
|
|
113
|
-
if (this.lastTime === time) {
|
|
114
|
-
return video;
|
|
115
|
-
}
|
|
116
|
-
console.log(
|
|
117
|
-
'calculating if playing:',
|
|
118
|
-
this.playing(),
|
|
119
|
-
time < video.duration,
|
|
120
|
-
video.playbackRate,
|
|
121
|
-
);
|
|
122
|
-
console.log('time', time);
|
|
123
|
-
console.log('this.duration', video.duration);
|
|
124
|
-
if (time < video.duration) {
|
|
125
|
-
console.log("oh shit, we're over tiem!");
|
|
126
|
-
this.pause();
|
|
127
|
-
this.remove();
|
|
128
|
-
}
|
|
129
|
-
const playing =
|
|
130
|
-
this.playing() && time < video.duration && video.playbackRate > 0;
|
|
131
|
-
if (playing) {
|
|
132
|
-
if (video.paused) {
|
|
133
|
-
DependencyContext.collectPromise(video.play());
|
|
134
|
-
}
|
|
135
|
-
} else {
|
|
136
|
-
if (!video.paused) {
|
|
137
|
-
video.pause();
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
console.log('video difference', Math.abs(video.currentTime - time) > 0.3);
|
|
141
|
-
if (Math.abs(video.currentTime - time) > 0.3) {
|
|
142
|
-
this.setCurrentTime(time);
|
|
143
|
-
} else if (!playing) {
|
|
144
|
-
video.currentTime = time;
|
|
145
|
-
}
|
|
146
|
-
return video;
|
|
147
|
-
}
|
|
148
|
-
draw(context) {
|
|
149
|
-
console.log('drawing video');
|
|
150
|
-
this.drawShape(context);
|
|
151
|
-
const alpha = this.alpha();
|
|
152
|
-
if (alpha > 0) {
|
|
153
|
-
const playbackState = this.view().playbackState();
|
|
154
|
-
console.log('in video playbackState', playbackState);
|
|
155
|
-
const video =
|
|
156
|
-
playbackState === PlaybackState.Playing ||
|
|
157
|
-
playbackState === PlaybackState.Presenting
|
|
158
|
-
? this.fastSeekedVideo()
|
|
159
|
-
: this.seekedVideo();
|
|
160
|
-
console.log('in video video', video);
|
|
161
|
-
const box = BBox.fromSizeCentered(this.computedSize());
|
|
162
|
-
context.save();
|
|
163
|
-
context.clip(this.getPath());
|
|
164
|
-
if (alpha < 1) {
|
|
165
|
-
context.globalAlpha *= alpha;
|
|
166
|
-
}
|
|
167
|
-
context.imageSmoothingEnabled = this.smoothing();
|
|
168
|
-
//drawImage(context, video, box);
|
|
169
|
-
context.restore();
|
|
170
|
-
}
|
|
171
|
-
console.log('this.clip() video', this.clip());
|
|
172
|
-
if (this.clip()) {
|
|
173
|
-
context.clip(this.getPath());
|
|
174
|
-
}
|
|
175
|
-
this.drawChildren(context);
|
|
176
|
-
}
|
|
177
|
-
applyFlex() {
|
|
178
|
-
super.applyFlex();
|
|
179
|
-
const video = this.video();
|
|
180
|
-
this.element.style.aspectRatio = (this.ratio() ?? 300 / 300).toString();
|
|
181
|
-
}
|
|
182
|
-
setCurrentTime(value) {
|
|
183
|
-
console.log('setcurrenttime called on video with value', value);
|
|
184
|
-
const video = this.video();
|
|
185
|
-
console.log('setcurrenttime this.video', video);
|
|
186
|
-
console.log('setcurrenttime this.video.readyState', video.readyState);
|
|
187
|
-
if (video.readyState < 2) {
|
|
188
|
-
console.log('some fucking failure haha bruder');
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
video.currentTime = value;
|
|
192
|
-
this.lastTime = value;
|
|
193
|
-
if (video.seeking) {
|
|
194
|
-
DependencyContext.collectPromise(
|
|
195
|
-
new Promise(resolve => {
|
|
196
|
-
const listener = () => {
|
|
197
|
-
resolve();
|
|
198
|
-
video.removeEventListener('seeked', listener);
|
|
199
|
-
};
|
|
200
|
-
video.addEventListener('seeked', listener);
|
|
201
|
-
}),
|
|
202
|
-
);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
setPlaybackRate(playbackRate) {
|
|
206
|
-
let value;
|
|
207
|
-
if (isReactive(playbackRate)) {
|
|
208
|
-
value = playbackRate();
|
|
209
|
-
useLogger().warn({
|
|
210
|
-
message: 'Invalid value set as the playback rate',
|
|
211
|
-
remarks:
|
|
212
|
-
'<p>The <code>playbackRate</code> of a <code>Video</code> cannot be reactive.</p>\n<p>Make sure to use a concrete value and not a function:</p>\n<pre class="wrong"><code class="language-ts">video.<span class="hljs-title function_">playbackRate</span>(<span class="hljs-function">() =></span> <span class="hljs-number">7</span>);</code></pre><pre class="correct"><code class="language-ts">video.<span class="hljs-title function_">playbackRate</span>(<span class="hljs-number">7</span>);</code></pre><p>If you're using a signal, extract its value before passing it to the property:</p>\n<pre class="wrong"><code class="language-ts">video.<span class="hljs-title function_">playbackRate</span>(mySignal);</code></pre><pre class="correct"><code class="language-ts">video.<span class="hljs-title function_">playbackRate</span>(<span class="hljs-title function_">mySignal</span>());</code></pre>',
|
|
213
|
-
inspect: this.key,
|
|
214
|
-
stack: new Error().stack,
|
|
215
|
-
});
|
|
216
|
-
} else {
|
|
217
|
-
value = playbackRate;
|
|
218
|
-
}
|
|
219
|
-
this.playbackRate.context.setter(value);
|
|
220
|
-
if (this.playing()) {
|
|
221
|
-
if (value === 0) {
|
|
222
|
-
this.pause();
|
|
223
|
-
} else {
|
|
224
|
-
const time = useThread().time;
|
|
225
|
-
const start = time();
|
|
226
|
-
const offset = this.time();
|
|
227
|
-
this.time(() => this.clampTime(offset + (time() - start) * value));
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
play() {
|
|
232
|
-
const time = useThread().time;
|
|
233
|
-
const start = time();
|
|
234
|
-
const offset = this.time();
|
|
235
|
-
const playbackRate = this.playbackRate();
|
|
236
|
-
this.playing(true);
|
|
237
|
-
this.time(() => this.clampTime(offset + (time() - start) * playbackRate));
|
|
238
|
-
}
|
|
239
|
-
pause() {
|
|
240
|
-
this.playing(false);
|
|
241
|
-
this.time.save();
|
|
242
|
-
this.video().pause();
|
|
243
|
-
}
|
|
244
|
-
seek(time) {
|
|
245
|
-
console.log('seek called on video');
|
|
246
|
-
const playing = this.playing();
|
|
247
|
-
this.time(this.clampTime(time));
|
|
248
|
-
if (playing) {
|
|
249
|
-
this.play();
|
|
250
|
-
} else {
|
|
251
|
-
this.pause();
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
clampTime(time) {
|
|
255
|
-
const duration = this.video().duration;
|
|
256
|
-
if (this.loop()) {
|
|
257
|
-
time %= duration;
|
|
258
|
-
}
|
|
259
|
-
console.log(`in clamptime (VIDEO), calling clamp(0, ${duration}, ${time}`);
|
|
260
|
-
return clamp(0, duration, time);
|
|
261
|
-
}
|
|
262
|
-
collectAsyncResources() {
|
|
263
|
-
super.collectAsyncResources();
|
|
264
|
-
this.seekedVideo();
|
|
265
|
-
}
|
|
266
|
-
});
|
|
267
|
-
AudioTest.pool = {};
|
|
268
|
-
__decorate([signal()], AudioTest.prototype, 'src', void 0);
|
|
269
|
-
__decorate([initial(1), signal()], AudioTest.prototype, 'alpha', void 0);
|
|
270
|
-
__decorate([initial(true), signal()], AudioTest.prototype, 'smoothing', void 0);
|
|
271
|
-
__decorate([initial(false), signal()], AudioTest.prototype, 'loop', void 0);
|
|
272
|
-
__decorate([initial(1), signal()], AudioTest.prototype, 'playbackRate', void 0);
|
|
273
|
-
__decorate([initial(0), signal()], AudioTest.prototype, 'time', void 0);
|
|
274
|
-
__decorate([initial(false), signal()], AudioTest.prototype, 'playing', void 0);
|
|
275
|
-
__decorate([computed()], AudioTest.prototype, 'completion', null);
|
|
276
|
-
__decorate([computed()], AudioTest.prototype, 'video', null);
|
|
277
|
-
__decorate([computed()], AudioTest.prototype, 'seekedVideo', null);
|
|
278
|
-
__decorate([computed()], AudioTest.prototype, 'fastSeekedVideo', null);
|
|
279
|
-
AudioTest = AudioTest_1 = __decorate([nodeName('AudioTest')], AudioTest);
|
|
280
|
-
export {AudioTest};
|
|
281
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXVkaW9UZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL0F1ZGlvVGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsT0FBTyxFQUNILElBQUksRUFDSixpQkFBaUIsRUFDakIsYUFBYSxFQUliLEtBQUssRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHbEUsT0FBTyxFQUFDLElBQUksRUFBWSxNQUFNLFFBQVEsQ0FBQztBQWdDaEMsSUFBTSxTQUFTLGlCQUFmLE1BQU0sU0FBVSxTQUFRLElBQUk7SUF1RWpDLFlBQW1CLEVBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxFQUFpQjtRQUNqRCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFIUCxhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFJcEIsSUFBSSxJQUFJLEVBQUU7WUFDUixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDYjtJQUNILENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVNLGNBQWM7UUFDbkIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUMvQixDQUFDO0lBRWtCLFdBQVc7UUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25DLElBQUksTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFD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
|