[NUI] Introduce Button extentions and styles (#1515)
authorJiyun Yang <ji.yang@samsung.com>
Tue, 7 Apr 2020 11:49:57 +0000 (20:49 +0900)
committerGitHub <noreply@github.com>
Tue, 7 Apr 2020 11:49:57 +0000 (20:49 +0900)
* 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 <ji.yang@samsung.com>
31 files changed:
packaging/PlatformFileList.txt
src/Tizen.NUI.Components/Controls/Button.cs
src/Tizen.NUI.Components/Controls/Extension/ButtonExtension.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Controls/Extension/LottieButtonExtension.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Controls/Extension/LottieSwitchExtension.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Controls/Extension/SlidingSwitchExtension.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Controls/Extension/SwitchExtension.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Controls/RadioButton.cs
src/Tizen.NUI.Components/Controls/Switch.cs
src/Tizen.NUI.Components/PreloadStyle/DefaultSwitchStyle.cs
src/Tizen.NUI.Components/Style/ButtonStyle.cs
src/Tizen.NUI.Components/Style/Extension/ILottieButtonStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Style/Extension/LottieButtonStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Style/Extension/LottieSwitchStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Components/Style/SwitchStyle.cs
src/Tizen.NUI.Components/Utils/StyleManager.cs
src/Tizen.NUI.Wearable/Tizen.NUI.Wearable.csproj
src/Tizen.NUI.Wearable/res/nui_wearable_checkbox_icon.json [new file with mode: 0755]
src/Tizen.NUI.Wearable/res/nui_wearable_radiobutton_icon.json [new file with mode: 0755]
src/Tizen.NUI.Wearable/res/nui_wearable_switch_icon.json [new file with mode: 0755]
src/Tizen.NUI.Wearable/src/public/Style/OverlayAnimationButtonStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Wearable/src/public/Style/WearableButtonStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Wearable/src/public/Style/WearableCheckBoxStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Wearable/src/public/Style/WearableRadioButtonStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Wearable/src/public/Style/WearableStyle.cs [new file with mode: 0644]
src/Tizen.NUI.Wearable/src/public/Style/WearableSwitchStyle.cs [new file with mode: 0644]
src/Tizen.NUI/Properties/AssemblyInfo.cs
src/Tizen.NUI/src/public/BaseComponents/LottieAnimationView.cs
src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs
src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs
src/Tizen.NUI/src/public/BaseComponents/View.cs

index 1d38480..c9e61ea 100755 (executable)
@@ -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
index 6da957d..ec6a25b 100755 (executable)
@@ -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<StateChangedEventArgs> stateChangeHander;
 
         private bool isSelected = false;
         private bool isEnabled = true;
         private bool isPressed = false;
 
+        /// <summary>
+        /// Button's overlay image part.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected ImageView ButtonOverlayImage { get; set; }
+
+        /// <summary>
+        /// Button's text part.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected TextLabel ButtonText { get; set; }
+
+        /// <summary>
+        /// Button's icon part.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected ImageView ButtonIcon { get; set; }
+
+        /// <summary>
+        /// The last touch information triggering selected state change.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected Touch SelectionChangedByTouch { get; set; }
+
+        /// <summary>
+        /// The ButtonExtension instance that is injected by ButtonStyle.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected ButtonExtension Extension { get; set; }
+
+        /// <summary>
+        /// Creates Button's text part.
+        /// </summary>
+        /// <return>The created Button's text part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual TextLabel CreateText()
+        {
+            return new TextLabel();
+        }
+
+        /// <summary>
+        /// Creates Button's icon part.
+        /// </summary>
+        /// <return>The created Button's icon part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual ImageView CreateIcon()
+        {
+            return new ImageView();
+        }
+
+        /// <summary>
+        /// Creates Button's overlay image part.
+        /// </summary>
+        /// <return>The created Button's overlay image part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual ImageView CreateOverlayImage()
+        {
+            return new ImageView();
+        }
+
+        /// <summary>
+        /// Called when the Button is Clicked by a user
+        /// </summary>
+        /// <param name="eventArgs">The click information.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual void OnClick(ClickEventArgs eventArgs)
+        {
+        }
+
         static Button() { }
 
         /// <summary>
@@ -484,9 +549,13 @@ namespace Tizen.NUI.Components
             set
             {
                 isSelected = value;
-                UpdateState();
+
+                UpdateState(SelectionChangedByTouch);
+
+                SelectionChangedByTouch = null;
             }
         }
+
         /// <summary>
         /// Flag to decide enable or disable in Button.
         /// </summary>
@@ -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
         }
 
         /// <summary>
-        /// Tap gesture event callback.
-        /// </summary>
-        /// <param name="source">Source which recieved touch event.</param>
-        /// <param name="e">Tap gesture event argument.</param>
-        /// <since_tizen> 6 </since_tizen>
-        /// 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);
-            }
-        }
-        /// <summary>
         /// Called after a touch event is received by the owning view.<br />
         /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
         /// </summary>
@@ -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);
         }
 
         /// <summary>
         /// Update Button State.
         /// </summary>
+        /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
         /// <since_tizen> 6 </since_tizen>
         /// 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
         /// <since_tizen> 6 </since_tizen>
         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);
+        }
+
         /// <summary>
         /// Measure text, it can be override.
         /// </summary>
@@ -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;
             }
         }
         /// <summary>
@@ -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;
         }
 
+        /// <summary>
+        /// A Selector class that describes Buttons state by actions.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public class ActionSelector<T>
+        {
+            /// <summary>
+            /// Value used when the Button is created.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public T OnCreate { get; set; }
+
+            /// <summary>
+            /// Value used when the Button is selected.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public T OnSelect { get; set; }
+
+            /// <summary>
+            /// Value used when the Button is unselected.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public T OnUnselect { get; set; }
+
+            /// <summary>
+            /// Value used when the Button is disabled.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public T OnDisable { get; set; }
+
+            /// <summary>
+            /// Value used when the Button is disabled in selected state.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public T OnDisableSelected { get; set; }
+
+            /// <summary>
+            /// Value used when the Button is pressed.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public T OnPress { get; set; }
+
+            /// <summary>
+            /// Value used when the Button is pressed in selected state.
+            /// </summary>
+            [EditorBrowsable(EditorBrowsableState.Never)]
+            public T OnPressSelected { get; set; }
+        }
+
+        /// <summary>
+        /// Get current text part to the attached ButtonExtension.
+        /// </summary>
+        /// <remarks>
+        /// It returns null if the passed extension is invaild.
+        /// </remarks>
+        /// <param name="extension">The extension instance that is currently attached to this Button.</param>
+        /// <return>The button's text part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public TextLabel GetCurrentText(ButtonExtension extension)
+        {
+            return (extension == Extension) ? ButtonText : null;
+        }
+
+        /// <summary>
+        /// Get current icon part to the attached ButtonExtension.
+        /// </summary>
+        /// <remarks>
+        /// It returns null if the passed extension is invaild.
+        /// </remarks>
+        /// <param name="extension">The extension instance that is currently attached to this Button.</param>
+        /// <return>The button's icon part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ImageView GetCurrentIcon(ButtonExtension extension)
+        {
+            return (extension == Extension) ? ButtonIcon : null;
+        }
+
+        /// <summary>
+        /// Get current overlay image part to the attached ButtonExtension.
+        /// </summary>
+        /// <remarks>
+        /// It returns null if the passed extension is invaild.
+        /// </remarks>
+        /// <param name="extension">The extension instance that is currently attached to this Button.</param>
+        /// <return>The button's overlay image part.</return>
+        [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 (file)
index 0000000..429b4b9
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// The ButtonExtension class allows developers to access the Button's components and extend their behavior in various states.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public abstract class ButtonExtension
+    {
+        /// <summary>
+        /// Called immediately after the Button creates the text part.
+        /// </summary>
+        /// <param name="button">The Button instance that the extension currently applied to.</param>
+        /// <param name="text">The created Button's text part.</param>
+        /// <return>The refined button text.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual TextLabel OnCreateText(Button button, TextLabel text)
+        {
+            return text;
+        }
+
+        /// <summary>
+        /// Called immediately after the Button creates the icon part.
+        /// </summary>
+        /// <param name="button">The Button instance that the extension currently applied to.</param>
+        /// <param name="icon">The created Button's icon part.</param>
+        /// <return>The refined button icon.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual ImageView OnCreateIcon(Button button, ImageView icon)
+        {
+            return icon;
+        }
+
+        /// <summary>
+        /// Called immediately after the Button creates the overlay image part.
+        /// </summary>
+        /// <param name="button">The Button instance that the extension currently applied to.</param>
+        /// <param name="overlayImage">The created Button's overlayImage part.</param>
+        /// <return>The refined button overlayImage.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual ImageView OnCreateOverlayImage(Button button, ImageView overlayImage)
+        {
+            return overlayImage;
+        }
+
+        /// <summary>
+        /// Describes actions on Button's ControlStates changed.
+        /// </summary>
+        /// <param name="button">The Button instance that the extension currently applied to.</param>
+        /// <param name="previousState">The previous contol state of the Button.</param>
+        /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual void OnControlStateChanged(Button button, ControlStates previousState, Touch touchInfo)
+        {
+        }
+
+        /// <summary>
+        /// Called when the Button is Clicked by a user
+        /// </summary>
+        /// <param name="button">The Button instance that the extension currently applied to.</param>
+        /// <param name="eventArgs">The click event information.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual void OnClick(Button button, Button.ClickEventArgs eventArgs)
+        {
+        }
+
+        /// <summary>
+        /// Called after the size negotiation has been finished for the attached Control.
+        /// </summary>
+        /// <param name="button">The Button instance that the extension currently applied to.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual void OnRelayout(Button button)
+        {
+        }
+
+        /// <summary>
+        /// Called when the attached Button is explicitly disposing.
+        /// </summary>
+        /// <param name="button">The Button instance that the extension currently applied to.</param>
+        [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 (file)
index 0000000..da50bc8
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// LottieButtonExtension is a ButtonExtension class that uses Lottie image for a Button icon.
+    /// <remark>
+    /// This extension must be used within a class implementing LottieButtonStyle.
+    /// </remark>
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class LottieButtonExtension : ButtonExtension
+    {
+        /// <summary>
+        /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieButtonExtension() : base()
+        {
+            LottieView = new LottieAnimationView();
+        }
+
+        /// <summary>
+        /// The Lottie view that will be used as an icon part in a Button.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected LottieAnimationView LottieView { get; set; }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public override ImageView OnCreateIcon(Button button, ImageView icon)
+        {
+            InitializeLottieView(button, LottieView);
+
+            return LottieView;
+        }
+
+        /// <inheritdoc/>
+        [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 (file)
index 0000000..4fdd99f
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// LottieSwitchExtension is a SwitchExtension class that uses Lottie image for a Switch icon.
+    /// <remark>
+    /// This extension must be used within a class implementing LottieSwitchStyle.
+    /// </remark>
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class LottieSwitchExtension : SwitchExtension
+    {
+        /// <summary>
+        /// A constructor that creates LottieButtonExtension with a specified Lottie resource URL
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieSwitchExtension() : base()
+        {
+            LottieView = new LottieAnimationView();
+        }
+
+        /// <summary>
+        /// The Lottie view that will be used as an icon part in a Button.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected LottieAnimationView LottieView { get; set; }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public override ImageView OnCreateIcon(Button button, ImageView icon)
+        {
+            LottieButtonExtension.InitializeLottieView(button, LottieView);
+
+            return LottieView;
+        }
+
+        /// <inheritdoc/>
+        [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 (file)
index 0000000..c204f71
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// The SlidingSwitchExtension class makes attached Switch to animate thumb when selected/unselected.
+    /// <remark>
+    /// This extension must be used within a class implementing SwitchStyle.
+    /// </remark>
+    /// </summary>
+    [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 (file)
index 0000000..985c012
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// The SwitchExtension class allows developers to access the Switch's components and extend their behavior in various states.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public abstract class SwitchExtension : ButtonExtension
+    {
+        internal SwitchExtension() : base()
+        {
+        }
+
+        /// <summary>
+        /// Called immediately after the Switch creates the track part.
+        /// </summary>
+        /// <param name="switchButton">The Switch instance that the extension currently applied to.</param>
+        /// <param name="track">The created Switch's track part.</param>
+        /// <return>The refined switch track.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual ImageView OnCreateTrack(Switch switchButton, ImageView track)
+        {
+            return track;
+        }
+
+        /// <summary>
+        /// Called immediately after the Switch creates the thumb part.
+        /// </summary>
+        /// <param name="switchButton">The Switch instance that the extension currently applied to.</param>
+        /// <param name="thumb">The created Switch's thumb part.</param>
+        /// <return>The refined switch thumb.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual ImageView OnCreateThumb(Switch switchButton, ImageView thumb)
+        {
+            return thumb;
+        }
+    }
+}
index 21b77c5..f11d647 100755 (executable)
@@ -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) { }
+
         /// <summary>
         /// Get RadioButtonGroup to which this selections belong.
         /// </summary>
index 69e5842..ee02ac5 100755 (executable)
@@ -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
     /// <since_tizen> 6 </since_tizen>
     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() { }
 
         /// <summary>
@@ -176,6 +173,38 @@ namespace Tizen.NUI.Components
         }
 
         /// <summary>
+        /// Switch's track part.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected ImageView Track { get; set; }
+
+        /// <summary>
+        /// Switch's thumb part.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected ImageView Thumb { get; set; }
+
+        /// <summary>
+        /// Creates Switch's track part.
+        /// </summary>
+        /// <return>The created Button's icon part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual ImageView CreateTrack()
+        {
+            return new ImageView();
+        }
+
+        /// <summary>
+        /// Creates Switch's overlay thumb part.
+        /// </summary>
+        /// <return>The created Button's overlay image part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual ImageView CreateThumb()
+        {
+            return new ImageView();
+        }
+
+        /// <summary>
         /// Dispose Switch and all children on it.
         /// </summary>
         /// <param name="type">Dispose type.</param>
@@ -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);
         }
 
         /// <summary>
@@ -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
             /// <since_tizen> 6 </since_tizen>
             public bool IsSelected;
         }
+
+        /// <summary>
+        /// Get current track part to the attached SwitchExtension.
+        /// </summary>
+        /// <remarks>
+        /// It returns null if the passed extension is invaild.
+        /// </remarks>
+        /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
+        /// <return>The switch's track part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ImageView GetCurrentTrack(SwitchExtension extension)
+        {
+            return (extension == Extension) ? Track : null;
+        }
+
+         /// <summary>
+        /// Get current thumb part to the attached SwitchExtension.
+        /// </summary>
+        /// <remarks>
+        /// It returns null if the passed extension is invaild.
+        /// </remarks>
+        /// <param name="extension">The extension instance that is currently attached to this Switch.</param>
+        /// <return>The switch's thumb part.</return>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ImageView GetCurrentThumb(SwitchExtension extension)
+        {
+            return (extension == Extension) ? Thumb : null;
+        }
     }
 }
index 676a2d3..ee88c91 100755 (executable)
@@ -35,19 +35,19 @@ namespace Tizen.NUI.Components
                 Size = new Size(96, 60),
                 Track = new ImageViewStyle
                 {
+                    Size = new Size(96, 60),
                     ResourceUrl = new Selector<string>
                     {
                         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<string>
                     {
                         Normal = DefaultStyle.GetResourcePath("nui_component_default_switch_thumb_n.png"),
index c3f8e1e..1056d9e 100755 (executable)
  * 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
             }
         }
 
+        /// <summary>
+        /// Create corresponding ButtonExtension.
+        /// This is to be called by a Button.
+        /// You may override this function to customize button's behavior.
+        /// </summary>
+        /// <return>The new ButtonExtension instance.</return>
+        [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 (file)
index 0000000..0325344
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// Interface that provides style properties for Lottie playing in Button.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public interface ILottieButtonStyle
+    {
+        /// <summary>
+        /// Get/Set Lottie resource url.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        string LottieUrl { get; set; }
+
+        /// <summary>
+        /// Get/Set LottieFrameInfo on various action states of attached Button.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        Button.ActionSelector<LottieFrameInfo> 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 (file)
index 0000000..d0105be
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// LottieButtonStyle implements ILottieButtonStyle interface to support extended ButtonStyle using Lottie.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class LottieButtonStyle : ButtonStyle, ILottieButtonStyle
+    {
+        static LottieButtonStyle()
+        {
+        }
+
+        /// <summary>
+        /// Create new instance of a LottieButtonStyle.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieButtonStyle() : base()
+        {
+        }
+
+        /// <summary>
+        /// Copy constructor.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieButtonStyle(LottieButtonStyle style) : base(style)
+        {
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string LottieUrl { get; set; }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public Button.ActionSelector<LottieFrameInfo> LottieFrameInfo { get; set; }
+
+        /// <inheritdoc/>
+        [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;
+        }
+
+        /// <inheritdoc/>
+        [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 (file)
index 0000000..d768afe
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// LottieSwitchStyle implements ILottieButtonStyle interface to support extended ButtonStyle using Lottie.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class LottieSwitchStyle : SwitchStyle, ILottieButtonStyle
+    {
+        static LottieSwitchStyle()
+        {
+        }
+
+        /// <summary>
+        /// Create new instance of a LottieButtonStyle.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieSwitchStyle() : base()
+        {
+        }
+
+        /// <summary>
+        /// Copy constructor.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieSwitchStyle(LottieSwitchStyle style) : base(style)
+        {
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string LottieUrl { get; set; }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public Button.ActionSelector<LottieFrameInfo> LottieFrameInfo { get; set; }
+
+        /// <inheritdoc/>
+        [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;
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public override ButtonExtension CreateExtension()
+        {
+            return new LottieSwitchExtension();
+        }
+
+        private void InitSubStyle()
+        {
+        }
+    }
+}
index dee1443..c424b0d 100755 (executable)
@@ -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
             }
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public override ButtonExtension CreateExtension()
+        {
+            return new SlidingSwitchExtension();
+        }
+
         private void InitSubStyle()
         {
             Track = new ImageViewStyle()
index e583b2c..6f4b397 100755 (executable)
@@ -60,7 +60,7 @@ namespace Tizen.NUI.Components
         /// StyleManager static instance.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public static StyleManager Instance { get; } = new StyleManager();
+        public static StyleManager Instance { get; internal set; } = new StyleManager();
 
         /// <summary>
         /// Style theme.
index c45cd7c..57dd66e 100755 (executable)
@@ -8,6 +8,13 @@
   <ItemGroup>
     <ProjectReference Include="..\Tizen.Applications.Common\Tizen.Applications.Common.csproj" />
     <ProjectReference Include="..\Tizen.NUI\Tizen.NUI.csproj" />
+    <ProjectReference Include="..\Tizen.NUI.Components\Tizen.NUI.Components.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <None Update="res\*.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
 </Project>
\ 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 (executable)
index 0000000..3074f69
--- /dev/null
@@ -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 (executable)
index 0000000..0adc84f
--- /dev/null
@@ -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 (executable)
index 0000000..e52990b
--- /dev/null
@@ -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 (file)
index 0000000..72d8c19
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// Describes Button Animation used in OneUI_Watch2.X
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class OverlayAnimationButtonStyle : ButtonStyle
+    {
+        /// <summary>
+        /// Constructor
+        /// </summary>
+        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<Color>
+                {
+                    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<float?>
+                {
+                    Normal = 0.7f,
+                    Pressed = 0.5f
+                }
+            };
+            Opacity = new Selector<float?>
+            {
+                Disabled = 0.3f,
+                Other = 1.0f
+            };
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public override ButtonExtension CreateExtension()
+        {
+            return new OverlayAnimationButtonExtension();
+        }
+    }
+
+    /// <summary>
+    /// OverlayAnimationButtonExtension class is a extended ButtonExtension class that make the overlay image blinking on a Button pressed.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class OverlayAnimationButtonExtension : ButtonExtension
+    {
+        private Animation PressAnimation { get; set; }
+
+        /// <summary>
+        /// Creates a new instance of a OverlayAnimationButtonExtension.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public OverlayAnimationButtonExtension() : base()
+        {
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public override ImageView OnCreateOverlayImage(Button button, ImageView overlayImage)
+        {
+            overlayImage.Hide();
+
+            return overlayImage;
+        }
+
+        /// <inheritdoc/>
+        [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();
+        }
+
+        /// <inheritdoc/>
+        [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 (file)
index 0000000..7548652
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// A predefined style class for Wearable buttons.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class WearableButtonStyle : ButtonStyle
+    {
+        /// <summary>
+        /// Creates a new class instance.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public WearableButtonStyle() : base()
+        {
+            Size = new Size(210, 72);
+            CornerRadius = 36;
+            BackgroundColor = new Selector<Color>
+            {
+                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<Color>
+                {
+                    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<float?>
+            {
+                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 (file)
index 0000000..6c7ca28
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// A predefined style class for Wearable check boxes.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class WearableCheckBoxStyle : LottieButtonStyle
+    {
+        /// <summary>
+        /// Creates a new class instance.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public WearableCheckBoxStyle() : base()
+        {
+            LottieUrl = WearableStyle.GetResourcePath("nui_wearable_checkbox_icon.json");
+            LottieFrameInfo = new Button.ActionSelector<LottieFrameInfo>
+            {
+                OnSelect = (0, 18),
+                OnUnselect = (19, 36)
+            };
+            Opacity = new Selector<float?>
+            {
+                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 (file)
index 0000000..f7b1eaf
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// A predefined style class for Wearable radio buttons.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class WearableRadioButtonStyle : LottieButtonStyle
+    {
+        /// <summary>
+        /// Creates a new class instance.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public WearableRadioButtonStyle() : base()
+        {
+            LottieUrl = WearableStyle.GetResourcePath("nui_wearable_radiobutton_icon.json");
+            LottieFrameInfo = new Button.ActionSelector<LottieFrameInfo>
+            {
+                OnSelect = (0, 12),
+                OnUnselect = (13, 25)
+            };
+            Opacity = new Selector<float?>
+            {
+                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 (file)
index 0000000..89d8b09
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// </summary>
+    [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 (file)
index 0000000..8952bd2
--- /dev/null
@@ -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
+{
+    /// <summary>
+    /// A predefined style class for Wearable switches.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class WearableSwitchStyle : LottieSwitchStyle
+    {
+        /// <summary>
+        /// Creates a new class instance.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public WearableSwitchStyle() : base()
+        {
+            LottieUrl = WearableStyle.GetResourcePath("nui_wearable_switch_icon.json");
+            LottieFrameInfo = new Button.ActionSelector<LottieFrameInfo>
+            {
+                OnSelect = (0, 18),
+                OnUnselect = (19, 36)
+            };
+            Opacity = new Selector<float?>
+            {
+                Other = 1.0f,
+                Pressed = 0.6f,
+                Disabled = 0.3f,
+            };
+        }
+    }
+}
index 4310065..04f6657 100755 (executable)
@@ -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")]
index a38a43b..a0958fc 100755 (executable)
@@ -831,4 +831,115 @@ namespace Tizen.NUI.BaseComponents
         }
         #endregion Private
     }
+
+    /// <summary>
+    /// A class containing frame informations for a LottieAnimationView.
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class LottieFrameInfo
+    {
+        /// <summary>
+        /// Creates a new instance with a playing range.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieFrameInfo(int startFrame, int endFrame)
+        {
+            StartFrame = startFrame;
+            EndFrame = endFrame;
+        }
+
+        /// <summary>
+        /// Creates a new instance with a still image frame.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public LottieFrameInfo(int stillImageFrame) : this(stillImageFrame, stillImageFrame)
+        {
+        }
+
+        /// <summary>
+        /// Create a new instance from a pair notation.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static implicit operator LottieFrameInfo((int, int) pair)
+        {
+            return new LottieFrameInfo(pair.Item1, pair.Item2);
+        }
+
+        /// <summary>
+        /// Create a new instance from an int value.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static implicit operator LottieFrameInfo(int stillImageFrame)
+        {
+            return new LottieFrameInfo(stillImageFrame);
+        }
+
+        /// <summary>
+        /// The start frame of the lottie animation.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public int StartFrame { get; }
+
+        /// <summary>
+        /// The end frame of the lottie animation.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public int EndFrame { get; }
+
+        /// <summary>
+        /// Create LottieFrameInfo struct with animation range information
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static LottieFrameInfo CreateAnimationRange(int startFrame, int endFrame)
+        {
+            return new LottieFrameInfo(startFrame, endFrame);
+        }
+
+        /// <summary>
+        /// Create LottieFrameInfo struct with still image information
+        /// </summary>
+        [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
index 7638e39..01a016f 100755 (executable)
@@ -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;
             }
index bb05335..222b9a0 100755 (executable)
@@ -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);
index 5342bf9..192cadd 100755 (executable)
@@ -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);
+        /// <summary>
+        /// Set ControlState with specified change environment
+        /// </summary>
+        /// <param name="state">New state value</param>
+        /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
+        /// <return>True, if the state changed successfully.</return>
+        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.
+        /// <summary>
+        /// Called after the View's ControlStates changed.
+        /// </summary>
+        /// <param name="previousState">The previous state value</param>
+        /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
+        /// <return>True if it needs to apply the state to children recursively.</return>
         [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<string>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
             var view = (View)bindable;