diff --git a/Lottie.xcodeproj/project.pbxproj b/Lottie.xcodeproj/project.pbxproj index a2be98863c..1a12392a3e 100644 --- a/Lottie.xcodeproj/project.pbxproj +++ b/Lottie.xcodeproj/project.pbxproj @@ -331,6 +331,10 @@ 0887347C28F0CCDD00458627 /* LottieAnimationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0887347428F0CCDD00458627 /* LottieAnimationView.swift */; }; 0887347D28F0CCDD00458627 /* LottieAnimationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0887347428F0CCDD00458627 /* LottieAnimationView.swift */; }; 089C50C22ABA0C6D007903D3 /* LoggingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089C50C12ABA0C6D007903D3 /* LoggingTests.swift */; }; + 089E5D9F2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089E5D9E2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift */; }; + 089E5DA02B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089E5D9E2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift */; }; + 089E5DA12B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089E5D9E2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift */; }; + 089E5DA22B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089E5D9E2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift */; }; 08AB05552A61C20400DE86FD /* ReducedMotionOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08AB05542A61C20400DE86FD /* ReducedMotionOption.swift */; }; 08AB05562A61C20400DE86FD /* ReducedMotionOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08AB05542A61C20400DE86FD /* ReducedMotionOption.swift */; }; 08AB05572A61C20400DE86FD /* ReducedMotionOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08AB05542A61C20400DE86FD /* ReducedMotionOption.swift */; }; @@ -1186,6 +1190,7 @@ 0887347328F0CCDD00458627 /* LottieAnimationViewInitializers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LottieAnimationViewInitializers.swift; sourceTree = ""; }; 0887347428F0CCDD00458627 /* LottieAnimationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LottieAnimationView.swift; sourceTree = ""; }; 089C50C12ABA0C6D007903D3 /* LoggingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingTests.swift; sourceTree = ""; }; + 089E5D9E2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Keyframes+timeRemapping.swift"; sourceTree = ""; }; 08AB05542A61C20400DE86FD /* ReducedMotionOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReducedMotionOption.swift; sourceTree = ""; }; 08AB05582A61C5B700DE86FD /* DecodingStrategy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DecodingStrategy.swift; sourceTree = ""; }; 08AB055C2A61C5CC00DE86FD /* RenderingEngineOption.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenderingEngineOption.swift; sourceTree = ""; }; @@ -2145,6 +2150,7 @@ 2E9C95AA2822F43100677516 /* CALayer+fillBounds.swift */, 2E9C95AB2822F43100677516 /* Keyframes+combined.swift */, 2E9C95AC2822F43100677516 /* KeyframeGroup+exactlyOneKeyframe.swift */, + 089E5D9E2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift */, ); path = Extensions; sourceTree = ""; @@ -2942,6 +2948,7 @@ 080DEFB12A9570FE00BE2D96 /* WillDisplayProviding.swift in Sources */, 080DEFE82A95711E00BE2D96 /* ImageLayer.swift in Sources */, 080DF0672A95717600BE2D96 /* AnimatorNodeDebugging.swift in Sources */, + 089E5DA22B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */, 080DEFAC2A9570FE00BE2D96 /* StyleIDProviding.swift in Sources */, 080DF0002A95712400BE2D96 /* CombinedShapeAnimation.swift in Sources */, 080DEFD42A95711400BE2D96 /* Archive+Helpers.swift in Sources */, @@ -3004,6 +3011,7 @@ 0887346F28F0CBDE00458627 /* LottieAnimation.swift in Sources */, 08C002002A46150D00AB54BA /* Data+CompressionDeprecated.swift in Sources */, 0820D5B82A8BF159007D705C /* DropShadowStyle.swift in Sources */, + 089E5D9F2B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */, 2E9C97412822F43100677516 /* TestHelpers.swift in Sources */, 08EF21DC289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */, 2E9C96152822F43100677516 /* Transform.swift in Sources */, @@ -3318,6 +3326,7 @@ 2E9C966D2822F43100677516 /* LayerImageProvider.swift in Sources */, 2EAF5ABD27A0798700E00531 /* FilepathImageProvider.swift in Sources */, 2EAF5AEA27A0798700E00531 /* AnimationTextProvider.swift in Sources */, + 089E5DA02B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */, 08E206FE2A56014E002DCE17 /* Diffable.swift in Sources */, 2E9C96672822F43100677516 /* LayerTransformNode.swift in Sources */, 0887347028F0CBDE00458627 /* LottieAnimation.swift in Sources */, @@ -3606,6 +3615,7 @@ 0887347128F0CBDE00458627 /* LottieAnimation.swift in Sources */, 2E9C97432822F43100677516 /* TestHelpers.swift in Sources */, 0820D5BA2A8BF159007D705C /* DropShadowStyle.swift in Sources */, + 089E5DA12B4CCD3F00F4F836 /* Keyframes+timeRemapping.swift in Sources */, 08EF21DE289C643B0097EA47 /* KeyframeInterpolator.swift in Sources */, 2E9C96172822F43100677516 /* Transform.swift in Sources */, 2E9C97492822F43100677516 /* CGFloatExtensions.swift in Sources */, diff --git a/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift b/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift index 50711038c7..35dd69dfb4 100644 --- a/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift +++ b/Sources/Private/CoreAnimation/Animations/CALayer+addAnimation.swift @@ -10,7 +10,7 @@ extension CALayer { /// Constructs a `CAKeyframeAnimation` that reflects the given keyframes, /// and adds it to this `CALayer`. @nonobjc - func addAnimation( + func addAnimation( for property: LayerProperty, keyframes: KeyframeGroup, value keyframeValueMapping: (KeyframeValue) throws -> ValueRepresentation, @@ -39,7 +39,7 @@ extension CALayer { /// - If the value can be applied directly to the CALayer using KVC, /// then no `CAAnimation` will be created and the value will be applied directly. @nonobjc - private func defaultAnimation( + private func defaultAnimation( for property: LayerProperty, keyframes keyframeGroup: KeyframeGroup, value keyframeValueMapping: (KeyframeValue) throws -> ValueRepresentation, @@ -61,9 +61,9 @@ extension CALayer { """) } - // If there is exactly one keyframe value, we can improve performance - // by applying that value directly to the layer instead of creating - // a relatively expensive `CAKeyframeAnimation`. + // If there is exactly one keyframe value that doesn't animate, + // we can improve performance by applying that value directly to the layer + // instead of creating a relatively expensive `CAKeyframeAnimation`. if keyframes.count == 1 { return singleKeyframeAnimation( for: property, @@ -71,6 +71,16 @@ extension CALayer { writeDirectlyToPropertyIfPossible: true) } + /// If we're required to use the `complexTimeRemapping` from some parent `PreCompLayer`, + /// we have to manually interpolate the keyframes with the time remapping applied. + if context.mustUseComplexTimeRemapping { + return try defaultAnimation( + for: property, + keyframes: Keyframes.manuallyInterpolatedWithTimeRemapping(keyframeGroup, context: context), + value: keyframeValueMapping, + context: context.withoutTimeRemapping()) + } + // Split the keyframes into segments with the same `CAAnimationCalculationMode` value // - Each of these segments will become their own `CAKeyframeAnimation` let animationSegments = keyframes.segmentsSplitByCalculationMode() @@ -179,8 +189,8 @@ extension CALayer { // all of which have a non-zero number of keyframes. let segmentAnimations: [CAKeyframeAnimation] = try animationSegments.indices.map { index in let animationSegment = animationSegments[index] - var segmentStartTime = context.time(for: animationSegment.first!.time) - var segmentEndTime = context.time(for: animationSegment.last!.time) + var segmentStartTime = try context.time(forFrame: animationSegment.first!.time) + var segmentEndTime = try context.time(forFrame: animationSegment.last!.time) // Every portion of the animation timeline has to be covered by a `CAKeyframeAnimation`, // so if this is the first or last segment then the start/end time should be exactly @@ -190,13 +200,13 @@ extension CALayer { if isFirstSegment { segmentStartTime = min( - context.time(for: context.animation.startFrame), + try context.time(forFrame: context.animation.startFrame), segmentStartTime) } if isLastSegment { segmentEndTime = max( - context.time(for: context.animation.endFrame), + try context.time(forFrame: context.animation.endFrame), segmentEndTime) } @@ -206,8 +216,8 @@ extension CALayer { // relative to 0 (`segmentStartTime`) and 1 (`segmentEndTime`). This is different // from the default behavior of the `keyframeAnimation` method, where times // are expressed relative to the entire animation duration. - let customKeyTimes = animationSegment.map { keyframeModel -> NSNumber in - let keyframeTime = context.time(for: keyframeModel.time) + let customKeyTimes = try animationSegment.map { keyframeModel -> NSNumber in + let keyframeTime = try context.time(forFrame: keyframeModel.time) let segmentProgressTime = ((keyframeTime - segmentStartTime) / segmentDuration) return segmentProgressTime as NSNumber } @@ -241,8 +251,8 @@ extension CALayer { { // Convert the list of `Keyframe` into // the representation used by `CAKeyframeAnimation` - var keyTimes = customKeyTimes ?? keyframes.map { keyframeModel -> NSNumber in - NSNumber(value: Float(context.progressTime(for: keyframeModel.time))) + var keyTimes = try customKeyTimes ?? keyframes.map { keyframeModel -> NSNumber in + NSNumber(value: Float(try context.progressTime(for: keyframeModel.time))) } var timingFunctions = timingFunctions(for: keyframes) diff --git a/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift b/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift index dfeb8afdc7..2171eda517 100644 --- a/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift +++ b/Sources/Private/CoreAnimation/Animations/CustomPathAnimation.swift @@ -53,7 +53,7 @@ extension CGPath { // MARK: - BezierPathKeyframe /// Data that represents how to render a bezier path at a specific point in time -struct BezierPathKeyframe { +struct BezierPathKeyframe: Interpolatable { let path: BezierPath let cornerRadius: LottieVector1D? @@ -77,4 +77,10 @@ struct BezierPathKeyframe { path, cornerRadius, makeCombinedResult: BezierPathKeyframe.init) } + + func interpolate(to: BezierPathKeyframe, amount: CGFloat) -> BezierPathKeyframe { + BezierPathKeyframe( + path: path.interpolate(to: to.path, amount: amount), + cornerRadius: cornerRadius.interpolate(to: to.cornerRadius, amount: amount)) + } } diff --git a/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift b/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift index a514cbb6f0..df3d148d48 100644 --- a/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift +++ b/Sources/Private/CoreAnimation/Animations/EllipseAnimation.swift @@ -29,9 +29,15 @@ extension CAShapeLayer { extension Ellipse { /// Data that represents how to render an ellipse at a specific point in time - struct Keyframe { + struct Keyframe: Interpolatable { let size: LottieVector3D let position: LottieVector3D + + func interpolate(to: Ellipse.Keyframe, amount: CGFloat) -> Ellipse.Keyframe { + Keyframe( + size: size.interpolate(to: to.size, amount: amount), + position: position.interpolate(to: to.position, amount: amount)) + } } /// Creates a single array of animatable keyframes from the separate arrays of keyframes in this Ellipse diff --git a/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift b/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift index 75b43a4099..17ebf274d0 100644 --- a/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift +++ b/Sources/Private/CoreAnimation/Animations/GradientAnimations.swift @@ -114,7 +114,7 @@ extension GradientRenderLayer { let combinedKeyframes = Keyframes.combined( gradient.startPoint, gradient.endPoint, - makeCombinedResult: { absoluteStartPoint, absoluteEndPoint -> (startPoint: CGPoint, endPoint: CGPoint) in + makeCombinedResult: { absoluteStartPoint, absoluteEndPoint -> RadialGradientKeyframes in // Convert the absolute start / end points to the relative structure used by Core Animation let relativeStartPoint = percentBasedPointInBounds(from: absoluteStartPoint.pointValue) let radius = absoluteStartPoint.pointValue.distanceTo(absoluteEndPoint.pointValue) @@ -123,7 +123,7 @@ extension GradientRenderLayer { x: absoluteStartPoint.x + radius, y: absoluteStartPoint.y + radius)) - return (startPoint: relativeStartPoint, endPoint: relativeEndPoint) + return RadialGradientKeyframes(startPoint: relativeStartPoint, endPoint: relativeEndPoint) }) try addAnimation( @@ -140,6 +140,19 @@ extension GradientRenderLayer { } } +// MARK: - RadialGradientKeyframes + +private struct RadialGradientKeyframes: Interpolatable { + let startPoint: CGPoint + let endPoint: CGPoint + + func interpolate(to: RadialGradientKeyframes, amount: CGFloat) -> RadialGradientKeyframes { + RadialGradientKeyframes( + startPoint: startPoint.interpolate(to: to.startPoint, amount: amount), + endPoint: endPoint.interpolate(to: to.endPoint, amount: amount)) + } +} + // MARK: - GradientContentType /// Each type of gradient that can be constructed from a `GradientShapeItem` diff --git a/Sources/Private/CoreAnimation/Animations/LayerProperty.swift b/Sources/Private/CoreAnimation/Animations/LayerProperty.swift index 71a3453b70..b3fd3ad1bc 100644 --- a/Sources/Private/CoreAnimation/Animations/LayerProperty.swift +++ b/Sources/Private/CoreAnimation/Animations/LayerProperty.swift @@ -165,6 +165,13 @@ extension LayerProperty { customizableProperty: .opacity) } + static var isHidden: LayerProperty { + .init( + caLayerKeypath: #keyPath(CALayer.isHidden), + defaultValue: false, + customizableProperty: nil /* unsupported */ ) + } + static var transform: LayerProperty { .init( caLayerKeypath: #keyPath(CALayer.transform), diff --git a/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift b/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift index 41147b414a..8c617a67eb 100644 --- a/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift +++ b/Sources/Private/CoreAnimation/Animations/RectangleAnimation.swift @@ -31,10 +31,17 @@ extension CAShapeLayer { extension Rectangle { /// Data that represents how to render a rectangle at a specific point in time - struct Keyframe { + struct Keyframe: Interpolatable { let size: LottieVector3D let position: LottieVector3D let cornerRadius: LottieVector1D + + func interpolate(to: Rectangle.Keyframe, amount: CGFloat) -> Rectangle.Keyframe { + Rectangle.Keyframe( + size: size.interpolate(to: to.size, amount: amount), + position: position.interpolate(to: to.position, amount: amount), + cornerRadius: cornerRadius.interpolate(to: to.cornerRadius, amount: amount)) + } } /// Creates a single array of animatable keyframes from the separate arrays of keyframes in this Rectangle diff --git a/Sources/Private/CoreAnimation/Animations/StarAnimation.swift b/Sources/Private/CoreAnimation/Animations/StarAnimation.swift index 44a47cdde6..62a762111b 100644 --- a/Sources/Private/CoreAnimation/Animations/StarAnimation.swift +++ b/Sources/Private/CoreAnimation/Animations/StarAnimation.swift @@ -80,7 +80,7 @@ extension CAShapeLayer { extension Star { /// Data that represents how to render a star at a specific point in time - struct Keyframe { + struct Keyframe: Interpolatable { let position: LottieVector3D let outerRadius: LottieVector1D let innerRadius: LottieVector1D @@ -88,6 +88,17 @@ extension Star { let innerRoundness: LottieVector1D let points: LottieVector1D let rotation: LottieVector1D + + func interpolate(to: Star.Keyframe, amount: CGFloat) -> Star.Keyframe { + Star.Keyframe( + position: position.interpolate(to: to.position, amount: amount), + outerRadius: outerRadius.interpolate(to: to.outerRadius, amount: amount), + innerRadius: innerRadius.interpolate(to: to.innerRadius, amount: amount), + outerRoundness: outerRoundness.interpolate(to: to.outerRoundness, amount: amount), + innerRoundness: innerRoundness.interpolate(to: to.innerRoundness, amount: amount), + points: points.interpolate(to: to.points, amount: amount), + rotation: rotation.interpolate(to: to.rotation, amount: amount)) + } } /// Creates a single array of animatable keyframes from the separate arrays of keyframes in this star/polygon diff --git a/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift b/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift index 178cc4ca28..b9f69d605c 100644 --- a/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift +++ b/Sources/Private/CoreAnimation/Animations/TransformAnimations.swift @@ -253,10 +253,16 @@ extension CALayer { context: LayerAnimationContext) throws { - // Core Animation doesn't animate skew changes properly. If the skew value - // changes over the course of the animation then we have to manually - // compute the `CATransform3D` for each frame individually. - let requiresManualInterpolation = transformModel.hasSkewAnimation + let requiresManualInterpolation = + // Core Animation doesn't animate skew changes properly. If the skew value + // changes over the course of the animation then we have to manually + // compute the `CATransform3D` for each frame individually. + transformModel.hasSkewAnimation + // `addAnimation` requires that we use an `Interpolatable` value, but we can't interpolate a `CATransform3D`. + // Since this is only necessary when using `complexTimeRemapping`, we can avoid this by manually interpolating + // when `context.mustUseComplexTimeRemapping` is true and just returning a `Hold` container. + // Since our keyframes are already manually interpolated, they won't need to be interpolated again. + || context.mustUseComplexTimeRemapping let combinedTransformKeyframes = Keyframes.combined( transformModel.anchorPoint, @@ -272,7 +278,7 @@ extension CALayer { requiresManualInterpolation: requiresManualInterpolation, makeCombinedResult: { anchor, position, positionX, positionY, scale, rotationX, rotationY, rotationZ, skew, skewAxis - -> CATransform3D in + -> Hold in let transformPosition: CGPoint if transformModel._positionX != nil, transformModel._positionY != nil { @@ -281,7 +287,7 @@ extension CALayer { transformPosition = position.pointValue } - return CATransform3D.makeTransform( + let transform = CATransform3D.makeTransform( anchor: anchor.pointValue, position: transformPosition, scale: scale.sizeValue, @@ -290,12 +296,14 @@ extension CALayer { rotationZ: rotationZ.cgFloatValue, skew: skew.cgFloatValue, skewAxis: skewAxis.cgFloatValue) + + return Hold(value: transform) }) try addAnimation( for: .transform, keyframes: combinedTransformKeyframes, - value: { $0 }, + value: { $0.value }, context: context) } diff --git a/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift b/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift index 0011a015e9..7d6c4b71ea 100644 --- a/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift +++ b/Sources/Private/CoreAnimation/Animations/VisibilityAnimation.swift @@ -10,32 +10,54 @@ extension CALayer { inFrame: AnimationFrameTime, outFrame: AnimationFrameTime, context: LayerAnimationContext) + throws { - let animation = CAKeyframeAnimation(keyPath: #keyPath(isHidden)) - animation.calculationMode = .discrete + /// If this layer uses `complexTimeRemapping`, use the `addAnimation` codepath + /// which uses `Keyframes.manuallyInterpolatedWithTimeRemapping`. + if context.mustUseComplexTimeRemapping { + let isHiddenKeyframes = KeyframeGroup(keyframes: [ + Keyframe(value: true, time: 0, isHold: true), // hidden, before `inFrame` + Keyframe(value: false, time: inFrame, isHold: true), // visible + Keyframe(value: true, time: outFrame, isHold: true), // hidden, after `outFrame` + ]) - animation.values = [ - true, // hidden, before `inFrame` - false, // visible - true, // hidden, after `outFrame` - ] + try addAnimation( + for: .isHidden, + keyframes: isHiddenKeyframes.map { Hold(value: $0) }, + value: { $0.value }, + context: context) + } - // From the documentation of `keyTimes`: - // - If the calculationMode is set to discrete, the first value in the array - // must be 0.0 and the last value must be 1.0. The array should have one more - // entry than appears in the values array. For example, if there are two values, - // there should be three key times. - animation.keyTimes = [ - NSNumber(value: 0.0), - NSNumber(value: max(Double(context.progressTime(for: inFrame)), 0)), - // Anything visible during the last frame should stay visible until the absolute end of the animation. - // - This matches the behavior of the main thread rendering engine. - context.timeRemapping(outFrame) == context.animation.endFrame - ? NSNumber(value: Double(1.0)) - : NSNumber(value: min(Double(context.progressTime(for: outFrame)), 1)), - NSNumber(value: 1.0), - ] + /// Otherwise continue using the legacy codepath that doesn't support complex time remapping. + /// - TODO: We could remove this codepath in favor of always using the simpler codepath above, + /// but would have to solve https://github.com/airbnb/lottie-ios/pull/2254 for that codepath. + else { + let animation = CAKeyframeAnimation(keyPath: #keyPath(isHidden)) + animation.calculationMode = .discrete - add(animation, timedWith: context) + animation.values = [ + true, // hidden, before `inFrame` + false, // visible + true, // hidden, after `outFrame` + ] + + // From the documentation of `keyTimes`: + // - If the calculationMode is set to discrete, the first value in the array + // must be 0.0 and the last value must be 1.0. The array should have one more + // entry than appears in the values array. For example, if there are two values, + // there should be three key times. + animation.keyTimes = [ + NSNumber(value: 0.0), + NSNumber(value: max(Double(try context.progressTime(for: inFrame)), 0)), + // Anything visible during the last frame should stay visible until the absolute end of the animation. + // - This matches the behavior of the main thread rendering engine. + context.simpleTimeRemapping(outFrame) == context.animation.endFrame + ? NSNumber(value: Double(1.0)) + : NSNumber(value: min(Double(try context.progressTime(for: outFrame)), 1)), + NSNumber(value: 1.0), + ] + + add(animation, timedWith: context) + } } } diff --git a/Sources/Private/CoreAnimation/CoreAnimationLayer.swift b/Sources/Private/CoreAnimation/CoreAnimationLayer.swift index 4fc4680805..8389dd5600 100644 --- a/Sources/Private/CoreAnimation/CoreAnimationLayer.swift +++ b/Sources/Private/CoreAnimation/CoreAnimationLayer.swift @@ -248,6 +248,8 @@ final class CoreAnimationLayer: BaseAnimationLayer { try setupLayerHierarchy( for: animation.layers, context: layerContext) + + try validateReasonableNumberOfTimeRemappingLayers() } /// Immediately builds and begins playing `CAAnimation`s for each sublayer @@ -531,6 +533,18 @@ extension CoreAnimationLayer: RootAnimationLayer { } } + /// Time remapping in the Core Animation rendering engine requires manually interpolating + /// every frame of every animation. For very large animations with a huge number of layers, + /// this can be prohibitively expensive. + func validateReasonableNumberOfTimeRemappingLayers() throws { + try layerContext.compatibilityAssert( + numberOfLayersWithTimeRemapping < 500, + """ + This animation has a very large number of layers with time remapping (\(numberOfLayersWithTimeRemapping)), + so will perform poorly with the Core Animation rendering engine. + """) + } + } // MARK: - CALayer + allSublayers @@ -548,4 +562,23 @@ extension CALayer { return allSublayers } + + /// The number of layers in this layer hierarchy that have a time remapping applied + @nonobjc + var numberOfLayersWithTimeRemapping: Int { + var numberOfSublayersWithTimeRemapping = 0 + + for sublayer in sublayers ?? [] { + if + let preCompLayer = sublayer as? PreCompLayer, + preCompLayer.preCompLayer.timeRemapping != nil + { + numberOfSublayersWithTimeRemapping += preCompLayer.allSublayers.count + } else { + numberOfSublayersWithTimeRemapping += sublayer.numberOfLayersWithTimeRemapping + } + } + + return numberOfSublayersWithTimeRemapping + } } diff --git a/Sources/Private/CoreAnimation/Extensions/Keyframes+timeRemapping.swift b/Sources/Private/CoreAnimation/Extensions/Keyframes+timeRemapping.swift new file mode 100644 index 0000000000..217e38ddae --- /dev/null +++ b/Sources/Private/CoreAnimation/Extensions/Keyframes+timeRemapping.swift @@ -0,0 +1,46 @@ +// Created by Cal Stephens on 1/8/24. +// Copyright © 2024 Airbnb Inc. All rights reserved. + +extension Keyframes { + /// Manually interpolates the given keyframes, and applies `context.complexTimeRemapping`. + /// - Since `complexTimeRemapping` is a mapping from "global time" to "local time", + /// we have to manually interpolate the keyframes at every frame in the animation. + static func manuallyInterpolatedWithTimeRemapping( + _ keyframes: KeyframeGroup, + context: LayerAnimationContext) + -> KeyframeGroup + { + let minimumTime = context.animation.startFrame + let maximumTime = context.animation.endFrame + let animationLocalTimeRange = stride(from: minimumTime, to: maximumTime, by: 1.0) + + let interpolator = keyframes.interpolator + + // Since potentially many global times can refer to the same local time, + // we can cache and reused these local-time values. + var localTimeCache = [AnimationFrameTime: T]() + + let interpolatedRemappedKeyframes = animationLocalTimeRange.compactMap { globalTime -> Keyframe? in + let remappedLocalTime = context.complexTimeRemapping(globalTime) + + let valueAtRemappedTime: T + if let cachedValue = localTimeCache[remappedLocalTime] { + valueAtRemappedTime = cachedValue + } else if let interpolatedValue = interpolator.value(frame: remappedLocalTime) as? T { + valueAtRemappedTime = interpolatedValue + localTimeCache[remappedLocalTime] = interpolatedValue + } else { + LottieLogger.shared.assertionFailure(""" + Failed to cast untyped keyframe values to expected type. This is an internal error. + """) + return nil + } + + return Keyframe( + value: valueAtRemappedTime, + time: AnimationFrameTime(globalTime)) + } + + return KeyframeGroup(keyframes: ContiguousArray(interpolatedRemappedKeyframes)) + } +} diff --git a/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift b/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift index d58101e138..e15ae531a2 100644 --- a/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift +++ b/Sources/Private/CoreAnimation/Layers/AnimationLayer.swift @@ -52,8 +52,22 @@ struct LayerAnimationContext { var recordHierarchyKeypath: ((String) -> Void)? /// A closure that remaps the given frame in the child layer's local time to a frame - /// in the animation's overall global time - private(set) var timeRemapping: ((AnimationFrameTime) -> AnimationFrameTime) = { $0 } + /// in the animation's overall global time. + /// - This time remapping is simple and only used `preCompLayer.timeStretch` and `preCompLayer.startTime`, + /// so is a trivial function and is invertible. This allows us to invert the time remapping from + /// "global time to local time" to instead be "local time to global time". + private(set) var simpleTimeRemapping: ((_ localTime: AnimationFrameTime) -> AnimationFrameTime) = { $0 } + + /// A complex time remapping closure that remaps the given frame in the animation's overall global time + /// into the child layer's local time. + /// - This time remapping is arbitrarily complex because it includes the full `preCompLayer.timeRemapping`. + /// - Since it isn't possible to invert the time remapping function, this can only be applied by converting + /// from global time to local time. This requires using `Keyframes.manuallyInterpolatedWithTimeRemapping`. + private(set) var complexTimeRemapping: ((_ globalTime: AnimationFrameTime) -> AnimationFrameTime) = { $0 } + + /// Whether or not this layer is required to use the `complexTimeRemapping` via + /// the more expensive `Keyframes.manuallyInterpolatedWithTimeRemapping` codepath. + var mustUseComplexTimeRemapping = false /// The duration of the animation var animationDuration: AnimationFrameTime { @@ -79,29 +93,63 @@ struct LayerAnimationContext { } /// The `AnimationProgressTime` for the given `AnimationFrameTime` within this layer, - /// accounting for the `timeRemapping` applied to this layer - func progressTime(for frame: AnimationFrameTime) -> AnimationProgressTime { + /// accounting for the `simpleTimeRemapping` applied to this layer. + func progressTime(for frame: AnimationFrameTime) throws -> AnimationProgressTime { + try compatibilityAssert( + !mustUseComplexTimeRemapping, + "LayerAnimationContext.time(forFrame:) does not support complex time remapping") + let animationFrameCount = animationDuration * animation.framerate - return (timeRemapping(frame) - animation.startFrame) / animationFrameCount + return (simpleTimeRemapping(frame) - animation.startFrame) / animationFrameCount } /// The real-time `TimeInterval` for the given `AnimationFrameTime` within this layer, - /// accounting for the `timeRemapping` applied to this layer - func time(for frame: AnimationFrameTime) -> TimeInterval { - animation.time(forFrame: timeRemapping(frame)) + /// accounting for the `simpleTimeRemapping` applied to this layer. + func time(forFrame frame: AnimationFrameTime) throws -> TimeInterval { + try compatibilityAssert( + !mustUseComplexTimeRemapping, + "LayerAnimationContext.time(forFrame:) does not support complex time remapping") + + return animation.time(forFrame: simpleTimeRemapping(frame)) } - /// Chains an additional `timeRemapping` closure onto this layer context - func withTimeRemapping( - _ additionalTimeRemapping: @escaping (AnimationFrameTime) -> AnimationFrameTime) + /// Chains an additional time remapping closure onto the `simpleTimeRemapping` closure + func withSimpleTimeRemapping( + _ additionalSimpleTimeRemapping: @escaping (_ localTime: AnimationFrameTime) -> AnimationFrameTime) -> LayerAnimationContext { var copy = self - copy.timeRemapping = { [existingTimeRemapping = timeRemapping] time in - existingTimeRemapping(additionalTimeRemapping(time)) + copy.simpleTimeRemapping = { [existingSimpleTimeRemapping = simpleTimeRemapping] time in + existingSimpleTimeRemapping(additionalSimpleTimeRemapping(time)) } return copy } + + /// Chains an additional time remapping closure onto the `complexTimeRemapping` closure. + /// - If `required` is `true`, all subsequent child layers will be required to use the expensive + /// `complexTimeRemapping` / `Keyframes.manuallyInterpolatedWithTimeRemapping` codepath. + /// - `required: true` is necessary when this time remapping is not available via `simpleTimeRemapping`. + func withComplexTimeRemapping( + required: Bool, + _ additionalComplexTimeRemapping: @escaping (_ globalTime: AnimationFrameTime) -> AnimationFrameTime) + -> LayerAnimationContext + { + var copy = self + copy.mustUseComplexTimeRemapping = copy.mustUseComplexTimeRemapping || required + copy.complexTimeRemapping = { [existingComplexTimeRemapping = complexTimeRemapping] time in + additionalComplexTimeRemapping(existingComplexTimeRemapping(time)) + } + return copy + } + + /// Returns a copy of this context with time remapping removed + func withoutTimeRemapping() -> LayerAnimationContext { + var copy = self + copy.simpleTimeRemapping = { $0 } + copy.complexTimeRemapping = { $0 } + copy.mustUseComplexTimeRemapping = false + return copy + } } // MARK: - LoggingState diff --git a/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift b/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift index 004f1fd128..976580338e 100644 --- a/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift +++ b/Sources/Private/CoreAnimation/Layers/BaseCompositionLayer.swift @@ -63,7 +63,7 @@ class BaseCompositionLayer: BaseAnimationLayer { if renderLayerContents { try contentsLayer.addOpacityAnimation(for: baseLayerModel.transform, context: transformContext) - contentsLayer.addVisibilityAnimation( + try contentsLayer.addVisibilityAnimation( inFrame: CGFloat(baseLayerModel.inFrame), outFrame: CGFloat(baseLayerModel.outFrame), context: context) diff --git a/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift b/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift index 9bceb5f46f..7006192738 100644 --- a/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift +++ b/Sources/Private/CoreAnimation/Layers/PreCompLayer.swift @@ -27,12 +27,13 @@ final class PreCompLayer: BaseCompositionLayer { } preCompLayer = typedLayer.preCompLayer - timeRemappingInterpolator = typedLayer.timeRemappingInterpolator super.init(layer: typedLayer) } // MARK: Internal + let preCompLayer: PreCompLayerModel + /// Post-init setup for `PreCompLayer`s. /// Should always be called after `PreCompLayer.init(preCompLayer:)`. /// @@ -51,12 +52,6 @@ final class PreCompLayer: BaseCompositionLayer { /// - `PreCompLayer.init(preCompLayer:context:)` /// func setup(context: LayerContext) throws { - if let timeRemappingKeyframes = preCompLayer.timeRemapping { - timeRemappingInterpolator = try .timeRemapping(keyframes: timeRemappingKeyframes, context: context) - } else { - timeRemappingInterpolator = nil - } - try setupLayerHierarchy( for: context.animation.assetLibrary?.precompAssets[preCompLayer.referenceID]?.layers ?? [], context: context) @@ -67,24 +62,28 @@ final class PreCompLayer: BaseCompositionLayer { context = context.addingKeypathComponent(preCompLayer.name) try setupLayerAnimations(context: context) - // Precomp layers can adjust the local time of their child layers (relative to the - // animation's global time) via `timeRemapping` or a custom `startTime` / `timeStretch` - let contextForChildren = context.withTimeRemapping { [preCompLayer, timeRemappingInterpolator] layerLocalFrame in - if let timeRemappingInterpolator { - return timeRemappingInterpolator.value(frame: layerLocalFrame) as? AnimationFrameTime ?? layerLocalFrame - } else { - return (layerLocalFrame * AnimationFrameTime(preCompLayer.timeStretch)) + AnimationFrameTime(preCompLayer.startTime) + let timeRemappingInterpolator = preCompLayer.timeRemapping.flatMap { KeyframeInterpolator(keyframes: $0.keyframes) } + + let contextForChildren = context + // `timeStretch` and `startTime` are a simple linear function so can be inverted from a + // "global time to local time" function into the simpler "local time to global time". + .withSimpleTimeRemapping { [preCompLayer] layerLocalFrame in + (layerLocalFrame * AnimationFrameTime(preCompLayer.timeStretch)) + AnimationFrameTime(preCompLayer.startTime) + } + // `timeRemappingInterpolator` is arbitrarily complex and cannot be inverted, + // so can only be applied via `complexTimeRemapping` from global time to local time. + .withComplexTimeRemapping(required: preCompLayer.timeRemapping != nil) { [preCompLayer] globalTime in + if let timeRemappingInterpolator { + let remappedLocalTime = timeRemappingInterpolator.value(frame: globalTime) as! LottieVector1D + return remappedLocalTime.cgFloatValue * context.animation.framerate + } else { + return (globalTime - preCompLayer.startTime) / preCompLayer.timeStretch + } } - } try setupChildAnimations(context: contextForChildren) } - // MARK: Private - - private let preCompLayer: PreCompLayerModel - private var timeRemappingInterpolator: KeyframeInterpolator? - } // MARK: CustomLayoutLayer @@ -104,36 +103,3 @@ extension PreCompLayer: CustomLayoutLayer { contentsLayer.masksToBounds = true } } - -extension KeyframeInterpolator where ValueType == AnimationFrameTime { - /// A `KeyframeInterpolator` for the given `timeRemapping` keyframes - static func timeRemapping( - keyframes timeRemappingKeyframes: KeyframeGroup, - context: LayerContext) - throws -> KeyframeInterpolator - { - try context.logCompatibilityIssue(""" - The Core Animation rendering engine partially supports time remapping keyframes, - but this is somewhat experimental and has some known issues. Since it doesn't work - in all cases, we have to fall back to using the main thread engine when using - `RenderingEngineOption.automatic`. - """) - - // `timeRemapping` is a mapping from the animation's global time to the layer's local time. - // In the Core Animation engine, we need to perform the opposite calculation -- convert - // the layer's local time into the animation's global time. We can get this by inverting - // the time remapping, swapping the x axis (global time) and the y axis (local time). - let localTimeToGlobalTimeMapping = timeRemappingKeyframes.keyframes.map { keyframe in - Keyframe( - value: keyframe.time, - time: keyframe.value.cgFloatValue * CGFloat(context.animation.framerate), - isHold: keyframe.isHold, - inTangent: keyframe.inTangent, - outTangent: keyframe.outTangent, - spatialInTangent: keyframe.spatialInTangent, - spatialOutTangent: keyframe.spatialOutTangent) - } - - return KeyframeInterpolator(keyframes: .init(localTimeToGlobalTimeMapping)) - } -} diff --git a/Sources/Private/CoreAnimation/Layers/SolidLayer.swift b/Sources/Private/CoreAnimation/Layers/SolidLayer.swift index 3d241bd7e0..2e1d5e33e1 100644 --- a/Sources/Private/CoreAnimation/Layers/SolidLayer.swift +++ b/Sources/Private/CoreAnimation/Layers/SolidLayer.swift @@ -43,8 +43,8 @@ final class SolidLayer: BaseCompositionLayer { // codepath so that this value can be customized using the custom `ValueProvider`s API. try shapeLayer.addAnimation( for: .fillColor, - keyframes: KeyframeGroup(solidLayer.colorHex.cgColor), - value: { $0 }, + keyframes: KeyframeGroup(solidLayer.colorHex.lottieColor), + value: { $0.cgColorValue }, context: context) } diff --git a/Sources/Private/Utility/Extensions/StringExtensions.swift b/Sources/Private/Utility/Extensions/StringExtensions.swift index 4a03843ff8..8d33cee249 100644 --- a/Sources/Private/Utility/Extensions/StringExtensions.swift +++ b/Sources/Private/Utility/Extensions/StringExtensions.swift @@ -15,6 +15,11 @@ extension String { return .rgb(red, green, blue) } + var lottieColor: LottieColor { + let (red, green, blue) = hexColorComponents() + return .init(r: red, g: green, b: blue, a: 1.0) + } + func hexColorComponents() -> (red: CGFloat, green: CGFloat, blue: CGFloat) { var cString: String = trimmingCharacters(in: .whitespacesAndNewlines).uppercased() diff --git a/Sources/Public/Keyframes/Interpolatable.swift b/Sources/Public/Keyframes/Interpolatable.swift index 7c8937507c..bb53c13d1d 100644 --- a/Sources/Public/Keyframes/Interpolatable.swift +++ b/Sources/Public/Keyframes/Interpolatable.swift @@ -251,3 +251,29 @@ extension Array: Interpolatable, AnyInterpolatable where Element: Interpolatable } } } + +// MARK: - Optional + Interpolatable, AnyInterpolatable + +extension Optional: Interpolatable, AnyInterpolatable where Wrapped: Interpolatable { + public func interpolate(to: Wrapped?, amount: CGFloat) -> Wrapped? { + guard let self, let to else { return nil } + return self.interpolate(to: to, amount: amount) + } +} + +// MARK: - Hold + +/// An `Interpolatable` container that animates using "hold" keyframes. +/// The keyframes do not animate, and instead always display the value from the most recent keyframe. +/// This is necessary when passing non-interpolatable values to a method that requires an `Interpolatable` conformance. +struct Hold: Interpolatable { + let value: T + + func interpolate(to: Hold, amount: CGFloat) -> Hold { + if amount < 1 { + return self + } else { + return to + } + } +} diff --git a/Tests/LoggingTests.swift b/Tests/LoggingTests.swift index 0db144ad96..77d4cedd56 100644 --- a/Tests/LoggingTests.swift +++ b/Tests/LoggingTests.swift @@ -21,27 +21,28 @@ final class LoggingTests: XCTestCase { } func testAutomaticFallbackToMainThreadRenderingEngine() async { - // This animation is not supported by the Core Animation rendering engine - // because it uses time remapping + // This animation is not supported by the Core Animation rendering engine: + // > The Core Animation rendering engine does not support animating multiple keyframes + // > for stroke dashPattern values, due to limitations of Core Animation. await snapshotLoggedMessages( - animationName: "Boat_Loader", + animationName: "TypeFace/G", configuration: LottieConfiguration(renderingEngine: .automatic)) } func testCoreAnimationRenderingEngineUnsupportedAnimation() async { - // This animation is not supported by the Core Animation rendering engine - // because it uses time remapping + // This animation is not supported by the Core Animation rendering engine: + // > The Core Animation rendering engine does not support animating multiple keyframes + // > for stroke dashPattern values, due to limitations of Core Animation. await snapshotLoggedMessages( - animationName: "Boat_Loader", + animationName: "TypeFace/G", configuration: LottieConfiguration(renderingEngine: .coreAnimation)) } func testExplicitMainThreadRenderingEngine() async { - // This animation is not supported by the Core Animation rendering engine - // because it uses time remapping. Manually specifying the Main Thread - // rendering engine should silence the log messages. + // This animation is not supported by the Core Animation rendering engine. + // Manually specifying the Main Thread rendering engine should silence the log messages. await snapshotLoggedMessages( - animationName: "Boat_Loader", + animationName: "TypeFace/G", configuration: LottieConfiguration(renderingEngine: .mainThread)) } diff --git a/Tests/Samples/Issues/pr_2286.json b/Tests/Samples/Issues/pr_2286.json new file mode 100644 index 0000000000..d5bb412a9e --- /dev/null +++ b/Tests/Samples/Issues/pr_2286.json @@ -0,0 +1 @@ +{"v":"5.9.6","fr":60,"ip":0,"op":1001,"w":780,"h":608,"nm":"Fullscreen Loader - Step 2 Rotate - Lottie","ddd":0,"assets":[{"id":"comp_0","nm":"Sphere Rotate - 2 - White","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[1.207]},{"t":120,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":0,"op":124,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[390,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[1.207]},{"t":124,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":4,"op":124,"st":87,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[452,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[1.207]},{"t":128,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":8,"op":124,"st":87,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[1.207]},{"t":132,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":12,"op":124,"st":87,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[1.207]},{"t":136,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":16,"op":124,"st":87,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[1.207]},{"t":140,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[1.207]},{"t":144,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[390,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[1.207]},{"t":148,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[1.207]},{"t":152,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0}]},{"id":"comp_1","nm":"Sphere Rotate","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[1.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[1.5,639.5],[1.5,1.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,416]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-416]],"v":[[49.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[49.5,639.5],[-30.5,1.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[41.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[41.5,639.5],[1.5,1.5]],"c":true}]},{"t":136,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[41.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[41.5,639.5],[1.5,1.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":136,"st":94,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 6","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[915,915],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":136,"st":94,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Mask 5","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,448]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-448]],"v":[[-46.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[-46.5,639.5],[17.5,-0.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,448]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-448]],"v":[[-70.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[-70.5,639.5],[49.5,-0.5]],"c":true}]},{"t":52,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,448]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-448]],"v":[[1.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[1.5,639.5],[1.5,-0.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":94,"st":48,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[915,915],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":94,"st":48,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.939,0],"y":[1,1]},"o":{"x":[0.524,0.2],"y":[0,0]},"t":90,"s":[970,970]},{"i":{"x":[0.415,0.556],"y":[1,1]},"o":{"x":[0,0.48],"y":[0,0]},"t":136,"s":[0,970]},{"t":182,"s":[970,970]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":136,"s":[0.921568627451,0.921568627451,0.921568627451,1]},{"t":138,"s":[1,1,1,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":182,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.939,0],"y":[1,1]},"o":{"x":[0.524,0.2],"y":[0,0]},"t":0,"s":[970,970]},{"i":{"x":[0.415,0.556],"y":[1,1]},"o":{"x":[0,0.48],"y":[0,0]},"t":46,"s":[0,970]},{"t":92,"s":[970,970]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[1,1,1,1]},{"t":48,"s":[0.921568627451,0.921568627451,0.921568627451,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":94,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Mask 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[640,1280],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":182,"st":94,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 5","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[970,970],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":182,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[320,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[640,1280],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":94,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 1","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[970,970],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":94,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"BG","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1280,1280],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":182,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Sphere Rotate - 3 - Black to White 3","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[1.81]},{"t":120,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":0,"op":124,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[390,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[1.81]},{"t":124,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":4,"op":124,"st":87,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[452,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[1.81]},{"t":128,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":8,"op":124,"st":87,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[1.81]},{"t":132,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":12,"op":124,"st":87,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[1.81]},{"t":136,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":16,"op":124,"st":87,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[1.81]},{"t":140,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[1.81]},{"t":144,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[390,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[1.81]},{"t":148,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-90,"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[1.81]},{"t":152,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0}]},{"id":"comp_3","nm":"Sphere Rotate - White to Black","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Mask 4","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":130,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[1.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[1.5,639.5],[1.5,1.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,416]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-416]],"v":[[49.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[49.5,639.5],[-30.5,1.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":134,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[41.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[41.5,639.5],[1.5,1.5]],"c":true}]},{"t":136,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[41.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[41.5,639.5],[1.5,1.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":136,"st":94,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 6","tt":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[915,915],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":136,"st":94,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Mask 5","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":84,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[1.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[1.5,639.5],[1.5,1.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":86,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,416]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-416]],"v":[[49.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[49.5,639.5],[-30.5,1.5]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":88,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[41.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[41.5,639.5],[1.5,1.5]],"c":true}]},{"t":90,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,394]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-394]],"v":[[41.5,-640.5],[-640.5,-640.5],[-640.5,639.5],[41.5,639.5],[1.5,1.5]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":90,"st":48,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[915,915],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":94,"st":48,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.939,0],"y":[1,1]},"o":{"x":[0.524,0.2],"y":[0,0]},"t":90,"s":[970,970]},{"i":{"x":[0.415,0.556],"y":[1,1]},"o":{"x":[0,0.48],"y":[0,0]},"t":136,"s":[0,970]},{"t":182,"s":[970,970]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":136,"s":[0.921568627451,0.921568627451,0.921568627451,1]},{"t":138,"s":[0.133333333333,0.133333333333,0.133333333333,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":182,"st":90,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.939,0],"y":[1,1]},"o":{"x":[0.524,0.2],"y":[0,0]},"t":0,"s":[970,970]},{"i":{"x":[0.415,0.556],"y":[1,1]},"o":{"x":[0,0.48],"y":[0,0]},"t":46,"s":[0,970]},{"t":92,"s":[970,970]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[1,1,1,1]},{"t":48,"s":[0.921568627451,0.921568627451,0.921568627451,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":94,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Mask 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[960,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[640,1280],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":182,"st":94,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 5","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[970,970],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":182,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[320,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[640,1280],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":94,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 1","tt":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[970,970],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":54,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.921568627451,0.921568627451,0.921568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":94,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"BG","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[640,640,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[1280,1280],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":182,"st":0,"ct":1,"bm":0}]},{"id":"comp_4","nm":"Success Taps - 3x3 - 4","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Black Circle Outlined - Tap - Large 4","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[44,44,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":88,"h":88,"ip":60,"op":127,"st":60,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Black Circle Outlined - Tap - Large 4","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[44,44,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":88,"h":88,"ip":40,"op":107,"st":40,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Black Circle Outlined - Tap - Large 4","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[44,44,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":88,"h":88,"ip":20,"op":87,"st":20,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Black Circle Outlined - Tap - Large 4","refId":"comp_5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[44,44,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":88,"h":88,"ip":0,"op":67,"st":0,"ct":1,"bm":0}]},{"id":"comp_5","nm":"Black Circle Outlined - Tap - Large 4","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Circle 36","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[44,44,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.198,0.198],"y":[1,1]},"o":{"x":[0.401,0.401],"y":[0,0]},"t":0,"s":[33,33]},{"i":{"x":[0.198,0.198],"y":[1,1]},"o":{"x":[0.401,0.401],"y":[0,0]},"t":10,"s":[24,24]},{"t":50,"s":[33,33]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333340287,0.133333340287,0.133333340287,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.198],"y":[1]},"o":{"x":[0.401],"y":[0]},"t":0,"s":[0.133333333333,0.133333333333,0.133333333333,1]},{"i":{"x":[0.198],"y":[1]},"o":{"x":[0.401],"y":[0]},"t":10,"s":[0.443137258291,0.443137258291,0.443137258291,1]},{"t":50,"s":[0.133333333333,0.133333333333,0.133333333333,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":67,"st":-10,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Ripple","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[50]},{"t":66,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[44,44,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.2,0.2],"y":[1,1]},"o":{"x":[0.1,0.1],"y":[0.9,0.9]},"t":6,"s":[15,15]},{"t":66,"s":[52,52]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":67,"st":-10,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"BG","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[44,44,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[44,44],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":67,"st":0,"ct":1,"bm":0}]},{"id":"comp_6","nm":"Sphere Rotate - 3 - White to Black 2","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[1.207]},{"t":120,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":0,"op":245,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[390,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[1.207]},{"t":124,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":4,"op":245,"st":87,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[452,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[1.207]},{"t":128,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":8,"op":245,"st":87,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[1.207]},{"t":132,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":12,"op":245,"st":87,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[1.207]},{"t":136,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":16,"op":245,"st":87,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[1.207]},{"t":140,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[1.207]},{"t":144,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[390,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[1.207]},{"t":148,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[1.207]},{"t":152,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0}]},{"id":"comp_7","nm":"Sphere Rotate - 3 - White","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[-72]},{"t":120,"s":[-180]}],"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[1.207]},{"t":120,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":0,"op":124,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[-72]},{"t":124,"s":[-180]}],"ix":10},"p":{"a":0,"k":[390,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[1.207]},{"t":124,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":4,"op":124,"st":87,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[-72]},{"t":128,"s":[-180]}],"ix":10},"p":{"a":0,"k":[452,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,-3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[1.207]},{"t":128,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":8,"op":124,"st":87,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[-72]},{"t":132,"s":[-180]}],"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[1.207]},{"t":132,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":12,"op":124,"st":87,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[-72]},{"t":136,"s":[-180]}],"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,-3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[1.207]},{"t":136,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":16,"op":124,"st":87,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[-72]},{"t":140,"s":[-180]}],"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[1.207]},{"t":140,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[-72]},{"t":144,"s":[-180]}],"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,-3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[1.207]},{"t":144,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[-72]},{"t":148,"s":[-180]}],"ix":10},"p":{"a":0,"k":[390,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[1.207]},{"t":148,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[-72]},{"t":152,"s":[-180]}],"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,-3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[1.207]},{"t":152,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0}]},{"id":"comp_8","nm":"Sphere Rotate - 1 - White","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[1.207]},{"t":120,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":0,"op":124,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[1.207]},{"t":124,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":4,"op":124,"st":87,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[452,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[1.207]},{"t":128,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":8,"op":124,"st":87,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[1.207]},{"t":132,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":12,"op":124,"st":87,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[1.207]},{"t":136,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[1.207]},{"t":140,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[1.207]},{"t":144,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[1.207]},{"t":148,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[1.207]},{"t":152,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":124,"st":87,"bm":0}]},{"id":"comp_9","nm":"Sphere Rotate - 3 - Black to White 2","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[1.81]},{"t":120,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":0,"op":153,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[390,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[1.81]},{"t":124,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":4,"op":153,"st":87,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[452,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[1.81]},{"t":128,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":8,"op":153,"st":87,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[1.81]},{"t":132,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":12,"op":153,"st":87,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[1.81]},{"t":136,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":16,"op":153,"st":87,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[1.81]},{"t":140,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":153,"st":87,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[1.81]},{"t":144,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":153,"st":87,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[390,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[1.81]},{"t":148,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":153,"st":87,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":90,"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[3.017]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[1.81]},{"t":152,"s":[0]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":153,"st":87,"bm":0}]},{"id":"comp_10","nm":"Sphere Rotate - 3 - White to Black","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[36]},{"t":120,"s":[90]}],"ix":10},"p":{"a":0,"k":[328,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":20,"s":[1.207]},{"t":120,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":0,"op":245,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[36]},{"t":124,"s":[90]}],"ix":10},"p":{"a":0,"k":[390,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":24,"s":[1.207]},{"t":124,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":4,"op":245,"st":87,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[36]},{"t":128,"s":[90]}],"ix":10},"p":{"a":0,"k":[452,227,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":28,"s":[1.207]},{"t":128,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":8,"op":245,"st":87,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[36]},{"t":132,"s":[90]}],"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":32,"s":[1.207]},{"t":132,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":12,"op":245,"st":87,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[36]},{"t":136,"s":[90]}],"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":36,"s":[1.207]},{"t":136,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":16,"op":245,"st":87,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[36]},{"t":140,"s":[90]}],"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":40,"s":[1.207]},{"t":140,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[36]},{"t":144,"s":[90]}],"ix":10},"p":{"a":0,"k":[328,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":44,"s":[1.207]},{"t":144,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[36]},{"t":148,"s":[90]}],"ix":10},"p":{"a":0,"k":[390,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":48,"s":[1.207]},{"t":148,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate - White to Black","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[36]},{"t":152,"s":[90]}],"ix":10},"p":{"a":0,"k":[452,381,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":52,"s":[1.207]},{"t":152,"s":[3.017]}],"ix":2},"w":1280,"h":1280,"ip":20,"op":245,"st":87,"bm":0}]},{"id":"comp_11","nm":"White Circle - Large 3","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Circle 36","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22,22,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[28.5,28.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2027,"st":-10,"ct":1,"bm":0}]},{"id":"comp_12","nm":"Black Circle - Large","fr":60,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Circle 36","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22,22,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[32,32],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.133333333333,0.133333333333,0.133333333333,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":2027,"st":-10,"ct":1,"bm":0}]},{"id":"comp_13","nm":"Sphere Rotate - Outlines","fr":60,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":0,"s":[328,247,0],"to":[0,-0.303,0],"ti":[0,1.961,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":8.334,"s":[328,239,0],"to":[0,-4.984,0],"ti":[0,2.817,0]},{"t":50,"s":[328,227,0]}],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":0,"op":71,"st":87,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":0,"s":[390,247,0],"to":[0,-0.303,0],"ti":[0,1.961,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":8.334,"s":[390,239,0],"to":[0,-4.984,0],"ti":[0,2.817,0]},{"t":50,"s":[390,227,0]}],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":0,"op":71,"st":83,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":0,"s":[452,247,0],"to":[0,-0.303,0],"ti":[0,1.961,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":8.334,"s":[452,239,0],"to":[0,-4.984,0],"ti":[0,2.817,0]},{"t":50,"s":[452,227,0]}],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":0,"op":71,"st":79,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[328,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":51,"op":71,"st":75,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":51,"op":71,"st":71,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[452,304,0],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":51,"op":71,"st":67,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":0,"s":[328,361,0],"to":[0,0.716,0],"ti":[0,-1.441,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":8.334,"s":[328,369,0],"to":[0,5.266,0],"ti":[0,-2.617,0]},{"t":50,"s":[328,381,0]}],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":0,"op":71,"st":67,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":0,"s":[390,361,0],"to":[0,0.716,0],"ti":[0,-1.441,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":8.334,"s":[390,369,0],"to":[0,5.266,0],"ti":[0,-2.617,0]},{"t":50,"s":[390,381,0]}],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":0,"op":71,"st":67,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":0,"s":[452,361,0],"to":[0,0.716,0],"ti":[0,-1.441,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":8.334,"s":[452,369,0],"to":[0,5.266,0],"ti":[0,-2.617,0]},{"t":50,"s":[452,381,0]}],"ix":2,"l":2},"a":{"a":0,"k":[640,640,0],"ix":1,"l":2},"s":{"a":0,"k":[3.4,3.4,100],"ix":6,"l":2}},"ao":0,"tm":{"a":0,"k":0,"ix":2},"w":1280,"h":1280,"ip":0,"op":71,"st":67,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Sphere Rotate - 2 - White","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":993,"s":[0]},{"t":1145,"s":[2.533]}],"ix":2},"w":780,"h":608,"ip":993,"op":1001,"st":841,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Sphere Rotate - 3 - Black to White 3","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":901,"s":[0]},{"t":1053,"s":[2.533]}],"ix":2},"w":780,"h":608,"ip":901,"op":1001,"st":529,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Success Taps - 3x3 - 4","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,-100,100],"ix":6,"l":2}},"ao":0,"w":780,"h":608,"ip":793,"op":920,"st":793,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Sphere Rotate - 3 - White to Black 2","refId":"comp_6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":780,"h":608,"ip":701,"op":951,"st":701,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Sphere Rotate - 3 - White","refId":"comp_7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":610,"s":[0]},{"t":762,"s":[2.533]}],"ix":2},"w":780,"h":608,"ip":610,"op":722,"st":458,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Sphere Rotate - 1 - White","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":518,"s":[0]},{"t":670,"s":[2.533]}],"ix":2},"w":780,"h":608,"ip":518,"op":630,"st":366,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Sphere Rotate - 3 - Black to White 2","refId":"comp_9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":434,"s":[0]},{"t":586,"s":[2.533]}],"ix":2},"w":780,"h":608,"ip":434,"op":547,"st":62,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Success Taps - 3x3 - 4","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":780,"h":608,"ip":326,"op":453,"st":326,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Sphere Rotate - 3 - White to Black","refId":"comp_10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":780,"h":608,"ip":244,"op":494,"st":244,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Sphere Rotate - 2 - White","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":152,"s":[0]},{"t":304,"s":[2.533]}],"ix":2},"w":780,"h":608,"ip":152,"op":264,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"Sphere Rotate - 1 - White","refId":"comp_8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"t":212,"s":[2.533]}],"ix":2},"w":780,"h":608,"ip":60,"op":173,"st":60,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"White Circle - Large 3","parent":15,"refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22,22,0],"ix":2,"l":2},"a":{"a":0,"k":[22,22,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":14,"s":[0,0,100]},{"t":20,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":44,"h":44,"ip":0,"op":61,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"White Circle - Large 3","parent":16,"refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22,22,0],"ix":2,"l":2},"a":{"a":0,"k":[22,22,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":14,"s":[0,0,100]},{"t":20,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":44,"h":44,"ip":0,"op":61,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"White Circle - Large 3","parent":17,"refId":"comp_11","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22,22,0],"ix":2,"l":2},"a":{"a":0,"k":[22,22,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":14,"s":[0,0,100]},{"t":20,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":44,"h":44,"ip":0,"op":61,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"Black Circle - Large","parent":16,"refId":"comp_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-37.048,22,0],"ix":2,"l":2},"a":{"a":0,"k":[22,22,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":44,"h":44,"ip":0,"op":61,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"Black Circle - Large","refId":"comp_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[22,22,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":10,"s":[72,72,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":18.332,"s":[85.2,85.2,100]},{"t":60,"s":[105,105,100]}],"ix":6,"l":2}},"ao":0,"w":44,"h":44,"ip":0,"op":61,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"Black Circle - Large","parent":16,"refId":"comp_12","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81.048,22,0],"ix":2,"l":2},"a":{"a":0,"k":[22,22,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":44,"h":44,"ip":0,"op":61,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Mask","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[11.621,265.965,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":10,"s":[160,55]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":18.334,"s":[192,161]},{"t":60,"s":[240,320]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":48,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.443137254902,0.443137254902,0.443137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.621,265.965],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1001,"st":-21,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"Sphere Rotate - Outlines","parent":16,"tt":1,"refId":"comp_13","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"t":21,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[22,22,0],"ix":2,"l":2},"a":{"a":0,"k":[390,304,0],"ix":1,"l":2},"s":{"a":0,"k":[95.238,95.238,100],"ix":6,"l":2}},"ao":0,"w":780,"h":608,"ip":10,"op":163,"st":10,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Device 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"t":29,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[11.621,265.965,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":10,"s":[160,55]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":18.334,"s":[192,161]},{"t":60,"s":[240,320]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":48,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.443137254902,0.443137254902,0.443137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.621,265.965],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1001,"st":-21,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Device","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":14,"s":[0]},{"t":29,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[390,304,0],"ix":2,"l":2},"a":{"a":0,"k":[11.621,265.965,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":10,"s":[172,66]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":18.334,"s":[204,172.4]},{"t":60,"s":[252,332]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":53,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.443137254902,0.443137254902,0.443137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.621,265.965],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1001,"st":-21,"ct":1,"bm":0}],"markers":[{"tm":0,"cm":"intro","dr":60},{"tm":60,"cm":"loop","dr":940}]} \ No newline at end of file diff --git a/Tests/Samples/success.json b/Tests/Samples/success.json new file mode 100644 index 0000000000..f265605c6e --- /dev/null +++ b/Tests/Samples/success.json @@ -0,0 +1 @@ +{"v":"5.7.3","fr":60,"ip":0,"op":90,"w":830,"h":1704,"nm":"JS Complete Check Faster Gary Fast","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"JS Complete Check - Start Later 2","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[415,852,0],"ix":2},"a":{"a":0,"k":[415,852,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-103,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[2.133]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":69.609,"s":[3.033]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":82,"s":[3.283]},{"t":173,"s":[4.6]}],"ix":2},"w":830,"h":1704,"ip":25,"op":120,"st":-103,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"JS Complete Check - Start Later 3","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[415,852,0],"ix":2},"a":{"a":0,"k":[415,852,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":-65,"s":[0]},{"i":{"x":[0.773],"y":[0.693]},"o":{"x":[0.374],"y":[0.28]},"t":0,"s":[1.083]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.247],"y":[0.218]},"t":42,"s":[2.05]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76,"s":[3.25]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":104,"s":[3.717]},{"t":120,"s":[4.133]}],"ix":2},"w":830,"h":1704,"ip":0,"op":120,"st":-65,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Move Down","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":415,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":37,"s":[723]},{"t":177,"s":[852]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":419,"st":-1382,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 92","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,129,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":272,"st":-4,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Center","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":272,"st":-4,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Check - Rotation","parent":3,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.882],"y":[0.499]},"o":{"x":[0.615],"y":[0.248]},"t":-20,"s":[52.88]},{"i":{"x":[0.266],"y":[1]},"o":{"x":[0.116],"y":[0.342]},"t":126,"s":[103.768]},{"t":190,"s":[135.767]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":272,"st":-184,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Check - Shape","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":173,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":179,"s":[100]},{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":211,"s":[100]},{"t":240,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[7.8,7.8,100],"ix":6}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":177,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-771.237,-335.882],[-1035.729,-67.924],[-674.086,289.847],[-409.593,21.889]],"c":true}]},{"i":{"x":0,"y":1},"o":{"x":0.167,"y":0.167},"t":182,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-509.57,-80.882],[-774.063,187.076],[-359.086,601.514],[-94.593,333.556]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":198,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[146.43,-712.882],[-774.063,187.077],[-359.086,601.514],[561.407,-298.444]],"c":true}]},{"t":219,"s":[{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[146.43,-712.882],[-774.063,187.077],[-359.086,601.514],[561.407,-298.444]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-506,-8],[-168,326],[502,-346]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":166,"s":[0.678431391716,0,0.537254929543,1]},{"t":205,"s":[0.890196084976,0.109803922474,0.372549027205,1]}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":90,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":177,"op":272,"st":141,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Check - Dot","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":124,"s":[0]},{"t":164,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":27.3,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.906],"y":[0.673]},"o":{"x":[0.754],"y":[0]},"t":108,"s":[443.293]},{"t":177,"s":[31.545]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.45,0.45,0.45],"y":[1,1,1]},"o":{"x":[0.55,0.55,0.55],"y":[0,0,0]},"t":-90,"s":[0,0,100]},{"t":-56,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.603,0.603],"y":[0,0]},"t":-20,"s":[0,0]},{"i":{"x":[0.115,0.115],"y":[1,1]},"o":{"x":[1,1],"y":[0,0]},"t":154,"s":[16.305,16.305]},{"t":188,"s":[7.6,7.6]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":44,"s":[0.890196084976,0.109803922474,0.372549027205,1]},{"t":186,"s":[0.674509803922,0.003921568627,0.529411764706,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":177,"st":-198,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Move Down","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":415,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":37,"s":[723]},{"t":177,"s":[852]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":419,"st":-1382,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Null 92","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,129,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":272,"st":-4,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Center","parent":2,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":272,"st":-4,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Check - Rotation","parent":3,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.882],"y":[0.499]},"o":{"x":[0.615],"y":[0.248]},"t":-20,"s":[52.88]},{"i":{"x":[0.266],"y":[1]},"o":{"x":[0.116],"y":[0.342]},"t":126,"s":[103.768]},{"t":190,"s":[135.767]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":60,"op":272,"st":-184,"bm":0},{"ddd":0,"ind":5,"ty":3,"nm":"Ring - Rotation","parent":3,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.762],"y":[0.588]},"o":{"x":[0.446],"y":[0.233]},"t":-5.965,"s":[0]},{"i":{"x":[0.444],"y":[0.755]},"o":{"x":[0.374],"y":[0]},"t":64,"s":[107.384]},{"i":{"x":[0.798],"y":[0.661]},"o":{"x":[0.152],"y":[0.905]},"t":148.715,"s":[452.843]},{"t":1230,"s":[778.401]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-4,"op":272,"st":-232,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Ring - Dot","parent":5,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":0,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.431],"y":[0.859]},"o":{"x":[0.88],"y":[0]},"t":60,"s":[393.575]},{"t":120,"s":[76.349]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.45,0.45,0.45],"y":[1,1,1]},"o":{"x":[0.55,0.55,0.55],"y":[0,0,0]},"t":-124,"s":[0,0,100]},{"t":-90,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.348,0.348],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":60,"s":[0,0]},{"i":{"x":[0.348,0.348],"y":[1,1]},"o":{"x":[0.628,0.628],"y":[0,0]},"t":81.957,"s":[28.007,28.007]},{"i":{"x":[0.45,0.45],"y":[1,1]},"o":{"x":[0.628,0.628],"y":[0,0]},"t":85.871,"s":[28.007,28.007]},{"t":123.158203125,"s":[7.4,7.4]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12.428,"s":[0.674509803922,0.003921568627,0.529411764706,1]},{"t":124,"s":[0.890196084976,0.109803922474,0.372549027205,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":118,"st":-232,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Ring","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":220,"s":[100]},{"t":249,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":114.143,"s":[0]},{"t":180,"s":[161.831]}],"ix":10},"p":{"s":true,"x":{"a":0,"k":-0.125,"ix":3},"y":{"a":0,"k":0,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.155,0.155,0.155],"y":[0.973,0.973,-1.726]},"o":{"x":[0.147,0.147,0.189],"y":[0.166,0.166,12.598]},"t":85.072,"s":[0,0,100]},{"i":{"x":[0.638,0.638,0.638],"y":[1,1,1]},"o":{"x":[0.306,0.306,0.306],"y":[0.651,0.651,0.496]},"t":110.17,"s":[7.741,7.741,100]},{"t":122.787109375,"s":[7.8,7.8,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[2016,2016],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":75,"ix":10},"g":{"p":7,"k":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":100,"s":[0,0.251,0.016,0.647,0.282,0.437,0.008,0.606,0.565,0.624,0,0.565,0.782,0.72,0,0.518,0.998,0.816,0,0.471,0.999,0.816,0,0.471,1,0.816,0,0.471]},{"t":114.142578125,"s":[0,0.89,0.11,0.373,0,0.89,0.11,0.373,0,0.89,0.11,0.373,0.282,0.89,0.11,0.373,0.565,0.89,0.11,0.373,0.782,0.89,0.11,0.373,1,0.89,0.11,0.373]}],"ix":8}},"s":{"a":0,"k":[35.669,993.415],"ix":4},"e":{"a":0,"k":[-17.803,-1034.77],"ix":5},"t":2,"h":{"a":0,"k":0,"ix":6},"a":{"a":0,"k":0,"ix":7},"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":145,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.574],"y":[0.83]},"o":{"x":[0.171],"y":[0.131]},"t":114.143,"s":[0]},{"i":{"x":[0.672],"y":[0.849]},"o":{"x":[0.403],"y":[0.64]},"t":150,"s":[84.086]},{"t":162,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":116,"op":272,"st":96,"bm":0},{"ddd":0,"ind":8,"ty":3,"nm":"Fill - Rotation","parent":3,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.829],"y":[0.721]},"o":{"x":[0.626],"y":[0.43]},"t":-4,"s":[172.831]},{"i":{"x":[0.453],"y":[0.843]},"o":{"x":[0.274],"y":[0.404]},"t":90,"s":[365.073]},{"i":{"x":[0.779],"y":[0.699]},"o":{"x":[0.242],"y":[0.208]},"t":142,"s":[483.134]},{"t":1292,"s":[1358.251]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":-4,"op":272,"st":-224,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Fill - Dot","parent":8,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":220,"s":[100]},{"t":249,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":62,"s":[-20]},{"t":144,"s":[0]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":62,"s":[443.349]},{"t":144,"s":[0]}],"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.45,0.45,0.45],"y":[1,1,1]},"o":{"x":[0.55,0.55,0.55],"y":[0,0,0]},"t":-116,"s":[0,0,100]},{"t":-82,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.667,0.667],"y":[1.553,1.553]},"o":{"x":[0.333,0.333],"y":[0,0]},"t":-28,"s":[10,10]},{"i":{"x":[0.667,0.667],"y":[0.933,0.933]},"o":{"x":[0.333,0.333],"y":[0.085,0.085]},"t":60,"s":[0,0]},{"i":{"x":[0.667,0.667],"y":[1,1]},"o":{"x":[0.333,0.333],"y":[0.391,0.391]},"t":81.533,"s":[15.926,15.926]},{"i":{"x":[0.34,0.34],"y":[1,1]},"o":{"x":[0.88,0.88],"y":[0,0]},"t":98,"s":[18,18]},{"t":164,"s":[134,134]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":-28,"s":[0.890196084976,0.109803922474,0.372549027205,1]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.88],"y":[0]},"t":86,"s":[0.674509803922,0.003921568627,0.529411764706,1]},{"t":164,"s":[0.976470589638,0.823529422283,0.874509811401,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":272,"st":-224,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Gary Speed 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[415,852,0],"ix":2},"a":{"a":0,"k":[415,852,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"tm":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.02],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.662],"y":[0.691]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0.667]},{"t":90,"s":[2]}],"ix":2},"w":830,"h":1704,"ip":-10,"op":110,"st":-10,"bm":0}],"markers":[{"tm":225,"cm":"Y Move Up Start","dr":0},{"tm":275,"cm":"Y Move Up End\r","dr":0}]} \ No newline at end of file diff --git a/Tests/SnapshotConfiguration.swift b/Tests/SnapshotConfiguration.swift index e495e63760..6b4a887c0f 100644 --- a/Tests/SnapshotConfiguration.swift +++ b/Tests/SnapshotConfiguration.swift @@ -34,6 +34,10 @@ struct SnapshotConfiguration { /// the code supporting the automatic engine. var testWithAutomaticEngine = false + /// Whether or not this sample should be excluded from testing with the Core Animation rendering engine + /// - Can be used for animations that are very expensive to render with the CA engine + var excludeCoreAnimationRenderingEngine = false + /// Custom progress values (from 0 to 1) that should be screenshot var customProgressValuesToSnapshot: [Double]? @@ -192,6 +196,10 @@ extension SnapshotConfiguration { ] return configuration }(), + + /// Animations which are very expensive to render using the Core Animation rendering engine, + /// and should fall back to the Main Thread engine when using `RenderingEngineOption.automatic`. + "Issues/pr_2286": .excludeCoreAnimationRenderingEngine, ] } @@ -201,12 +209,22 @@ extension SnapshotConfiguration { /// The default configuration to use if no custom mapping is provided static let `default` = SnapshotConfiguration() + /// Opts this snapshot in to being tested with the automatic rendering engine option static var useAutomaticRenderingEngine: SnapshotConfiguration { var configuration = SnapshotConfiguration.default configuration.testWithAutomaticEngine = true return configuration } + /// Excludes this snapshot from being tested with the Core Animation rendering engine. + /// If this is the case then using the automatic engine should fall back to the main thread engine. + static var excludeCoreAnimationRenderingEngine: SnapshotConfiguration { + var configuration = SnapshotConfiguration.default + configuration.excludeCoreAnimationRenderingEngine = true + configuration.testWithAutomaticEngine = true + return configuration + } + /// The `SnapshotConfiguration` to use for the given sample JSON file name static func forSample(named sampleName: String) -> SnapshotConfiguration { if let customConfiguration = customMapping[sampleName] { @@ -302,7 +320,9 @@ extension SnapshotConfiguration { switch configuration.renderingEngine { case .automatic: return testWithAutomaticEngine - case .specific: + case .specific(.coreAnimation): + return !excludeCoreAnimationRenderingEngine + case .specific(.mainThread): return true } } diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Boat_Loader.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Boat_Loader.txt index 4207a6c644..4b816d7353 100644 --- a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Boat_Loader.txt +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Boat_Loader.txt @@ -1,2 +1 @@ -Does not support Core Animation engine. Encountered compatibility issues: -[Chest] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. \ No newline at end of file +Supports Core Animation engine \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-issue_1403.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-issue_1403.txt index c4e7852302..4b816d7353 100644 --- a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-issue_1403.txt +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-issue_1403.txt @@ -1,2 +1 @@ -Does not support Core Animation engine. Encountered compatibility issues: -[Desktop (828x734)[000-143].jpg] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. \ No newline at end of file +Supports Core Animation engine \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_1.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_1.txt index d6d92717b3..4b816d7353 100644 --- a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_1.txt +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_1.txt @@ -1,3 +1 @@ -Does not support Core Animation engine. Encountered compatibility issues: -[DEMO - Feature - Payments] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. -[Folding Bill - Payments Mirror] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. \ No newline at end of file +Supports Core Animation engine \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_2.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_2.txt index 3c2ffc8e66..4b816d7353 100644 --- a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_2.txt +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_1604_2.txt @@ -1,3 +1 @@ -Does not support Core Animation engine. Encountered compatibility issues: -[DEMO - Feature - Payments] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. -[Folding Bill - Payments] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. \ No newline at end of file +Supports Core Animation engine \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_2286.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_2286.txt new file mode 100644 index 0000000000..00052ffa85 --- /dev/null +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.Issues-pr_2286.txt @@ -0,0 +1,2 @@ +Does not support Core Animation engine. Encountered compatibility issues: +[root layer] This animation has a very large number of layers with time remapping (3670), so will perform poorly with the Core Animation rendering engine. \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.success.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.success.txt new file mode 100644 index 0000000000..4b816d7353 --- /dev/null +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.success.txt @@ -0,0 +1 @@ +Supports Core Animation engine \ No newline at end of file diff --git a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.timeremap.txt b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.timeremap.txt index a50fd31364..4b816d7353 100644 --- a/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.timeremap.txt +++ b/Tests/__Snapshots__/AutomaticEngineTests/testAutomaticEngineDetection.timeremap.txt @@ -1,3 +1 @@ -Does not support Core Animation engine. Encountered compatibility issues: -[Reverse] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. -[Freeze] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. \ No newline at end of file +Supports Core Animation engine \ No newline at end of file diff --git a/Tests/__Snapshots__/LoggingTests/testAutomaticFallbackToMainThreadRenderingEngine.Boat_Loader.txt b/Tests/__Snapshots__/LoggingTests/testAutomaticFallbackToMainThreadRenderingEngine.TypeFace-G.txt similarity index 60% rename from Tests/__Snapshots__/LoggingTests/testAutomaticFallbackToMainThreadRenderingEngine.Boat_Loader.txt rename to Tests/__Snapshots__/LoggingTests/testAutomaticFallbackToMainThreadRenderingEngine.TypeFace-G.txt index 7b444e732e..58e11b5db6 100644 --- a/Tests/__Snapshots__/LoggingTests/testAutomaticFallbackToMainThreadRenderingEngine.Boat_Loader.txt +++ b/Tests/__Snapshots__/LoggingTests/testAutomaticFallbackToMainThreadRenderingEngine.TypeFace-G.txt @@ -1,5 +1,5 @@ [warning] Encountered Core Animation compatibility issue while setting up animation: -[Chest] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. +[dotted_lines.Ellipse 1.Stroke 1] The Core Animation rendering engine does not support animating multiple keyframes for stroke dashPattern values, due to limitations of Core Animation. This animation may have additional compatibility issues, but animation setup was cancelled early to avoid wasted work. Automatically falling back to Main Thread rendering engine. This fallback comes with some additional performance diff --git a/Tests/__Snapshots__/LoggingTests/testCoreAnimationRenderingEngineUnsupportedAnimation.Boat_Loader.txt b/Tests/__Snapshots__/LoggingTests/testCoreAnimationRenderingEngineUnsupportedAnimation.Boat_Loader.txt deleted file mode 100644 index 0ab0f8ed28..0000000000 --- a/Tests/__Snapshots__/LoggingTests/testCoreAnimationRenderingEngineUnsupportedAnimation.Boat_Loader.txt +++ /dev/null @@ -1,6 +0,0 @@ -[assertionFailure] Encountered Core Animation compatibility issues while setting up animation: -[Chest] The Core Animation rendering engine partially supports time remapping keyframes, but this is somewhat experimental and has some known issues. Since it doesn't work in all cases, we have to fall back to using the main thread engine when using `RenderingEngineOption.automatic`. - -This animation cannot be rendered correctly by the Core Animation engine. -To resolve this issue, you can use `RenderingEngineOption.automatic`, which automatically falls back -to the Main Thread rendering engine when necessary, or just use `RenderingEngineOption.mainThread`. diff --git a/Tests/__Snapshots__/LoggingTests/testCoreAnimationRenderingEngineUnsupportedAnimation.TypeFace-G.txt b/Tests/__Snapshots__/LoggingTests/testCoreAnimationRenderingEngineUnsupportedAnimation.TypeFace-G.txt new file mode 100644 index 0000000000..f5f194757b --- /dev/null +++ b/Tests/__Snapshots__/LoggingTests/testCoreAnimationRenderingEngineUnsupportedAnimation.TypeFace-G.txt @@ -0,0 +1,10 @@ +[info] `strokeStart` animation for "Shape Layer 17.Ellipse 1.Trim Paths 1" includes an After Effects expression (https://helpx.adobe.com/after-effects/using/expression-language.html), which is not supported by lottie-ios (expressions are only supported by lottie-web). This animation may not play correctly. +[assertionFailure] Encountered Core Animation compatibility issues while setting up animation: +[dotted_lines.Ellipse 1.Stroke 1] The Core Animation rendering engine does not support animating multiple keyframes for stroke dashPattern values, due to limitations of Core Animation. +[dotted_lines.Ellipse 1.Stroke 1] The Core Animation rendering engine does not support animating multiple keyframes for stroke dashPattern values, due to limitations of Core Animation. +[Dotted_lines.Ellipse 1.Stroke 1] The Core Animation rendering engine does not support animating multiple keyframes for stroke dashPattern values, due to limitations of Core Animation. +[Dotted_lines.Ellipse 1.Stroke 1] The Core Animation rendering engine does not support animating multiple keyframes for stroke dashPattern values, due to limitations of Core Animation. + +This animation cannot be rendered correctly by the Core Animation engine. +To resolve this issue, you can use `RenderingEngineOption.automatic`, which automatically falls back +to the Main Thread rendering engine when necessary, or just use `RenderingEngineOption.mainThread`. diff --git a/Tests/__Snapshots__/LoggingTests/testExplicitMainThreadRenderingEngine.Boat_Loader.txt b/Tests/__Snapshots__/LoggingTests/testExplicitMainThreadRenderingEngine.TypeFace-G.txt similarity index 100% rename from Tests/__Snapshots__/LoggingTests/testExplicitMainThreadRenderingEngine.Boat_Loader.txt rename to Tests/__Snapshots__/LoggingTests/testExplicitMainThreadRenderingEngine.TypeFace-G.txt diff --git a/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-0.png b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-0.png new file mode 100644 index 0000000000..c872459b89 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-100.png b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-100.png new file mode 100644 index 0000000000..85bfc01cad Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-25.png b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-25.png new file mode 100644 index 0000000000..cd8d1fe33b Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-50.png b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-50.png new file mode 100644 index 0000000000..7bbfb557b5 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-75.png b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-75.png new file mode 100644 index 0000000000..7811309f18 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testAutomaticRenderingEngine.Issues-pr_2286-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-0.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-0.png index e3f6e9cb96..eeb5917404 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-0.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-100.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-100.png index 039a08a63f..55250bb789 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-100.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Boat_Loader-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-0.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-0.png index f85e0a4a64..f3249f0af5 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-0.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-100.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-100.png index f85e0a4a64..6000b8f1e7 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-100.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-25.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-25.png index 5aa28bab2a..23dc357baa 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-25.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-50.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-50.png index 7b9da430f0..6000b8f1e7 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-50.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-75.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-75.png index f85e0a4a64..6000b8f1e7 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-75.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_1-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-100.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-100.png index f85e0a4a64..37f89391ba 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-100.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png index ca0f36c585..04024edd93 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-75.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-75.png index 74c825bf0f..b4fef86c25 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-75.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.Issues-pr_1604_2-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-0.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-0.png new file mode 100644 index 0000000000..9983e8c73d Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-100.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-100.png new file mode 100644 index 0000000000..3d548c79e6 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-25.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-25.png new file mode 100644 index 0000000000..eb0bc7a21b Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-50.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-50.png new file mode 100644 index 0000000000..c50fdd6d45 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-75.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-75.png new file mode 100644 index 0000000000..2668ab3aad Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.success-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-0.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-0.png index a13de4d589..bff18056ca 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-0.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-100.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-100.png index f27cdd5564..6b16135ad4 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-100.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-25.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-25.png index 94aacd0b20..c2f93ec228 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-25.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-50.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-50.png index 6e95c14294..3415a7dbe6 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-50.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-75.png b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-75.png index 4680854cbd..5504406481 100644 Binary files a/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-75.png and b/Tests/__Snapshots__/SnapshotTests/testCoreAnimationRenderingEngine.timeremap-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-0.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-0.png new file mode 100644 index 0000000000..c872459b89 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-100.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-100.png new file mode 100644 index 0000000000..85bfc01cad Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-25.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-25.png new file mode 100644 index 0000000000..cd8d1fe33b Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-50.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-50.png new file mode 100644 index 0000000000..7bbfb557b5 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-75.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-75.png new file mode 100644 index 0000000000..7811309f18 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.Issues-pr_2286-75.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-0.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-0.png new file mode 100644 index 0000000000..9983e8c73d Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-0.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-100.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-100.png new file mode 100644 index 0000000000..692016cf4e Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-100.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-25.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-25.png new file mode 100644 index 0000000000..dccca56014 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-25.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-50.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-50.png new file mode 100644 index 0000000000..1bb27242b5 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-50.png differ diff --git a/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-75.png b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-75.png new file mode 100644 index 0000000000..6944dfef38 Binary files /dev/null and b/Tests/__Snapshots__/SnapshotTests/testMainThreadRenderingEngine.success-75.png differ