From: Jiyun Yang Date: Tue, 7 Apr 2020 11:49:57 +0000 (+0900) Subject: [NUI] Introduce Button extentions and styles (#1515) X-Git-Tag: accepted/tizen/unified/20210219.040944~797 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=496c5fdc1f53ce094cbc93a15a554206f5970b7c;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git [NUI] Introduce Button extentions and styles (#1515) * New feature : ILottieButtonStyle * LottieButtonStyle * LottieSwitchStyle * New feature : ButtonExtension * ButtonExtension * SwitchExtension * LottieButtonExtension * LottieSwitchExstension * New feature : Provide predefined component styles for Wearable * WearbleButtonStyle * WearableSwitchStyle * WearableRadioButtonStyle * WearableCheckBoxStyle * OverlayAnimationButtonStyle * Improvement : Button does not use a TapGestureDetector to detect clicking. * Fix bug : Measure text again when Button's icon is relayouted. Signed-off-by: Jiyun Yang --- diff --git a/packaging/PlatformFileList.txt b/packaging/PlatformFileList.txt index 1d38480..c9e61ea 100755 --- a/packaging/PlatformFileList.txt +++ b/packaging/PlatformFileList.txt @@ -21,6 +21,9 @@ res/nui_component_default_slider_thumb_bg_p.png #common #mobile #mobile-emul res/nui_component_default_slider_thumb_n.png #common #mobile #mobile-emul #tv #wearable res/nui_component_default_dropdown_button_icon.png #common #mobile #mobile-emul #tv #wearable res/nui_component_default_dropdown_list_bg.png #common #mobile #mobile-emul #tv #wearable +res/nui_wearable_checkbox_icon.json #wearable +res/nui_wearable_radiobutton_icon.json #wearable +res/nui_wearable_switch_icon.json #wearable Tizen.Account.AccountManager.dll #mobile #mobile-emul #tv #wearable Tizen.Account.FidoClient.dll #mobile #mobile-emul #wearable Tizen.Account.OAuth2.dll #mobile #mobile-emul #wearable diff --git a/src/Tizen.NUI.Components/Controls/Button.cs b/src/Tizen.NUI.Components/Controls/Button.cs index 6da957d..ec6a25b 100755 --- a/src/Tizen.NUI.Components/Controls/Button.cs +++ b/src/Tizen.NUI.Components/Controls/Button.cs @@ -1,5 +1,5 @@ /* - * Copyright(c) 2019 Samsung Electronics Co., Ltd. + * Copyright(c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ using System; using System.ComponentModel; using Tizen.NUI.BaseComponents; using Tizen.NUI.Binding; +using Tizen.NUI.Components.Extension; namespace Tizen.NUI.Components { @@ -121,17 +122,81 @@ namespace Tizen.NUI.Components return instance.Style?.TextPadding; }); - private ImageView overlayImage; - - private TextLabel buttonText; - private ImageView buttonIcon; - private EventHandler stateChangeHander; private bool isSelected = false; private bool isEnabled = true; private bool isPressed = false; + /// + /// Button's overlay image part. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected ImageView ButtonOverlayImage { get; set; } + + /// + /// Button's text part. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected TextLabel ButtonText { get; set; } + + /// + /// Button's icon part. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected ImageView ButtonIcon { get; set; } + + /// + /// The last touch information triggering selected state change. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected Touch SelectionChangedByTouch { get; set; } + + /// + /// The ButtonExtension instance that is injected by ButtonStyle. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected ButtonExtension Extension { get; set; } + + /// + /// Creates Button's text part. + /// + /// The created Button's text part. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual TextLabel CreateText() + { + return new TextLabel(); + } + + /// + /// Creates Button's icon part. + /// + /// The created Button's icon part. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual ImageView CreateIcon() + { + return new ImageView(); + } + + /// + /// Creates Button's overlay image part. + /// + /// The created Button's overlay image part. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual ImageView CreateOverlayImage() + { + return new ImageView(); + } + + /// + /// Called when the Button is Clicked by a user + /// + /// The click information. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void OnClick(ClickEventArgs eventArgs) + { + } + static Button() { } /// @@ -484,9 +549,13 @@ namespace Tizen.NUI.Components set { isSelected = value; - UpdateState(); + + UpdateState(SelectionChangedByTouch); + + SelectionChangedByTouch = null; } } + /// /// Flag to decide enable or disable in Button. /// @@ -582,17 +651,19 @@ namespace Tizen.NUI.Components if (type == DisposeTypes.Explicit) { - if (buttonIcon != null) + Extension?.OnDispose(this); + + if (ButtonIcon != null) { - Utility.Dispose(buttonIcon); + Utility.Dispose(ButtonIcon); } - if (buttonText != null) + if (ButtonText != null) { - Utility.Dispose(buttonText); + Utility.Dispose(ButtonText); } - if (overlayImage != null) + if (ButtonOverlayImage != null) { - Utility.Dispose(overlayImage); + Utility.Dispose(ButtonOverlayImage); } } @@ -613,23 +684,30 @@ namespace Tizen.NUI.Components { isPressed = true; UpdateState(); - if(isEnabled) - { - ClickEventArgs eventArgs = new ClickEventArgs(); - OnClick(eventArgs); - } } } else if (key.State == Key.StateType.Up) { if (key.KeyPressedName == "Return") { + bool clicked = isPressed && isEnabled; + isPressed = false; + if (Style.IsSelectable != null && Style.IsSelectable == true) { - isSelected = !isSelected; + IsSelected = !IsSelected; + } + else + { + UpdateState(); + } + + if (clicked) + { + ClickEventArgs eventArgs = new ClickEventArgs(); + OnClickInternal(eventArgs); } - UpdateState(); } } return base.OnKey(key); @@ -660,23 +738,6 @@ namespace Tizen.NUI.Components } /// - /// Tap gesture event callback. - /// - /// Source which recieved touch event. - /// Tap gesture event argument. - /// 6 - /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API. - [EditorBrowsable(EditorBrowsableState.Never)] - protected override void OnTapGestureDetected(object source, TapGestureDetector.DetectedEventArgs e) - { - if (isEnabled) - { - ClickEventArgs eventArgs = new ClickEventArgs(); - OnClick(eventArgs); - base.OnTapGestureDetected(source, e); - } - } - /// /// Called after a touch event is received by the owning view.
/// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).
///
@@ -694,20 +755,36 @@ namespace Tizen.NUI.Components { case PointStateType.Down: isPressed = true; - UpdateState(); + UpdateState(touch); return true; case PointStateType.Interrupted: isPressed = false; UpdateState(); return true; case PointStateType.Up: + { + bool clicked = isPressed && isEnabled; + isPressed = false; + if (Style.IsSelectable != null && Style.IsSelectable == true) { - isSelected = !isSelected; + SelectionChangedByTouch = touch; + IsSelected = !IsSelected; } - UpdateState(); + else + { + UpdateState(touch); + } + + if (clicked) + { + ClickEventArgs eventArgs = new ClickEventArgs(); + OnClickInternal(eventArgs); + } + return true; + } default: break; } @@ -727,31 +804,9 @@ namespace Tizen.NUI.Components if (null != buttonStyle) { - if (null == overlayImage) - { - overlayImage = new ImageView() - { - WidthResizePolicy = ResizePolicyType.FillToParent, - HeightResizePolicy = ResizePolicyType.FillToParent - }; - this.Add(overlayImage); - } - - if (null == buttonText) - { - buttonText = new TextLabel(); - this.Add(buttonText); - } - - if (null == buttonIcon) - { - buttonIcon = new ImageView(); - this.Add(buttonIcon); - } - - overlayImage.ApplyStyle(buttonStyle.Overlay); - buttonText.ApplyStyle(buttonStyle.Text); - buttonIcon.ApplyStyle(buttonStyle.Icon); + ButtonOverlayImage?.ApplyStyle(buttonStyle.Overlay); + ButtonText?.ApplyStyle(buttonStyle.Text); + ButtonIcon?.ApplyStyle(buttonStyle.Icon); } } @@ -771,15 +826,18 @@ namespace Tizen.NUI.Components { base.OnUpdate(); UpdateUIContent(); + + Extension?.OnRelayout(this); } /// /// Update Button State. /// + /// The touch information in case the state has changed by touching. /// 6 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API. [EditorBrowsable(EditorBrowsableState.Never)] - protected void UpdateState() + protected void UpdateState(Touch touchInfo = null) { ControlStates sourceState = ControlState; ControlStates targetState; @@ -793,10 +851,8 @@ namespace Tizen.NUI.Components targetState = IsSelected ? ControlStates.DisabledSelected : (IsFocused ? ControlStates.DisabledFocused : ControlStates.Disabled); } - if(sourceState != targetState) + if (SetControlState(targetState, touchInfo)) { - ControlState = targetState; - OnUpdate(); StateChangedEventArgs e = new StateChangedEventArgs @@ -805,6 +861,8 @@ namespace Tizen.NUI.Components CurrentState = targetState }; stateChangeHander?.Invoke(this, e); + + Extension?.OnControlStateChanged(this, sourceState, touchInfo); } } @@ -814,11 +872,53 @@ namespace Tizen.NUI.Components /// 6 private void Initialize() { - if (null == Style.IconRelativeOrientation) Style.IconRelativeOrientation = IconOrientation.Left; + var style = (ButtonStyle)Style; + + Extension = style.CreateExtension(); + + CreateComponents(); + + if (ButtonOverlayImage != null) + { + Add(ButtonOverlayImage); + ButtonOverlayImage.ApplyStyle(style.Overlay); + } + + if (ButtonIcon != null) + { + Add(ButtonIcon); + ButtonIcon.ApplyStyle(style.Icon); + ButtonIcon.Relayout += OnIconRelayout; + } + + if (null != ButtonText) + { + Add(ButtonText); + ButtonText.ApplyStyle(style.Text); + } + UpdateState(); + LayoutDirectionChanged += OnLayoutDirectionChanged; } + private void CreateComponents() + { + ButtonOverlayImage = CreateOverlayImage(); + ButtonIcon = CreateIcon(); + ButtonText = CreateText(); + + if (Extension == null) + { + return; + } + + // Update component with extension + ButtonOverlayImage = Extension.OnCreateOverlayImage(this, ButtonOverlayImage); + ButtonIcon = Extension.OnCreateIcon(this, ButtonIcon); + ButtonText = Extension.OnCreateText(this, ButtonText); + } + /// /// Measure text, it can be override. /// @@ -827,12 +927,12 @@ namespace Tizen.NUI.Components [EditorBrowsable(EditorBrowsableState.Never)] protected virtual void MeasureText() { - if (Style.IconRelativeOrientation == null || buttonIcon == null || buttonText == null) + if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null) { return; } - buttonText.WidthResizePolicy = ResizePolicyType.Fixed; - buttonText.HeightResizePolicy = ResizePolicyType.Fixed; + ButtonText.WidthResizePolicy = ResizePolicyType.Fixed; + ButtonText.HeightResizePolicy = ResizePolicyType.Fixed; int textPaddingStart = Style.TextPadding.Start; int textPaddingEnd = Style.TextPadding.End; int textPaddingTop = Style.TextPadding.Top; @@ -845,13 +945,13 @@ namespace Tizen.NUI.Components if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom) { - buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd; - buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - buttonIcon.SizeHeight; + ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd; + ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - ButtonIcon.SizeHeight; } else { - buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - buttonIcon.SizeWidth; - buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom; + ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - ButtonIcon.SizeWidth; + ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom; } } /// @@ -862,11 +962,14 @@ namespace Tizen.NUI.Components [EditorBrowsable(EditorBrowsableState.Never)] protected virtual void LayoutChild() { - if (Style.IconRelativeOrientation == null || buttonIcon == null || buttonText == null) + if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null) { return; } + var buttonIcon = ButtonIcon; + var buttonText = ButtonText; + int textPaddingStart = Style.TextPadding.Start; int textPaddingEnd = Style.TextPadding.End; int textPaddingTop = Style.TextPadding.Top; @@ -993,8 +1096,10 @@ namespace Tizen.NUI.Components LayoutChild(); } - private void OnClick(ClickEventArgs eventArgs) + private void OnClickInternal(ClickEventArgs eventArgs) { + OnClick(eventArgs); + Extension?.OnClick(this, eventArgs); ClickEvent?.Invoke(this, eventArgs); } @@ -1025,5 +1130,95 @@ namespace Tizen.NUI.Components public ControlStates CurrentState; } + /// + /// A Selector class that describes Buttons state by actions. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class ActionSelector + { + /// + /// Value used when the Button is created. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public T OnCreate { get; set; } + + /// + /// Value used when the Button is selected. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public T OnSelect { get; set; } + + /// + /// Value used when the Button is unselected. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public T OnUnselect { get; set; } + + /// + /// Value used when the Button is disabled. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public T OnDisable { get; set; } + + /// + /// Value used when the Button is disabled in selected state. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public T OnDisableSelected { get; set; } + + /// + /// Value used when the Button is pressed. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public T OnPress { get; set; } + + /// + /// Value used when the Button is pressed in selected state. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public T OnPressSelected { get; set; } + } + + /// + /// Get current text part to the attached ButtonExtension. + /// + /// + /// It returns null if the passed extension is invaild. + /// + /// The extension instance that is currently attached to this Button. + /// The button's text part. + [EditorBrowsable(EditorBrowsableState.Never)] + public TextLabel GetCurrentText(ButtonExtension extension) + { + return (extension == Extension) ? ButtonText : null; + } + + /// + /// Get current icon part to the attached ButtonExtension. + /// + /// + /// It returns null if the passed extension is invaild. + /// + /// The extension instance that is currently attached to this Button. + /// The button's icon part. + [EditorBrowsable(EditorBrowsableState.Never)] + public ImageView GetCurrentIcon(ButtonExtension extension) + { + return (extension == Extension) ? ButtonIcon : null; + } + + /// + /// Get current overlay image part to the attached ButtonExtension. + /// + /// + /// It returns null if the passed extension is invaild. + /// + /// The extension instance that is currently attached to this Button. + /// The button's overlay image part. + [EditorBrowsable(EditorBrowsableState.Never)] + public ImageView GetCurrentOverlayImage(ButtonExtension extension) + { + return (extension == Extension) ? ButtonOverlayImage : null; + } } } diff --git a/src/Tizen.NUI.Components/Controls/Extension/ButtonExtension.cs b/src/Tizen.NUI.Components/Controls/Extension/ButtonExtension.cs new file mode 100644 index 0000000..429b4b9 --- /dev/null +++ b/src/Tizen.NUI.Components/Controls/Extension/ButtonExtension.cs @@ -0,0 +1,103 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// The ButtonExtension class allows developers to access the Button's components and extend their behavior in various states. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public abstract class ButtonExtension + { + /// + /// Called immediately after the Button creates the text part. + /// + /// The Button instance that the extension currently applied to. + /// The created Button's text part. + /// The refined button text. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual TextLabel OnCreateText(Button button, TextLabel text) + { + return text; + } + + /// + /// Called immediately after the Button creates the icon part. + /// + /// The Button instance that the extension currently applied to. + /// The created Button's icon part. + /// The refined button icon. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual ImageView OnCreateIcon(Button button, ImageView icon) + { + return icon; + } + + /// + /// Called immediately after the Button creates the overlay image part. + /// + /// The Button instance that the extension currently applied to. + /// The created Button's overlayImage part. + /// The refined button overlayImage. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual ImageView OnCreateOverlayImage(Button button, ImageView overlayImage) + { + return overlayImage; + } + + /// + /// Describes actions on Button's ControlStates changed. + /// + /// The Button instance that the extension currently applied to. + /// The previous contol state of the Button. + /// The touch information in case the state has changed by touching. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo) + { + } + + /// + /// Called when the Button is Clicked by a user + /// + /// The Button instance that the extension currently applied to. + /// The click event information. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual void OnClick(Button button, Button.ClickEventArgs eventArgs) + { + } + + /// + /// Called after the size negotiation has been finished for the attached Control. + /// + /// The Button instance that the extension currently applied to. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual void OnRelayout(Button button) + { + } + + /// + /// Called when the attached Button is explicitly disposing. + /// + /// The Button instance that the extension currently applied to. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual void OnDispose(Button button) + { + } + } +} diff --git a/src/Tizen.NUI.Components/Controls/Extension/LottieButtonExtension.cs b/src/Tizen.NUI.Components/Controls/Extension/LottieButtonExtension.cs new file mode 100644 index 0000000..da50bc8 --- /dev/null +++ b/src/Tizen.NUI.Components/Controls/Extension/LottieButtonExtension.cs @@ -0,0 +1,117 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System; +using System.ComponentModel; +using Tizen.NUI.BaseComponents; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// LottieButtonExtension is a ButtonExtension class that uses Lottie image for a Button icon. + /// + /// This extension must be used within a class implementing LottieButtonStyle. + /// + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class LottieButtonExtension : ButtonExtension + { + /// + /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieButtonExtension() : base() + { + LottieView = new LottieAnimationView(); + } + + /// + /// The Lottie view that will be used as an icon part in a Button. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected LottieAnimationView LottieView { get; set; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override ImageView OnCreateIcon(Button button, ImageView icon) + { + InitializeLottieView(button, LottieView); + + return LottieView; + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo) + { + UpdateLottieView(button, previousState, touchInfo, LottieView); + } + + internal static void InitializeLottieView(Button button, LottieAnimationView lottieView) + { + if (button.Style as ILottieButtonStyle == null) + { + throw new Exception("LottieButtonExtension must be used within a ILottieButtonStyle or derived class."); + } + + var lottieStyle = (ILottieButtonStyle)button.Style; + lottieView.URL = lottieStyle.LottieUrl; + lottieView.StopBehavior = LottieAnimationView.StopBehaviorType.MaximumFrame; + lottieStyle.LottieFrameInfo.OnCreate?.Show(lottieView, true); + } + + internal static void UpdateLottieView(Button button, ControlStates previousState, Touch touchInfo, LottieAnimationView lottieView) + { + var lottieStyle = (ILottieButtonStyle)button.Style; + + switch (button.ControlState) + { + case ControlStates.Normal: + lottieStyle.LottieFrameInfo?.OnUnselect?.Show(lottieView, previousState == ControlStates.Disabled); + break; + + case ControlStates.Focused: + lottieStyle.LottieFrameInfo?.OnUnselect?.Show(lottieView, previousState == ControlStates.DisabledFocused); + break; + + case ControlStates.Selected: + case ControlStates.SelectedFocused: + lottieStyle.LottieFrameInfo?.OnSelect?.Show(lottieView); + break; + + case ControlStates.Disabled: + case ControlStates.DisabledFocused: + lottieStyle.LottieFrameInfo?.OnDisable?.Show(lottieView); + break; + + case ControlStates.DisabledSelected: + lottieStyle.LottieFrameInfo?.OnDisableSelected?.Show(lottieView); + break; + + case ControlStates.Pressed: + if (button.IsSelected) + { + lottieStyle.LottieFrameInfo?.OnPressSelected?.Show(lottieView); + } + else + { + lottieStyle.LottieFrameInfo?.OnPress?.Show(lottieView); + } + break; + } + } + } +} diff --git a/src/Tizen.NUI.Components/Controls/Extension/LottieSwitchExtension.cs b/src/Tizen.NUI.Components/Controls/Extension/LottieSwitchExtension.cs new file mode 100644 index 0000000..4fdd99f --- /dev/null +++ b/src/Tizen.NUI.Components/Controls/Extension/LottieSwitchExtension.cs @@ -0,0 +1,62 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// LottieSwitchExtension is a SwitchExtension class that uses Lottie image for a Switch icon. + /// + /// This extension must be used within a class implementing LottieSwitchStyle. + /// + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class LottieSwitchExtension : SwitchExtension + { + /// + /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieSwitchExtension() : base() + { + LottieView = new LottieAnimationView(); + } + + /// + /// The Lottie view that will be used as an icon part in a Button. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected LottieAnimationView LottieView { get; set; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override ImageView OnCreateIcon(Button button, ImageView icon) + { + LottieButtonExtension.InitializeLottieView(button, LottieView); + + return LottieView; + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo) + { + LottieButtonExtension.UpdateLottieView(button, previousState, touchInfo, LottieView); + } + } +} diff --git a/src/Tizen.NUI.Components/Controls/Extension/SlidingSwitchExtension.cs b/src/Tizen.NUI.Components/Controls/Extension/SlidingSwitchExtension.cs new file mode 100644 index 0000000..c204f71 --- /dev/null +++ b/src/Tizen.NUI.Components/Controls/Extension/SlidingSwitchExtension.cs @@ -0,0 +1,78 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System; +using System.ComponentModel; +using Tizen.NUI.BaseComponents; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// The SlidingSwitchExtension class makes attached Switch to animate thumb when selected/unselected. + /// + /// This extension must be used within a class implementing SwitchStyle. + /// + /// + [EditorBrowsable(EditorBrowsableState.Never)] + internal class SlidingSwitchExtension : SwitchExtension + { + private Animation slidingAnimation; + + public SlidingSwitchExtension() : base() + { + slidingAnimation = new Animation(100); + } + + public override void OnClick(Button button, Button.ClickEventArgs eventArgs) + { + if (button as Switch == null) + { + throw new Exception("SlidingSwitchExtension must be used within a SwitchStyle or derived class."); + } + + var switchButton = (Switch)button; + var track = switchButton.GetCurrentTrack(this); + var thumb = switchButton.GetCurrentThumb(this); + + if (track == null || thumb == null || null == slidingAnimation) + { + return; + } + + if (slidingAnimation.State == Animation.States.Playing) + { + slidingAnimation.Stop(); + } + + slidingAnimation.Clear(); + slidingAnimation.AnimateTo(thumb, "PositionX", track.Size.Width - thumb.Size.Width - thumb.Position.X); + slidingAnimation.Play(); + } + + public override void OnDispose(Button button) + { + if (slidingAnimation != null) + { + if (slidingAnimation.State == Animation.States.Playing) + { + slidingAnimation.Stop(); + } + slidingAnimation.Dispose(); + slidingAnimation = null; + } + } + } +} diff --git a/src/Tizen.NUI.Components/Controls/Extension/SwitchExtension.cs b/src/Tizen.NUI.Components/Controls/Extension/SwitchExtension.cs new file mode 100644 index 0000000..985c012 --- /dev/null +++ b/src/Tizen.NUI.Components/Controls/Extension/SwitchExtension.cs @@ -0,0 +1,56 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// The SwitchExtension class allows developers to access the Switch's components and extend their behavior in various states. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public abstract class SwitchExtension : ButtonExtension + { + internal SwitchExtension() : base() + { + } + + /// + /// Called immediately after the Switch creates the track part. + /// + /// The Switch instance that the extension currently applied to. + /// The created Switch's track part. + /// The refined switch track. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual ImageView OnCreateTrack(Switch switchButton, ImageView track) + { + return track; + } + + /// + /// Called immediately after the Switch creates the thumb part. + /// + /// The Switch instance that the extension currently applied to. + /// The created Switch's thumb part. + /// The refined switch thumb. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual ImageView OnCreateThumb(Switch switchButton, ImageView thumb) + { + return thumb; + } + } +} diff --git a/src/Tizen.NUI.Components/Controls/RadioButton.cs b/src/Tizen.NUI.Components/Controls/RadioButton.cs index 21b77c5..f11d647 100755 --- a/src/Tizen.NUI.Components/Controls/RadioButton.cs +++ b/src/Tizen.NUI.Components/Controls/RadioButton.cs @@ -58,6 +58,7 @@ namespace Tizen.NUI.Components /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API. [EditorBrowsable(EditorBrowsableState.Never)] public RadioButton(ButtonStyle buttonStyle) : base(buttonStyle) { } + /// /// Get RadioButtonGroup to which this selections belong. /// diff --git a/src/Tizen.NUI.Components/Controls/Switch.cs b/src/Tizen.NUI.Components/Controls/Switch.cs index 69e5842..ee02ac5 100755 --- a/src/Tizen.NUI.Components/Controls/Switch.cs +++ b/src/Tizen.NUI.Components/Controls/Switch.cs @@ -15,8 +15,9 @@ * */ using System; -using Tizen.NUI.BaseComponents; using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components.Extension; namespace Tizen.NUI.Components { @@ -27,10 +28,6 @@ namespace Tizen.NUI.Components /// 6 public class Switch : Button { - private const int aniTime = 100; // will be defined in const file later - private ImageView trackImage; - private ImageView thumbImage; - private Animation handlerAni = null; static Switch() { } /// @@ -176,6 +173,38 @@ namespace Tizen.NUI.Components } /// + /// Switch's track part. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected ImageView Track { get; set; } + + /// + /// Switch's thumb part. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected ImageView Thumb { get; set; } + + /// + /// Creates Switch's track part. + /// + /// The created Button's icon part. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual ImageView CreateTrack() + { + return new ImageView(); + } + + /// + /// Creates Switch's overlay thumb part. + /// + /// The created Button's overlay image part. + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual ImageView CreateThumb() + { + return new ImageView(); + } + + /// /// Dispose Switch and all children on it. /// /// Dispose type. @@ -186,18 +215,8 @@ namespace Tizen.NUI.Components if (type == DisposeTypes.Explicit) { - if (null != handlerAni) - { - if (handlerAni.State == Animation.States.Playing) - { - handlerAni.Stop(); - } - handlerAni.Dispose(); - handlerAni = null; - } - - Utility.Dispose(thumbImage); - Utility.Dispose(trackImage); + Utility.Dispose(Thumb); + Utility.Dispose(Track); } base.Dispose(type); @@ -266,28 +285,36 @@ namespace Tizen.NUI.Components private void Initialize() { Style.IsSelectable = true; - handlerAni = new Animation(aniTime); - trackImage = new ImageView() + + CreateComponents(); + + if (null != Track) { - ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft, - PivotPoint = Tizen.NUI.PivotPoint.TopLeft, - PositionUsesPivotPoint = true, - WidthResizePolicy = ResizePolicyType.FillToParent, - HeightResizePolicy = ResizePolicyType.FillToParent, - Name = "SwitchBackgroundImage", - }; - Add(trackImage); - trackImage.ApplyStyle(Style.Track); - - thumbImage = new ImageView() + Add(Track); + Track.ApplyStyle(Style.Track); + } + + if (null != Thumb) { - ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft, - PivotPoint = Tizen.NUI.PivotPoint.TopLeft, - PositionUsesPivotPoint = true, - Name = "SwitchHandlerImage", - }; - trackImage.Add(thumbImage); - thumbImage.ApplyStyle(Style.Thumb); + Add(Thumb); + Thumb.ApplyStyle(Style.Thumb); + } + } + + private void CreateComponents() + { + Track = CreateTrack(); + Thumb = CreateThumb(); + + if (Extension as SwitchExtension == null) + { + return; + } + + // Update component with extension + var extension = (SwitchExtension)Extension; + Track = extension.OnCreateTrack(this, Track); + Thumb = extension.OnCreateThumb(this, Thumb); } /// @@ -307,16 +334,6 @@ namespace Tizen.NUI.Components private void OnSelect() { - if (handlerAni.State == Animation.States.Playing) - { - handlerAni.Stop(); - } - handlerAni.Clear(); - handlerAni.AnimateTo(thumbImage, "PositionX", Size2D.Width - thumbImage.Size2D.Width - thumbImage.Position2D.X); - trackImage.Opacity = 0.5f; ///////need defined by UX - handlerAni.AnimateTo(trackImage, "Opacity", 1); - handlerAni.Play(); - if (SelectedEvent != null) { SelectEventArgs eventArgs = new SelectEventArgs(); @@ -335,5 +352,33 @@ namespace Tizen.NUI.Components /// 6 public bool IsSelected; } + + /// + /// Get current track part to the attached SwitchExtension. + /// + /// + /// It returns null if the passed extension is invaild. + /// + /// The extension instance that is currently attached to this Switch. + /// The switch's track part. + [EditorBrowsable(EditorBrowsableState.Never)] + public ImageView GetCurrentTrack(SwitchExtension extension) + { + return (extension == Extension) ? Track : null; + } + + /// + /// Get current thumb part to the attached SwitchExtension. + /// + /// + /// It returns null if the passed extension is invaild. + /// + /// The extension instance that is currently attached to this Switch. + /// The switch's thumb part. + [EditorBrowsable(EditorBrowsableState.Never)] + public ImageView GetCurrentThumb(SwitchExtension extension) + { + return (extension == Extension) ? Thumb : null; + } } } diff --git a/src/Tizen.NUI.Components/PreloadStyle/DefaultSwitchStyle.cs b/src/Tizen.NUI.Components/PreloadStyle/DefaultSwitchStyle.cs index 676a2d3..ee88c91 100755 --- a/src/Tizen.NUI.Components/PreloadStyle/DefaultSwitchStyle.cs +++ b/src/Tizen.NUI.Components/PreloadStyle/DefaultSwitchStyle.cs @@ -35,19 +35,19 @@ namespace Tizen.NUI.Components Size = new Size(96, 60), Track = new ImageViewStyle { + Size = new Size(96, 60), ResourceUrl = new Selector { Normal = DefaultStyle.GetResourcePath("nui_component_default_switch_track_n.png"), Selected = DefaultStyle.GetResourcePath("nui_component_default_switch_track_s.png"), Disabled = DefaultStyle.GetResourcePath("nui_component_default_switch_track_d.png"), DisabledSelected = DefaultStyle.GetResourcePath("nui_component_default_switch_track_ds.png"), - } + }, + Border = new Rectangle(30, 30, 30, 30), }, Thumb = new ImageViewStyle { - WidthResizePolicy = ResizePolicyType.DimensionDependency, - HeightResizePolicy = ResizePolicyType.SizeRelativeToParent, - SizeModeFactor = new Vector3(1, 1, 1), + Size = new Size(60, 60), ResourceUrl = new Selector { Normal = DefaultStyle.GetResourcePath("nui_component_default_switch_thumb_n.png"), diff --git a/src/Tizen.NUI.Components/Style/ButtonStyle.cs b/src/Tizen.NUI.Components/Style/ButtonStyle.cs index c3f8e1e..1056d9e 100755 --- a/src/Tizen.NUI.Components/Style/ButtonStyle.cs +++ b/src/Tizen.NUI.Components/Style/ButtonStyle.cs @@ -14,10 +14,10 @@ * limitations under the License. * */ -using System.Collections.Generic; using System.ComponentModel; using Tizen.NUI.BaseComponents; using Tizen.NUI.Binding; +using Tizen.NUI.Components.Extension; namespace Tizen.NUI.Components { @@ -255,6 +255,18 @@ namespace Tizen.NUI.Components } } + /// + /// Create corresponding ButtonExtension. + /// This is to be called by a Button. + /// You may override this function to customize button's behavior. + /// + /// The new ButtonExtension instance. + [EditorBrowsable(EditorBrowsableState.Never)] + public virtual ButtonExtension CreateExtension() + { + return null; + } + private void InitSubStyle() { Overlay = new ImageViewStyle() @@ -284,10 +296,10 @@ namespace Tizen.NUI.Components PositionUsesPivotPoint = true, ParentOrigin = Tizen.NUI.ParentOrigin.Center, PivotPoint = Tizen.NUI.PivotPoint.Center, - WidthResizePolicy = ResizePolicyType.FitToChildren, - HeightResizePolicy = ResizePolicyType.FitToChildren, }; Icon.PropertyChanged += SubStyleCalledEvent; + + IconRelativeOrientation = Button.IconOrientation.Left; } private void SubStyleCalledEvent(object sender, global::System.EventArgs e) diff --git a/src/Tizen.NUI.Components/Style/Extension/ILottieButtonStyle.cs b/src/Tizen.NUI.Components/Style/Extension/ILottieButtonStyle.cs new file mode 100644 index 0000000..0325344 --- /dev/null +++ b/src/Tizen.NUI.Components/Style/Extension/ILottieButtonStyle.cs @@ -0,0 +1,41 @@ +/* + * Copyright(c) 2019 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Binding; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// Interface that provides style properties for Lottie playing in Button. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public interface ILottieButtonStyle + { + /// + /// Get/Set Lottie resource url. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + string LottieUrl { get; set; } + + /// + /// Get/Set LottieFrameInfo on various action states of attached Button. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + Button.ActionSelector LottieFrameInfo { get; set; } + } +} diff --git a/src/Tizen.NUI.Components/Style/Extension/LottieButtonStyle.cs b/src/Tizen.NUI.Components/Style/Extension/LottieButtonStyle.cs new file mode 100644 index 0000000..d0105be --- /dev/null +++ b/src/Tizen.NUI.Components/Style/Extension/LottieButtonStyle.cs @@ -0,0 +1,81 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Binding; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// LottieButtonStyle implements ILottieButtonStyle interface to support extended ButtonStyle using Lottie. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class LottieButtonStyle : ButtonStyle, ILottieButtonStyle + { + static LottieButtonStyle() + { + } + + /// + /// Create new instance of a LottieButtonStyle. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieButtonStyle() : base() + { + } + + /// + /// Copy constructor. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieButtonStyle(LottieButtonStyle style) : base(style) + { + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public string LottieUrl { get; set; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Button.ActionSelector LottieFrameInfo { get; set; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override void CopyFrom(BindableObject bindableObject) + { + base.CopyFrom(bindableObject); + + LottieButtonStyle style = bindableObject as LottieButtonStyle; + + if (style == null) + { + return; + } + + LottieUrl = style.LottieUrl; + LottieFrameInfo = style.LottieFrameInfo; + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override ButtonExtension CreateExtension() + { + return new LottieButtonExtension(); + } + } +} diff --git a/src/Tizen.NUI.Components/Style/Extension/LottieSwitchStyle.cs b/src/Tizen.NUI.Components/Style/Extension/LottieSwitchStyle.cs new file mode 100644 index 0000000..d768afe --- /dev/null +++ b/src/Tizen.NUI.Components/Style/Extension/LottieSwitchStyle.cs @@ -0,0 +1,85 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Binding; + +namespace Tizen.NUI.Components.Extension +{ + /// + /// LottieSwitchStyle implements ILottieButtonStyle interface to support extended ButtonStyle using Lottie. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class LottieSwitchStyle : SwitchStyle, ILottieButtonStyle + { + static LottieSwitchStyle() + { + } + + /// + /// Create new instance of a LottieButtonStyle. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieSwitchStyle() : base() + { + } + + /// + /// Copy constructor. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieSwitchStyle(LottieSwitchStyle style) : base(style) + { + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public string LottieUrl { get; set; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Button.ActionSelector LottieFrameInfo { get; set; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override void CopyFrom(BindableObject bindableObject) + { + base.CopyFrom(bindableObject); + + LottieSwitchStyle style = bindableObject as LottieSwitchStyle; + + if (style == null) + { + return; + } + + LottieUrl = style.LottieUrl; + LottieFrameInfo = style.LottieFrameInfo; + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override ButtonExtension CreateExtension() + { + return new LottieSwitchExtension(); + } + + private void InitSubStyle() + { + } + } +} diff --git a/src/Tizen.NUI.Components/Style/SwitchStyle.cs b/src/Tizen.NUI.Components/Style/SwitchStyle.cs index dee1443..c424b0d 100755 --- a/src/Tizen.NUI.Components/Style/SwitchStyle.cs +++ b/src/Tizen.NUI.Components/Style/SwitchStyle.cs @@ -17,6 +17,7 @@ using System.ComponentModel; using Tizen.NUI.BaseComponents; using Tizen.NUI.Binding; +using Tizen.NUI.Components.Extension; namespace Tizen.NUI.Components { @@ -91,6 +92,13 @@ namespace Tizen.NUI.Components } } + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override ButtonExtension CreateExtension() + { + return new SlidingSwitchExtension(); + } + private void InitSubStyle() { Track = new ImageViewStyle() diff --git a/src/Tizen.NUI.Components/Utils/StyleManager.cs b/src/Tizen.NUI.Components/Utils/StyleManager.cs index e583b2c..6f4b397 100755 --- a/src/Tizen.NUI.Components/Utils/StyleManager.cs +++ b/src/Tizen.NUI.Components/Utils/StyleManager.cs @@ -60,7 +60,7 @@ namespace Tizen.NUI.Components /// StyleManager static instance. /// /// 8 - public static StyleManager Instance { get; } = new StyleManager(); + public static StyleManager Instance { get; internal set; } = new StyleManager(); /// /// Style theme. diff --git a/src/Tizen.NUI.Wearable/Tizen.NUI.Wearable.csproj b/src/Tizen.NUI.Wearable/Tizen.NUI.Wearable.csproj index c45cd7c..57dd66e 100755 --- a/src/Tizen.NUI.Wearable/Tizen.NUI.Wearable.csproj +++ b/src/Tizen.NUI.Wearable/Tizen.NUI.Wearable.csproj @@ -8,6 +8,13 @@ + + + + + + PreserveNewest + \ No newline at end of file diff --git a/src/Tizen.NUI.Wearable/res/nui_wearable_checkbox_icon.json b/src/Tizen.NUI.Wearable/res/nui_wearable_checkbox_icon.json new file mode 100755 index 0000000..3074f69 --- /dev/null +++ b/src/Tizen.NUI.Wearable/res/nui_wearable_checkbox_icon.json @@ -0,0 +1 @@ +{"v":"5.6.6","fr":60,"ip":0,"op":40,"w":76,"h":76,"nm":"Basic/03_CONTROLLERS/Check_on","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Left_Arrow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-45,"ix":10},"p":{"a":0,"k":[30.125,50.375,0],"ix":2},"a":{"a":0,"k":[-18.729,9.537,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[100,100,100]},{"t":27,"s":[100,0,100]}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6,24],"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":[1,1,1,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":[1,0,0,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":[-18.5,0.875],"ix":2},"a":{"a":0,"k":[0.125,0.25],"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":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Right_Arrow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":45,"ix":10},"p":{"a":0,"k":[28.188,52.687,0],"ix":2},"a":{"a":0,"k":[-18.11,12.984,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":21,"s":[100,100,100]},{"t":27,"s":[100,0,100]}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[6,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":"st","c":{"a":0,"k":[1,1,1,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":[1,0,0,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":[-18.125,-8.875],"ix":2},"a":{"a":0,"k":[0.125,0.25],"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":180,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Arrow","td":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":[38,38,0],"ix":2},"a":{"a":0,"k":[38,38,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":76,"h":76,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Circle_BG 2","tt":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[100]},{"t":38,"s":[0]}],"ix":11,"x":"var $bm_rt;\nvar easingPreset = [\n [\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ],\n [\n 3,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]\n ];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.5,41,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[67,67],"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":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.258823543787,0.592156887054,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":[-3.562,-3.062],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[113.244,113.244],"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":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[39.125,40.875,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[72,72],"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.631372570992,0.631372570992,0.631372570992,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,0,0,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-1.562,-3.188],"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":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/Tizen.NUI.Wearable/res/nui_wearable_radiobutton_icon.json b/src/Tizen.NUI.Wearable/res/nui_wearable_radiobutton_icon.json new file mode 100755 index 0000000..0adc84f --- /dev/null +++ b/src/Tizen.NUI.Wearable/res/nui_wearable_radiobutton_icon.json @@ -0,0 +1 @@ +{"v":"5.6.6","fr":60,"ip":0,"op":26,"w":64,"h":64,"nm":"[Watch2018] RadioButtonVI_360_json_64x64","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"checkbox_center_circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":210.16,"s":[100]},{"t":222.2265625,"s":[0]}],"ix":11,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n var i = 0;\n for (; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[31.625,32.625,0],"ix":2},"a":{"a":0,"k":[126.125,0.875,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[40,40,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":25,"s":[40,40,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":210.16,"s":[100,100,100]},{"t":222.2265625,"s":[40,40,100]}],"ix":6,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 4,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n var expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n var i = 0;\n for (; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[26,26],"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.301960796118,0.811764717102,1,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.301960796118,0.678431391716,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":[126.125,0.875],"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":459.535523150194,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Outline","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-94.625,30.25,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[58,58],"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":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.501960813999,0.501960813999,0.501960813999,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0.301960796118,0.678431391716,1,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0.301960796118,0.678431391716,1,1]},{"t":25,"s":[0.501960813999,0.501960813999,0.501960813999,1]}],"ix":3,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 2,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"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.760784327984,0.164090722799,0.164090722799,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126,2.375],"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":459.535101979252,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/Tizen.NUI.Wearable/res/nui_wearable_switch_icon.json b/src/Tizen.NUI.Wearable/res/nui_wearable_switch_icon.json new file mode 100755 index 0000000..e52990b --- /dev/null +++ b/src/Tizen.NUI.Wearable/res/nui_wearable_switch_icon.json @@ -0,0 +1 @@ +{"v":"5.6.6","fr":60,"ip":0,"op":37,"w":86,"h":86,"nm":"Switch_onoff_json","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Switch_Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[18.5,44.25,0],"to":[4.979,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[48.375,44.25,0],"to":[0,0,0],"ti":[4.979,0,0]},{"t":36,"s":[18.5,44.25,0]}],"ix":2,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[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":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.631372570992,0.631372570992,0.631372570992,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0.258823543787,0.592156887054,1,1]},{"t":36,"s":[0.631372570992,0.631372570992,0.631372570992,1]}],"ix":3,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"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,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"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":[9.75,-1.75],"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":120,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Switch_RoundRect_BG","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43,43,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[115,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40.5,28.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.631372570992,0.631372570992,0.631372570992,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":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.631372570992,0.631372570992,0.631372570992,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0.258823543787,0.592156887054,1,1]},{"t":36,"s":[0.631372570992,0.631372570992,0.631372570992,1]}],"ix":4,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[100]},{"t":36,"s":[0]}],"ix":5,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[161.453,161.453],"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":120,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Switch_RoundRect_BG_Outline","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43,43,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[115,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[40.5,28.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.631372570992,0.631372570992,0.631372570992,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[0.258823543787,0.592156887054,1,1]},{"t":36,"s":[0.631372570992,0.631372570992,0.631372570992,1]}],"ix":3,"x":"var $bm_rt;\nvar easingPreset = [[\n 1,\n 3,\n [\n 'make_bezier_easing',\n [\n 0.25,\n 0.46,\n 0.45,\n 1\n ],\n 'Glide.Out',\n false\n ]\n ]];\nfunction easingMaker() {\n var t, d, newProgress, i;\n var n = 0;\n if (numKeys > 0) {\n n = nearestKey(time).index;\n if (key(n).time > time) {\n n--;\n }\n }\n try {\n var key1 = key(n);\n var key2 = key($bm_sum(n, 1));\n } catch (e) {\n return null;\n }\n var expression = null;\n for (var i = 0; i < easingPreset.length; ++i) {\n if (easingPreset[i][0] <= n && easingPreset[i][1] >= n + 1) {\n expression = eval([easingPreset[i][2][0]][0]);\n try {\n expression = expression.apply({}, easingPreset[i][2][1].concat(easingPreset[i][2][3]));\n } catch (e) {\n expression = expression.apply({}, easingPreset[i][2][1]);\n }\n break;\n }\n }\n if (!expression)\n return null;\n var dim = 1;\n try {\n do {\n key(1)[dim];\n } while (++dim);\n } catch (e) {\n }\n t = $bm_sub(time, key1.time);\n d = $bm_sub(key2.time, key1.time);\n if (expression.hasOwnProperty('curviosity') && expression.curviosity || thisProperty.value.constructor === Object) {\n newProgress = expression.executeProgress($bm_div(t, d));\n return thisProperty.valueAtTime($bm_sum(key1.time, $bm_mul(d, newProgress)));\n }\n if (time < key1.time || time > key2.time) {\n return value;\n }\n var result = [];\n for (i = 0; i < dim; ++i) {\n result.push(expression.execute(t, key1[i], $bm_sub(key2[i], key1[i]), d));\n }\n if (result.length === 1)\n return result[0];\n return result;\n}\n$bm_rt = easingMaker() || value;\nfunction sampleCurveY(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ay, t), this.by), t), this.cy), t);\n}\nfunction sampleCurveX(t) {\n return $bm_mul($bm_sum($bm_mul($bm_sum($bm_mul(this.ax, t), this.bx), t), this.cx), t);\n}\nfunction sampleCurveDerivativeX(t) {\n return $bm_sum($bm_mul($bm_sum($bm_mul($bm_mul(3, this.ax), t), $bm_mul(2, this.bx)), t), this.cx);\n}\nfunction solveCurveX(x, epsilon) {\n var t2, i, x2, d2, t0, t1;\n for (t2 = x, i = 0; i < 8; i++) {\n x2 = $bm_sub(sampleCurveX.call(this, t2), x);\n if (Math.abs(x2) < epsilon)\n return t2;\n d2 = sampleCurveDerivativeX.call(this, t2);\n if (Math.abs(d2) < 0.000001)\n break;\n t2 = $bm_sub(t2, $bm_div(x2, d2));\n }\n t0 = 0;\n t1 = 1;\n t2 = x;\n if (t2 < t0)\n return t0;\n if (t2 > t1)\n return t1;\n while (t0 < t1) {\n x2 = sampleCurveX.call(this, t2);\n if (Math.abs(x2 - x) < epsilon)\n return t2;\n if (x > x2)\n t0 = t2;\n else\n t1 = t2;\n t2 = $bm_sum($bm_mul($bm_sub(t1, t0), 0.5), t0);\n }\n return t2;\n}\nfunction executeBezier(t, b, e, d) {\n return $bm_sum(b, $bm_mul(e, sampleCurveY.call(this, solveCurveX.call(this, $bm_div(t, d), $bm_div(1, $bm_mul(200, d))))));\n}\nfunction executeBezierProgress(oldProgress) {\n return sampleCurveY.call(this, solveCurveX.call(this, oldProgress, 1 / 200));\n}\nfunction make_bezier_easing(p1x, p1y, p2x, p2y, curviosity) {\n this.cx = $bm_mul(3, p1x);\n this.bx = $bm_sub($bm_mul(3, $bm_sub(p2x, p1x)), this.cx);\n this.ax = $bm_sub($bm_sub(1, this.cx), this.bx);\n this.cy = $bm_mul(3, p1y);\n this.by = $bm_sub($bm_mul(3, $bm_sub(p2y, p1y)), this.cy);\n this.ay = $bm_sub($bm_sub(1, this.cy), this.by);\n this.curviosity = curviosity;\n this.execute = executeBezier;\n this.executeProgress = executeBezierProgress;\n return this;\n}\nfunction executeElasticIn(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_neg($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n}\nfunction executeElasticOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d) === 1)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n return $bm_sum($bm_sum($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), c), b);\n}\nfunction executeElasticInOut(t, b, c, d) {\n var s = 1.70158;\n var p = 0;\n var a = c;\n if (t === 0)\n return b;\n if ((t /= d / 2) === 2)\n return $bm_sum(b, c);\n if (!p)\n p = $bm_mul(d, 0.3 * 1.5);\n if (a < Math.abs(c)) {\n a = c;\n s = $bm_div(p, 4);\n } else\n s = $bm_mul($bm_div(p, $bm_mul(2, Math.PI)), Math.asin(1));\n if (t < 1)\n return $bm_sum($bm_mul(-0.5, $bm_mul($bm_mul(a, Math.pow(2, $bm_mul(10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p)))), b);\n return $bm_sum($bm_sum($bm_mul($bm_mul($bm_mul(a, Math.pow(2, $bm_mul(-10, t -= 1))), Math.sin($bm_div($bm_mul($bm_sub($bm_mul(t, d), s), $bm_mul(2, Math.PI)), p))), 0.5), c), b);\n}\nfunction executeElasticInProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : -Math.pow(2, 10 * Progress - 10) * Math.sin((Progress * 10 - 10.75) * (2 * Math.PI / 3));\n}\nfunction executeElasticOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Math.pow(2, -10 * Progress) * Math.sin((Progress * 10 - 0.75) * (2 * Math.PI / 3)) + 1;\n}\nfunction executeElasticInOutProgress(Progress) {\n return Progress === 0 ? 0 : Progress === 1 ? 1 : Progress < 0.5 ? -(Math.pow(2, 20 * Progress - 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5))) / 2 : Math.pow(2, -20 * Progress + 10) * Math.sin((20 * Progress - 11.125) * (2 * Math.PI / 4.5)) / 2 + 1;\n}\nfunction make_elastic_easing_in(curviosity) {\n this.execute = executeElasticIn;\n this.executeProgress = executeElasticInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_out(curviosity) {\n this.execute = executeElasticOut;\n this.executeProgress = executeElasticOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_elastic_easing_in_out(curviosity) {\n this.execute = executeElasticInOut;\n this.executeProgress = executeElasticInOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction executeBounceIn(t, b, c, d) {\n return $bm_sum($bm_sub(c, executeBounceOut($bm_sub(d, t), 0, c, d)), b);\n}\nfunction executeBounceOut(t, b, c, d) {\n if ((t /= d) < 1 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_mul($bm_mul(7.5625, t), t)), b);\n } else if (t < 2 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 1.5 / 2.75), t), 0.75)), b);\n } else if (t < 2.5 / 2.75) {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.25 / 2.75), t), 0.9375)), b);\n } else {\n return $bm_sum($bm_mul(c, $bm_sum($bm_mul($bm_mul(7.5625, t -= 2.625 / 2.75), t), 0.984375)), b);\n }\n}\nfunction executeBounceInOut(t, b, c, d) {\n if (t < $bm_div(d, 2))\n return $bm_sum($bm_mul(executeBounceIn($bm_mul(t, 2), 0, c, d), 0.5), b);\n return $bm_sum($bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(t, 2), d), 0, c, d), 0.5), $bm_mul(c, 0.5)), b);\n}\nfunction executeBounceInProgress(oldProgress) {\n return $bm_sub(1, executeBounceOut($bm_sub(1, oldProgress)));\n}\nfunction executeBounceOutProgress(oldProgress) {\n if (oldProgress < 1 / 2.75) {\n return $bm_mul($bm_mul(7.5625, oldProgress), oldProgress);\n } else if (oldProgress < 2 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 1.5 / 2.75), oldProgress), 0.75);\n } else if (oldProgress < 2.5 / 2.75) {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.25 / 2.75), oldProgress), 0.9375);\n } else {\n return $bm_sum($bm_mul($bm_mul(7.5625, oldProgress -= 2.625 / 2.75), oldProgress), 0.984375);\n }\n}\nfunction executeBounceInOutProgress(oldProgress) {\n if (oldProgress < 1 / 2)\n return $bm_mul(executeBounceIn($bm_mul(oldProgress, 2)), 0.5);\n return $bm_sum($bm_mul(executeBounceOut($bm_sub($bm_mul(oldProgress, 2), 1)), 0.5), 0.5);\n}\nfunction make_bounce_easing_in(curviosity) {\n this.execute = executeBounceIn;\n this.executeProgress = executeBounceInProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_out(curviosity) {\n this.execute = executeBounceOut;\n this.executeProgress = executeBounceOutProgress;\n this.curviosity = curviosity;\n return this;\n}\nfunction make_bounce_easing_in_out(curviosity) {\n this.execute = executeBounceInOut;\n this.executeProgress = executeBounceInOutProgress;\n this.curviosity = curviosity;\n return this;\n}"},"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,0,0,1],"ix":4},"o":{"a":0,"k":0,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[161.453,161.453],"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":120,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/Tizen.NUI.Wearable/src/public/Style/OverlayAnimationButtonStyle.cs b/src/Tizen.NUI.Wearable/src/public/Style/OverlayAnimationButtonStyle.cs new file mode 100644 index 0000000..72d8c19 --- /dev/null +++ b/src/Tizen.NUI.Wearable/src/public/Style/OverlayAnimationButtonStyle.cs @@ -0,0 +1,165 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using Tizen.NUI.Components.Extension; + +namespace Tizen.NUI.Wearable +{ + /// + /// Describes Button Animation used in OneUI_Watch2.X + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class OverlayAnimationButtonStyle : ButtonStyle + { + /// + /// Constructor + /// + public OverlayAnimationButtonStyle() : base() + { + CornerRadius = 10; + BackgroundColor = new Color(0.3f, 0.3f, 0.3f, 0.5f); + // PositionUsesPivotPoint = true; + IconRelativeOrientation = Button.IconOrientation.Top; + Text = new TextLabelStyle + { + FontFamily = "SamsungOne 700", + PixelSize = 20, + TextColor = new Selector + { + Normal = new Color(1, 1, 1, 0.70f), + Pressed = new Color(1, 1, 1, 0.60f), + Disabled = new Color(1, 1, 1, 0.40f), + }, + HorizontalAlignment = HorizontalAlignment.Center, + VerticalAlignment = VerticalAlignment.Center, + }; + Icon = new ImageViewStyle + { + WidthResizePolicy = ResizePolicyType.SizeRelativeToParent, + HeightResizePolicy = ResizePolicyType.SizeRelativeToParent, + SizeModeFactor = new Vector3(0.35f, 0.35f, 0.35f), + Opacity = new Selector + { + Normal = 0.7f, + Pressed = 0.5f + } + }; + Opacity = new Selector + { + Disabled = 0.3f, + Other = 1.0f + }; + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override ButtonExtension CreateExtension() + { + return new OverlayAnimationButtonExtension(); + } + } + + /// + /// OverlayAnimationButtonExtension class is a extended ButtonExtension class that make the overlay image blinking on a Button pressed. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class OverlayAnimationButtonExtension : ButtonExtension + { + private Animation PressAnimation { get; set; } + + /// + /// Creates a new instance of a OverlayAnimationButtonExtension. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public OverlayAnimationButtonExtension() : base() + { + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override ImageView OnCreateOverlayImage(Button button, ImageView overlayImage) + { + overlayImage.Hide(); + + return overlayImage; + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo) + { + if (button.ControlState != ControlStates.Pressed) + { + return; + } + + var overlayImage = button.GetCurrentOverlayImage(this); + + if (overlayImage == null) + { + return; + } + + if (null == PressAnimation) + { + var keyFrames = new KeyFrames(); + keyFrames.Add(0.0f, 0.0f); + keyFrames.Add(0.25f, 1.0f, new AlphaFunction(AlphaFunction.BuiltinFunctions.Linear)); + keyFrames.Add(1.0f, 0.0f, new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOut)); + + PressAnimation = new Animation(400); + PressAnimation.EndAction = Animation.EndActions.StopFinal; + PressAnimation.AnimateBetween(overlayImage, "Opacity", keyFrames); + PressAnimation.AnimateTo(overlayImage, "Scale", new Vector3(1, 1, 1), 0, 300, new AlphaFunction(AlphaFunction.BuiltinFunctions.EaseOut)); + } + + if (PressAnimation.State == Animation.States.Playing) + { + PressAnimation.Stop(); + overlayImage.Hide(); + } + + overlayImage.Opacity = 0.0f; + overlayImage.CornerRadius = button.CornerRadius; + overlayImage.Background = button.Background; + overlayImage.Size = button.Size; + overlayImage.Scale = new Vector3(0.86f, 0.86f, 1); + overlayImage.Show(); + + PressAnimation.Play(); + } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public override void OnDispose(Button button) + { + if (PressAnimation == null) + { + return; + } + + if (PressAnimation.State == Animation.States.Playing) + { + PressAnimation.Stop(); + } + PressAnimation.Dispose(); + PressAnimation = null; + } + } +} \ No newline at end of file diff --git a/src/Tizen.NUI.Wearable/src/public/Style/WearableButtonStyle.cs b/src/Tizen.NUI.Wearable/src/public/Style/WearableButtonStyle.cs new file mode 100644 index 0000000..7548652 --- /dev/null +++ b/src/Tizen.NUI.Wearable/src/public/Style/WearableButtonStyle.cs @@ -0,0 +1,65 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; + +namespace Tizen.NUI.Wearable +{ + /// + /// A predefined style class for Wearable buttons. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WearableButtonStyle : ButtonStyle + { + /// + /// Creates a new class instance. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public WearableButtonStyle() : base() + { + Size = new Size(210, 72); + CornerRadius = 36; + BackgroundColor = new Selector + { + Normal = new Color(0, 42f/255f, 77f/255f, 0.85f), + Pressed = new Color(0, 70f/255f, 128f/255f, 0.70f), + Disabled = new Color(61f/255f, 61f/255f, 61f/255f, 0.85f), + }; + Text = new TextLabelStyle + { + FontFamily = "SamsungOne 700", + PixelSize = 28, + TextColor = new Selector + { + Normal = new Color(56f/255f, 164f/255f, 252f/255f, 1), + Pressed = new Color(56f/255f, 164f/255f, 252f/255f, 1), + Disabled = new Color(1, 1, 1, 0.35f), + }, + Padding = new Extents(20, 20, 0, 0), + VerticalAlignment = VerticalAlignment.Center, + HorizontalAlignment = HorizontalAlignment.Center, + }; + Opacity = new Selector + { + Other = 1.0f, + Pressed = 0.6f, + Disabled = 0.3f, + }; + } + } +} diff --git a/src/Tizen.NUI.Wearable/src/public/Style/WearableCheckBoxStyle.cs b/src/Tizen.NUI.Wearable/src/public/Style/WearableCheckBoxStyle.cs new file mode 100644 index 0000000..6c7ca28 --- /dev/null +++ b/src/Tizen.NUI.Wearable/src/public/Style/WearableCheckBoxStyle.cs @@ -0,0 +1,50 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using Tizen.NUI.Components.Extension; + +namespace Tizen.NUI.Wearable +{ + /// + /// A predefined style class for Wearable check boxes. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WearableCheckBoxStyle : LottieButtonStyle + { + /// + /// Creates a new class instance. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public WearableCheckBoxStyle() : base() + { + LottieUrl = WearableStyle.GetResourcePath("nui_wearable_checkbox_icon.json"); + LottieFrameInfo = new Button.ActionSelector + { + OnSelect = (0, 18), + OnUnselect = (19, 36) + }; + Opacity = new Selector + { + Other = 1.0f, + Pressed = 0.6f, + Disabled = 0.3f, + }; + } + } +} diff --git a/src/Tizen.NUI.Wearable/src/public/Style/WearableRadioButtonStyle.cs b/src/Tizen.NUI.Wearable/src/public/Style/WearableRadioButtonStyle.cs new file mode 100644 index 0000000..f7b1eaf --- /dev/null +++ b/src/Tizen.NUI.Wearable/src/public/Style/WearableRadioButtonStyle.cs @@ -0,0 +1,50 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using Tizen.NUI.Components.Extension; + +namespace Tizen.NUI.Wearable +{ + /// + /// A predefined style class for Wearable radio buttons. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WearableRadioButtonStyle : LottieButtonStyle + { + /// + /// Creates a new class instance. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public WearableRadioButtonStyle() : base() + { + LottieUrl = WearableStyle.GetResourcePath("nui_wearable_radiobutton_icon.json"); + LottieFrameInfo = new Button.ActionSelector + { + OnSelect = (0, 12), + OnUnselect = (13, 25) + }; + Opacity = new Selector + { + Other = 1.0f, + Pressed = 0.6f, + Disabled = 0.3f, + }; + } + } +} diff --git a/src/Tizen.NUI.Wearable/src/public/Style/WearableStyle.cs b/src/Tizen.NUI.Wearable/src/public/Style/WearableStyle.cs new file mode 100644 index 0000000..89d8b09 --- /dev/null +++ b/src/Tizen.NUI.Wearable/src/public/Style/WearableStyle.cs @@ -0,0 +1,33 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; + +namespace Tizen.NUI.Wearable +{ + /// + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WearableStyle + { + static internal string GetResourcePath(string filename) + { + return "/usr/share/dotnet.tizen/framework/res/" + filename; + } + } +} diff --git a/src/Tizen.NUI.Wearable/src/public/Style/WearableSwitchStyle.cs b/src/Tizen.NUI.Wearable/src/public/Style/WearableSwitchStyle.cs new file mode 100644 index 0000000..8952bd2 --- /dev/null +++ b/src/Tizen.NUI.Wearable/src/public/Style/WearableSwitchStyle.cs @@ -0,0 +1,50 @@ +/* + * Copyright(c) 2020 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +using System.ComponentModel; +using Tizen.NUI.BaseComponents; +using Tizen.NUI.Components; +using Tizen.NUI.Components.Extension; + +namespace Tizen.NUI.Wearable +{ + /// + /// A predefined style class for Wearable switches. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class WearableSwitchStyle : LottieSwitchStyle + { + /// + /// Creates a new class instance. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public WearableSwitchStyle() : base() + { + LottieUrl = WearableStyle.GetResourcePath("nui_wearable_switch_icon.json"); + LottieFrameInfo = new Button.ActionSelector + { + OnSelect = (0, 18), + OnUnselect = (19, 36) + }; + Opacity = new Selector + { + Other = 1.0f, + Pressed = 0.6f, + Disabled = 0.3f, + }; + } + } +} diff --git a/src/Tizen.NUI/Properties/AssemblyInfo.cs b/src/Tizen.NUI/Properties/AssemblyInfo.cs index 4310065..04f6657 100755 --- a/src/Tizen.NUI/Properties/AssemblyInfo.cs +++ b/src/Tizen.NUI/Properties/AssemblyInfo.cs @@ -3,6 +3,7 @@ using System.Runtime.CompilerServices; using Tizen.NUI; [assembly: InternalsVisibleTo("Tizen.NUI.Design, Publickey=0024000004800000940000000602000000240000525341310004000001000100d115b1004248416b12d21b626cfb17149c9303fe394693fd3b32d7872e89559a4fa96c98110c2e62eea48aca693bddbe17094ca8ea2e2cd79970ca590fb672b9b371b5d7002076817321f62d6483ea50c56dbd1f37b185a4c24c47718876e6ae6d266508c551170d4cbdda3f82edaff9405ee3d7857282d8269e8e518d2f0fb2")] +[assembly: InternalsVisibleTo("Tizen.NUI.Components, Publickey=0024000004800000940000000602000000240000525341310004000001000100d115b1004248416b12d21b626cfb17149c9303fe394693fd3b32d7872e89559a4fa96c98110c2e62eea48aca693bddbe17094ca8ea2e2cd79970ca590fb672b9b371b5d7002076817321f62d6483ea50c56dbd1f37b185a4c24c47718876e6ae6d266508c551170d4cbdda3f82edaff9405ee3d7857282d8269e8e518d2f0fb2")] // Xamarin.Forms.Loader.dll Xamarin.Forms.Xaml.XamlLoader.Load(object, string), kzu@microsoft.com [assembly: XmlnsDefinition("http://tizen.org/Tizen.NUI/2018/XAML", "Tizen.NUI")] diff --git a/src/Tizen.NUI/src/public/BaseComponents/LottieAnimationView.cs b/src/Tizen.NUI/src/public/BaseComponents/LottieAnimationView.cs index a38a43b..a0958fc 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/LottieAnimationView.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/LottieAnimationView.cs @@ -831,4 +831,115 @@ namespace Tizen.NUI.BaseComponents } #endregion Private } + + /// + /// A class containing frame informations for a LottieAnimationView. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public class LottieFrameInfo + { + /// + /// Creates a new instance with a playing range. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieFrameInfo(int startFrame, int endFrame) + { + StartFrame = startFrame; + EndFrame = endFrame; + } + + /// + /// Creates a new instance with a still image frame. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public LottieFrameInfo(int stillImageFrame) : this(stillImageFrame, stillImageFrame) + { + } + + /// + /// Create a new instance from a pair notation. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public static implicit operator LottieFrameInfo((int, int) pair) + { + return new LottieFrameInfo(pair.Item1, pair.Item2); + } + + /// + /// Create a new instance from an int value. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public static implicit operator LottieFrameInfo(int stillImageFrame) + { + return new LottieFrameInfo(stillImageFrame); + } + + /// + /// The start frame of the lottie animation. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public int StartFrame { get; } + + /// + /// The end frame of the lottie animation. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public int EndFrame { get; } + + /// + /// Create LottieFrameInfo struct with animation range information + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public static LottieFrameInfo CreateAnimationRange(int startFrame, int endFrame) + { + return new LottieFrameInfo(startFrame, endFrame); + } + + /// + /// Create LottieFrameInfo struct with still image information + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public static LottieFrameInfo CreateStillImage(int stillImageFrame) + { + return new LottieFrameInfo(stillImageFrame, stillImageFrame); + } + + internal bool IsStillImage() + { + return StartFrame == EndFrame; + } + + internal void Show(LottieAnimationView lottieView, bool noPlay = false) + { + if (!BeReadyToShow(lottieView)) + { + return; + } + + lottieView.SetMinMaxFrame(StartFrame, Math.Min(EndFrame, lottieView.TotalFrame - 1)); + lottieView.CurrentFrame = StartFrame; + + if (!noPlay && !IsStillImage()) + { + lottieView.Play(); + } + } + + private bool BeReadyToShow(LottieAnimationView lottieView) + { + // Validate input lottieView + if (null== lottieView || lottieView.PlayState == LottieAnimationView.PlayStateType.Invalid) + { + return false; + } + + // Stop if it was playing + if (lottieView.PlayState == LottieAnimationView.PlayStateType.Playing) + { + lottieView.Stop(); + } + + return true; + } + } } \ No newline at end of file diff --git a/src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs b/src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs index 7638e39..01a016f 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs @@ -187,9 +187,9 @@ namespace Tizen.NUI.BaseComponents case ControlStates.DisabledFocused: return DisabledFocused != null? DisabledFocused : Other; case ControlStates.DisabledSelected: - return DisabledSelected != null? DisabledSelected : Other; + return DisabledSelected != null ? DisabledSelected : (Disabled != null ? Disabled : Other); case ControlStates.SelectedFocused: - return SelectedFocused != null ? SelectedFocused : Other; + return SelectedFocused != null ? SelectedFocused : (Selected != null ? Selected : Other); default: return Other; } diff --git a/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs b/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs index bb05335..222b9a0 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs @@ -1408,6 +1408,19 @@ namespace Tizen.NUI.BaseComponents set => SetValue(CornerRadiusProperty, value); } + internal ViewStyle CreateInstance() + { + return (ViewStyle)Activator.CreateInstance(GetType());; + } + + internal ViewStyle Clone() + { + var cloned = CreateInstance(); + cloned.CopyFrom(this); + + return cloned; + } + private void OnPaddingChanged(ushort start, ushort end, ushort top, ushort bottom) { Padding = new Extents(start, end, top, bottom); diff --git a/src/Tizen.NUI/src/public/BaseComponents/View.cs b/src/Tizen.NUI/src/public/BaseComponents/View.cs index 5342bf9..192cadd 100755 --- a/src/Tizen.NUI/src/public/BaseComponents/View.cs +++ b/src/Tizen.NUI/src/public/BaseComponents/View.cs @@ -126,7 +126,14 @@ namespace Tizen.NUI.BaseComponents internal View(global::System.IntPtr cPtr, bool cMemoryOwn, ViewStyle viewStyle, bool shown = true) : this(cPtr, cMemoryOwn, shown) { - this.ViewStyle.CopyFrom(viewStyle); + if (this.viewStyle == null) + { + ApplyStyle((viewStyle == null) ? GetViewStyle() : viewStyle.Clone()); + } + else + { + this.viewStyle.CopyFrom(viewStyle); + } } internal View(global::System.IntPtr cPtr, bool cMemoryOwn, bool shown = true) : base(Interop.View.View_SWIGUpcast(cPtr), cMemoryOwn) @@ -173,21 +180,38 @@ namespace Tizen.NUI.BaseComponents } set { - if (controlStates != value) - { - controlStates = value; + SetControlState(value, null); + } + } - ControlStateChangeEvent?.Invoke(this, value); + /// + /// Set ControlState with specified change environment + /// + /// New state value + /// The touch information in case the state has changed by touching. + /// True, if the state changed successfully. + internal bool SetControlState(ControlStates state, Touch touchInfo) + { + if (controlStates == state) + { + return false; + } - if (true == OnControlStateChanged(value)) - { - foreach (View child in Children) - { - child.ControlState = value; - } - } + var prevState = controlStates; + + controlStates = state; + + ControlStateChangeEvent?.Invoke(this, state); + + if (OnControlStateChanged(prevState, touchInfo)) + { + foreach (View child in Children) + { + child.SetControlState(state, touchInfo); } } + + return true; } /// This will be public opened in tizen_5.0 after ACR done. Before ACR, need to be hidden as inhouse API. @@ -2277,13 +2301,19 @@ namespace Tizen.NUI.BaseComponents return new ViewStyle(); } - /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API. + /// + /// Called after the View's ControlStates changed. + /// + /// The previous state value + /// The touch information in case the state has changed by touching. + /// True if it needs to apply the state to children recursively. [EditorBrowsable(EditorBrowsableState.Never)] - protected virtual bool OnControlStateChanged(ControlStates currentState) + protected virtual bool OnControlStateChanged(ControlStates previousState, Touch touchInfo) { //If need to apply the state to all child, return true; return true; } + internal static readonly BindableProperty BackgroundImageSelectorProperty = BindableProperty.Create("BackgroundImageSelector", typeof(Selector), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) => { var view = (View)bindable;