From ba6adb78c19f502d71a50e7ad818f8b343d34c04 Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Wed, 13 May 2020 10:06:59 -0400 Subject: [PATCH 001/201] Add failing test for no items in TabControl --- .../TabControlTests.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs index 24aacd4000..db9211ac3c 100644 --- a/tests/Avalonia.Controls.UnitTests/TabControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TabControlTests.cs @@ -1,10 +1,12 @@ using System; +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using Avalonia.Collections; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; +using Avalonia.Controls.Utils; using Avalonia.LogicalTree; using Avalonia.Styling; using Avalonia.UnitTests; @@ -325,6 +327,28 @@ namespace Avalonia.Controls.UnitTests Assert.NotEqual(dataContext, tabItem.Content); } + [Fact] + public void Can_Have_Empty_Tab_Control() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = @" + + +"; + var loader = new Markup.Xaml.AvaloniaXamlLoader(); + var window = (Window)loader.Load(xaml); + var tabControl = window.FindControl("tabs"); + + tabControl.DataContext = new { Tabs = new List() }; + window.ApplyTemplate(); + + Assert.Equal(0, tabControl.Items.Count()); + } + } + private IControlTemplate TabControlTemplate() { return new FuncControlTemplate((parent, scope) => From c1dc0017d4b794420a3b8049acb09833ea14ff55 Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Wed, 13 May 2020 11:17:00 -0400 Subject: [PATCH 002/201] Add tests from chat with @grokys --- .../SelectionModelTests.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs index 246ff723a1..60fe9f3674 100644 --- a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs @@ -1752,6 +1752,26 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(0, node.PropertyChangedSubscriptions); } + [Fact] + public void Setting_SelectedIndex_To_Minus_1_Clears_Selection() + { + var data = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel { Source = data }; + target.SelectedIndex = new IndexPath(1); + target.SelectedIndex = new IndexPath(-1); + Assert.Empty(target.SelectedIndices); + } + + [Fact] + public void Assigning_Source_With_Less_Items_Than_Selection_Trims_Selection() + { + var data = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel { RetainSelectionOnReset = true }; + target.SelectedIndex = new IndexPath(4); + target.Source = data; + Assert.Empty(target.SelectedIndices); + } + private int GetSubscriberCount(AvaloniaList list) { return ((INotifyCollectionChangedDebug)list).GetCollectionChangedSubscribers()?.Length ?? 0; From 62e7dbded926a33415b5c2d636dced2203f4b4aa Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Wed, 13 May 2020 11:51:22 -0400 Subject: [PATCH 003/201] Add more tests for selection adjustments --- .../SelectionModelTests.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs index 60fe9f3674..9d795f6247 100644 --- a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs @@ -1762,6 +1762,18 @@ namespace Avalonia.Controls.UnitTests Assert.Empty(target.SelectedIndices); } + [Fact] + public void Assigning_Source_With_Less_Items_Than_Previous_Clears_Selection() + { + var data = new[] { "foo", "bar", "baz", "boo", "hoo" }; + var smallerData = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel { RetainSelectionOnReset = true }; + target.Source = data; + target.SelectedIndex = new IndexPath(4); + target.Source = smallerData; + Assert.Empty(target.SelectedIndices); + } + [Fact] public void Assigning_Source_With_Less_Items_Than_Selection_Trims_Selection() { @@ -1772,6 +1784,18 @@ namespace Avalonia.Controls.UnitTests Assert.Empty(target.SelectedIndices); } + [Fact] + public void Assigning_Source_With_Less_Items_Than_Multiple_Selection_Trims_Selection() + { + var data = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel { RetainSelectionOnReset = true }; + target.Select(4); + target.Select(2); + target.Source = data; + Assert.Equal(1, target.SelectedIndices.Count); + Assert.Equal(new IndexPath(2), target.SelectedIndices.First()); + } + private int GetSubscriberCount(AvaloniaList list) { return ((INotifyCollectionChangedDebug)list).GetCollectionChangedSubscribers()?.Length ?? 0; From 8fa6c05b7da7178d627eb8826d134a06f5c63083 Mon Sep 17 00:00:00 2001 From: Deadpikle Date: Wed, 13 May 2020 12:10:06 -0400 Subject: [PATCH 004/201] Another failing test for selection handling --- .../SelectionModelTests.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs index 9d795f6247..211fc44caf 100644 --- a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs @@ -1796,6 +1796,19 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new IndexPath(2), target.SelectedIndices.First()); } + // test that going from non-null source to non-null source clears selection + [Fact] + public void Changing_Source_With_Valid_IndexPath_Retains_Selection() + { + var data = new[] { "foo", "bar", "baz", "boo", "hoo" }; + var smallerData = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel { RetainSelectionOnReset = true }; + target.Source = data; + target.SelectedIndex = new IndexPath(2); + target.Source = smallerData; + Assert.Equal(1, target.SelectedIndices.Count); + } + private int GetSubscriberCount(AvaloniaList list) { return ((INotifyCollectionChangedDebug)list).GetCollectionChangedSubscribers()?.Length ?? 0; From 5b3d5db1d6c21338583843983f58d65a66cd99c6 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 19 May 2020 10:30:12 -0300 Subject: [PATCH 005/201] Add WindowTransparencyLevel enum. --- .../WindowTransparencyLevel.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/Avalonia.Controls/WindowTransparencyLevel.cs diff --git a/src/Avalonia.Controls/WindowTransparencyLevel.cs b/src/Avalonia.Controls/WindowTransparencyLevel.cs new file mode 100644 index 0000000000..f5fc0ca9dd --- /dev/null +++ b/src/Avalonia.Controls/WindowTransparencyLevel.cs @@ -0,0 +1,20 @@ +namespace Avalonia.Controls +{ + public enum WindowTransparencyLevel + { + /// + /// The window background is Black where nothing is drawn in the window. + /// + None, + + /// + /// The window background is Transparent where nothing is drawn in the window. + /// + Transparent, + + /// + /// The window background is a blur-behind where nothing is drawn in the window. + /// + Blur + } +} From cbd89289ab2b49887ef4114ef0dfa0e52db701dd Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 19 May 2020 10:45:26 -0300 Subject: [PATCH 006/201] add TransparencyLevel property to TopLevel --- .../Platform/ITopLevelImpl.cs | 6 ++++++ src/Avalonia.Controls/TopLevel.cs | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index 98ee17ee1f..8e892ffc21 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Avalonia.Controls; using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Rendering; @@ -106,5 +107,10 @@ namespace Avalonia.Platform IMouseDevice MouseDevice { get; } IPopupImpl CreatePopup(); + + /// + /// Gets or sets the ofthe TopLevel. + /// + WindowTransparencyLevel TransparencyLevel { get; set; } } } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index d17f3b0423..8861c72418 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -43,6 +43,12 @@ namespace Avalonia.Controls public static readonly StyledProperty PointerOverElementProperty = AvaloniaProperty.Register(nameof(IInputRoot.PointerOverElement)); + /// + /// Represents the current . + /// + public static readonly StyledProperty TransparencyLevelProperty = + AvaloniaProperty.Register(nameof(TransparencyLevel), WindowTransparencyLevel.None); + private readonly IInputManager _inputManager; private readonly IAccessKeyHandler _accessKeyHandler; private readonly IKeyboardNavigationHandler _keyboardNavigationHandler; @@ -57,6 +63,9 @@ namespace Avalonia.Controls static TopLevel() { AffectsMeasure(ClientSizeProperty); + + TransparencyLevelProperty.Changed.AddClassHandler( + (tl, e) => { if (tl.PlatformImpl != null) tl.PlatformImpl.TransparencyLevel = (WindowTransparencyLevel)e.NewValue; }); } /// @@ -155,6 +164,15 @@ namespace Avalonia.Controls protected set { SetAndRaise(ClientSizeProperty, ref _clientSize, value); } } + /// + /// Gets or sets the . + /// + public WindowTransparencyLevel TransparencyLevel + { + get { return GetValue(TransparencyLevelProperty); } + set { SetValue(TransparencyLevelProperty, value); } + } + public ILayoutManager LayoutManager { get From a30e6d8cf68bb44ef56c9e4f088746d130e7a758 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 19 May 2020 14:19:34 -0300 Subject: [PATCH 007/201] Add framework support for TopLevel transparency level. --- .../Platform/ITopLevelImpl.cs | 2 + src/Avalonia.Controls/TopLevel.cs | 40 +++++++++++++++++++ .../EmbeddableControlRoot.xaml | 16 ++++---- .../OverlayPopupHost.xaml | 16 ++++---- src/Avalonia.Themes.Default/PopupRoot.xaml | 16 ++++---- src/Avalonia.Themes.Default/Window.xaml | 20 +++++----- 6 files changed, 80 insertions(+), 30 deletions(-) diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index 8e892ffc21..b22962115e 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -59,6 +59,8 @@ namespace Avalonia.Platform /// Action ScalingChanged { get; set; } + Action TransparencyLevelChanged { get; set; } + /// /// Creates a new renderer for the toplevel. /// diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 8861c72418..3ac5779ed3 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -6,6 +6,7 @@ using Avalonia.Input.Raw; using Avalonia.Layout; using Avalonia.Logging; using Avalonia.LogicalTree; +using Avalonia.Media; using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Styling; @@ -14,6 +15,7 @@ using JetBrains.Annotations; namespace Avalonia.Controls { + /// /// Base class for top-level widgets. /// @@ -49,6 +51,12 @@ namespace Avalonia.Controls public static readonly StyledProperty TransparencyLevelProperty = AvaloniaProperty.Register(nameof(TransparencyLevel), WindowTransparencyLevel.None); + /// + /// Defines the property. + /// + public static readonly StyledProperty TransparencyBackgroundFallbackProperty = + AvaloniaProperty.Register(nameof(TransparencyBackgroundFallback), Brushes.White); + private readonly IInputManager _inputManager; private readonly IAccessKeyHandler _accessKeyHandler; private readonly IKeyboardNavigationHandler _keyboardNavigationHandler; @@ -56,6 +64,7 @@ namespace Avalonia.Controls private readonly IGlobalStyles _globalStyles; private Size _clientSize; private ILayoutManager _layoutManager; + private Border _transparencyFallbackBorder; /// /// Initializes static members of the class. @@ -117,6 +126,7 @@ namespace Avalonia.Controls impl.Paint = HandlePaint; impl.Resized = HandleResized; impl.ScalingChanged = HandleScalingChanged; + impl.TransparencyLevelChanged = HandleTransparencyLevelChanged; _keyboardNavigationHandler?.SetOwner(this); _accessKeyHandler?.SetOwner(this); @@ -173,6 +183,12 @@ namespace Avalonia.Controls set { SetValue(TransparencyLevelProperty, value); } } + public IBrush TransparencyBackgroundFallback + { + get => GetValue(TransparencyBackgroundFallbackProperty); + set => SetValue(TransparencyBackgroundFallbackProperty, value); + } + public ILayoutManager LayoutManager { get @@ -330,6 +346,21 @@ namespace Avalonia.Controls LayoutHelper.InvalidateSelfAndChildrenMeasure(this); } + protected virtual void HandleTransparencyLevelChanged(WindowTransparencyLevel transparencyLevel) + { + if(_transparencyFallbackBorder != null) + { + if(transparencyLevel == WindowTransparencyLevel.None) + { + _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; + } + else + { + _transparencyFallbackBorder.Background = Brushes.Transparent; + } + } + } + /// protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { @@ -339,6 +370,15 @@ namespace Avalonia.Controls $"Control '{GetType().Name}' is a top level control and cannot be added as a child."); } + protected override void OnApplyTemplate(TemplateAppliedEventArgs e) + { + base.OnApplyTemplate(e); + + _transparencyFallbackBorder = e.NameScope.Find("PART_TransparencyFallback"); + + HandleTransparencyLevelChanged(PlatformImpl.TransparencyLevel); + } + /// /// Raises the event. /// diff --git a/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml b/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml index 1fd168c009..3acab7d7bc 100644 --- a/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml +++ b/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml @@ -3,13 +3,15 @@ - - - - + + + + + + diff --git a/src/Avalonia.Themes.Default/OverlayPopupHost.xaml b/src/Avalonia.Themes.Default/OverlayPopupHost.xaml index 56b3699c07..e57325499d 100644 --- a/src/Avalonia.Themes.Default/OverlayPopupHost.xaml +++ b/src/Avalonia.Themes.Default/OverlayPopupHost.xaml @@ -2,13 +2,15 @@ - - - + + + + + diff --git a/src/Avalonia.Themes.Default/PopupRoot.xaml b/src/Avalonia.Themes.Default/PopupRoot.xaml index cf063f5390..1a55d2f7a4 100644 --- a/src/Avalonia.Themes.Default/PopupRoot.xaml +++ b/src/Avalonia.Themes.Default/PopupRoot.xaml @@ -2,13 +2,15 @@ - - - + + + + + diff --git a/src/Avalonia.Themes.Default/Window.xaml b/src/Avalonia.Themes.Default/Window.xaml index 2a8b5d0fca..e29409e894 100644 --- a/src/Avalonia.Themes.Default/Window.xaml +++ b/src/Avalonia.Themes.Default/Window.xaml @@ -4,15 +4,17 @@ - - - - + + + + + + From fe7e8582d1639b595c65395aa1357e3e19de04e3 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 19 May 2020 14:19:57 -0300 Subject: [PATCH 008/201] add basic win32 implementation for transparency level. --- .../Interop/UnmanagedMethods.cs | 41 +++++++++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 68 +++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 5601ccbafe..088c4b17ac 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -1302,6 +1302,47 @@ namespace Avalonia.Win32.Interop [DllImport("dwmapi.dll")] public static extern int DwmExtendFrameIntoClientArea(IntPtr hwnd, ref MARGINS margins); + [DllImport("dwmapi.dll")] + public static extern int DwmIsCompositionEnabled(out bool enabled); + + [DllImport("user32.dll")] + internal static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data); + + [StructLayout(LayoutKind.Sequential)] + internal struct WindowCompositionAttributeData + { + public WindowCompositionAttribute Attribute; + public IntPtr Data; + public int SizeOfData; + } + + internal enum WindowCompositionAttribute + { + // ... + WCA_ACCENT_POLICY = 19 + // ... + } + + internal enum AccentState + { + ACCENT_DISABLED = 0, + ACCENT_ENABLE_GRADIENT = 1, + ACCENT_ENABLE_TRANSPARENTGRADIENT = 2, + ACCENT_ENABLE_BLURBEHIND = 3, + ACCENT_ENABLE_ACRYLIC = 4, //1703 and above + ACCENT_ENABLE_HOSTBACKDROP = 5, // RS5 1809 + ACCENT_INVALID_STATE = 6 + } + + [StructLayout(LayoutKind.Sequential)] + internal struct AccentPolicy + { + public AccentState AccentState; + public int AccentFlags; + public int GradientColor; + public int AnimationId; + } + [StructLayout(LayoutKind.Sequential)] internal struct MARGINS { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index cc4c12ec3c..45abf9fd79 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using Avalonia.Controls; using Avalonia.Input; using Avalonia.Input.Raw; +using Avalonia.Media; using Avalonia.OpenGL; using Avalonia.Platform; using Avalonia.Rendering; @@ -66,6 +67,7 @@ namespace Avalonia.Win32 private Size _minSize; private Size _maxSize; private WindowImpl _parent; + private WindowTransparencyLevel _transparencyLevel = WindowTransparencyLevel.None; public WindowImpl() { @@ -122,6 +124,8 @@ namespace Avalonia.Win32 public Action WindowStateChanged { get; set; } + public Action TransparencyLevelChanged { get; set; } + public Thickness BorderThickness { get @@ -206,6 +210,70 @@ namespace Avalonia.Win32 } } + public WindowTransparencyLevel TransparencyLevel + { + get => _transparencyLevel; + set + { + var oldValue = _transparencyLevel; + _transparencyLevel = EnableBlur(value); + + if(oldValue != _transparencyLevel) + { + TransparencyLevelChanged?.Invoke(_transparencyLevel); + } + } + } + + private WindowTransparencyLevel EnableBlur(WindowTransparencyLevel transparencyLevel) + { + if(DwmIsCompositionEnabled(out var compositionEnabled) != 0 || !compositionEnabled) + { + return WindowTransparencyLevel.None; + } + + var accent = new AccentPolicy(); + var accentStructSize = Marshal.SizeOf(accent); + + switch (transparencyLevel) + { + default: + case WindowTransparencyLevel.None: + accent.AccentState = AccentState.ACCENT_DISABLED; + break; + + case WindowTransparencyLevel.Transparent: + accent.AccentState = AccentState.ACCENT_ENABLE_TRANSPARENTGRADIENT; + break; + + case WindowTransparencyLevel.Blur: + accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; + break; + + case (WindowTransparencyLevel.Blur + 1): + accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; + break; + } + var bgcolor = 0x00ffffff; + + accent.GradientColor = bgcolor; + + var accentPtr = Marshal.AllocHGlobal(accentStructSize); + Marshal.StructureToPtr(accent, accentPtr, false); + + var data = new WindowCompositionAttributeData(); + data.Attribute = WindowCompositionAttribute.WCA_ACCENT_POLICY; + data.SizeOfData = accentStructSize; + data.Data = accentPtr; + + SetWindowCompositionAttribute(_hwnd, ref data); + + Marshal.FreeHGlobal(accentPtr); + + //todo return acheived level and check windows versions. + return transparencyLevel; + } + public IEnumerable Surfaces => new object[] { Handle, _gl, _framebuffer }; public PixelPoint Position From f9a1871d1e7f121c92a9ebedfaa7a83bcef05bc8 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 19 May 2020 14:20:17 -0300 Subject: [PATCH 009/201] add transparency demo to control catalog. --- samples/ControlCatalog/MainView.xaml | 7 ++++++- samples/ControlCatalog/MainView.xaml.cs | 7 +++++++ samples/ControlCatalog/MainWindow.xaml | 3 +-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index 30671ef083..5d62e61d0e 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -2,7 +2,7 @@ xmlns:pages="clr-namespace:ControlCatalog.Pages" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ControlCatalog.MainView" - Background="{DynamicResource ThemeBackgroundBrush}" + Background="Transparent" Foreground="{DynamicResource ThemeForegroundBrush}" FontSize="{DynamicResource FontSizeNormal}"> @@ -70,6 +70,11 @@ Light Dark + + None + Transparent + Blur + diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs index 7c17b125d6..d1d54c6636 100644 --- a/samples/ControlCatalog/MainView.xaml.cs +++ b/samples/ControlCatalog/MainView.xaml.cs @@ -63,6 +63,13 @@ namespace ControlCatalog if (VisualRoot is Window window) window.SystemDecorations = (SystemDecorations)decorations.SelectedIndex; }; + + var transparencyLevels = this.Find("TransparencyLevels"); + transparencyLevels.SelectionChanged += (sender, e) => + { + if (VisualRoot is Window window) + window.TransparencyLevel = (WindowTransparencyLevel)transparencyLevels.SelectedIndex; + }; } protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) diff --git a/samples/ControlCatalog/MainWindow.xaml b/samples/ControlCatalog/MainWindow.xaml index 935db20757..a0bb956425 100644 --- a/samples/ControlCatalog/MainWindow.xaml +++ b/samples/ControlCatalog/MainWindow.xaml @@ -7,8 +7,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:ControlCatalog.ViewModels" xmlns:v="clr-namespace:ControlCatalog.Views" - x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}"> - + x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}" Background="Transparent"> From 30b81f1ded2753d08c1023a5cbb7c08012794e96 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 19 May 2020 14:20:44 -0300 Subject: [PATCH 010/201] Add stubs for transparency in other toplevel impls. --- .../Embedding/Offscreen/OffscreenTopLevelImpl.cs | 6 ++++++ src/Avalonia.DesignerSupport/Remote/Stubs.cs | 4 ++++ src/Avalonia.Native/WindowImplBase.cs | 4 ++++ src/Avalonia.X11/X11Window.cs | 4 ++++ .../Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs | 6 ++++++ 5 files changed, 24 insertions(+) diff --git a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs index 29f0374301..5d7c968173 100644 --- a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs +++ b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs @@ -49,6 +49,9 @@ namespace Avalonia.Controls.Embedding.Offscreen public Action Paint { get; set; } public Action Resized { get; set; } public Action ScalingChanged { get; set; } + + public Action TransparencyLevelChanged { get; set; } + public void SetInputRoot(IInputRoot inputRoot) => InputRoot = inputRoot; public virtual Point PointToClient(PixelPoint point) => point.ToPoint(1); @@ -61,6 +64,9 @@ namespace Avalonia.Controls.Embedding.Offscreen public Action Closed { get; set; } public abstract IMouseDevice MouseDevice { get; } + + public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } + public IPopupImpl CreatePopup() => null; } } diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs index 484cf3bc97..0b5d2cb2b9 100644 --- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -37,6 +37,8 @@ namespace Avalonia.DesignerSupport.Remote public WindowState WindowState { get; set; } public Action WindowStateChanged { get; set; } + public Action TransparencyLevelChanged { get; set; } + public WindowStub(IWindowImpl parent = null) { if (parent != null) @@ -141,6 +143,8 @@ namespace Avalonia.DesignerSupport.Remote public IPopupPositioner PopupPositioner { get; } public Action GotInputWhenDisabled { get; set; } + + public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } } class ClipboardStub : IClipboard diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 47127fafe0..3b616ef76b 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -369,6 +369,8 @@ namespace Avalonia.Native Action ITopLevelImpl.ScalingChanged { get; set; } + public Action TransparencyLevelChanged { get; set; } + public IScreenImpl Screen { get; private set; } // TODO @@ -389,6 +391,8 @@ namespace Avalonia.Native _native.BeginDragAndDropOperation(effects, point, clipboard, callback, sourceHandle); } + public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } + public IPlatformHandle Handle { get; private set; } } } diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 643b037b3f..84f0b8c877 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -300,6 +300,9 @@ namespace Avalonia.X11 public Action Activated { get; set; } public Func Closing { get; set; } public Action WindowStateChanged { get; set; } + + public Action TransparencyLevelChanged { get; set; } + public Action Closed { get; set; } public Action PositionChanged { get; set; } @@ -1083,5 +1086,6 @@ namespace Avalonia.X11 public IPopupPositioner PopupPositioner { get; } public ITopLevelNativeMenuExporter NativeMenuExporter { get; } + public WindowTransparencyLevel TransparencyLevel { get; set; } } } diff --git a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs index 9844cdc03b..fa518bafec 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Avalonia.Controls; using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.LinuxFramebuffer.Input; @@ -70,6 +71,9 @@ namespace Avalonia.LinuxFramebuffer public Action Paint { get; set; } public Action Resized { get; set; } public Action ScalingChanged { get; set; } + + public Action TransparencyLevelChanged { get; set; } + public Action Closed { get; set; } public event Action LostFocus { @@ -78,5 +82,7 @@ namespace Avalonia.LinuxFramebuffer } public Size ScaledSize => _outputBackend.PixelSize.ToSize(Scaling); + + public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } } } From 0c3f2aa856d30ba04a99a0e14f802c81678a1583 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 19 May 2020 15:18:48 -0300 Subject: [PATCH 011/201] implement transparency api on osx. --- native/Avalonia.Native/inc/avalonia-native.h | 1 + native/Avalonia.Native/src/OSX/window.h | 3 ++ native/Avalonia.Native/src/OSX/window.mm | 29 ++++++++++++++++++++ src/Avalonia.Native/WindowImplBase.cs | 17 +++++++++++- 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 7782165263..b86c679397 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -258,6 +258,7 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT ObtainNSViewHandleRetained(void** retOut) = 0; virtual HRESULT BeginDragAndDropOperation(AvnDragDropEffects effects, AvnPoint point, IAvnClipboard* clipboard, IAvnDndResultCallback* cb, void* sourceHandle) = 0; + virtual HRESULT SetBlurEnabled (bool enable) = 0; }; AVNCOM(IAvnPopup, 03) : virtual IAvnWindowBase diff --git a/native/Avalonia.Native/src/OSX/window.h b/native/Avalonia.Native/src/OSX/window.h index ca60914526..bdf3007a28 100644 --- a/native/Avalonia.Native/src/OSX/window.h +++ b/native/Avalonia.Native/src/OSX/window.h @@ -3,6 +3,9 @@ class WindowBaseImpl; +@interface AutoFitContentVisualEffectView : NSVisualEffectView +@end + @interface AvnView : NSView -(AvnView* _Nonnull) initWithParent: (WindowBaseImpl* _Nonnull) parent; -(NSEvent* _Nonnull) lastMouseDownEvent; diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index fed2176580..abfae3cf1e 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -20,6 +20,7 @@ public: View = NULL; Window = NULL; } + NSVisualEffectView* VisualEffect; AvnView* View; AvnWindow* Window; ComPtr BaseEvents; @@ -47,6 +48,12 @@ public: [Window setStyleMask:NSWindowStyleMaskBorderless]; [Window setBackingType:NSBackingStoreBuffered]; + + VisualEffect = [AutoFitContentVisualEffectView new]; + [VisualEffect setBlendingMode:NSVisualEffectBlendingModeBehindWindow]; + [VisualEffect setMaterial:NSVisualEffectMaterialLight]; + [VisualEffect setAutoresizesSubviews:true]; + [Window setContentView: View]; } @@ -383,6 +390,18 @@ public: return *ppv == nil ? E_FAIL : S_OK; } + virtual HRESULT SetBlurEnabled (bool enable) override + { + [Window setContentView: enable ? VisualEffect : View]; + + if(enable) + { + [VisualEffect addSubview:View]; + } + + return S_OK; + } + virtual HRESULT BeginDragAndDropOperation(AvnDragDropEffects effects, AvnPoint point, IAvnClipboard* clipboard, IAvnDndResultCallback* cb, void* sourceHandle) override @@ -911,6 +930,16 @@ protected: NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEventTrackingRunLoopMode, NSModalPanelRunLoopMode, NSRunLoopCommonModes, NSConnectionReplyMode, nil]; +@implementation AutoFitContentVisualEffectView +-(void)setFrameSize:(NSSize)newSize +{ + [super setFrameSize:newSize]; + if([[self subviews] count] == 0) + return; + [[self subviews][0] setFrameSize: newSize]; +} +@end + @implementation AvnView { ComPtr _parent; diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 3b616ef76b..2442c2cba4 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -391,7 +391,22 @@ namespace Avalonia.Native _native.BeginDragAndDropOperation(effects, point, clipboard, callback, sourceHandle); } - public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } + private WindowTransparencyLevel _transparencyLevel; + + public WindowTransparencyLevel TransparencyLevel + { + get => _transparencyLevel; + set + { + if(_transparencyLevel != value) + { + _transparencyLevel = value; + + _native.SetBlurEnabled(_transparencyLevel >= WindowTransparencyLevel.Blur); + TransparencyLevelChanged?.Invoke(_transparencyLevel); + } + } + } public IPlatformHandle Handle { get; private set; } } From bd0b8942714592fedfef1e84886d31cade346d37 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 19 May 2020 14:08:06 +0200 Subject: [PATCH 012/201] Fix UseLayoutRounding calculations. Ported `RoundLayoutSize` and `RoundLayoutValue` from WPF and use these to calculated layout rounding. Fixes #3467. --- .../Presenters/ContentPresenter.cs | 12 ++-- src/Avalonia.Layout/LayoutHelper.cs | 58 ++++++++++++++++++ src/Avalonia.Layout/Layoutable.cs | 17 +++-- .../Primitives/TrackTests.cs | 4 +- .../Path_Expander_With_Border.expected.png | Bin 1281 -> 1284 bytes .../Path_Expander_With_Border.expected.png | Bin 1281 -> 1222 bytes 6 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/Avalonia.Controls/Presenters/ContentPresenter.cs b/src/Avalonia.Controls/Presenters/ContentPresenter.cs index 50aa8a9e71..f75184c686 100644 --- a/src/Avalonia.Controls/Presenters/ContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ContentPresenter.cs @@ -365,12 +365,8 @@ namespace Avalonia.Controls.Presenters if (useLayoutRounding) { - sizeForChild = new Size( - Math.Ceiling(sizeForChild.Width * scale) / scale, - Math.Ceiling(sizeForChild.Height * scale) / scale); - availableSize = new Size( - Math.Ceiling(availableSize.Width * scale) / scale, - Math.Ceiling(availableSize.Height * scale) / scale); + sizeForChild = LayoutHelper.RoundLayoutSize(sizeForChild, scale, scale); + availableSize = LayoutHelper.RoundLayoutSize(availableSize, scale, scale); } switch (horizontalContentAlignment) @@ -395,8 +391,8 @@ namespace Avalonia.Controls.Presenters if (useLayoutRounding) { - originX = Math.Floor(originX * scale) / scale; - originY = Math.Floor(originY * scale) / scale; + originX = LayoutHelper.RoundLayoutValue(originX, scale); + originY = LayoutHelper.RoundLayoutValue(originY, scale); } var boundsForChild = diff --git a/src/Avalonia.Layout/LayoutHelper.cs b/src/Avalonia.Layout/LayoutHelper.cs index 2b61de00a7..d8fa00deb7 100644 --- a/src/Avalonia.Layout/LayoutHelper.cs +++ b/src/Avalonia.Layout/LayoutHelper.cs @@ -82,6 +82,64 @@ namespace Avalonia.Layout InnerInvalidateMeasure(control); } + /// + /// Rounds a size to integer values for layout purposes, compensating for high DPI screen + /// coordinates. + /// + /// Input size. + /// DPI along x-dimension. + /// DPI along y-dimension. + /// Value of size that will be rounded under screen DPI. + /// + /// This is a layout helper method. It takes DPI into account and also does not return + /// the rounded value if it is unacceptable for layout, e.g. Infinity or NaN. It's a helper + /// associated with the UseLayoutRounding property and should not be used as a general rounding + /// utility. + /// + public static Size RoundLayoutSize(Size size, double dpiScaleX, double dpiScaleY) + { + return new Size(RoundLayoutValue(size.Width, dpiScaleX), RoundLayoutValue(size.Height, dpiScaleY)); + } + + /// + /// Calculates the value to be used for layout rounding at high DPI. + /// + /// Input value to be rounded. + /// Ratio of screen's DPI to layout DPI + /// Adjusted value that will produce layout rounding on screen at high dpi. + /// + /// This is a layout helper method. It takes DPI into account and also does not return + /// the rounded value if it is unacceptable for layout, e.g. Infinity or NaN. It's a helper + /// associated with the UseLayoutRounding property and should not be used as a general rounding + /// utility. + /// + public static double RoundLayoutValue(double value, double dpiScale) + { + double newValue; + + // If DPI == 1, don't use DPI-aware rounding. + if (!MathUtilities.AreClose(dpiScale, 1.0)) + { + newValue = Math.Round(value * dpiScale) / dpiScale; + + // If rounding produces a value unacceptable to layout (NaN, Infinity or MaxValue), + // use the original value. + if (double.IsNaN(newValue) || + double.IsInfinity(newValue) || + MathUtilities.AreClose(newValue, double.MaxValue)) + { + newValue = value; + } + } + else + { + newValue = Math.Round(value); + } + + return newValue; + } + + /// /// Calculates the min and max height for a control. Ported from WPF. /// diff --git a/src/Avalonia.Layout/Layoutable.cs b/src/Avalonia.Layout/Layoutable.cs index cbeab0482e..ce5200f4a4 100644 --- a/src/Avalonia.Layout/Layoutable.cs +++ b/src/Avalonia.Layout/Layoutable.cs @@ -1,5 +1,6 @@ using System; using Avalonia.Logging; +using Avalonia.Utilities; using Avalonia.VisualTree; namespace Avalonia.Layout @@ -545,8 +546,8 @@ namespace Avalonia.Layout if (UseLayoutRounding) { var scale = GetLayoutScale(); - width = Math.Ceiling(width * scale) / scale; - height = Math.Ceiling(height * scale) / scale; + width = LayoutHelper.RoundLayoutValue(width, scale); + height = LayoutHelper.RoundLayoutValue(height, scale); } return NonNegative(new Size(width, height).Inflate(margin)); @@ -623,12 +624,8 @@ namespace Avalonia.Layout if (useLayoutRounding) { - size = new Size( - Math.Ceiling(size.Width * scale) / scale, - Math.Ceiling(size.Height * scale) / scale); - availableSizeMinusMargins = new Size( - Math.Ceiling(availableSizeMinusMargins.Width * scale) / scale, - Math.Ceiling(availableSizeMinusMargins.Height * scale) / scale); + size = LayoutHelper.RoundLayoutSize(size, scale, scale); + availableSizeMinusMargins = LayoutHelper.RoundLayoutSize(availableSizeMinusMargins, scale, scale); } size = ArrangeOverride(size).Constrain(size); @@ -657,8 +654,8 @@ namespace Avalonia.Layout if (useLayoutRounding) { - originX = Math.Floor(originX * scale) / scale; - originY = Math.Floor(originY * scale) / scale; + originX = LayoutHelper.RoundLayoutValue(originX, scale); + originY = LayoutHelper.RoundLayoutValue(originY, scale); } Bounds = new Rect(originX, originY, size.Width, size.Height); diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs index f4001a8ca1..59276a94d0 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/TrackTests.cs @@ -67,7 +67,7 @@ namespace Avalonia.Controls.UnitTests.Primitives target.Measure(new Size(100, 100)); target.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(33, 0, 34, 12), thumb.Bounds); + Assert.Equal(new Rect(33, 0, 33, 12), thumb.Bounds); } [Fact] @@ -92,7 +92,7 @@ namespace Avalonia.Controls.UnitTests.Primitives target.Measure(new Size(100, 100)); target.Arrange(new Rect(0, 0, 100, 100)); - Assert.Equal(new Rect(0, 33, 12, 34), thumb.Bounds); + Assert.Equal(new Rect(0, 33, 12, 33), thumb.Bounds); } [Fact] diff --git a/tests/TestFiles/Direct2D1/Shapes/Path/Path_Expander_With_Border.expected.png b/tests/TestFiles/Direct2D1/Shapes/Path/Path_Expander_With_Border.expected.png index 4a7f4c26b06e0d7fefff05e0f1089072c0cd23db..7a7d70a521f2001728cddf42d0bb46b1752b8827 100644 GIT binary patch literal 1284 zcmWmEeM}Q)90%}noO)G+dvP1OQ=eY1txiI;Q&ZpAK~MTrK&0BKj5#)oW@0w45CguT zrzEyg%k>6|fxsWuWM;^OWGai(*)+67e8p_A;T9`oW5#I^S)5Gw+#k>9$@9(kzuzy9 zf5Upm%;|Hc>vX!APAIz29oG&q6?uM3M=QFLDqM~nUB@kU6g}{r*#+4;U1$A_$xo-C zXNObF-c+^i$xk;z50;a{UCWnOyjjHyFw2Opq29PB_qTyX{-)W^=hgFT1p2|j_3q6~ zdE&!|{U-mnr*2%j-T!**fJfIqvaaG<1}Pw|_AGohsX56=8o|Ey;J;MU2ko4@z_ zYBRg0+?!l-0{+Qu2b$%`fs6`Gem`={`5eu&>onV4n&Dz()A`Rd&+bB2eeFeF{$`)1 z6WkUfZtUe+{s2%eiII1)myn<2mB(U)k%!DQK6V%$XX4wrh56vQFT6nRv#3Y#t^hnv z#l74@5j^&V3Ax>(VtCgHs50@roHHLB^zjSjaidy`-#Z0W3LfH|B6vkQX>70_(q#Oq zNVf;E zPp0ErL~FVnaPY}gyh*eYav+aSCgTI5*D41Jc?%6wxD|dOLH6o#x(=qAl`7E->fqZnT*GZeq2FVc@0--wxT_h?BMGkC4wiD=*EvK@?1JY9NdNA-4nZEI_y$$Vo*9;o~(Gnfm; z6)SRg<8sZ=N@ROumSz!$%y64Ei{3-_xwU>@k=9@B()vRiwf>Mx>z5dV?_dwtNLM&= z8xvcFJ)9<$7|1!&5Fn${F<}=IOUBOSvF{UMv((2c`=XtPg+9U5E^ z4Q`&qLeS}ZREqiStc8Rr37cQ&u>={tXLrJOTIewalL$|KBE44VF$QJAlaWXd2t9^i zlHQY&NN*5sS%R{DxFnI@BHS_tb+|WG!VStJzmY`C$D-x4B?t&&q+8A)oLs?XY5_4py%ZqtK*0iH4eli IoYEuz0}8C+ZU6uP literal 1281 zcmWlZd2ka|9LK|U+rAAwHVv1sK(l#iz;cu-W6Dup(@m3D(qIIqNCnFTZ4m|*530iz z*eO}tS$5Y@+M$C2t3y!`>IEKyz-k*&W^fc~XGFRLY&aZ^GsqNleEY|K-n{Sr{&;V` zpIvcDoj>0?(Q2_+@`C{`g4cfY0Xdk*>W?45%cz$ley`>DMJA0mom5FV%mw4&A2vPi)ISjQ5KUKiorKU33>z=KZ~Og0du} zp*Q!Oj|*!LWk)dC9Lz@#nf!sx#S9%X`ExmmxvbaZH|6G}uh-;2xjDJK*JQ9OYdUxC z$eq|2c4$_tK@|3rnYRNi)y1<#VLX}X2;BDnm{-0 zK`*hq1|~tYLV>LODyItQvOP!;12yn06`ik;CGtG3D1mO-f{5s;g=c|QsgSI^H4Z`S zjvtN!(N%1^8{KoO5|x_3rV~hVss&W4o=vwS38x^%uxSBZ#3@KMu+81*qFZgHw0yQX zfd(CF4yDaxo7>T#Q*8xWh;0_opi9jG+IqI43k|weJEaw}6(SmOsCJ;uW-B_;h*Qm? zv@lx{Mizn9tJbA{lm9?^wt6Y2>+Q z8cmKnX!6-1lM|;Kn2~0aMLi}P(k7Yd=G(-_{1~Ef@hy)vwlO?nvdwbYEoyU;Y9-;L-#5KEOv6p^fD9s|(Le-Gs?`pF$=ldaE7B&(TH0CV{dpnP9H8AGe> zeKmww%ZvrEgkQ?aE&5XmT5a>MA;fBCJ{`z2uHdrV(qu~8U|hkqxFpadfN5Uq_Zdu5Rl@pW6HziREF20@2AlbjUY!C5}35{&J!Vhg5V54_$Jz5m;P&U01r% zANE}0bTzY}sDFiVZEEaGSg?}r-)>yX$6w*D{UlpZ6D{PJ_V1Xur!z5^=F4ioMf%xw z1B5NNEo$YM867T~Kk;NM4%c4FvgPjQ3OHunI6S$;rz5>;?j=0A%x6vgQ)aw#baVKN vmwubIZ+H0oe_Iy*xMOH__Nf*7E==uvqik_1Giee2jah=eI_|jl`JMj*ZcOVB diff --git a/tests/TestFiles/Skia/Shapes/Path/Path_Expander_With_Border.expected.png b/tests/TestFiles/Skia/Shapes/Path/Path_Expander_With_Border.expected.png index 4a7f4c26b06e0d7fefff05e0f1089072c0cd23db..7727284050259992e1dc6d2daf95d82b4d38fb5b 100644 GIT binary patch literal 1222 zcmWlZeM}Q)9LGz2go6OPmrRD7`t-_+!a&<>dNRb)9rkIhWfDM1$Oclzh;E}SbKvV9 z=|az7;Z7oELtp{2=|GubneHWv?lP{9EQXNi;zso7&_tYXTO4l7_Vkjw=kELYe*bvB zd44Cq;&Y`WEl)C;Oet<8m6KJE-Bdhzj_o|#PZscw(_KN4>j32skJZ_~YBA|u}zdlLWqufkj3Zg_C({(dN=ODCSW zTXsJ#2R&TZX{m>d@Ub$ArBE>5p1@kz)GI4d5Q&3M0_r}=je!-pO9@ziW*Gt32Y1E5 z$e9>;HaC`d_0w2lC+vPtxMjirRy7J*`Vh;Z48iSz_d=N#JdvgP!E`@j z8GWOq1|2_HRRCHF6t557<{}zsNm0BWc#Vk!K}){k-2$(15eZCpplnO`A;}(x|Hx7= zB@S;^lD)8=jtl~Os*;RgJrk(~_LWMq1nb!d1oi?Y*#YZ0ccVFd02Q)2FHOsid5f9~ z>}g7k7d~bp9{_ufQX|2~Y-B00Z&3P(%0*@afg@-c6{M7+EV@{Z z#^DF2&>@=IEJri&gAgjFf{hYuuB%=|;BwxGm7#X`9FyQ^rJcp&r5A}dohu+Upfz<8M)1A7}{i5oq!#ORJ#V%!&rf!z(U#E+gy z#zOb!t#Sn&tzLc=xLjuZwFMr?36s~HKoO(`?O~6Do-~u~htoiLuUJJoF?PD)pP~9C zq^K|{szcmM+B2@Z;i5ceB9(?orM=>E8u^SjB)AwFvXJt_r2G!i2fKMKz~ZSgK8MwR z(E@fnwUtk!^*$}Y;3*fM#_Ba%z=o$@=2uYuRO5~W=Qx+koc@tm$mtg}n+bQi`F2`w z)oe8GEalr7UDRw4cb4$&EIMpFchd2coxBOAyTokRU98y>aZMS|G5QypEgjdmc#hRy z)NE^TA5l5|qGsEO`&@h?73B@&g!g1CLk@PB9PF^jvM9qq9ylpmZDa((QE+}hOrrH- zW3?0BkcVh8EMYP%{bCZU7aFTQ@SHrf4nNPi0_HX!Pel_0G-Ga)_yc7A0%ZRFliObd zk9>SlCLI_b+y{-??Y}v+OIs_KFbSVkBuo5gRX!o^5hA``X=W0>uAn4-;lw67(2VAZ xSXWJ)+x*1&!twc&v%>7Yw{OnoUpn~jl5=bKBu;ZBUF64Pa+ms~v(DNh{{wkey+;55 literal 1281 zcmWlZd2ka|9LK|U+rAAwHVv1sK(l#iz;cu-W6Dup(@m3D(qIIqNCnFTZ4m|*530iz z*eO}tS$5Y@+M$C2t3y!`>IEKyz-k*&W^fc~XGFRLY&aZ^GsqNleEY|K-n{Sr{&;V` zpIvcDoj>0?(Q2_+@`C{`g4cfY0Xdk*>W?45%cz$ley`>DMJA0mom5FV%mw4&A2vPi)ISjQ5KUKiorKU33>z=KZ~Og0du} zp*Q!Oj|*!LWk)dC9Lz@#nf!sx#S9%X`ExmmxvbaZH|6G}uh-;2xjDJK*JQ9OYdUxC z$eq|2c4$_tK@|3rnYRNi)y1<#VLX}X2;BDnm{-0 zK`*hq1|~tYLV>LODyItQvOP!;12yn06`ik;CGtG3D1mO-f{5s;g=c|QsgSI^H4Z`S zjvtN!(N%1^8{KoO5|x_3rV~hVss&W4o=vwS38x^%uxSBZ#3@KMu+81*qFZgHw0yQX zfd(CF4yDaxo7>T#Q*8xWh;0_opi9jG+IqI43k|weJEaw}6(SmOsCJ;uW-B_;h*Qm? zv@lx{Mizn9tJbA{lm9?^wt6Y2>+Q z8cmKnX!6-1lM|;Kn2~0aMLi}P(k7Yd=G(-_{1~Ef@hy)vwlO?nvdwbYEoyU;Y9-;L-#5KEOv6p^fD9s|(Le-Gs?`pF$=ldaE7B&(TH0CV{dpnP9H8AGe> zeKmww%ZvrEgkQ?aE&5XmT5a>MA;fBCJ{`z2uHdrV(qu~8U|hkqxFpadfN5Uq_Zdu5Rl@pW6HziREF20@2AlbjUY!C5}35{&J!Vhg5V54_$Jz5m;P&U01r% zANE}0bTzY}sDFiVZEEaGSg?}r-)>yX$6w*D{UlpZ6D{PJ_V1Xur!z5^=F4ioMf%xw z1B5NNEo$YM867T~Kk;NM4%c4FvgPjQ3OHunI6S$;rz5>;?j=0A%x6vgQ)aw#baVKN vmwubIZ+H0oe_Iy*xMOH__Nf*7E==uvqik_1Giee2jah=eI_|jl`JMj*ZcOVB From 1e74316f63804b69be628401f3bb1d050ecd61cf Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 19 May 2020 20:31:45 +0200 Subject: [PATCH 013/201] Add unit test for `UseLayoutRounding`. --- .../LayoutableTests.cs | 32 +++++++++++++++++++ tests/Avalonia.UnitTests/TestRoot.cs | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/tests/Avalonia.Layout.UnitTests/LayoutableTests.cs b/tests/Avalonia.Layout.UnitTests/LayoutableTests.cs index 31310f7d42..a1c1e62f58 100644 --- a/tests/Avalonia.Layout.UnitTests/LayoutableTests.cs +++ b/tests/Avalonia.Layout.UnitTests/LayoutableTests.cs @@ -1,5 +1,6 @@ using System; using Avalonia.Controls; +using Avalonia.UnitTests; using Moq; using Xunit; @@ -171,6 +172,37 @@ namespace Avalonia.Layout.UnitTests target.Verify(x => x.InvalidateMeasure(root), Times.Once()); } + [Theory] + [InlineData(16, 6, 5.333333333333333)] + [InlineData(18, 10, 4)] + public void UseLayoutRounding_Arranges_Center_Alignment_Correctly_With_Fractional_Scaling( + double containerWidth, + double childWidth, + double expectedX) + { + Border target; + var root = new TestRoot + { + LayoutScaling = 1.5, + UseLayoutRounding = true, + Child = new Decorator + { + Width = containerWidth, + Height = 100, + Child = target = new Border + { + Width = childWidth, + HorizontalAlignment = HorizontalAlignment.Center, + } + } + }; + + root.Measure(new Size(100, 100)); + root.Arrange(new Rect(target.DesiredSize)); + + Assert.Equal(new Rect(expectedX, 0, childWidth, 100), target.Bounds); + } + private class TestLayoutable : Layoutable { public Size ArrangeSize { get; private set; } diff --git a/tests/Avalonia.UnitTests/TestRoot.cs b/tests/Avalonia.UnitTests/TestRoot.cs index 56a1a6c245..f291d386aa 100644 --- a/tests/Avalonia.UnitTests/TestRoot.cs +++ b/tests/Avalonia.UnitTests/TestRoot.cs @@ -42,7 +42,7 @@ namespace Avalonia.UnitTests public Size MaxClientSize { get; set; } = Size.Infinity; - public double LayoutScaling => 1; + public double LayoutScaling { get; set; } = 1; public ILayoutManager LayoutManager { get; set; } = new LayoutManager(); From 119d92732fbb5d9f6ecde5aef43b83eb9cd61ad2 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 19 May 2020 20:32:20 +0200 Subject: [PATCH 014/201] Don't UseLayoutRounding on ScrollBar. Its default size of 18 with a thumb size of 8 can't be laid out to device pixels with a scaling of 1.5x. Previously, the thumb had more space on the right than the left, with this change it had more space on the left than the right. For some reason though it was more noticably offset with the space on the left. We may need to change the default sizes for `ScrollBar`. --- src/Avalonia.Themes.Default/ScrollBar.xaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Themes.Default/ScrollBar.xaml b/src/Avalonia.Themes.Default/ScrollBar.xaml index 64a4399d16..0f8fa4986d 100644 --- a/src/Avalonia.Themes.Default/ScrollBar.xaml +++ b/src/Avalonia.Themes.Default/ScrollBar.xaml @@ -3,7 +3,8 @@ - + - + Date: Wed, 20 May 2020 09:34:58 -0300 Subject: [PATCH 015/201] set hidden flag --- src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs | 8 ++++++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 7 +++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 088c4b17ac..92a06279bb 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -1334,6 +1334,14 @@ namespace Avalonia.Win32.Interop ACCENT_INVALID_STATE = 6 } + internal enum AccentFlags + { + DrawLeftBorder = 0x20, + DrawTopBorder = 0x40, + DrawRightBorder = 0x80, + DrawBottomBorder = 0x100, + } + [StructLayout(LayoutKind.Sequential)] internal struct AccentPolicy { diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 45abf9fd79..ae9c2c9030 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -247,14 +247,17 @@ namespace Avalonia.Win32 break; case WindowTransparencyLevel.Blur: - accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; + accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; break; case (WindowTransparencyLevel.Blur + 1): accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; break; } - var bgcolor = 0x00ffffff; + + var version = Environment.OSVersion; + accent.AccentFlags = 2;// (int)(AccentFlags.DrawBottomBorder | AccentFlags.DrawLeftBorder | AccentFlags.DrawRightBorder | AccentFlags.DrawTopBorder); + var bgcolor = 0x00FFFFFF; accent.GradientColor = bgcolor; From 8d899096bb5b91c8852448f495674241f4bb691a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 10:14:46 -0300 Subject: [PATCH 016/201] implement appropriate blur level depending on windows 10 version. --- .../Interop/UnmanagedMethods.cs | 29 ++++++++++++++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 34 ++++++++++++------- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index 92a06279bb..b06708ebd2 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -1305,6 +1305,35 @@ namespace Avalonia.Win32.Interop [DllImport("dwmapi.dll")] public static extern int DwmIsCompositionEnabled(out bool enabled); + [StructLayout(LayoutKind.Sequential)] + internal struct RTL_OSVERSIONINFOEX + { + internal uint dwOSVersionInfoSize; + internal uint dwMajorVersion; + internal uint dwMinorVersion; + internal uint dwBuildNumber; + internal uint dwPlatformId; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + internal string szCSDVersion; + } + + [DllImport("ntdll")] + private static extern int RtlGetVersion(out RTL_OSVERSIONINFOEX lpVersionInformation); + + internal static Version RtlGetVersion() + { + RTL_OSVERSIONINFOEX v = new RTL_OSVERSIONINFOEX(); + v.dwOSVersionInfoSize = (uint)Marshal.SizeOf(v); + if (RtlGetVersion(out v) == 0) + { + return new Version((int)v.dwMajorVersion, (int)v.dwMinorVersion, (int)v.dwBuildNumber, (int)v.dwPlatformId); + } + else + { + throw new Exception("RtlGetVersion failed!"); + } + } + [DllImport("user32.dll")] internal static extern int SetWindowCompositionAttribute(IntPtr hwnd, ref WindowCompositionAttributeData data); diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index ae9c2c9030..dd9a350b85 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -210,15 +210,15 @@ namespace Avalonia.Win32 } } - public WindowTransparencyLevel TransparencyLevel + public WindowTransparencyLevel TransparencyLevel { get => _transparencyLevel; - set + set { var oldValue = _transparencyLevel; _transparencyLevel = EnableBlur(value); - if(oldValue != _transparencyLevel) + if (oldValue != _transparencyLevel) { TransparencyLevelChanged?.Invoke(_transparencyLevel); } @@ -227,7 +227,21 @@ namespace Avalonia.Win32 private WindowTransparencyLevel EnableBlur(WindowTransparencyLevel transparencyLevel) { - if(DwmIsCompositionEnabled(out var compositionEnabled) != 0 || !compositionEnabled) + var version = RtlGetVersion(); + bool canUseTransparency = false; + bool canUseAcrylic = false; + + if (version.Major >= 10) + { + canUseTransparency = true; + + if (version.Build >= 19628) + { + canUseAcrylic = true; + } + } + + if (!canUseTransparency || DwmIsCompositionEnabled(out var compositionEnabled) != 0 || !compositionEnabled) { return WindowTransparencyLevel.None; } @@ -247,19 +261,16 @@ namespace Avalonia.Win32 break; case WindowTransparencyLevel.Blur: - accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; + accent.AccentState = canUseAcrylic ? AccentState.ACCENT_ENABLE_ACRYLIC : AccentState.ACCENT_ENABLE_BLURBEHIND; break; - case (WindowTransparencyLevel.Blur + 1): + case (WindowTransparencyLevel.Blur + 1): // hack force acrylic on windows 10. accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; break; } - var version = Environment.OSVersion; - accent.AccentFlags = 2;// (int)(AccentFlags.DrawBottomBorder | AccentFlags.DrawLeftBorder | AccentFlags.DrawRightBorder | AccentFlags.DrawTopBorder); - var bgcolor = 0x00FFFFFF; - - accent.GradientColor = bgcolor; + accent.AccentFlags = 2; + accent.GradientColor = 0x00FFFFFF; var accentPtr = Marshal.AllocHGlobal(accentStructSize); Marshal.StructureToPtr(accent, accentPtr, false); @@ -273,7 +284,6 @@ namespace Avalonia.Win32 Marshal.FreeHGlobal(accentPtr); - //todo return acheived level and check windows versions. return transparencyLevel; } From 9e9565f40f5222b477cdc4607c5f3ec2eab1f430 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 10:39:00 -0300 Subject: [PATCH 017/201] fix border only margin. --- src/Windows/Avalonia.Win32/WindowImpl.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index dd9a350b85..2cf87c1556 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -861,9 +861,14 @@ namespace Avalonia.Win32 if (!_isFullScreenActive) { + var margin = newProperties.Decorations == SystemDecorations.BorderOnly ? 1 : 0; + var margins = new MARGINS { - cyBottomHeight = newProperties.Decorations == SystemDecorations.BorderOnly ? 1 : 0 + cyBottomHeight = margin, + cxRightWidth = margin, + cxLeftWidth = margin, + cyTopHeight = margin }; DwmExtendFrameIntoClientArea(_hwnd, ref margins); From 58c518c573d73722075f1151ad15ee1b8ce18756 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 11:12:38 -0300 Subject: [PATCH 018/201] Add Hint / Actual properties for Transparency. --- samples/ControlCatalog/MainView.xaml.cs | 2 +- src/Avalonia.Controls/TopLevel.cs | 44 ++++++++++++++++++++----- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs index d1d54c6636..8c4818fb07 100644 --- a/samples/ControlCatalog/MainView.xaml.cs +++ b/samples/ControlCatalog/MainView.xaml.cs @@ -68,7 +68,7 @@ namespace ControlCatalog transparencyLevels.SelectionChanged += (sender, e) => { if (VisualRoot is Window window) - window.TransparencyLevel = (WindowTransparencyLevel)transparencyLevels.SelectedIndex; + window.TransparencyLevelHint = (WindowTransparencyLevel)transparencyLevels.SelectedIndex; }; } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 3ac5779ed3..55212eb3dc 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -46,13 +46,21 @@ namespace Avalonia.Controls AvaloniaProperty.Register(nameof(IInputRoot.PointerOverElement)); /// - /// Represents the current . + /// Defines the property. /// - public static readonly StyledProperty TransparencyLevelProperty = - AvaloniaProperty.Register(nameof(TransparencyLevel), WindowTransparencyLevel.None); + public static readonly StyledProperty TransparencyLevelHintProperty = + AvaloniaProperty.Register(nameof(TransparencyLevelHint), WindowTransparencyLevel.None); /// - /// Defines the property. + /// Defines the property. + /// + public static readonly DirectProperty ActualTransparencyLevelProperty = + AvaloniaProperty.RegisterDirect(nameof(ActualTransparencyLevel), + o => o.ActualTransparencyLevel, + unsetValue: WindowTransparencyLevel.None); + + /// + /// Defines the property. /// public static readonly StyledProperty TransparencyBackgroundFallbackProperty = AvaloniaProperty.Register(nameof(TransparencyBackgroundFallback), Brushes.White); @@ -63,6 +71,7 @@ namespace Avalonia.Controls private readonly IPlatformRenderInterface _renderInterface; private readonly IGlobalStyles _globalStyles; private Size _clientSize; + private WindowTransparencyLevel _actualTransparencyLevel; private ILayoutManager _layoutManager; private Border _transparencyFallbackBorder; @@ -73,7 +82,7 @@ namespace Avalonia.Controls { AffectsMeasure(ClientSizeProperty); - TransparencyLevelProperty.Changed.AddClassHandler( + TransparencyLevelHintProperty.Changed.AddClassHandler( (tl, e) => { if (tl.PlatformImpl != null) tl.PlatformImpl.TransparencyLevel = (WindowTransparencyLevel)e.NewValue; }); } @@ -103,6 +112,8 @@ namespace Avalonia.Controls PlatformImpl = impl; + _actualTransparencyLevel = WindowTransparencyLevel.None; + dependencyResolver = dependencyResolver ?? AvaloniaLocator.Current; var styler = TryGetService(dependencyResolver); @@ -175,14 +186,27 @@ namespace Avalonia.Controls } /// - /// Gets or sets the . + /// Gets or sets the that the TopLevel should use when possible. /// - public WindowTransparencyLevel TransparencyLevel + public WindowTransparencyLevel TransparencyLevelHint { - get { return GetValue(TransparencyLevelProperty); } - set { SetValue(TransparencyLevelProperty, value); } + get { return GetValue(TransparencyLevelHintProperty); } + set { SetValue(TransparencyLevelHintProperty, value); } } + /// + /// Gets the acheived that the platform was able to provide. + /// + public WindowTransparencyLevel ActualTransparencyLevel + { + get => _actualTransparencyLevel; + private set => SetAndRaise(ActualTransparencyLevelProperty, ref _actualTransparencyLevel, value); + } + + /// + /// Gets or sets the that transparency will blend with when transparency is not supported. + /// By default this is a solid white brush. + /// public IBrush TransparencyBackgroundFallback { get => GetValue(TransparencyBackgroundFallbackProperty); @@ -359,6 +383,8 @@ namespace Avalonia.Controls _transparencyFallbackBorder.Background = Brushes.Transparent; } } + + ActualTransparencyLevel = transparencyLevel; } /// From 4011cb3f4944a31c23b15913ce3630e77a0464a9 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 11:27:23 -0300 Subject: [PATCH 019/201] Use Hint/Actual naming --- .../Embedding/Offscreen/OffscreenTopLevelImpl.cs | 2 +- src/Avalonia.Controls/Platform/ITopLevelImpl.cs | 7 +++++-- src/Avalonia.Controls/TopLevel.cs | 4 ++-- src/Avalonia.DesignerSupport/Remote/Stubs.cs | 2 +- src/Avalonia.Native/WindowImplBase.cs | 2 +- src/Avalonia.X11/X11Window.cs | 2 +- .../Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs | 2 +- src/Windows/Avalonia.Win32/WindowImpl.cs | 2 +- 8 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs index 5d7c968173..625acb17c3 100644 --- a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs +++ b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs @@ -65,7 +65,7 @@ namespace Avalonia.Controls.Embedding.Offscreen public Action Closed { get; set; } public abstract IMouseDevice MouseDevice { get; } - public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } + public WindowTransparencyLevel TransparencyLevelHint { get => WindowTransparencyLevel.None; set { } } public IPopupImpl CreatePopup() => null; } diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index b22962115e..4bcfaf91d6 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -59,6 +59,9 @@ namespace Avalonia.Platform /// Action ScalingChanged { get; set; } + /// + /// Gets or sets a method called when the toplevel's TransparencyLevel changes. + /// Action TransparencyLevelChanged { get; set; } /// @@ -111,8 +114,8 @@ namespace Avalonia.Platform IPopupImpl CreatePopup(); /// - /// Gets or sets the ofthe TopLevel. + /// Gets or sets the of the TopLevel. /// - WindowTransparencyLevel TransparencyLevel { get; set; } + WindowTransparencyLevel TransparencyLevelHint { get; set; } } } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 55212eb3dc..1bf33acf42 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -83,7 +83,7 @@ namespace Avalonia.Controls AffectsMeasure(ClientSizeProperty); TransparencyLevelHintProperty.Changed.AddClassHandler( - (tl, e) => { if (tl.PlatformImpl != null) tl.PlatformImpl.TransparencyLevel = (WindowTransparencyLevel)e.NewValue; }); + (tl, e) => { if (tl.PlatformImpl != null) tl.PlatformImpl.TransparencyLevelHint = (WindowTransparencyLevel)e.NewValue; }); } /// @@ -402,7 +402,7 @@ namespace Avalonia.Controls _transparencyFallbackBorder = e.NameScope.Find("PART_TransparencyFallback"); - HandleTransparencyLevelChanged(PlatformImpl.TransparencyLevel); + HandleTransparencyLevelChanged(PlatformImpl.TransparencyLevelHint); } /// diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs index 0b5d2cb2b9..95284f18fe 100644 --- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -144,7 +144,7 @@ namespace Avalonia.DesignerSupport.Remote public Action GotInputWhenDisabled { get; set; } - public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } + public WindowTransparencyLevel TransparencyLevelHint { get => WindowTransparencyLevel.None; set { } } } class ClipboardStub : IClipboard diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 2442c2cba4..5852675fb6 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -393,7 +393,7 @@ namespace Avalonia.Native private WindowTransparencyLevel _transparencyLevel; - public WindowTransparencyLevel TransparencyLevel + public WindowTransparencyLevel TransparencyLevelHint { get => _transparencyLevel; set diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 84f0b8c877..6006135a2b 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -1086,6 +1086,6 @@ namespace Avalonia.X11 public IPopupPositioner PopupPositioner { get; } public ITopLevelNativeMenuExporter NativeMenuExporter { get; } - public WindowTransparencyLevel TransparencyLevel { get; set; } + public WindowTransparencyLevel TransparencyLevelHint { get; set; } } } diff --git a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs index fa518bafec..3f50e1e4eb 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs @@ -83,6 +83,6 @@ namespace Avalonia.LinuxFramebuffer public Size ScaledSize => _outputBackend.PixelSize.ToSize(Scaling); - public WindowTransparencyLevel TransparencyLevel { get => WindowTransparencyLevel.None; set { } } + public WindowTransparencyLevel TransparencyLevelHint { get => WindowTransparencyLevel.None; set { } } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 2cf87c1556..005df2b99b 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -210,7 +210,7 @@ namespace Avalonia.Win32 } } - public WindowTransparencyLevel TransparencyLevel + public WindowTransparencyLevel TransparencyLevelHint { get => _transparencyLevel; set From 21e3642a2ca2ca4cd5c35b484eefdc3a4e36fd5e Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 11:42:33 -0300 Subject: [PATCH 020/201] encapsulate and cache os version. --- src/Windows/Avalonia.Win32/Win32Platform.cs | 5 +++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 5 ++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Windows/Avalonia.Win32/Win32Platform.cs b/src/Windows/Avalonia.Win32/Win32Platform.cs index c01bc8e16d..e25c5e4733 100644 --- a/src/Windows/Avalonia.Win32/Win32Platform.cs +++ b/src/Windows/Avalonia.Win32/Win32Platform.cs @@ -58,6 +58,11 @@ namespace Avalonia.Win32 CreateMessageWindow(); } + /// + /// Gets the actual WindowsVersion. Same as the info returned from RtlGetVersion. + /// + public static Version WindowsVersion { get; } = RtlGetVersion(); + public static bool UseDeferredRendering => Options.UseDeferredRendering; internal static bool UseOverlayPopups => Options.OverlayPopups; public static Win32PlatformOptions Options { get; private set; } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 005df2b99b..105823d206 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -227,15 +227,14 @@ namespace Avalonia.Win32 private WindowTransparencyLevel EnableBlur(WindowTransparencyLevel transparencyLevel) { - var version = RtlGetVersion(); bool canUseTransparency = false; bool canUseAcrylic = false; - if (version.Major >= 10) + if (Win32Platform.WindowsVersion.Major >= 10) { canUseTransparency = true; - if (version.Build >= 19628) + if (Win32Platform.WindowsVersion.Build >= 19628) { canUseAcrylic = true; } From 20916d49db969af5f1d7650e52721c45b906efe2 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 15:39:02 -0300 Subject: [PATCH 021/201] fix transparency fallback border. --- src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml | 5 +++-- src/Avalonia.Themes.Default/OverlayPopupHost.xaml | 5 +++-- src/Avalonia.Themes.Default/PopupRoot.xaml | 5 +++-- src/Avalonia.Themes.Default/Window.xaml | 5 +++-- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml b/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml index 3acab7d7bc..9ffe51fae8 100644 --- a/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml +++ b/src/Avalonia.Themes.Default/EmbeddableControlRoot.xaml @@ -3,7 +3,8 @@ - + + - + diff --git a/src/Avalonia.Themes.Default/OverlayPopupHost.xaml b/src/Avalonia.Themes.Default/OverlayPopupHost.xaml index e57325499d..36dbc1b761 100644 --- a/src/Avalonia.Themes.Default/OverlayPopupHost.xaml +++ b/src/Avalonia.Themes.Default/OverlayPopupHost.xaml @@ -2,7 +2,8 @@ - + + - + diff --git a/src/Avalonia.Themes.Default/PopupRoot.xaml b/src/Avalonia.Themes.Default/PopupRoot.xaml index 1a55d2f7a4..9af4f5a910 100644 --- a/src/Avalonia.Themes.Default/PopupRoot.xaml +++ b/src/Avalonia.Themes.Default/PopupRoot.xaml @@ -2,7 +2,8 @@ - + + - + diff --git a/src/Avalonia.Themes.Default/Window.xaml b/src/Avalonia.Themes.Default/Window.xaml index e29409e894..0e7ec42856 100644 --- a/src/Avalonia.Themes.Default/Window.xaml +++ b/src/Avalonia.Themes.Default/Window.xaml @@ -4,7 +4,8 @@ - + + - + From f88f94cce35d8a1aea2aba1c376ba0af58cd5767 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 17:11:15 -0300 Subject: [PATCH 022/201] fix win 10 version number check --- src/Windows/Avalonia.Win32/WindowImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 105823d206..6a78c150e0 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -234,7 +234,7 @@ namespace Avalonia.Win32 { canUseTransparency = true; - if (Win32Platform.WindowsVersion.Build >= 19628) + if (Win32Platform.WindowsVersion.Major > 10 || Win32Platform.WindowsVersion.Build >= 19628) { canUseAcrylic = true; } From b818ca05d4193648b20c3c4f7e6af9ffa639cbf0 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 18:23:37 -0300 Subject: [PATCH 023/201] always draw the border. --- src/Windows/Avalonia.Win32/WindowImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 6a78c150e0..5eb92a4023 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -268,7 +268,7 @@ namespace Avalonia.Win32 break; } - accent.AccentFlags = 2; + accent.AccentFlags = 2 | (int)(AccentFlags.DrawLeftBorder | AccentFlags.DrawBottomBorder | AccentFlags.DrawRightBorder | AccentFlags.DrawTopBorder); accent.GradientColor = 0x00FFFFFF; var accentPtr = Marshal.AllocHGlobal(accentStructSize); From d1049fd79fcc9ffe64853bbd181c557d38c67f9a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 18:37:33 -0300 Subject: [PATCH 024/201] dont use property for setting transparency level hint. --- .../Offscreen/OffscreenTopLevelImpl.cs | 4 +++- .../Platform/ITopLevelImpl.cs | 9 ++++++-- src/Avalonia.Controls/TopLevel.cs | 4 ++-- src/Avalonia.DesignerSupport/Remote/Stubs.cs | 4 +++- src/Avalonia.Native/WindowImplBase.cs | 20 +++++++--------- src/Avalonia.X11/X11Window.cs | 5 +++- .../FramebufferToplevelImpl.cs | 4 +++- src/Windows/Avalonia.Win32/WindowImpl.cs | 23 ++++++++----------- 8 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs index 625acb17c3..09f9ed7c1b 100644 --- a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs +++ b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs @@ -65,7 +65,9 @@ namespace Avalonia.Controls.Embedding.Offscreen public Action Closed { get; set; } public abstract IMouseDevice MouseDevice { get; } - public WindowTransparencyLevel TransparencyLevelHint { get => WindowTransparencyLevel.None; set { } } + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { } + + public WindowTransparencyLevel TransparencyLevel { get; private set; } public IPopupImpl CreatePopup() => null; } diff --git a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs index 4bcfaf91d6..c7875f6413 100644 --- a/src/Avalonia.Controls/Platform/ITopLevelImpl.cs +++ b/src/Avalonia.Controls/Platform/ITopLevelImpl.cs @@ -114,8 +114,13 @@ namespace Avalonia.Platform IPopupImpl CreatePopup(); /// - /// Gets or sets the of the TopLevel. + /// Sets the hint of the TopLevel. /// - WindowTransparencyLevel TransparencyLevelHint { get; set; } + void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel); + + /// + /// Gets the current of the TopLevel. + /// + WindowTransparencyLevel TransparencyLevel { get; } } } diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 6c09420f35..b61623a759 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -83,7 +83,7 @@ namespace Avalonia.Controls AffectsMeasure(ClientSizeProperty); TransparencyLevelHintProperty.Changed.AddClassHandler( - (tl, e) => { if (tl.PlatformImpl != null) tl.PlatformImpl.TransparencyLevelHint = (WindowTransparencyLevel)e.NewValue; }); + (tl, e) => { if (tl.PlatformImpl != null) tl.PlatformImpl.SetTransparencyLevelHint((WindowTransparencyLevel)e.NewValue); }); } /// @@ -402,7 +402,7 @@ namespace Avalonia.Controls _transparencyFallbackBorder = e.NameScope.Find("PART_TransparencyFallback"); - HandleTransparencyLevelChanged(PlatformImpl.TransparencyLevelHint); + HandleTransparencyLevelChanged(PlatformImpl.TransparencyLevel); } /// diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs index 95284f18fe..a9665b1519 100644 --- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -144,7 +144,9 @@ namespace Avalonia.DesignerSupport.Remote public Action GotInputWhenDisabled { get; set; } - public WindowTransparencyLevel TransparencyLevelHint { get => WindowTransparencyLevel.None; set { } } + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { } + + public WindowTransparencyLevel TransparencyLevel { get; private set; } } class ClipboardStub : IClipboard diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 5852675fb6..5072d98256 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -391,23 +391,19 @@ namespace Avalonia.Native _native.BeginDragAndDropOperation(effects, point, clipboard, callback, sourceHandle); } - private WindowTransparencyLevel _transparencyLevel; - - public WindowTransparencyLevel TransparencyLevelHint + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { - get => _transparencyLevel; - set + if (TransparencyLevel != transparencyLevel) { - if(_transparencyLevel != value) - { - _transparencyLevel = value; + TransparencyLevel = transparencyLevel; - _native.SetBlurEnabled(_transparencyLevel >= WindowTransparencyLevel.Blur); - TransparencyLevelChanged?.Invoke(_transparencyLevel); - } - } + _native.SetBlurEnabled(TransparencyLevel >= WindowTransparencyLevel.Blur); + TransparencyLevelChanged?.Invoke(TransparencyLevel); + } } + public WindowTransparencyLevel TransparencyLevel { get; private set; } + public IPlatformHandle Handle { get; private set; } } } diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index 6006135a2b..bce82b2954 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -1086,6 +1086,9 @@ namespace Avalonia.X11 public IPopupPositioner PopupPositioner { get; } public ITopLevelNativeMenuExporter NativeMenuExporter { get; } - public WindowTransparencyLevel TransparencyLevelHint { get; set; } + + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { } + + public WindowTransparencyLevel TransparencyLevel { get; private set; } } } diff --git a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs index 3f50e1e4eb..d4a29e39c6 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/FramebufferToplevelImpl.cs @@ -83,6 +83,8 @@ namespace Avalonia.LinuxFramebuffer public Size ScaledSize => _outputBackend.PixelSize.ToSize(Scaling); - public WindowTransparencyLevel TransparencyLevelHint { get => WindowTransparencyLevel.None; set { } } + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { } + + public WindowTransparencyLevel TransparencyLevel { get; private set; } } } diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 5eb92a4023..e9c14274cd 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -66,8 +66,7 @@ namespace Avalonia.Win32 private OleDropTarget _dropTarget; private Size _minSize; private Size _maxSize; - private WindowImpl _parent; - private WindowTransparencyLevel _transparencyLevel = WindowTransparencyLevel.None; + private WindowImpl _parent; public WindowImpl() { @@ -210,18 +209,16 @@ namespace Avalonia.Win32 } } - public WindowTransparencyLevel TransparencyLevelHint + public WindowTransparencyLevel TransparencyLevel { get; private set; } + + public void SetTransparencyLevelHint (WindowTransparencyLevel transparencyLevel) { - get => _transparencyLevel; - set - { - var oldValue = _transparencyLevel; - _transparencyLevel = EnableBlur(value); + var level = EnableBlur(transparencyLevel); - if (oldValue != _transparencyLevel) - { - TransparencyLevelChanged?.Invoke(_transparencyLevel); - } + if (TransparencyLevel != level) + { + TransparencyLevel = level; + TransparencyLevelChanged?.Invoke(TransparencyLevel); } } @@ -281,7 +278,7 @@ namespace Avalonia.Win32 SetWindowCompositionAttribute(_hwnd, ref data); - Marshal.FreeHGlobal(accentPtr); + Marshal.FreeHGlobal(accentPtr); return transparencyLevel; } From 1a5c8fcf3f9f92067f07385da71f2df742276fde Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Thu, 21 May 2020 01:12:19 +0300 Subject: [PATCH 025/201] X11 transparency reporting and blur support --- src/Avalonia.X11/TransparencyHelper.cs | 83 +++++++++++ src/Avalonia.X11/X11Atoms.cs | 2 + src/Avalonia.X11/X11Globals.cs | 183 +++++++++++++++++++++++++ src/Avalonia.X11/X11Platform.cs | 2 + src/Avalonia.X11/X11Window.cs | 15 +- 5 files changed, 282 insertions(+), 3 deletions(-) create mode 100644 src/Avalonia.X11/TransparencyHelper.cs create mode 100644 src/Avalonia.X11/X11Globals.cs diff --git a/src/Avalonia.X11/TransparencyHelper.cs b/src/Avalonia.X11/TransparencyHelper.cs new file mode 100644 index 0000000000..6d62d21ec6 --- /dev/null +++ b/src/Avalonia.X11/TransparencyHelper.cs @@ -0,0 +1,83 @@ +using System; +using Avalonia.Controls; + +namespace Avalonia.X11 +{ + class TransparencyHelper : IDisposable, X11Globals.IGlobalsSubscriber + { + private readonly X11Info _x11; + private readonly IntPtr _window; + private readonly X11Globals _globals; + private WindowTransparencyLevel _currentLevel; + private WindowTransparencyLevel _requestedLevel; + private bool _isCompositing; + private bool _blurAtomsAreSet; + + public Action TransparencyLevelChanged { get; set; } + public WindowTransparencyLevel CurrentLevel => _currentLevel; + + public TransparencyHelper(X11Info x11, IntPtr window, X11Globals globals) + { + _x11 = x11; + _window = window; + _globals = globals; + _globals.AddSubscriber(this); + } + + public void SetTransparencyRequest(WindowTransparencyLevel level) + { + _requestedLevel = level; + UpdateTransparency(); + } + + private void UpdateTransparency() + { + var newLevel = UpdateAtomsAndGetTransparency(); + if (newLevel != _currentLevel) + { + _currentLevel = newLevel; + TransparencyLevelChanged?.Invoke(newLevel); + } + } + + private WindowTransparencyLevel UpdateAtomsAndGetTransparency() + { + if (_requestedLevel >= WindowTransparencyLevel.Blur) + { + if (!_blurAtomsAreSet) + { + IntPtr value = IntPtr.Zero; + XLib.XChangeProperty(_x11.Display, _window, _x11.Atoms._KDE_NET_WM_BLUR_BEHIND_REGION, + _x11.Atoms.XA_CARDINAL, 32, PropertyMode.Replace, ref value, 1); + _blurAtomsAreSet = true; + } + } + else + { + if (_blurAtomsAreSet) + { + XLib.XDeleteProperty(_x11.Display, _window, _x11.Atoms._KDE_NET_WM_BLUR_BEHIND_REGION); + _blurAtomsAreSet = false; + } + } + + if (!_globals.IsCompositionEnabled) + return WindowTransparencyLevel.None; + if (_requestedLevel >= WindowTransparencyLevel.Blur && CanBlur) + return WindowTransparencyLevel.Blur; + return WindowTransparencyLevel.Transparent; + } + + + private bool CanBlur => _globals.WmName == "KWin" && _globals.IsCompositionEnabled; + + public void Dispose() + { + _globals.RemoveSubscriber(this); + } + + void X11Globals.IGlobalsSubscriber.WmChanged(string wmName) => UpdateTransparency(); + + void X11Globals.IGlobalsSubscriber.CompositionChanged(bool compositing) => UpdateTransparency(); + } +} diff --git a/src/Avalonia.X11/X11Atoms.cs b/src/Avalonia.X11/X11Atoms.cs index 523b65c115..dd16fae386 100644 --- a/src/Avalonia.X11/X11Atoms.cs +++ b/src/Avalonia.X11/X11Atoms.cs @@ -185,6 +185,8 @@ namespace Avalonia.X11 public readonly IntPtr UTF8_STRING; public readonly IntPtr UTF16_STRING; public readonly IntPtr ATOM_PAIR; + public readonly IntPtr MANAGER; + public readonly IntPtr _KDE_NET_WM_BLUR_BEHIND_REGION; public X11Atoms(IntPtr display) diff --git a/src/Avalonia.X11/X11Globals.cs b/src/Avalonia.X11/X11Globals.cs new file mode 100644 index 0000000000..54032831f6 --- /dev/null +++ b/src/Avalonia.X11/X11Globals.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using static Avalonia.X11.XLib; +namespace Avalonia.X11 +{ + unsafe class X11Globals + { + private readonly AvaloniaX11Platform _plat; + private readonly int _screenNumber; + private readonly X11Info _x11; + private readonly IntPtr _rootWindow; + private readonly IntPtr _compositingAtom; + private readonly List _subscribers = new List(); + + private string _wmName; + private IntPtr _compositionAtomOwner; + private bool _isCompositionEnabled; + + public X11Globals(AvaloniaX11Platform plat) + { + _plat = plat; + _x11 = plat.Info; + _screenNumber = XDefaultScreen(_x11.Display); + _rootWindow = XRootWindow(_x11.Display, _screenNumber); + plat.Windows[_rootWindow] = OnRootWindowEvent; + XSelectInput(_x11.Display, _rootWindow, + new IntPtr((int)(EventMask.StructureNotifyMask | EventMask.PropertyChangeMask))); + _compositingAtom = XInternAtom(_x11.Display, "_NET_WM_CM_S" + _screenNumber, false); + UpdateWmName(); + UpdateCompositingAtomOwner(); + } + + public string WmName + { + get => _wmName; + private set + { + if (_wmName != value) + { + _wmName = value; + // The collection might change during enumeration + foreach (var s in _subscribers.ToList()) + s.WmChanged(value); + } + } + } + + private IntPtr CompositionAtomOwner + { + get => _compositionAtomOwner; + set + { + if (_compositionAtomOwner != value) + { + _compositionAtomOwner = value; + IsCompositionEnabled = _compositionAtomOwner != IntPtr.Zero; + } + } + } + + public bool IsCompositionEnabled + { + get => _isCompositionEnabled; + set + { + if (_isCompositionEnabled != value) + { + _isCompositionEnabled = value; + // The collection might change during enumeration + foreach (var s in _subscribers.ToList()) + s.CompositionChanged(value); + } + } + } + + + IntPtr GetSupportingWmCheck(IntPtr window) + { + XGetWindowProperty(_x11.Display, _rootWindow, _x11.Atoms._NET_SUPPORTING_WM_CHECK, + IntPtr.Zero, new IntPtr(IntPtr.Size), false, + _x11.Atoms.XA_WINDOW, out IntPtr actualType, out int actualFormat, out IntPtr nitems, + out IntPtr bytesAfter, out IntPtr prop); + if (nitems.ToInt32() != 1) + return IntPtr.Zero; + try + { + if (actualType != _x11.Atoms.XA_WINDOW) + return IntPtr.Zero; + return *(IntPtr*)prop.ToPointer(); + } + finally + { + XFree(prop); + } + } + + void UpdateCompositingAtomOwner() + { + // This procedure is described in https://tronche.com/gui/x/icccm/sec-2.html#s-2.8 + + // Check the server-side selection owner + var newOwner = XGetSelectionOwner(_x11.Display, _compositingAtom); + while (CompositionAtomOwner != newOwner) + { + // We have a new owner, unsubscribe from the previous one first + if (CompositionAtomOwner != IntPtr.Zero) + { + _plat.Windows.Remove(CompositionAtomOwner); + XSelectInput(_x11.Display, CompositionAtomOwner, IntPtr.Zero); + } + + // Set it as the current owner and select input + CompositionAtomOwner = newOwner; + if (CompositionAtomOwner != IntPtr.Zero) + { + _plat.Windows[newOwner] = HandleCompositionAtomOwnerEvents; + XSelectInput(_x11.Display, CompositionAtomOwner, new IntPtr((int)(EventMask.StructureNotifyMask))); + } + + // Check for the new owner again and repeat the procedure if it was changed between XGetSelectionOwner and XSelectInput call + newOwner = XGetSelectionOwner(_x11.Display, _compositingAtom); + } + } + + private void HandleCompositionAtomOwnerEvents(XEvent ev) + { + if(ev.type == XEventName.DestroyNotify) + UpdateCompositingAtomOwner(); + } + + void UpdateWmName() => WmName = GetWmName(); + + string GetWmName() + { + var wm = GetSupportingWmCheck(_rootWindow); + if (wm == IntPtr.Zero || wm != GetSupportingWmCheck(wm)) + return null; + XGetWindowProperty(_x11.Display, wm, _x11.Atoms._NET_WM_NAME, + IntPtr.Zero, new IntPtr(0x7fffffff), + false, _x11.Atoms.UTF8_STRING, out var actualType, out var actualFormat, + out var nitems, out _, out var prop); + if (nitems == IntPtr.Zero) + return null; + try + { + if (actualFormat != 8) + return null; + return Marshal.PtrToStringAnsi(prop, nitems.ToInt32()); + } + finally + { + XFree(prop); + } + } + + private void OnRootWindowEvent(XEvent ev) + { + if (ev.type == XEventName.PropertyNotify) + { + if(ev.PropertyEvent.atom == _x11.Atoms._NET_SUPPORTING_WM_CHECK) + UpdateWmName(); + } + + if (ev.type == XEventName.ClientMessage) + { + if(ev.ClientMessageEvent.message_type == _x11.Atoms.MANAGER + && ev.ClientMessageEvent.ptr2 == _compositingAtom) + UpdateCompositingAtomOwner(); + } + } + + public interface IGlobalsSubscriber + { + void WmChanged(string wmName); + void CompositionChanged(bool compositing); + } + + public void AddSubscriber(IGlobalsSubscriber subscriber) => _subscribers.Add(subscriber); + public void RemoveSubscriber(IGlobalsSubscriber subscriber) => _subscribers.Remove(subscriber); + } +} diff --git a/src/Avalonia.X11/X11Platform.cs b/src/Avalonia.X11/X11Platform.cs index a1bfa682f5..c2b3926ffd 100644 --- a/src/Avalonia.X11/X11Platform.cs +++ b/src/Avalonia.X11/X11Platform.cs @@ -26,6 +26,7 @@ namespace Avalonia.X11 public IX11Screens X11Screens { get; private set; } public IScreenImpl Screens { get; private set; } public X11PlatformOptions Options { get; private set; } + public X11Globals Globals { get; private set; } public void Initialize(X11PlatformOptions options) { Options = options; @@ -36,6 +37,7 @@ namespace Avalonia.X11 throw new Exception("XOpenDisplay failed"); XError.Init(); Info = new X11Info(Display, DeferredDisplay); + Globals = new X11Globals(this); //TODO: log if (options.UseDBusMenu) DBusHelper.TryInitialize(); diff --git a/src/Avalonia.X11/X11Window.cs b/src/Avalonia.X11/X11Window.cs index bce82b2954..4899f0efc0 100644 --- a/src/Avalonia.X11/X11Window.cs +++ b/src/Avalonia.X11/X11Window.cs @@ -43,6 +43,7 @@ namespace Avalonia.X11 private bool _wasMappedAtLeastOnce = false; private double? _scalingOverride; private bool _disabled; + private TransparencyHelper _transparencyHelper; public object SyncRoot { get; } = new object(); @@ -176,6 +177,9 @@ namespace Avalonia.X11 UpdateSizeHints(null); _xic = XCreateIC(_x11.Xim, XNames.XNInputStyle, XIMProperties.XIMPreeditNothing | XIMProperties.XIMStatusNothing, XNames.XNClientWindow, _handle, IntPtr.Zero); + _transparencyHelper = new TransparencyHelper(_x11, _handle, platform.Globals); + _transparencyHelper.SetTransparencyRequest(WindowTransparencyLevel.None); + XFlush(_x11.Display); if(_popup) PopupPositioner = new ManagedPopupPositioner(new ManagedPopupPositionerPopupImplHelper(popupParent, MoveResize)); @@ -301,7 +305,11 @@ namespace Avalonia.X11 public Func Closing { get; set; } public Action WindowStateChanged { get; set; } - public Action TransparencyLevelChanged { get; set; } + public Action TransparencyLevelChanged + { + get => _transparencyHelper.TransparencyLevelChanged; + set => _transparencyHelper.TransparencyLevelChanged = value; + } public Action Closed { get; set; } public Action PositionChanged { get; set; } @@ -1087,8 +1095,9 @@ namespace Avalonia.X11 public IPopupPositioner PopupPositioner { get; } public ITopLevelNativeMenuExporter NativeMenuExporter { get; } - public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { } + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) => + _transparencyHelper.SetTransparencyRequest(transparencyLevel); - public WindowTransparencyLevel TransparencyLevel { get; private set; } + public WindowTransparencyLevel TransparencyLevel => _transparencyHelper.CurrentLevel; } } From 2354db63063f03942a8de9604f534be6fbe3e87c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 19:18:01 -0300 Subject: [PATCH 026/201] take into account the requested transparency hint when setting the fallback. --- src/Avalonia.Controls/TopLevel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index b61623a759..b7ff30680c 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -374,7 +374,7 @@ namespace Avalonia.Controls { if(_transparencyFallbackBorder != null) { - if(transparencyLevel == WindowTransparencyLevel.None) + if(transparencyLevel == WindowTransparencyLevel.None || TransparencyLevelHint == WindowTransparencyLevel.None) { _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; } From aff7815d98682629b3f67a181ee3a8af687bc15c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 19:27:07 -0300 Subject: [PATCH 027/201] HandleTransparencyChanged when Hint changes. --- src/Avalonia.Controls/TopLevel.cs | 9 ++++++++- src/Windows/Avalonia.Win32/WindowImpl.cs | 8 +------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index b7ff30680c..53b9d081d4 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -83,7 +83,14 @@ namespace Avalonia.Controls AffectsMeasure(ClientSizeProperty); TransparencyLevelHintProperty.Changed.AddClassHandler( - (tl, e) => { if (tl.PlatformImpl != null) tl.PlatformImpl.SetTransparencyLevelHint((WindowTransparencyLevel)e.NewValue); }); + (tl, e) => + { + if (tl.PlatformImpl != null) + { + tl.PlatformImpl.SetTransparencyLevelHint((WindowTransparencyLevel)e.NewValue); + tl.HandleTransparencyLevelChanged(tl.PlatformImpl.TransparencyLevel); + } + }); } /// diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index e9c14274cd..193f60a7cf 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -213,13 +213,7 @@ namespace Avalonia.Win32 public void SetTransparencyLevelHint (WindowTransparencyLevel transparencyLevel) { - var level = EnableBlur(transparencyLevel); - - if (TransparencyLevel != level) - { - TransparencyLevel = level; - TransparencyLevelChanged?.Invoke(TransparencyLevel); - } + TransparencyLevel = EnableBlur(transparencyLevel); } private WindowTransparencyLevel EnableBlur(WindowTransparencyLevel transparencyLevel) From df43cd75698fa9a2d97b3a0ccac6821c4e0ff78d Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 20 May 2020 21:30:29 -0300 Subject: [PATCH 028/201] fix wpf integration. --- src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs index 2887468046..b30831667b 100644 --- a/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs +++ b/src/Windows/Avalonia.Win32.Interop/Wpf/WpfTopLevelImpl.cs @@ -5,6 +5,7 @@ using System.Windows; using System.Windows.Input; using System.Windows.Interop; using System.Windows.Media; +using Avalonia.Controls; using Avalonia.Controls.Embedding; using Avalonia.Input; using Avalonia.Input.Raw; @@ -236,6 +237,9 @@ namespace Avalonia.Win32.Interop.Wpf Action ITopLevelImpl.Paint { get; set; } Action ITopLevelImpl.Resized { get; set; } Action ITopLevelImpl.ScalingChanged { get; set; } + + Action ITopLevelImpl.TransparencyLevelChanged { get; set; } + Action ITopLevelImpl.Closed { get; set; } public new event Action LostFocus; @@ -248,5 +252,9 @@ namespace Avalonia.Win32.Interop.Wpf } public IPopupImpl CreatePopup() => null; + + public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { } + + public WindowTransparencyLevel TransparencyLevel { get; private set; } } } From e3f6a9f5abd7f0af041e9a7ee65c57515b7785a0 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 21 May 2020 18:30:35 +0200 Subject: [PATCH 029/201] Enable the previewer in Avalonia samples. --- samples/Directory.Build.props | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/Directory.Build.props b/samples/Directory.Build.props index b9075b957b..8fc91aca14 100644 --- a/samples/Directory.Build.props +++ b/samples/Directory.Build.props @@ -1,6 +1,7 @@ false + $(MSBuildThisFileDirectory)..\src\tools\Avalonia.Designer.HostApp\bin\Debug\netcoreapp2.0\Avalonia.Designer.HostApp.dll From ba9e3e76414f677e614ba5be61d07b95a7d879e6 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 21 May 2020 23:15:26 +0200 Subject: [PATCH 030/201] Updated expected render test output. --- .../VisualBrush_Fill_NoTile.expected.png | Bin 113232 -> 117709 bytes .../VisualBrush_InTree_Visual.expected.png | Bin 375 -> 404 bytes ..._NoStretch_FlipXY_TopLeftDest.expected.png | Bin 2615 -> 2631 bytes ...h_NoStretch_FlipX_TopLeftDest.expected.png | Bin 2997 -> 2996 bytes ...h_NoStretch_FlipY_TopLeftDest.expected.png | Bin 2196 -> 2276 bytes ...retch_NoTile_Alignment_Center.expected.png | Bin 4406 -> 4317 bytes ...NoTile_BottomRightQuarterDest.expected.png | Bin 1223 -> 1230 bytes ...ualBrush_UniformToFill_NoTile.expected.png | Bin 13912 -> 14093 bytes .../VisualBrush_Fill_NoTile.expected.png | Bin 37647 -> 37676 bytes .../VisualBrush_InTree_Visual.expected.png | Bin 375 -> 370 bytes ..._NoStretch_FlipXY_TopLeftDest.expected.png | Bin 2615 -> 2631 bytes ...h_NoStretch_FlipX_TopLeftDest.expected.png | Bin 2997 -> 3013 bytes ...h_NoStretch_FlipY_TopLeftDest.expected.png | Bin 2196 -> 2213 bytes ...retch_NoTile_Alignment_Center.expected.png | Bin 4406 -> 4448 bytes ...NoTile_BottomRightQuarterDest.expected.png | Bin 1223 -> 1228 bytes ...ualBrush_UniformToFill_NoTile.expected.png | Bin 8637 -> 8679 bytes 16 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png index 3996782889c4a3952d554c32ad24e2e232f87c32..ea81296017c59aeec8deef2aba6516a9f2ed557d 100644 GIT binary patch literal 117709 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⋙q`BK6bO~wgD^$9cg508Jr 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

DDs4b93iPN3>SOSv_$ z;8eq7eAg#03sYb8Ce_;!m^3Xi+7MNa{0C#cvZ{MlvWkh#r0n6i!UDwx1rT{#VwOY!wR*tSjd6FE#0Q2+NNLfaPr=iGpDr=RqJyf-4EtEQ zr6_2+h`Ws8{Jqpx*c8f-C?xZMZNcW<(R4wT=`5M|4q10oEK&v3SH;Xgw;4*)0U*obi_XR^8RLijr;*5 zrzjJ#sHI@;zJyZDX>53$ZjCegQ@%Bf_T-W)?IyMF-Fj|`{)QZ5(TCUb0DqCK(uGyg zO9$s~p^{gG7Ax zFX&E$FA!=GyRg$;G>pdN??coM@Nho3d}K_e2N_?OQYkJWw6LWthKpleHTge{APW7g z75VG6h}SW_ydo5Jc>=LR+*!S2o<(F&|5|VsD9irfhRRZ?E5m2O?C?l>0R=RAgG8rC zS9lPrhPCZK`FX7-KP!9~C7d@5x(DG>oG$U_r1X}8LjJU6;0Yt-nb9iWxuiJMF+Y7V z@&Zf?ev@weFaXDdeNQ4A9k@yx&s6a2K|Vmk6Z8QG$5plL6nBHVD_y@nf=eNB%pc$4 z{tcjM1@o-Q~tbvER#$bWiz|CXzN-Wy_5WTQ|P8 zv3;4(oI(&64aFA9laze~v@boQ{EXpJOpyF0QZY0EX1it3od>B%*i%JoRYZ73p#V!H z;}<;E#VJtPuu)+qnsB~I*lTKLe%aWD91wZVrsz>>P-f@7H;Xkz!{`xOj83w7W0;eb zXpt-tJq+fmn4ffPc$*5{GUg*eMul+pFr!3FyK5J^Mu_75YMTM-snE3`;wojn^Y8}pz@Dtp4VA|rheY)gj_{MRki4am!{jCx?0^+(PHik+H zA&=hjQb~k{vdSW9t)P;#+3M`ufx9IK1}!R&IK_|l?2of&EKOj()dG0`*1keY zD7I@AD&hAluyKCsxWBPZfsDz|M0g6D=J$eggBKLnZw6?_(DA6i&nPQw{7H%sycvLx zzdg!Tmc3^DQq=$`<`Ud3Ak~|UZGMsj*&8UAPy1MBJ(w7^T$f$BKA2FHV8@0_TV>uE z{5+2clF5jj=r{B}bZu$<`z+s6{)bvHv&Z=IMYIWuHRX4UE&tekrGo}O6|MH&MAjw=?eskhas{+@fJUCE*b#xiopMjkxY=5Or&snCw1G|!9cS| z{tVs5MmL`$8?%a9O3Y!%dp>fu?5@_k3``D`kPBFVQxD_##`4>hhR*x*s*-}^h$aPV z1GoA1O6AI|qF17wL^s*h&hxX61VHZd4L+YyZQsesiH^!TR;G(+(@m2^bL`BGP_@SW z;W5sP(!#+F%)IU)%NFN5Xm}XSPh=m^->=fU3?(s^6o}*Q;Z@SQwZQ=K6g=nhq>~M2VeTHt$$nMFb~kAZ2%GPZ{>r#>7La?!$R01 zhy*cV;IUe;reFJAbauR;+(h>*ke&S8+?Z~~Z|>K>zi6+^XVnFS8~cDE-?- ztrhvu;%+JADKS-HEL`Zm^c*?XJ;y z+K!FIJj;Uoi?>+Nzz6&6#VZCi32(cLeZO3Kz5u()tOD`v{r0(=s;@zZ0d^~Qc7I~l z#Wd5dbN*!q_1=r0?@wo?YhSKW6C*mu1wzIDwCwdLGf;;GF^inik%JdMit-dC^tx#d zX@XGChN80&A#x7?ius{LuKf%=3T;R;gcX zTM6*5q`TcqB@N4562U5sOj%I;zujXBCkx>*gB}@`4We9nn38Lfm2KCgTsvQoF3#WG zcUSF~#(*KBQ$;$iB88aW`TET&p~JH6w4Y`WN*MJM@tWSr=QG1;ofw_^j~*i7i+`%A z`x!K+7QtIHxs8)S7j<)`wxh&KnapID7IyfT7N4K|zy}_|l|}#_s>N?zgVYW^+48~~ zd+T-gb}{D-t9Vlvcu9s9It%ul`*>JmA#?e**7#WJKm1>ag;kgF1+L=EwY)5w(gd0HXly0p-7)z9|>xLaH{hG4cN2sbqg&6(qe;n+&QG-`gmxL*yysEtH zEJhnOt8AqS)yJ%0<|IOx2cJ#7KRJ52|b`X&ZdElKa(iBTrFU?L!Oj)EI6FVvFE8Dp)Gt9AEw6+bEXwpsh_|9SHyP|=(n?G}$eR`BDm}Qu zD*R1A1`>femH`Hp-*(=bW{SF*v4^Fl%+jH5F(pb_0b5UYJe~9pw5|RZ(g_~7DZl26 z93I;kMMieuj0q~7SMIQGxm)@w)2(1kN?Big4RLM^3h2h+=-I2~!h6(4)_$n-hOXOJ zz429uZi14#Vxv(UMuZh~u_z=w;G{l*WfwQ*lkIWX!q^i-F(KFKKGx?JGM{e?kzFc- z*a5W9>taSlq$r;7ft^i>dlQt?a~cu^IEd7z@f1sD2k$gMS2Q9lD?D~up@w|9o$Q2& zyG)7)8OW*5QAe52-}GsgjJ0j_Jyh4e9u|qas@i zB6dFkTuA;lnfW(L9p-|4&x3o#{%CDSZF&BqAvC*1alrPZ1qH_X&`&^$G?67uZ6+!1 zSKIzT|6obK|1;gc=$Tkfinh%|;XPS8v2)vYwV8s@$<1a2y8>oaZqwLhGlf+8)Fn4Z zpuUV~&M+6&dR&ZDd9%<`4UQRD!ZP`RfzgClkHF4mW__w&#)#TFxBO)AI{Amgnb2fi2{#53K_VE z8lf(gAJ}@?-*6et#W^?=4`YN?-OH4r64)N5v(oXeQ?WQ3P&*J^PWg~6#ORoph%N5F!Yqt?+H$b z#+eKq6F&iT4D7xD?aq{}?yoF|3aiE6vsiXvNTyq!mWYTyCQfWb^Gc`c3BCmqQ)NX>gTVx^KEfrESzIGDk zP<(pxOHtw2?aB5EqkrsV-^Y#ejxE*dym1K*68`!5Z}zQ*79zj1KAbS z&wR00xlGj3!=+;0`x88tA?ZqW6+w6CV-J@$*EP;R>}BrRZk_HFSAjp^)C#xUv){mR z&i3XfWlp~-0Bp<)5RFx;XfA8SX@Q?64kvT)_TsS9rbW%KTOus_%aPl`PXq2pg!zSMe)u$E7Psfum3?4z%H=j; z%q!8}v`63Brt1kwj3S+NTjF-KJmw+nSXhen5Kd@G`7u+>uQ@5~@5l=5OX%af6CcrcA9@4XQWl^A6vt$|oZTTS>F*=MQx{Y8)^U zOOjFV5`!-j!-_YgaeuTOs*1i6+F>%e{y5!Zzja#;H!@h+R(;r_F?~Dfe0);rlEY2D zGuKeI?0$P7q8d&Ofp>ap|G$rxOp(AffnZzuS>K1JdLFOyBeyj~e>vp({to@t@i^27 zddm0xWl6p9%k5Yk=hzq3d>VTg(ITaZ&dWWWFSA0Tgb5BMJvN?KbGaXV%VRKkd?V^| zA6N(G1#}D1m2M2>OxrXjzA%*TSc&&|>Ko7$XpPM4kc4>}?i%2u@n`DKv^?q_qWbbi zj&V+)E#XUw@JJN+km*Ez`DLGzggAB(I1|l@1Zpt9@S|;=y(u+$6PlrKVnOzZ+)oBe zU6IaA1$~M@Bi#Cog3<6w_!l+aC)jq$cN+TzG2EaJrlp#k)L@n)%DX( z5bO!s;c7tI%RfpFX4+s+W`UfF$DA8@C|Wc+E`QwW@ac`f@);c$jfzzN|321x{q++! zAzrs{6dG!!Vl#TDZ*paV_UB%?)_}kn+t_5630}mAa$=l<#5_SH)`RAm+mq9kRcGvw zj?wPD@=O$8!OnA@I&w2iE$H7>H&rL>ig9d(EQ*Rz-n1&cnlJunk(dQ3WQ})@k^|QT z5@y#VPc-U%qPdONO?IUciQ;^p9y`@mLWI7SeE3fO)XQ1gwSSM|5Sp!p!^=OT+KfH6 zvJ-6lX`S8%qbFktBXm(oME=6hh|frWs_TVL=&&XgW6Ay*Bf~Mn2@R7}s^^!pA2liV zM2S|Gk{s*OGMwXY!$t%9ZTtz3FM-nv!el=pBnveVO68!ie0wb%@tR?JK zj|KdWFIS}=T!oEj~|wW(autsev}!`h-lOn)kIjV4@@&TEQ4`EMYe7 z33l=~bVMTo341j1sq@#tf#&xb<%P*PFO6PSWEjQ>Ffnl#tjYTd5M@WJ{_1VPSr2N9 z8Voc&6K=u@8`Mke4X|M`j_X$hLgw1O;A7B$2c+HCAi)wtgdjC&JM6f1>3a9*;&(Vf znubO2tN9>%17dM3>wLxc_5^aq zKTC+HWjkj{%)d~{VG=4xr5}ttU^+GsAVL5Z@Yj{QEm1%N76POAi&4AQ&G>s4$Dm&b zW?uJOSN`#K-j90plQYJkz~j!17Y!F_YZJhslKMsm1y1-8<$bgT!L7Mnu>*fBG zVFQnz02jXR9ib1b%UZsR^E2yvYzc!a>9zq+sYHO{tmiCwGs7PEB(BH&NWBqA1Ese1 z_|9_{R#8s*KB=w>{Tnx*g$*|U7s-6TE&ERwbDsT=v1jP6n5I5QXqSz4r^-du$HWJP zQ>QG;#|VuMYPY8D`}>eP0_T;SKV%c;Nphh^bPS|KSpf~aU8gZS%x)>$G(`F3&-@a$ zNnSr2;v>fHj$J+Y(C18=7WXY)k#BI#Uz#XMuU|#oL(yUF$4>EJwvB1M9V@En#`^(9 zi`w9j^?1=Rq|CQ_5sqrO(%RLA;!ck6W#Mp_w%$??&2bg4l?7>uG%Z7ASKe$A-wH2N#%qgdba^26TCwe~>s=r;H}_RaIS6%t7k zi+i+)ahGq$4-Rq)Ka)*a1OL|{eJAz%?5*W5 zR=oU1T3&w^rdZVx7P+@$_T|V>u|Za1k~PXx;wYHGX;|gp&?qIA^2B<>hIkn1RCLz| zkN4tHn9CL0QolBu<8Xh4a`ZY`9z`FNfT>dCwD7*(rfD zT@f=%-O!YC%HrGT8M{Zu^@YQDO=6Nm3(o7$UzU~UXR3z?)a5Dk>WQeL@WbU#a^b&)dz!vo;Zm4s zqH^To)KI?CFXvxAuv1x#@_ZNiF^P0!RktQ-IAWLuASD_W>Y?yzjxe@=s$&RC5nI(i z(C-Q@yXTi~)e_!4?lf%U`-i1Uv#1r{j_VNdbsQo~Lj0yE*i}5~JR0$X?(bC(NN*{` z-dGqKRFl2oeS|bDakQQ0~%Cy;x_+=@`$k$k81zF3&FM+n#I3GPA-y^ z;;C(-r4Th&mOAg%DmMrd0m=H`E=g#2?nukU;@^SMVSiLU&I;3`lr`aHzIC(Jh6!@s zh(k)$t!hiOyY3AIdmsQl960~V1v--k*)hSg4M+b zb6Cj-RF1H(#G^T50=k8Z%?gwa!>dEbS?k~{)oGuUpg5F0b%`!n`>czDHo3`!foFGq zw{y*&7o9c_uPz8``9|ncG^U+J_oU~C{YQ+4j&#g;T9-;wAWE&AdeuP^Yf9d0;W%Ry zVQhqlxOr^t0q3=k{*M5}Wgj7sC*7O5`RUgLi0`!9< zX`6AK&p|G=kz~R;^M5~7TvD~ipH^05jY~wHD*&}qdGj2p(q@n3aMX7uGcA#Fj?Sn- zxV+T3tuNQHlMn1Xg;C~q1bw73H9jRi`4bIb-)FMlBKH5LEN4iFDvKx{9t_U^ad)E( zBRedrGFy*)kha3i`=S6Qy)#`~hFxKw+CaGMH3&*y4D}NH6ny{%6Um1of{TOBhk)BX zzK}(k^BAoK#rDG%7*n`Pa?-pA)e%vAg04yNl%)Uqh{YhBa_JlD2#%wa7@o|E}nx6ym(MdJ3v z;=HZ-xAj|_ufu=WiZAigi9$DD(H!Rw@d)yrz#lD?aO-Wbg{jtTnCobh9YVszgZ`sj z2>M!`(pNu35c4%UQd8JN`uASUhc5@JG z{G&1B{ef!JJ=X9|&$g^vBB%&jvSs(YOz(-i169D6vDzC^H3$Jjn)U;vMmcgK`EB(C zE~ff`IV8WB0YowF%Z!UuYapN4aSgxt9B_4{3*%c$prP}<_uL3oN+Z!W5ZB*ebFD^) z7=5UA_uwyxZHSmiu8YB_`?OSe1d(;@FB>A0tHe}i!%HdX;!emt)H!UPZ7${(+uSAc zi;O9)swvP|DS1vx_P#r9V7M(RD}w8#opsVyJB^>4dvHS2NzCox*C@KcZ%9i^PX}Kl zj{2Z`t*QX3U2zvjfIP~d0AfV+cvG)3y?j!<8}@xQkr}D46m-5hd9Y5qKzXk6^-nd| zLY2JcsrR@2;O-^NTzU4RKV_p`X$|G6XH%Ct7ua<{X@X8yIW*>tHCufDf8v6$1#1<& z?g3|QG<{U2OI(#3S;h_i2~(4N$rFo{AU?YHSHYOw`BDg&LGqk*`%kcPWub~no^iT?gfa2d!q_<)s1D38h(1USK2>#Bz?2u>#M^Y< zdBBt7HmIPIstBaF&|Lk8Ip>hT5yT2J@ZQ?NEMC*;bjpvxU8yX*^KD3c#uiu{J^q6TVQXj@k!KMQ0 zu!1c13W+xgESO~YWM$FVuCCXQ#QD(TB7s%?he5}kZR@%P> z0%rTVEzQqD^sMr32H(?hJ0_LSnqvKV)lql?r0Sic&o>yaAh03vh~?`N-SPW#^Vdk9 zRl)BfhW`}qAt4x{-wH$dAcXik$B$@7XV!-{22fx64nCEb^fa@cKi8?A8L{!<$gkRV zE*P$1XJ;|fLV>q3+>lT1UYFpIyYvExo6WYSneT0EbA}D)miX{YdX}vhb|sH# z;QK?*<4abtrF6kx3@>JeWyMxkV$1SJtCt^#aU4o%pOAIo9g|9XFmkfp%(d(Hg2JX7 z%4ogKz|9@S2MVVWTl6uLkJWh0DgB2yJ~Gc()*fsKg1#uh&5>F`7_-`j^egxApOfz5 z0pDqMCrje|FLm3$toG`!r(W-m`E7=#YOXr}CU#%Gb#~M z{Px|NgNM5QWAhLd{eWfhDs&TD)8j?9#@rtIhkslhVxWygCh zCSdb$|4)&>+io|C`ahGYEhkY%fFwoGBcSnS4c#`Uu>&tf4GY6rb-IV_ zD_ET+Dw8#S1TydUpaq_;sqN~O&E z6QPs0H3G~1Q=*JP?q@MvC3(<1)xE;9Y!@e>Hx~-gOlXuH#0F^sJ&` zZ6-Zf7rTl@l}BGa%IWi>{`g+0UT1L#SuW$*Sny%@>BIpoPyRALRFg$4_$Vhjc#10k zdyFS5nX=km1HK?Pf`qQAg5@{)+uZ&Vp<^_Y_)$EY}#cGGxaBKXN zvu2%+L-`pUKVQljUTWs`ONo?gRWQMT1A6vp( zJfp{Cnn;!wW)niD+Z6cHb=EzX8!ooYsE^&yA99n@(9qNB1BsSBdv)ZC9-M&INU;Q) zt!j^4kri^6P}}+mI>_hn*VO#bgSrlntUR z@T2Y;N_#QW-?Ce%>5ne!Fc2H}@A6ea!+l9DWCkkXuRAXJl$W{gI--&LcBC zgfFmJey$UmOCRnXpC4Kq>a=f-Y`)Pvj4{D35k9ae;D2F0{qm_jnu=-nWd}}L{$vQd z!5?}$+;lHUVL$UEPTk|R-H!xgrxSQ1L*w&Qn^!+ixerUJBB!(td#9tUZacC<>+N@6 zm3O(Z?Mx<-#7#1yY8B*hHuB^O{_nuBX?|q=dXveL87@F7_Dz&DypH!Fj(n&!9=%G` zGpF`=mB%X-3gTN7ha8+n+x;9K*LF5EU%$A*J{JY&*gq_c6&4NTKg-B{VOE+bC7MM- z(o{Hw>r8>s{$$PNjEV{Uh2BZM-~G1l7CO6!fYU5gUHrE0b|oPYvt_?jUE#XrIH=uG zXF-NN=qpRGuv*`@8XM1re~z>bbR;+6LAdB+euqi!eaK-%(gj=VSBxGMeg5_7kLg+6 zGz=QDLU$PgkJxG=b0W(T-0(Gd`xHx&KA%T8Wo23gl?lk~l?tEDN98!W{!rayqfYnZ z|6Q3a{obyF_lej*(rn$kX4H&B%84aGzgzp)wVu6M4!sDv#$btnMaouAA3d34GV{dT z4mb$`NrME)_{d-)b4Xs#=ynD#`ZkVqt$u_x@2aboo^6RhkqO~#-Y&d-x*}JnQlAeK z(WHf8qCmA~>o8eoixbshzkg=Z12e}-mea_&Tu1lf4ZH<5kM`T^_PJ5xmc0kwWjx4S zo8kr!RKH7qXs6O@1p@?PeFt}tzN!D=^-|+U5J3(iBhiI3UDhAQl`jc-jw+5ey>Snk z&u6fYQf~A79D9yVL)I-K|4k%v|KTKG(cbc{Y>vD=HL|0A^ZYEG$k;cJmIg-|clXwJ z0QliBtV7);MYa>tJscx^jsL%MOB#?rW7h25;Kp~oAP+C*p62}^-x3loo-v;EP-s?_ z{a}$p&K6aGktD2Pz^jTy=p~1HMM>V;vz{0o(*#m^+)SNF%<3#~9P0|&5j?gKOEkjv zVi>So_Fjjr^UyLw@M4NL5P}!M=Z{roZl-Aef?Ud| z!+rOgt@|@=bDLaxIIdhj^}WBvK?^JWJ3LcsF0(RSZQ1EH%-;d{ULbAvIQjYUb$s07 zYKKp_JH~2~k*dJhvEC}mh93aT_*-*}u3qQ)y6dCzc-V^KT%k0@Ow#3m1;x5B=d6!xJGG4aka@u9h{ zxIrWN!xRTIFz2>OylX+1R|pk^!w@kT&?@qj9LH@r z>z`A1{{|`_l?UG?TM*1$wvn`1!1-ruhn24Ii_x>4i$2M_@mCcFgeEcg!)=cI@lStc zC_SuC7*KjQ^RBOIG4V(^u#ZxTef1-#sP>c^9LVIOC4>QqCCaL%G(7H!tDC-?f;`Mq zfEp)@A~UeMYpdY2m#`3ZL;%!T0jZ*l3G=uS=;lRB=yntTwgwT==*Lpsh&K66LjE5$ z1-N+Va(>bKr^Vk2?aC=GOGXtIAz@ZWFMnS}dZ$pF=NxKiFJqfPkfj#-&nP-O?nr5c z#kR!g@W!C))$1;2^?POVl{zZ9GEo6dYrm0dwX5KRMSs?{)Mth&TP^G-E3n#R*O0X+ zzHTl4Z3&cy?{TX(Xs6uf|FcgGFd}ajCQvn6=lM^X`0n#(^Ev13&ktNU_@S< zra+yDHL>PYLjsAOr)A`pY}&2(ewuDdB&C=nDY+_EZRjvXTC$6&4T)0p}7pd|FjKrBxqgJbK+ z;~Rq61SlAO-*-Y%kg4f8tv^#`9-2Fj@(x+i;oy6IXgx3(QZ(z=#3Q$kmMo7 z-8DUwKKX)7YhH1dLg)M-VO?nky-XU#uw)I7a%)#ep|AI&+b(SVAUwRSpw7!jldeLSN8T{s-UGbc({#@3A$wkm-!uu)gX(E=2_?F)jQYxi&3qI1t zp}#daOwVM30-$~MzMcz|U&QU)vW0pX2?)Ly;WNppn(Q@E{ak-FpF5#~<2~CvSuyF} z$KP>qEkdSI75Ho!N#jFn9$hAKlk|r?jV%>LqxV5+Pc3qaC2iniL$V6k#5(OvYs=*A9ZbSgFjee4f-jqQ113RH(szcUo#|AslHB_Jmh0#1@lP$6JZ#!W8l6UiQCrty)JfTbmmq8!SPI^Y#X7 zU2})55pVfQ(tKI4S#CV)K(mjS&c)lu-Nf#Gx_wt7oKyDpuzdF@OlL+xH4WZJmGp9Y zIEj=nue86$O=eRA{h2Kgd6%@~8eE^a1x+yxyXlPEq zbuY4Gr-SQgCSk~LO%x$p=>?|X0lERVGm6HMiFQ`a9-L63hLw5ZMBBXqJ$fFq~u=79nCWEl|{+ zF0lVX*P~@+Ib~D^kM!tRuE>xXe~n8^6vxVXeDzGh9&k?bQxr?)fO-*$4jf6>eDB+h zI;OyeVYfy0HO=DYphA#sv`F(*#ghEgWnn*mX5uJHzfo!<-bAYXDT@TB{4SH_fI474 z1@G0!c~8uC_0_9tpx5~Iuh)j#2sMX;OHzl!q+cr0;;HmK@Ma74DH-uLCL2g=kCXUU zbON5bC|9VshyvMa{R$Js=hLft1JLhrr2X~`5u@(KeQecWGfw9vRoFWC4KEdVyX!Ya zmVn&t^}0B!Hrq&poZoNn6z2gSl0!R2G?~@}qihXDE;k7(<<`_~BxGjt5ifybJG_}X z-L1mDIZ*722)w61?A;xhs}Z_aL&*3K#btN5FZ<%zXrHSHxX?deP1D$S4##Swr2dDvS2kkc zex{RUr4awsj$F_w)_6&IbA>D`TXayu6(^&Y@r0;mv=~nUsZN+< zYPO*sAj<}0RN`fU;10W)wRb%GpdkP~GTZ%8n&5sgFYG09?24y3boqydkrOvFeGWNV z+7b6%843$(6DZL%ta)SG&yja`&;mm5=?tq~VW@3#K_`nCe?@%W)WmoEncoQc@9Mms zQD_mL*Paj3FO3CMUAkH1?H5Snkbn|uqG0n&0d@Hb24OgcyR2-*WYXpGziMY4tX zy2`}MKV`85E=+`+EM2f8wuTAZN~k(1J~qmO58Mih&&Gt+X@f?6oJA>FZC^y6_TxvF z;yW|6Zc;-%RVr-KttMYbi*i#Jm*1mxi&36l`8L}56*<)(C1JxuBlyXee#y@+@~ zNw?^NuR3*{XO8imBg8J6HcWU0`O<5pRJ_>pRDP2{p#f@afTF`0`GMNlzdMikx@~f+VgO78 zVtpV>e3cZ|0Wjw@XdtpG1N6!PR^4~o#ESM5AWu`PiJ_Q44Y-Lc~Vc0 z)c6Co{@&=fq^~C8bpgH=O(q$OE)KC%h8vCdc^?8vVGv_Jfx(T{glNUM$C6^6~^f z$LSTM2@T((j^lfDhM?rDvr~;avK}%uXA^3@JFZzAAwe7Vu8HF{xM7qtTYXJNx26>E zwG8R>ndz0%ky*{$i}^Qr%MrBfLD^x(WFD3^qm0N_+BuPUZ0vJrfyIvfY%_SICWAYF z^%o~b1XKlNi0UzDRnjg`iDmTY&YCD8i+$7KA3l-i#-QX!H5KhYfe+%$)bp~nu72#1 z8Sn=8Q;!TTRms2y6h*ZSE3lFYqPCdVnAf~#eQsW(g5=Wu@7jombovSXkKpRV-A9`) z6Q&<1hUV2#Jc-jcWMfgRG-$-=gCQEUJ@mc7{aZyo9E&67GLerfty?_yrKM4(`D{jq>`l*Piu(Ty( z!N9#WC@>Jksq(g?=i{5)vc|ne7-0ss#GhqP#o=7Zz<>f|rrTgdV)!F>w;mm{gK@0p z7lPPSgT&{VOFxq=#MZSmH{9DWJ0UT+Y+p<`e-iTOn+h_R^i^aDZ8Jv)Q55&>X-`lg z<3c1DQM_IUKEeIi7uLsMmkiXO2izTQlDN|9A(A0{YWb%BD%N<2Gsrc$ZIaCW_vGym85_`0g!OVJCIx0P1V?Mxy)TO!M%iSHYUyAI zOWhFOmtxwjrQ_z2HpNZLev`+oFP5SJ)39RC{}k3z)7|l0{wYIeyM{THSV~wE9XFb1 zapSKS3mr+G$rz8#2lfXqY5t14h-QEjin7b>gP4M=glJr;+PioinC!nhVFm_}z~ZK^ z8z9w@l4B+ABd)5F`c>ttvH-OjW4^En22%6SStHHM290QHhG1i2)EmIv7-+N)?{ zS5yS=sj^hwvsAsVABwb8Vu{*;Ew_N5%-K5}&8>Cb{Uca2_WP#q>@O;*MQw3xbXcN( zA1g;#D-EwNprkM7-PHTLQBi^l9xl01^hI+xyjUvaN77k7wj$c`ew~B&qME8T&5OGd zHW4V2PU)+EHz zNq9Xc?{D%y_W3KfoPy%Pg`3HdCD=$C`gmqJ_))p~;UcY42jZeqEFb5Fv~AJXBEF><`@U)o#vth?Rmy%2>f;BjWt60oP&5-{InhW{-ATR?sbtrDv@ zbhZwSpSobM##-&&Q#lm0{NA~p9_%S1o-j!z7}goViquP2UE9TEO1#IA4+1-nub8Z|9JaGG$6CIVj2^GHy=bA=P!G-eibs&Q@ zaJs$Lsm&+<5ptde`n}LGJr@cSr-u>~{?f==lav>_Xp9%RbJ9X-=RH1NJaxM2#F`9>8w2<*oV+gCVKPKEJ<*GCOhi*TNNf^2U@=17$9Z zXO?zq1N1%GiS`Biw{@aFthY(<2)P7vXH=9M&Ygp>D*-`mZotKZw`4*ufOIYB>||Nj z!TjWh%j#ndjde@SXpdD@!5IX@|Me=)8TopmFd+hG?y-S$&vwS2 zM-KdkK&|}W9Y4bIK2-jlSH82kxtT_4Ic&Z+Kv%Y+_W@s1QR`-xk(>2>SJ#3|&Iu!4 zh5{6VpAie~{rKFt$Zo#bZR<&8>&aXHEzu>kI90eTfm4a?_oMm5^J!xU zGN_}h^StHld;1)AUl~L&Jt5BUjsiZIM7#{9U^G!i_VghWc$1%+hipPZr0&F+0x}p} z)zSuvI(pn71Y~mlHa_>6>VYBzsvnJ88gv5gu0mXVt}lMJ21 zB8HuYBi4kxr53Q!KT&F(Sx;P@PUk&{>{5Kqv`_HikF=izj=hwch*BO;Co$H zPqfC~VqX>1zj2=YQ5_t=E8p#zc1p5tYj=e)U={-MVNyohB&TYokA1zR@draryy%2+X&NJ>Nu;9Sii9lH!%foIS@l}k zjk82nicr2is@Qr$rI;JVTo!2(c&eJ+ZWfH_=c^Nc#;I#uZ+O3Cc*LMum6t!bsVcYt z^;~k-MNM#=D^ZU%s~KrLU_kcbM`(seA=Ui4M8DYC{{c>08_agS-Odf1Bpsm z0*+a2R^@;{i3B&qYtmrSYW)m53v{4x!wPkkEAeZ+MW#wTo=Y@CO?t33C zbxG;?UODErU(|;{enGfutq5a()LNIS3E4gj9yq`GRav6e^Q1M!i?b1ui0Fed@!qe0 zJr9z_9oQxm@`lo~)_mR^I)PK75h26_-d1~ldm;kTzc}C>cY^EJU(*4_&)qL%k)7W{^pwXpnuU02U+S9B0EjT*qn&a^Bx(Hw z5kjDO*#UGTdA!`hNq5ncS#D;ysfWc72^^PX??oK1l^ae~Onv}A8$~XkLrgp=m~Um1 z^dMS9EFD%gb}Rbh1j=T~IE$Zjo`Lu_6Ox|f2!MPJh@lQxeYt$BWTcj?n!=y1^Q&1X z{MB-GQTi4p+R!_@{EM>q^~4Dul!s)cRVIBdg9$eHSuCZ%uQikMQER_F&#SBC>uG$s zaU*Bg(6?X~_B6X{urmS&Xj8Y-mt%SRA0;EE5xszr5GbgBF)@kEB1!RpA-z~Bj1aOI z*-s_z^E_<8C#q}>`s7pn5?VET+D4Vt6O@@iTdB*U_|NX~ zi6qog6wLY*60SY3D)lY7+E3ozF1@?yS8EeMg=dF%q@Bpkcb`JoGU)d@4k z1ZO+5zd#NXeisb5jwl?2@TrvZsj-trEP;*m()=k?OA7d6sKhesVGE3Ghhl*eUcA?X z217RZc4nn4qjfMc)8+kM6eYzEC zSFJ97s=~4@^TELg{qJ&pnP&0ZdWTdX&|Jt{N{+V>1yoEA!lr2tIka z89$~&@eGr7#L*h6K{)e(Fp~L{n6M#PGYZp7g;O*2z_b%4%Q^1nvOF+kV4 zX&&|(+v*{>Gtaa>8I)%kyQ#9bbfl6o;WJ?|5sY=e$=T~N3loGNP2+wM+z}U+7kDvg zvSnAii2np9sgIGVacFa(MA1kSmL~ne?cA@;M3SWt3Xt66h^zaaX#58IODBNBd{hm* zH1@S0B=EJKeV+Zy1rj4bm$!q(J?7>DXR_O5Bj~CKt=kI@vD-`do6(e&}5AaNHdHC^)d>mA0~l z;SndHne!&SpJz1(*DTQ9{IU&rO7$sqcdlsLHigt$rGyTqn}2MM=Gxz1eKwtGzdtLz zm?d|f&Z@V!{1w7b0D}7kv_nqvAn-k)g0;JSf{FU{0dX4eT0VNk%hK_Umu}>(O!cIl zu5N_`B0QgPFd11iIjj$H*Y+gL;=#*dx6s162RSr_#gJ$Es`?Z~BaC`V|gD{*V2Az^%hi0E7i}AtSQr-FGH>e@}fT?t$Tbz7bX93{H;vYsTdGRpB8X zPT!|G0^vb95b4mG6W3P|86h9-nJE!I_f>!ns)r#m#`yL|Nj3s&Dg{*S0{9S+G`xMnA%t9YH}J?bJ!BCk-orMn2L6lxo%aHO+;Kh zz|w^rssKl`3U$c)HcG51jqj_|pl!)Yr4E!ik2I9l^_^yFdP~&bQT41>2A*aw*BgEH zYj#{}7>TD4#_NF@O+G4XL7Wx2qMi+gOlozahfN?pp4tgfZ|JC){EE2S#g($5*v8@w z+qn>=%EG){XFgTAdI}ab)Srxm1V@r|nJa%ou~oP{P)57^DSXM_fMs={Rp-(HTVE$P z#?k?Weo!JVJ!-(Z{^d=k?4~+2@cY_~NTc{URa(v0whf`3N1ci(c(j#>65n)F|6c*8 zb4#=T(6{!L?M~SO&JBRx17US#^{Bp%KdbW3cNXR(K=|@S^b@M8&d|sDr&c3kOA{^@ zsBYexF*hmNw}i?d-BP35pwWqP^&T$!vjiC-T5p!Y=OBsP$!k-%fGzZS@ePcWrTK`* z=ZuHob~e96g44Z_O!Zg45EXyNNv{rPtgsFhRl9oecL-FtAtd-0J%<6-_gl=8)uuNm z=?II%Tq{hO-JXkvg0*ZK80&DJUVl^%m^esp0_E+7+m1V36E3S5^ysHv6PvC*Fn@h} z((K#bd_5%isssYto<;jiN4{@E$KBSSu(tjb^GzEA3+s(r`@uqW&4JInw7koEq3{v; zs?QJ|0M@*HK+7A*=&P2nG}+u+gH^N8sxF@&WJCN@JSW}_cBHAPyMiEH{~VcvK`a4K z5Q~e3P26=9-WSbVd!F~VOBeH}V{=_{F%F;`xH{{S-W;On09r;JUfkb#{D>2rb!=R; z13lwapouf$f+1`KJPYb18W}A+p_z4qobFInSTDzA))YM<9D@)#F!UO`WNn=a^GzId zt-i@m@A9Y=hJT*%yY?5$eSxUNPu|8T zxV1VIl{Jpmr~FF7)h24(b733KO>~4u8PWMFtg)j6RS811U}uv#&kReZriMIz-+Bqc zGnQ6_7=w}g!4?KcgvQ8#)EFYJh8dusnmcT@bZ)&WX=6zOCTM6jk6TH3ViVYCtTT22 zUY%CEG`rBe2>QepaeaVqQv1ZZDWITVCh5$ArU8w%gA#wRmHgXgkp zT&eWFy>PB+Prs#}3EZ70m{FRMYD-Tv#Ljg;NnP;0m`(=Kg>gV|bnml@c72=>Na4yJ zczL}vcSgzw9FmkCdqQ8syztn1?2P3;C$${3{*btD9s}E{-*@>0G8kCIl#G^K`XC}K zs68-E@${cfG%5{7*JgCw1MLiVlF={aE}CoEeg((C{&KG0)kgaMFJ04m!6l!e z#Y}+_tI<41a3j~$+fPN@C~2CmHrT2VknDZ{kLYwq@FPd|#ldW+8X%*8oWL0F51wWs zSDv;E#3RS@q@gy7Tgjr`-YDi5%oaZbvY^rJ3psdBe#RH%GnaKQZ}00K+~!l=Pc=ARY$6JUSGs6;XIR{Fj3QGA zD_}iz{%oZxxpwXM-PF=f8;$L!l-KR|e=9GRd?a+Xbj$Q`*}l=StcgYbXiTpE+41nv z-Xb_?S5l^uC+XJ>O#Jz!?&H_i$znwmpuVtUv>q7P3o*wb~Ckx1c*L0J`*t*wf zHE685hC9R~Z>~2k)@+%0(S|*_yCH6`y8i=GRuj}ENPTWbK%s3Kr!j)2!c67=n6)_0nG}hHxsi_k{Ryo{*CSS`8 zKb6hnrjezx)FVAmKE}4Ly9nH@7c*miOxh8}LF#>Kxza-HC;@t=j65gk)L?@VN#jteB(jk8(mLw5<&6Ry?K1 ziv5xHh-DqEw5)2xMNdBeb81a-%_UR|o4R2NG}iwzMGG`8=-U-^s4{NxoE!i77{W=g zv1Zb33EAF_6P(8h+Yt9$LbTJO?#BO~Q4=+&E?CZrcX3~k?eMYe3JW=pgq!FoxT#u` zOybv(fX9cSkj7NgthhswUritgpY<#GU5gk%R@Seod=*FOVp5A<0u-gHyFX|NG_4Y6 zK)#_^Sw$sv#J-TQ*y~uScX%Jp9s&=@DnHAaM>6Ttvhm?aw;(;5m;Kg7E}A`PI#(`t z1&TWzL2P9{3%a)h5Z2Wb&IF{@dqS1S=6OdCK=RYljh z9~!S&%u&=x>0oya`|gKGn#~hlLj{9~mm`FSGy{LV z(BaxnIpG{1pYq#J)-lDAKe3-Lg6NTGakPSQcv5fcsP%|~{ywkL(%eW&fhzEi5m5=6 zcx8r9ys^p~iNCWsmXl>6E+YBl!767YQ-6yqF1P*8zHYaLTV_TfEeEXR6-@U&72i@+ z7otOXx^qP|^J*sVr@i%?;SDbq0aHCbjzAZ^?lY%q0;fI4)JRtkfG;uX!qcv5w7 z9d5Pj5{Qp^+i^E_*8fMU_|(A7f>$}Pn5ddYD*#6#KgxwB^dBtCqK~ZV=JYEwaK8(@ z^S<8T3M3^Xs$I(^_^|B(;%#R~1eY8<=Uo&wW%>ZV@f4s1vpbuT1n=o@j>F_bxo zI=wX0AUOLIZpd53L<`MIbu3Jhn8#7ZaP;iBQ91KE5*-eE?Mf;G9rN)k5QiVZEm>gD z|3jgO&d6KcJZZr4WVoPm><^QPcjD{dXzn600%2LB!*Dt3DT!4aNn#Av*b!o2P#NBx zHWA`bXt>r>q?kW*>;h2dl`7|`QepflY=JBWerG2 z^0?k_oO^^VhC`%AiU_1ZU`)UpZh{$O*2-~KfQjojg|y_R_pF6wNSNZ*u2FR3LxE`_(mkkYzK?~pcIaEn>+ zjN~1CFRCW<;FBgi;8bYtk@yVu);i7eM?%Q3nP~mBn~mTi6NS9*P`gxO>|0ax82*wx^QLm;KNnrO z`ehKLn=Hgm@p#B`k=Q?B6;+<-*egh{KfNy_wn~;l)}$D(HlS^W`rf9&T;{jzRfiQy z$U#P#82Rwg?KD9rPN*EN@%8le-`Oq`IjY*AE;^oQ6m_fLZ6uNyhrvZ?Di!9f$zdtA zCfoBLwS;P<7G7-42$|P1%07bnU}+fq4-(hTx&4C77 zE<=ZBs1GO*lw3`}0DM!eScUjo@gCrs%m zR(1JZOiv1uc5z%FPOgZkdr+*}DKa=+wfu#xH9wi}f4WG3&ezv=t!FfT5BK?W4r zjX2&<{d5BKgF0q-WTIdn@jdP(4khMet(sE|_--w6O8RLt0!3BcB{);q6$C)#1p=!` ze$8s;kJ93mhVYu(^pIZMt{M<=PaB)0n$pi((~?IM4Dq7L%fcc0Ajg3JL^vB&)!-R> zV);}^%1v#*?^+5a(Un6)*a)7!zSILVKXtJ(#?5)*S~xRC{03^*ZmR@w-wA=ah7Efk zHuEuN@(}n^fFkMH2!2$5!0lgsFbsrlWf$m96-oEZbXcy@G50e5pN~f#zLa*W^zEC8 zfWY|#$}dajRAc7dp=bi28DO3Z?9Yt;MSPbh0P zVG`nj3+QI_f|KQZnHAw%Ok3*XyP4Yj_7&RP76J_+y5`sHDNQ9a(UqT3G;y*-B8ek& zy*-xopQk=U!^2cRP+9NEwpw|Uu_h+@` z@6UtL$QZ-hf}=bqBDk}_W+3%G6>ufel(wGIHXPnL@$dv$-MbBik9#s|-Om#Q@W$(w2{~V*lC0O!zNL{g0Y^CJZoGNxwpJ_2CKWb0vN1cb_^cu=6ySS559vTdNf!tiCxc^wnPmTYX zT2@SdC|SH@Kfy%X7yV53&9c7(q8Z6%N#d-8Ld2^oj*5TqTPzi2{3C#C(ZL&F8tzcn zXNBDRJ<-Z~)dglbR;?ZrPj=(b@X;r!)qKn;NBDE4qUh(Ce3jG0VA?oDzU8qKUi?By zt1T<-Ls|trX*P*g$C!{-VXk}Kk+VSY`zD`flRVH6HDS2}=UQNiw6 zBHoM2K_bwCez;!W9f9aP!h8Go_7{D^bhqiB5b?9+(0uF*vuL%}bXlJxf52nDMe41R zlQ*wt==vKma+(|;1*T2RNo~W83|YM%YB8^)np9y*<^`I&ez$Mg8LUkQ16w&@OB27| ztG%dwcRwF+ZF&y_xdqjfKq7Tms^yCFHa2C1f#rG-WST8?I zrO}F!_a`^|ZvjBaJi0MyegLF@&449yA7Q^oFbQ8TepSvc-6!0e2i})Eqeyv!EVdaC z&reR51`^ti3j%;&7@gn|D=*CRQ4hQ-9zv-s9gWOnUdYg)V50K)oI&cC;ADQV+i+c| zI9RC~42@WeXDTiidoxFeNv7h41t;}Wrj6+!W)ZPg5^)+p$psuxX}@^As7yKC@gqQH z%7c(u)crUtPjCneTOX-;a@LYlv{qh&<|C#gAUmmkxWg&q(2&NT`YU~fa>Ez)zEdR{ zl~Df~VP$18y!|y-$}he#_XyqO0+_~7B52A%PN2V92P;6;o&WVLcl6Nsl(Ds-N(PQt zs;BbHMLt_iAy=pEMB2%EWn%lqvYANpD!^tIqXc^^rqzW64F68LOg@@UW_p@tr_({B z{%fEJYZz6f%W@%f2Z|x!^5IO0^u{45N-W@}soc0_^6u>B^x|Fn-_+YZ$-8c=(JUPt z-rdDv*TSSQdf}`>nCAdh+H}w7tK1aNQ@+23^GxIwr^c|j^E{znl?)6?%|SRlMJ1|2 zFlKhmH~X&=Q&9vOK*)z}o6kkv3b>(qKpk7cl5eH|PK;^Y{qcx1h|jxqy#6Nm)g0Um zTYK@KoD}3%8i2McnMKB_kAR>Q>0p%0aF{@5LQl9uDy9@yX5>a=HP=Xb9t;VX1qRsZXs>{MBTQM-I|YPVY|(Z?;5LK3SL# z-7$LFdY}=1+{^vtScIJUY`DjA$z)QlATh+3V3Ab9uPKgPbn=^NV4Et5qy$A}0!T?V zv+RpS3-{@-+?y*^KeB0X`o$L3;i~@UaTK7O!Ly?!&ws@b+*SBW))tPcwBHHkfrAfr zD21Mb!?Y_j6C_PQU-#Z_;fuRo6MjgBYCNT+69^k@NH+JA#VXwAnQ7dE=!K^qwBr;-d@ygQy3zGj}$J^Q02;@RQ=1-X>vzMl4T4dp-*-|se< zqlX)==VENC(zNIvHwCXxsvdA{+iO^C+yCl&h=t;HcX8aeA9(jea>f(nn1(c--~(R? zb<2JO4a@b#u5~#B!$Qn~kXpkF9)}dhaw4~sRV@Q-tEA6UU5-k00N}I+u6}H9{ivFv zATukerBcv&TN?eW&?`H680S=g(J0Vid0DE65l6n?uHpSJH1le|rvfIZ`QpWW8X8!8 z$yBw-jjRx6jS8}MjfTU-w+xeR^~sNc)qU9)}?@7gn@zhN06v z$IWG*n5%Pg1P=gq;AeEQHMZX(FLLlQvSAmfzPIui;?C_oHRdx;qTw|Tgq%SSv3`x zExTwvKaJPN>>`;4P$r3@?|yoTH)oc9gtCCEm1k@y^|hOM+$8{?+Sp8GW! z`=5?b`=p?i$NznhJQ%bU`8Lxl_(Ri7x&2gPseAxAA^#KGGEnTP%aSL}sOCDAwQZ03 zn>$p994wxXFOfP6o4BAr5SU$;C04Q2QgA4{u(=2~8~`)L(RP*2WyD#?1H z7nX%s3&E-pkBP3*V6~L43U6a9>{m|~iTsfj_DmplA*U&-4s{qT>&S)6eHF$nn$~XA zL__Q;HVv^I(9YoyHXzym=MKPS|IIot{YzFXJiF21id#0d*Iyu_JrN0~r}(Q=PZX|s*)H37bdxNU zPX1V>F`Z;%7bnS&YxLNEW_y_=dU~5;DjYsXv!+KtbAgjyHzb9Mx2Yt>Ds4#b0?B8U zHab>{A3uH^U!%d>niSSb_rkVCW`(ND5^d+(XULyD7#|ZZ+-S^bO3erC5dZV}t;D1) zmeOds;S8Ml;boDShp=aAMzY|(@J?6Yrz!uwEZdn-G~VKQScPM0o?0D33bsm_cvKa$ zsjql>D$%NM?_YMHm`9hgWP4}ghK*>tkg78&01>+v3gQz3Us`g9yNBw=U_P@M!Nu@5 zc@X0)<}U03w3u3QV<~zK7xS4u|yFhRfb1Ug&Z`Ko4Sv;M3$rxhGJ*K~&Uogm|Vw z#Vzbzz&35mWuEWeH*#mp!`>Ee_YyksoVu=fK8xy5S^BF)FXl>Rw2|GjoGRTOrdz|g zfr3?WKP;0mOvV(T_JUFpbUEp3l9Lx4MTxMMi$X9L#%M)5yD?^r5vjE0D3V>ifrdF%luZ~-mp({iAk*llnGfkj0%uD{rPfA5q6 z`e3OJ1%o)kzGJ`<^^2tMFP#RdwUKwvOKvp!h@sEi7F_~ zvV);G|9Og%867(-RcBJK;{@Ij;PPGQ!UkV`B9JB?NFoo|ug_l*qJ684RV>Z2sImyh zI?`J`R)Bs539`UcG>jmIN*CanLQknBC|nOg1FJp!ywRkfUHGbr`PMo2l!hBO$$^l4 zDuYjX^+a{%jd+0iH|e)@M8r@q9$h^}4<@^ZoSGGEzc!@d9-4SktBnNz6da}ON^tz% zPj8x@)+?$E-}?8sUb~@S_M6KEFje~X$}8K*_v+Q4g-0>9pQnxF@DHUa0l|apwK+2c z=muu;KoVC~Qq}A60@?bHt`dV4DgAyW7IN3>Grm5ic@!wRKmhXXWe|!p(@Nb;&~!PR_W$SE|wkxY(So11N1CW$EK~xDg504S7~y_-o7*D$}SbA zc4lgj8k?!U1maki6H)?cJQ=9QoAqCC-{>axa*XPq6$;XpXz*fgWQ;|I6{H^nDAVit zSiOIa*Y@+DP}d>K%hzGAhAf<(>o^f}m^cLboaFshv!ZG) z@B6U}PD%hl1ZG!f7Gzlx#|D8w)Jnq-y<2kzv8%oFhZy5Iq1A`qJ3|E=|Gx3PO4W53 zoo~)RJia=;OCMGk-Jx16za|a7D%!l?5pnwI?aJ#P0Z2+yvsTNsIJO#Jgz~YBtoE?8 zOqc6 zmy|FG7fv#H>;2tzgV(Wz?|J={1JFBxOooul zkk5;k^|5T-!`>!do#V`K7O529`XfI>0iA|d_ZL!>3v;;6AnVya@+ox#0*nBd+7Q@c z2n1$Z-zVTNO!>Z{9vihx@RGbW77=+?YqZsisuD)d8#LbR(V?8ptGr1I4sj1_qg${$48elLs`^NNyFIors5PK7#3SAaMGTk{w zk7yxJt$;9c{~Nhe6;Gl3OwiqJIRws>Z)(LPo*9<-((O&w-AJ=R*u-WBqw>xB*Vx&% zp#1>LJN=Be*KLQ~VRWMdF06Zb?m)RUfRj0Y_%(W6NKI1;x2i;#M)_06@Ruj>h(pw2 z1|M#j;24=mX{wUQ2;pY*a+Pfz<;vlNCC_)j0QhXaF=vdSwEk%RGmmBUo}73|V;(*i zi(P{ofOXr=r25+!e7apKkS$JP4>nM~RKEM5H=ef36T`*zXycz(TW%|=@ko||?he$f zb{5GYbtS(P6Jw;{+aMf3MpYq;hDYvzhg+wKxmg{tm)%~U*H#xQ%vI6Kl-VLaEYqb6 zlUXOkLTpi)?f((=)lpGx@860bC5<40G=nq(B8{XB-AFf*A|PGTAV>`{NC|>;4K3Xa zVIVbtfOL0Azk9sD?|Rp|e|Xn&9nb8u_p_h)#31*0f;7V{6aR%e3-vC`*$NQ4eBIxO z1{1DfZwcu!zE^K|Yt)wCB;9eMFaco|%1jEEwP1mo<<1um+84y)3?oX32TO7En@6^Q z`gg+H&Rl#Vh&P;;adU|;QUUK$05l|z`kNPHMWyrg1;hDRc$qvl=F&B)EFKdhWaHS* z7p*7{hN%{HD@>fei(Qm*>3R9PYj9$^K* zPVFL5S!=`A}pFBELZ|SPw*R8XD=q$aE-WTy3*ZEf89_x zL*o1$#$7V<-eG)V>>#1qq+qN}6wu0@Cr%CRGZ~KJ)2wN?%5lLe;S8ek=H>tGz>`_o zE^W5ZBUXqt0akwdve7MY|1dQ@2x3()Ky9>fnvJb1B`GQHU|4T&{p`2bX96m*NqYcD z)O%%aX`3&B?|+nnJXwF@ZIpWH+j!sUO;nqwi_^_)i=YEYEP!)@BOtJYK#0vP$`a8- znKiilwSaQHLEeM!tGtr^n<$5|vJ3+5;|ouYz!0S?f|-GddCj&P*UCeLB_Cr2P!b;= zZG+>ezd1gt9!oXmY8u_0XVS%#Yh4Vf2snP<*7k_hq@v8k$=UI@z1GQAmCUR4@MM}P z01YyIAkg1i|Jo@NFg7K!tWH)1JA4hDcd=mgSm_8k*#x7< z^^@&7%T?95(KiFK1i#yUv+LG8*`7jOS@yncvKj7#=tk{00JyOOYYT{5l_v`EZuBXY zv-2NM-p{N@xC>0YeJJFzkyQ4(Zg|$Hx;LQiO^%a9=e>_K8@d&*7eSX|-}vjK%EPvF zJAV(B^7E;Qa-l*>F5YP3wF|3itBS!a6>&9EAbl_Z=?@=xJZ-qcyMH~8ZDV=?M1Np{ zSv~_>`+dU#3QM9(L|fyvrw&})0bEs{igEn<-`>ajoUfg1PESZ2uB%Od0#pycebC=8 zToI5wPe575x{ylczFICW-D8^P^C^1PYY z=)2^#%l~lie~3VMRsh3G4B#)aUXZN{{&=?y_>0)Ri|j?K^rJm9fpx61ttFgU!L#}B zo9K2p2y*5R+q?r<%GoU@Du;H2&hzOzKMo8q**tqaANM;MVRdGc=@-FnK3oH*_W2Y1 zo6UhTEY%9<6U<>!2wR*B7xDDx+c&Zmk=de zwE@5PZxb<3xt9xlZKb?gFl}DxbBTW&^&gT>TF`G2F#Dd|kRck_>h!ygtEO*{k$*j8 zjx#J}Qh-VCb=c6I`iuicQuqZ6?;Nb%sKrL5P;)D10zf19A{9lH%%C#@GG?SY<9SdR zahRs=fE=Lr7KtTwKMvr|xndLT!|j7U@Opx6yFa1SM~HYxMd8WH%r{YLOf9o6{Z-=X%==p-9j@5>rm*$N}ARzaprTiF#s`|0sxZWwYM~VNSy~=g@|t}`lMKp zFax%!DWHDog`?amb)Rb4jyNqZ6v8(7o^Ai#y&&jkuibmA%mmWbxGuXq=H6wcX|!ZC z8Y>++a9-O8b$#4H&o3&~a!M(o<5UITt@xM(0?iDJSTuz7>SW^fO}=J$4p29zhqQS0C|*P5qe`vxQz^!cl!MOx-GGFA|~t{ClshfnP>UG%GMR7y1S75Cj%DxNo% zG3e*jB|eP@F&ptf#*FW2;v@O~QtVw}Xb3{&4l}oN>zfXdjhDtL>ye?L$eA9kpQ{rF z2q)l7yxpLepp4&t682GSHsL4DoXg1V9K_avR+?A&&N}Eh6qo?&4f4^0L7cdJcXMW5 z*iwhA*#dy^7ANae#D3(U8&EORP5y(GGhm;X!WjuYVIxjm;?(f|<#~~r*YR9kFXVAp zKzVXMO`)ZVKE%9T!gVQ<%eZbR%licNM$BzRc~bc8K*VRh=9E$OS*}C*zp7u&G~^2} zT3dW&xL4}7r?o0T@v}r2V~I^fdk-tXc0c@-59-cH4AS2vipD9SVJN)yZa@En>MD~yOIdp*|@R<@IBEH6{b_>!Ep!p$-fY!Z` z@3Q^=-fd*~HrEgZkG_SdM`bPA69tqM0O<)L_-leNT-aRty%#6=cpM1_CcPq1tOV%KZ0?8Z7ySmCE?=575u*L{5)LPh7Zt2omCJ*v*lJ%W zuh~S?pC$|yp-C8PIoGO?`B|2}k9a>zbj$FvZh(}J0MfAKV<_-GKYeYKM!l_8#j~y9uY~n{*ej99P z0=Vs)jP6#gG)yTd#f+E=MAkw`6+(ZM$&Ogksd(8qf@XROW2H}r_CfT`dPT6w3fQlB ztMBWkzJBu_RxevcclucfT96aE?EX;O&Q#iYND-mjmHQSHG=dJ}rRv7xCF&`((&k0M zEm~x_Wzg8QHK8=Cx$CPs*Rf*IZU!sJQMs-X$+?-37v2xZBz+H`y{7q2tUvW|zD3sT zK*&z~30t_7#=WUz^{}5UaMeVH)UOe;EaRHGCG&6Ph278JzD(jaXrBC{lKmP`^aw-z zNH5g#sk>P$C%9FZBZrn$5>#hUZO*1^QR}oooX$1uaqj!sRPCmK@^k@1V&W8P>sIW|r90Y5 zkMeIPtD~k62h-E+R9lRodo{lDE!&yjW*AYsIgV;Pq%AZtvQ-Pl{)P1g##Kl-?BD!? z(G5U1rQV3dE_PFirKSryDLO7`xA+{RA)6h(`m=d*W_2(Y9W&aLvSjZ@5>`5T_8{Lh zdqfDcK>8Y-VDhPziy|F6-t`b%n19J?NAmezffl)}Noi_>nD*YN3m@SJB(68Bc1j8h znsgf_Dr-diGz?_+#1E&-jYYxMzvOUAYHD9%f}nu!oKu*in%9cZnUo1<2XChMw@s_Umhq8@*R!5kmXvqfmI2eWo;em@aowb+HJJopUEZ_C5)C7{&h z9YUBp5XlQ0I799Tt1nj~-%NvL*9);0%=DS`8;NN1={L%rp^NCl;b%_3$(f-o`nUYK z&T`2!SoTL8{Lp0xl^k-WV$+Ixr*E+@4!fcq;4s7&+FdeUcFI3U-XwuTXKKm~YKxx& zxsb>~aOq8s>7@oPXiberhW@NgW+|hy!NhROA98z==@-X#=v1U)G1#hQ~7@;h941{$49v z`l5b+-|(W@*xdw}kTJ{C9VHtrX-r6CYH0tL=o&ob_g6`QQ?_DeY9SshAmAL}20tz& z|E)hRr)#{x&0VS9Yy`~9W{EsV!y{8fPbmZAY+PmemEb*f{^7F*Q7 z4eNz73L|Rpx5z53GAs8R9@^0s#g6RiU0)|lu!-e};oxFy4fWw=+xP_#;WOlLC{Y4P zW1|Jd;GA22MB_;82fW2lZI6~W9X|d2^|AO~e8}YXbZGK`HEGI{jpnU2WI=Wv(z)fn ztAIBbZjSd-<@RJ%SIWj}CL_a{G(ayWZRw!yiJL;E8C|>;JPcNn2#R-finWo&dKIrf zJQS=6CwTa><*R#{VlsP?r%+FrZyeSPnyKOcyBZXvF7K+M8k2`NK_8M8`IK@|_LHlL;!Pq7&D9eUekB*Js(=6K!WIwoVAYp7+6F zPO-kK#3MietF|80J#z}m*Rq`l5v0$*uQw=sKZO#v@VI@qK6?)JWZ%^w&jB(@yv`~vRBQcn#G%-eSJ-v1f zvb!5v{-Ai2dfG z@(>qOta37SvEBtR933f&q1xTL+J4QLiaYE^HFZ#m=B^WkYIqq}b z3*5U?UE$B=-U+1!4k2IUa-F7AME)dExW=z4M7BVD>nwUQHgKao6EnrmB>~VDBh^pj zuHoJJH8D|tcl!y#7Y|AF#yjB?CHb?SA6j47F<@eUXQO|I5|&#_yyecWA3m5?#suL*!oO00iUzHp}*+?D?P5 zAt7T$;uN$On>D}95Kj6J(9H+_WRqwmn)=@!>HY_>?0XKGBd+(uaLbTA`-ROCRH~fYj0VSO^!T9g`Lb#k5(J z{~#@uDlft)QBkDHqHS980qTWN=jQTat>2v_pKikeZHW{nV82ohq zgH!#(gekJ|QZc1D7pSD$+#K-Skan}U@%@y8=BiBB33>pn2lGzMbRm~qoiat84*QU%|KXV7q?n5eX_*~MTq*pwjx_=H`e)w;5E#I{ueZniu!aK1c0?`)4 zo&RH%@GbaJ6&2Tv@ONnmgrbj$K|iiI+a1W0?pwm2Li-jn#WDx5Rrqik3Hi=T4$}S9 zCPr2s7|Ap~=0&BURrJuetk)7HkBKATrx2!7x=a_&&zk>Q0lN3w&H}Wj^xFK=ZJv~H zD!_mK-w)f@rj-nsne|#E0NA`%%1+C)2$&!?Eb+~E@zc;@@lGrKxuld_Oq;3Ve(9vo z3QtkYMvkKHB znNwg`e&_tO9v5gLe6DEvc9-ZOxvLy1KUU^vF^-`2%b}kb^M0MuKR{V4J{ie$lh~hI z=;KJbYQ|VqNUKC^^K~_}24DH4r@uVXO*8}%T;LHMLp*OqA>ffQ*aaDJH{kV9oj2Rc zi}?Cg*9Y0V_BD-pb74X?EvopA$HtEiv=>75`4a0khv_wf;1M4)`Dlm314?3e=pHSs zUyPD}w-`*Wuu0@VCXJ`F0@I$Gx0sA%9?1tDB8^pGd-R(dW9&_|O6+JUS#qHk3yoeCdSTa*$xQ2iR=xk8O4B>lmLv!eh z^CNL4_+Yw0R8m6P4#1gc{j>ifJ_eafqr7gs#t>3WNR_@ua<3-r z!Sg}lk7;Qu2V@=vBxx!SpVg@XfwcN^<1(GWlq$Srf78xH5Ah`t)-r?7fP@?IfvcNk zQN1vv(%E#u0CtOw9IYkW65*YJ%g4xjra_!KtQiNpo66Xk$S8SXUE{o0G=h9a3@58q zSW>VGbdk1s43DpTbE1Y39H z|5SA{3g;gz63Yb;e}sY%@bL~G1>>~5Jlqis>6lde`+K@!>(=-gej(~83Q|IHXR1Oe zYNF)DTaBqptBA9A`wiXO85x=~bK^mG?qVjS741C+DQQCpJa2jQ{CHCaC=dk~qVxVr zSzP4+@?vCNl18{h5q|U{qLxpD)8~&n>s&jNTnZ&tAWn$m+cBM-y~su4Bq((v+StU% zPb@8LbK=kMB}JDCPoGbFYG`dahg9yI_huOeDMDbtjE}hj(m&}PmMo9}6FE=8Y8+8~ z+HopL?N;oc73rhZijm_9EG{T-?KFh z6OD^;$T5=GzFVvLm<4Ho-iG>G0hq#66+cF|1-OXeM-3)b7GaOX2iPU_E3b3??~hqh z-Jl$YM(jqphancf}ELk9YGrKeGGd3fY#Ng!TE<9ggaRLeN)^f0%>Vb%=kbJHE zYy)#P=sj2+LAN1I+DfFsf(c?SY?57*Dvvty@<}X5l#S0bbh>%-y-Yp@(CMa za_7CH7a_>u(lA|+lOfn-32EKL`n}ga4|kC*z>KJ6X!J{~ovr?|wVrh&$ zg8V|5{xF3_RU%lSP_MT51C7XNIi2YE1~9qY3x=i6x0JFn$<{S)X?6&EJw?F_A<=gV zSXv2@LXaqfS_i|vZ<%G#Utg+-;b`laZNOH~YVqA}?gp=+`UP|=(8yR9y5c^~x14tL z5Mb70#bsDK@Yg0#-rZ!fCnX^+ty}%^mlqx_Bxy?)u5ZCMlFHwBIuYtu5d?U#tE!o$ z8UWp`{2j>?&+EwZ<7+rM?w5L{4_DfhtP#(+4>1=1=8Qgpj)K26RqF(bE}?gY-68GL z-_fvhncx?WP&B9pNUb@rV%ltYbH5|E;Ssg_;8Cnw_VB&biEGvD7v7lWS@P}9qYX=4na6i$mBZvk1DB609V%mZ_# z2qK~;+oMId@6hXZ(~kpxym)zZ#K)1GI72|!;=+GTNOhLXoA-40)mWC;gI%DiO^pdz z49LZ@!CXM3$5=>0Lk0dYAzBcbh^4yM?in0ij48%79^2E?T=g>+cd!ZXg=DQ-t`HG0 za~dLNJTv_tt9@q-@s0mH7Xi8x)Y{R%0Y#&~LkyTSGDctABC!H+L3~DjYAZQ2(u`kn z6mfiamWjl9$?K-sTg~!kXYF@K5XI}zOftz?2Y@53RoCF42?#+UtiS4Pk@Ls5b;268O>Fi%WTf%gSLGl0RqrI zd+b<0)7d2E(5>8~G6A|6ulC^doY;zHsviZAUu}Q5B@%Q9xl1&>H6&$i8jWuN;@m}J zg&Iumyx|>w>1W#2Rymu@FnV6C7px}4b>GT8?mw!=bz2BKTy2p9w%>NE zAw&{5WeVtB2k0L7eazDKr0c|9yrLdk@coS{5`7Z57dNsaFPHO|p{8NV4{WzE$NCu8 z(^>f`q$fD8&cDBU)<3cAn<@h|=rV(P)s_Y359}X@Hve=afqU(_QI@b9Wa)X;UpL^k zL>Z~nn~v_8zrW7`gie`*8?49@2CjhS2SL`5WBmOfpbpiS|Ira&Uo+(GT-qCeh)c2a8BNLd=lBDC{Hmu-Ir~j+O*Lz_q5TISE%|_v*h!dS3Z25A{8^}Tk*)4%A zq|Wcmb^5Ej15T=n{YwcasI8hbp^YH2xV`(86t|5g7Ua#@>twEkM+>2gLbvg5YJh-H zI1#l?{fwWRkWZnbYhe+xsj>7cJ~mngX^@z$$_hz34cL#lZms)(sa*YtiXxg=KUNm! z)p1uIF1PtexGXlUS&mB{j=f+h9sdm2#2^9Gm2Ewa-&XQmf1I9bZ1W0^DIcz>W} zq&wjL>!xF5Uh{;`4T7o1G-y7MvGK0EDYvrZRC&`eD($drD?UC6nPZIN%5DtZH%g3v z=46K;tm@vnXN*YYkQ{WB1L-*kAn4(wIsx$!TL)h=fHe&$ z&ApR)tw$`>&paF-JgzogA3-akWz1miF6Z_{I|2I)j}3v6eJkmIC3v@p^_@Kq_4pwYWFc8U>#9Ty54lTtPt+x&fH(fXw{-b*MKWfY%4KX1 zYJfU^Tnae3Y7C|g4PzVP8u#z5g!ZA=9Y;s5@^z|p((>>veSKH0m`4Ri>c11&ZGj8w zWj+rouW1L76M}6BMr>NUZ@?SU^fiiwc8uUf?M>bXgEf%HY!6ZCE+V_d;glWN^aQn; z;AVw#oyeGH-$87%$ykkacDrQ6b+$+LJA(MPXJ+!uHSfbC(Q)~WNdP+rjTk$eg8b+I zz45o6AMY_;8qw8gtCQj59a#5ls)h@lD>r~EI|F(3sGjr36c}XYDDCm*@>SW)qV(rg$Y_Wi0As>qI_e?X&{pG2N-Bd zyo>o^WeXQN!DY4`8Fmutz0d)lNJl&a@rk5b75)4Aq<;{Q8`m_)vKU?f&f-=Z?af1D zF)DrmD3t@cmi;Z}lKbK7jtH8wvuDF7`v|=}F1Mu6=8piyq2J%7Y`?3-*g93`L|qEH z`8nqSG?5?hZ)u>Qva1$Gr`2hH-GJaA zPMSMSf$g3Rf`VH;&PuVhQVDAU@>BE!IY%EU`hw;^9}hMMz=00{zH&TECYtluRZs~V z(x?L-l2r1)QCb3ej+l_(L<~voBquJ1B#~6@!pBXr@>O(wE{a6REhmHex&$Wq$pVQp z=*1?0{sN1vj9T zW^9#4K+uQ}q>4CUCaEHU`w>f9uD^|7g%u;96mX*hoFOj06CLh;fQ%HzQNF8RJUk+L z2s9IkTKJutj&-TU?UM*-g?PP0MLpJto70<9*&V!uklSy0lC&O{7a5`K$BM0!#cw9S zkEAdX0%A)XxN*bSLC~?6VyQ>Cub9MD$Bq{dp_-$K$MG5}g2;Rgs6=%^IiX34b=A)?;fxy|xy5qRF^;QS{DWus><^s+#|G_iJmpYimkGXtG4A=MKp^>ULI5ief09k&hglI^9AULjhgaSY?HZ*ko;W+F2K zEO{D2V#JhbS;d>eEF^zv0lmDDJLZ*MPn+!NA&w_#MWYH@?{2gnV+~hua?p zU%REEf+5<#jC*^dxU5_?j&>*i#{!pa2GZ=sZUCQ0c!dBMWAnbaN7Y?E0lIn5cT(GzenxIpnHP7MA}x7g-Ydw>5j$t&c>bzk7* zm|tdTxx_Ty2e!b^xVAPFeTnAaiyR~Ny|kl=o2ZYyDF*|-?C);FV**ES{iTd@5A`*h zQpw)m!Efnf%7; zbZzzA+im+2-SQfh^hgqAh^#G%lblpn6cBfHm-~W$X{6H~>$`;s*&}M@xM*>Vjj<4d zhIPt6J$`oH3kY|pS8Yf6^9L)^E+atJUpeJ;g0Agt-`evqhz1y7>8Vtu`Q=xbjH%qL#e>P2T-tev_V~OlyR67Eteo1cL z>X`pn72B0PN?b5g-7@>R5{<4{I?1fby_ajho9YRu__}x6ZUU$!{QkZe$4!&IS-F4n z(`#snvV--DG182x5e^McUw}Ja0fFr|f22jt)Z?8}t`D)jAxq%F;ugO#DZU7V6eTT@AvOc;5K2IC1_^l2>Ec!MP1ILfY1V9jPC ztfI#q*mWL@^8e5izra*-miH5x-E#}^v$T6BJx^!jPDz8%QAJ1d=#n zSZLTWwnLOu$X%=;Dm@DhUZjXUKC9|`P3 zS>$d-*}mtfx(_EWDP)zgN_?a)lVa7sm|NqT^j+>Y3Hs&PoO1<*(zx*eRzoYRQu7N2 zM$dD*v(%;BPtP|I0IV9yD2b!eyWc=+7)13`Q_yIfQ%s4Q6}VLVsX||i0O%8rY5m`W z`nhaQ(|g{7moJwlfF&bzKp6)^Fw49rkn=atRCuz|ZDO|2l4nDQ!H>k^R8aUL-ifXU z3b%fKe(?{WBBXleqLR!G5RT&C?*K@0fq8!O%Q|Tf*_6={i6vuF7isejknM$A&P27e zJF;)`Eb2uu2_bKbGeelTfwG|`h%btn=*7r5_?$?=uEWAzl(7YRB_)-bu~Sr8e`KYj zMjjHUTwRrLUP2C5jb* zF0a7gA7A=#D2;g+iT<+akGpSf9aCupkulO-TMgzc8U@p_qaX5SK!@~c4K!M`iW2_( zrK2xZ4njLcg)b5?6j#4zJ1eDf6PTkXdH?={XC{(RG(886vBVyh(F#+^&|aYOAn~d= za5c1jNya0dAPGR3#0w)ZByom%qA4Rb5OjWfQXBWt-wM5H)n1ZlaZv;bo2DEk!pZ+i znGpi!6^^ndjcd@%-=y3+FcWmLTC(b`KU6|7>;jq=kQp?ru}yFS>S%KRrR1@&`byGS zMnmRlb{QjxFkov-EE$3BmmvAyB4g^ONz_ZB?cJ785eG|sLwyb^?=S+X#5QN2f^xz@tX8cvK%AssjYbHYck9sbV_sq3jXzs5cz4x=QRAK7;Lh& z$uSKuyUirSjbKLr2yQt@>)DrVKtJT)x=I9>SSN28qfAtpGte+;a1;Mi2S`s-T1skP z(o^ELd8Yq}>SetGjO4N0}Kl4=8ylkv@o?wj4w}-A}Bl*iN0os5;T8O z#C_u>Fk}a|Lev4ZUcA2jANxU7sBZ?U1i?sUX)E01e1A|>|9ij^S?Rl?hf0y03kRi~ z09&+gB4{_#jdp|vY^NdNApJav3$u~DNtPQfaqp4qxt-sF#&uF2Cq{`{e#7S{TXvr- zTE<`RfF5{#9#f%~eVy|JR?X-ZxmjYe&;euaq*mq8xTIJNx!6(B;14*@8*O~0zs zhE^zE1m+z+R`P1%nZ4Dbb;!oJN@j}ywOU4H5Ae+V4s_w_Pj}Tahq>=R?YN1Cobc2- z=)K7exC(YKkfi((v7Iz~meDU5$<-#-~$W{tVI#}8ypSQ90zO^WqiXhgMCJSd zh^4O7*qzjEg;KCWzg$0^c&Vk*ZCYl8lE}O>tYbMmS!H8-o~UoBC@*Yh`JJ{J$aX5@ zzhoVr@ytf0wq^Kew)=6}T(1OP@uWAtyPDnNEe#B83i$hmTGAqvVB;67`^kvo45Ejk z!pKhY;%aw$8&$3Ksv5tg_j);fu7<~dLko*Fg^Q!%ODYeMTEb2f3vZy`Wy6)=-F5um z$KHJovF-mB=Wx|2WNWoRZ5s9}egKtI7ZA98)aX1$bE*KMS@yw&2xa-I@2*PAAe36` z3%SuR-$RCUu4ptAmzE#m-pNML_D^)I?WSp4#I>8yc1DHIvG&8bmsd;gLAt{jqE0Sm z9W`IPJw5oC*YaiS5m4#+xR^T40bHom)`F+o0t0Qg6SUvF*Mo^OS{8)}3}j08Jh2>M zMyC}+;vMVO(}LA~wEVv3>mUJg^4oT>k-RkDfZjf2;k;SdG_6mow#olyl?D6}-ZM0fMP*`(6*w%z!ng}5m)<~`4V<}};wX2Uu;i?y3| z|F%@?^qr5zeM$nc6D~$1a(@b28>F(YR?lbDZ1$`9<7$7sYSB4~ER`4pP>qR0y*7hA z2&=!?v37^hc2@0Cr%#B(`A!phl>fYVa_4u`c75Ab8IXFA#6MQ}X60hZ`CB{j=ivD= z;a^2yq7e(DeZ%;ZEGsw_eO1&nV3MnFQFS7+IrSbX3bXNYXcrPE8Uqr$EjlHJR-WC$ zfVEs@{z?14v&~G2X9NV9MWxJE?mT`t^+Yg6K2(VN?G#Kcf|5X1%5CmNTLQb4NfKLkb zQ~M;eIgL96MbCbUM5{T8bE1C*`eI{t0g8nHPMiZ!Dx&~;O4)5A@$S?$snpIZrD>_A z9YE;Hfg}~jQH0%(PeD2=UPVqm*Yxam3cRKs>K@CQgdj-muO6-c^0@4dlBIM&KlgoK z7%(-J`VOc{plHgW^XX!xBEQ$;zjivOz81^6fK8>3Yqx*Gshk}?dYE{`F%RuYS9ZH)edN#h0FFrJ&>gj<6P7BAvfK?BzxW~}9)|-Hh z81(0hqleTx&%H*oO~U+v5CPf26Br?$&8HZM5BVuF;IIUd@C$=Km>q#L}hEQ?=$q5bv0uL!g1uQjT&kX!rUw>K{ZvbNK8WVX-K#!qH@W{@786r3OsV_SZd z=K=Dllodpr5;nb67^9A2L0s{jSFzljpqDHWL-c6OYG_h#YZ3su7o=oKhoz-J=P;2) zX>0B0=P1h5n7~LSX-l>}EwvO(QU+dRmm?T=Re~#CAABCI3T8^aWa3n>C&(T#HuM8C zjB*kwVg<-w^_ItD)8h5Hln;Sa+!0`BfyGm<`V1@G!2#8c0dlIKG?o*WS=!9R9SoQ+Xc$Jpc{^tY*ow5Su#jk1(g2_0Fb58=h!~|iKTph zM|V2-i+LfZ2O?CnO1UD5q{9jDCyx?9FAW>){+DZU`bC=gZ@7ypCzQBXRH*<&>|V$E zeV}y=-t$(FzKlG)G@@Tb^*T6SRz1;I7>#6=5?pUgjq#2NI%=YUY|<-{MokIiQ9>BW z9A=vvbpTf2SkYCO(GbE!=hhOlAo;(`7GHhn6=-xZaHiBTM-crw7Ds(j|2RmT@<5yy zCJW}?VBlB=aN6VOt_x_jn=Dym#XBXJr6jr-gfeq)->$F*Qa(<5^Bp;V)mkf61m)_Ui2d(G{jE0dx|_~tt=Qi(M5+E* z#>(I7s0Gl2$lz$9%rPr)N~xODz}W`I8HwK{P|{Rc$_IS=K>K!4h$Vt1V9MA}s{c0NN+KyPPIrkqU4dG6 z9T+_PIOSV6;`;3BIGPgLN(t3w1Fx$cYpwAEJ%pI9uW;X061x&ilEW~R2QIAhn15i3n$sk zNB0}j?gn|U45iK2GM^^mA^wWd`^~_V*}@#MC=()h7Q; z$;;!Z%RXDb+}+xo84qav|x!sW&43_OBk z=u(I0^}qgVFz@AIxY z7V;Y;Wo-W!d%&_8aOGR$pJBj^hJYJbSTRC7smvf*RRDR{ znZ>=azawv+Xjb_o+Qu>ovLNsURVg+|p zYl3L>B$Ia%luamyiWVER1gVqa0fPXAbx^xKgqlspY=zpJl@~~8(aA#2;9wp{lz({` zc7>2bSOYJue+3X~WvNIjr*j@9HiZJ-EKoi#j(rnu!#Ym#Q&d~Fj%~m@#2WV|myFSP z>N5Ia4xsZ2IOz8<$QHd@pZ76zTIuya{#&iKk_EOef&c@SWqYQr^8++yqhzxN!JIp+ zQ-VXcv=UU=t2%Q^u3WzPrTLtJNxj)f(IDKT2pJ>7MNK~Ih6OFV0nr|?*dSi%3okGSMXUIV)Az~>X=+miz z@v=-L=Y4D3^kt*g=hKP8e6P>A5M*e^ucOpY?16EuZ?ouH*w_||@E)WvgqRDz`bIO| znyK?D;9Vj;P0B!3X#dD5U*KrZ3#3vI)SRvuQ**7r^yYe8MVg=P+(P~b_2Ii1zac6x zYx-{zK~uoF^}C+usL2S_%8!KJ&^ywu;6KI)9#a>$==_v!^ zCk&MQraoDJn1on9f80{08nY%senWzNa*zr7+Q0+vL#Y9+lNfp*hPi?6DCmGVcAXy! z0;MQ*alvdxEp_50lapkEcoInT=?In$ZEzutkl8zewK>Vi;gX705uT}(TlJz?fi@tK z{LOZ_#R{&?YII3^;jvxnvF&Fc4I-A7Pk$3ymHF`ozwbDwVcTot*+`|Nt}#AYmIczm zzD|iSq(e|tA73#$5bw#3kApf7`33oW0I0a0j4YoR%3mb|z>?v+_NbV8qw6w}Ie}v&XxV!Y zjCo&fj9uPZe%>}Hh4{k9-nUZQPI`8Ii2V>`^GxzFIE`=+Zu?7uB{6w;?>VM02&5uG z;81QU7W%tP3@5I@cA98#?&rr z0_#}(q32+*R_3`oJ6`?j`;XSpN|av^!@FQfQLE4a?gR#*mU*C;%)QFO8)u&=8L$vq zfBhKiKD+Kc287;wTZYRh;|)Ke5LX)3K-~1Sj}9rE`WDrIJ_0%flb|>_P&CVZU@+)2 z;4`=}Ktl}?{^mz7nDfmnWymfAn^_r2zEiW53;^@<6;F5C`Tt>Dp2&+F1@qF!nosbZ+en~|M5BtQk0VAUw^%WJSUAg-7KPt0z5WxMBd#AdFQlye}hKbSpSp*mwL}pX@ytL<3mX zqxo|iL(4fn^d>`oTymxqa7)#Gcwlow2H=}H8u7h$22CDdl|aqj_jMHW5u+|j?N&+KvkI#|)N8@j5Rx+goOZYN|8!YIsRVVH1-HJ7tl z;0=5DU6L-;rZq^~mZK{KWh@^}y80b>_F>+)M)t{CEg+d?+2`mR%<~TXB5c9FZCx(f-Wu(2LRlc7BAGWF|3CB4H<6$w9OaLs|WUWK$a2h`=&JemiO3>+dC+yuSsY_ak+j9|@Aa7idCs}*WdKUlzZfDE+O?i4Yf2ZW*ot%Eku2~ z>!b%y4zW@cmU`56Qi3J5lk?Zq0^9{$!5+GDTXh^9FRN2!gozC~N_(+sF!bQ^U(I)h z5xXXD`)RoHqzl+t)Y>yqM`ObtV{lQjYBi@`<|TJk56Sd$8RGd`E3xnam4U_X)Xy*C zrhure^w=a8K1FD8mF%}A>GDADAjUQJF1M)uqvER6Uf|MamLTOkL<{EZZ9wI6e(2c= z5?mY#b=n>ZXpary)9VWcSr0Tbs9#O6=@~PwHd=Ya*w~N`@mAOFiNA z(L$5o9|i3!#@vNZ78NY+Ev-q=J0Nj-i6e zm(OqW+KlYF#+O=dWVqRZU30fN+3N|lfGu$|9O$bKmlzG79vP?<5LF2@n*p{auw~z1+FQShDmRya=r0` zbdB~}>k`KL4_>{X`Gv6Z55qh85|iEKlJU0^w6A@afm+DH5)zbyD#Lzvuy~cjPZNK< zY)+NXG^VA5>)ncDX?X&;W3~YDgU;{6W^K>N*`tXNX#WdeY5PI=z|+2UdlyI zs2>kevU|o**B6#Ci&X_9ZvAE<$Ga;`vIX~2eluJ0|74@(=8eV`odW4_4PeQj-rc@a z>V3F^4m{0}E#8V$jiU(Kw53<)qq{=u5&4qV_a`U4UvwUDp)61*_>`R(V$&wHok~=! zRMZ!zo0PqSMj`RD^t?*(AxIC){;njU&y#9(b#$Ni)1EXkFY-kflz$CBNAC6Z-WFp; zx83UJy!&S1Vkkk!8QT|ej|Q9SaAIKuaJ2^Pb@#KCbmwq^aK8`CX8Cib<0`!|DccIk zMra?l4hLun=>adOlc=R_4)1qbn#PlGD}~3TCV6HYk>M({J4!H_pXFlyzAL7S5PB}e znOtWG%wy4zRSMw-TuMwE7{t7k2lqY;Cop48v*DnG<ANHA@H(^Ds7XqMgC-Do3^fqgRx1}5$Az``jgQdYT@)BG$ZltuiG zoqVUOC^w3i{5kbAn-~Bb`BAJ_qFZWV%c`1HW8CEVO1$|QXM9rWOa#IN>9djb*OlV*xWp60)~=$RAFcfY~g zZW+o5*JZ_v-@5^nVgN3ASjB?N;frZa1URe$!I$fF8WJGSVAy)CwN(HVeuXC%%bFt} z`Y>^3Cvm~5#Ex35``AqP6#qo!wvW3;h3hd-nT)$+#=dwPBhyY#?d(|dgcgYXPXVhh z=LsV%u_#x~PS?{caVc9HSSLnx;Xr+Au;;UsH9Lku5BH9)bKlZb7f!^Ny+z~} z=V#`?I!dib1&X?*pqA@i>XQSGickt%fa{8rtF`KbK9t3&M7@|@h5_da*H5^q!+k&A z>YfZ+iCdGOn)|&~496eR909GCCJ@@nWUv*PmRL1<+SY+bRy`W2BT1Zc$V`6CECrRy z#`00F=n~pyW$ORxzWq=vRU7rCpXdzU6NELqu2ryQl;YV>(v9XQes$kSDkiuu>BP*- zGk46-zXhwJl4@H>e15&g%f&2HSX!Ex)pwhsp3@abO*pinXEJIaeVc;Jp8=biOZwe2 z@871{Z)U43UpV6RS>Mq;@f`db@k-V1O_07~e+SL8*G4bZHO3|AWUTi~X%b1;m40Ts z^SxJUVEyHyh^^#v@*dTUVoRu0ws`f?5fO9uh}ydEtpxY!gU*F3g*tUdAnS zP;u|iISp$1LFG#>J$gu>dr-r$&fa8_(l(|$07?x_O||G^fC&qKQ+fLicKGVqfFSBJ zi9~R4VbUcdF{Hst(UikwFGIEyhA3e6(p^`$ohpQd_5WD9>bNMrukF`BO6gJ*X^>u8 zLM4O+1O=sB(p^wO=?*2NyIYWuZUiZ5mIkFo6zLE}K-%|=zxQuG?9R^Ix%ZssJi)?( zoZfDR;a6p*N*Z^khR#&7rAA6j)IC-rCz|woa9-@fBeCa(b3b+W%0>eeE_Qg8#N$*` zzkM_0exq@HT+_Ccf%eQk+#9 zL&WfvK-E?g7*aD?O^aze?i2Cszl0WSuA^@@&T|rip;ZbVP6L@WC>cyAop$a_SJEzXIG`7mfE3eBD`L3X*BKx9>#~u?O#I|3KdloqH zL2I&7iR`kZso&1(q%id@o@YOB?Y{sf2Mft>iFa9EPG;eHHHp;j9P3kJ0St^89sg|= zRH=nh;6MNh+gs#HnN9NSV}x<+oH28Xwmz%z2uoAaerf8Fi*TOCJAZID!t_J0^M1%7 z)wC746bar&esF&biS}TfGG^V3PVF^Bb^fx-lb%OGGW4m;2Q&4Km1`yS1Hd@61eBQT zq02)`<2;X->wJ^?44IXNJ}tJv=b1~-vlGOt+&j6wTh&R?zHl)ugjG~@tU5buH&F=5 zR7iNg#4agYuW1rK=~wV>W4fAzrA`DU86C=(gDT=HtT^tLQQUsTlKwNgraUu?m$`zq zYOmq&Xn%-RINVRMTw(F!p!8$!z3)ucD-}4WpF_;gadQ$KesX$#t%yOv7q>M&7`fjz zeARK9=g*~znu;|*x%&o3J@&tyt|a{m?zKhMDPmwN`IVesmA%#DtPuKskSIW6brq~A zx}

SKarUai?B$^mgO6v)Hwyhr3!`2vRfO1F6!$G`5D$k2r>=EGXC3n+q zjDo!zmHw#(OGh*9AATJdqnJ_XU7ME=#E$;x+|hkK^f!!=tteYk8T~Rp^+u#$R}&;D zJvND%8MzWp^_)C01t-jQ_T*l9mdu;)77TnGbIal^e6OLmZ?W9ZQDVA~Vv$V}D`MxH zB?~FP#hFp{A0Pq{XJv997Bp)?{*y zTnWQAN;4iev@cleJIp18U0&Lmto2%s*e6ZzKAt>w zK4kdvZ`Vn8RL0_!B>}xR<=@W*;g{G3equ^K+P5;)1oDWA4{@rO{QBlz=oN)oC3=PbsmQ zai%Ulum{PEF(O*rQhsh+?(;UAiGv3B>$I6A?X`wvZFW_M>^N$}Un7`Dcem}gW5UL> z9DL4lkO($Z?iGDUwUrBY9#%j>bZ;-f&};ByMFVLB$fo&Rx{JP3XLCj#%EAoknjlda zy8$zkxCwnTc}$;~U#A_m&uJ64|MhewVV`wc=X zc`r~k)b)5j+$t(GIK%dgEqeLps0qIMsQvg)KvOg5$$7OXQUg5?{{)!rUlzCS>1oZ# zh`@{hsZ@VWyV$3eckr~e%YI3mV;s&tS`n)$5sc|;bPIKE5NWpd63*Q7Kf5Te|621X zAac^8LgLvQJI~?X%?>)FDx>3r@fOwZ0ObzrTP>)#Z{az8KYRxL0eQ+kG0%1+@wLkw zzvI~!LP+}T{APZ_%>Gfvm&RfMDKnKYO|7l3&RwWq62KEC<@^-AdZ`Pqq&sD2WEJ~5 zwJ*y^iMae8DbK}g?*ltuA1lL>@lnPI70`&(&WDyDH)aDF}SuU$7f`lA;fX^-BcuRnru1PO_-Q`bsFQYpDdxz?SFbWt`Q-}7-(62aySS4*I{VoV8u$vYFARuP^;log^A%e%+L8hidc`dAN*M}mvP@FJU2NaB>TNQJ6+XLL@@B{6bLB~;`)2B1asxQ7f*LQ+CrUou2#9SM(21IR7s(8-oHa-9*j_4_L+8GH z%XKHC$p}~{M&Wm3Rl!_WaY=50o#i69i zo{Pe}Va>;n>diqHkXO!gh500NbE?6$MuFtS%HPa!ZE6&W=(b^-%a)dZEC3VFcM5cw zIdQnjt)D_)D)MhPKMWmF!Trjwurcmp`X+s6_k~wysd5#?jcNJ8UlWFWA#FZkjI(V@ z;b#Z;7yDD%=8|o0cj3zk+fW&9nDss7~ZV=C-zzFm6(0miWq^iY#BEBCuXX~l&it78E;?% zXI$DYICVjY6IcV#N+$r2LOf~`^!{~*z+7PiA&qSH2P3e0;d|61J>NF0&k}Pj@oA|X zMNJds5M&$@&!N&roA4{Q{VqiRyu`_BC3abAA+$2;yk~(`e(0}vRj81`2;CBXNNwxD zT<;H$pUKMjeQ~niP0gLE)tn;rA#U>2OY{$c4YfV@gqmtV*(qICA|Ut!(Q&6EOp#Yz z^PEdOp^XYUL-E+6BCS=|$=)%^1n5*RJsqzp4r970`@l3i3@xh@ckYPhBTl0i6jeRa z5619xa#2itR+TGK%pTszq#w0T#{^XMlfCb|{)3(acMP1u>K+~M?;Z-#I=oD zjv@L{;j6h5nyn1?@8)a*U(^3?vqM{}|NV^Mij1+rX?eM&OELpv?W#Pf2|MEH#ozyv z5fEUqdk|(@>(!*OymYi$XTLiRuC?QU!ajz%K!e3s?+uKdGVgg^q6n0YRGMsz?C|gC{ls5AXeQa7+$gRG zv@cyNXPBnQVul57X)MsPwp9++zKDxS_>hZ$qBDFjN&zoy1mNMo(tmJW7 zf`k`IlXNKS^&b;=xar#Ji)BRYlBXC*R&7nKrWByyf#-rJzT+b8x43OrR`-=r@&u{g`=eCfLQb5Aa4=0tLj;T+ZV3dw`?%`Vho>{(<*L`1`F1z%&m+&EYlTVv@ z@3k=@aB5~SO9%f}+>^W%iM{(3!`!SHoEzc|w3l{$nG&n5l8}5qgU#KE$7UK-O>-zXm$UimdAd}&DChnDg|0$;dJ1`*Y5{mSP?g~Fx^g!}ClPfQFd?_4M} zDAexGDbi{7k}y(T(hJPvA>B149A**O?MN`J7_aV50>9n~^pXchE={|zX>@S;ztk2z zLQ=2uIi_R0m0e8YDKb)yS=g`a^P7zim81jh*|xsK4+|tVdvcf@V_5oZhMaO*^SjKq@<0uR{Fu4?JmSu$&u60zb)O&o3@~$^O}i0wwYAZ1 zPNBQ5-CfdpstTrmEqZ%Rc=5N(GY{|Rt~a7;==Gl8z{yvR(QxvEnTHQ*7-1scg&yC~ zbs?^7sAuU4`|AfHQseKsuSVaW3@P)kg2*(;CF7-4+kaGD)>)|G#X<7?>=RoQPM3p~ z`qF3jQqhyGgqwW=tY^zUu@o>$l=_o0m-)4hSZ*Zz-Ot$lOd{YnN14?9U#paV)SObmN=Y*!#wJ$fJ8^U2@lni25E@9J}@9%9&Ma@@+3OzLs1zJZ|i! z>iC_Qv=N}{`&Gf^>VA*Tdb{TzfBOd>ImEoh;c(gYo8?1S2oW&}IpVEt(%*X02i<;JB^J?@U-N_;Q8;Un|NU@2s$z zsYO6IYN`|G&x9MHNTu8CT)ccVziwfVT}sv*CO!K!=U>|BU7kopkV8%Y@T3`!POiE{ zg0G?s)zuUpt6FlEN%dDs`COK)mXaQ|qVInXl)b%!F_R+Aumx97&)or_1s~o#8D4Du zV@UrSRh{{2`So2S4OZ@iTPEnTidDRxL*>&}QG?D732%mz#rpzcKCvrWL3F|&*(J!U zT`t!BSj7`w=4qa4VGlTm#(Ab+I;bBVmI$-Ke)Q`1J4x6Oi>tFOre#uILat^dm&Rl3C7b&QnEU&DSgPN->R&MT%zym~U zW@b;thxQOZa(0zIFDzeHYvO}w9-f@P_40yT?N;5ysc$~(x*sn`j-$rbt=d!kG?@V3Zp#3o6A@sGp?)28bs2(~5=84UXWo^5kxOu;R1%;cWR4<074lr|iw)aF$yWSRCkfQQza~DB!a4 zACEqKA+6elr~A2H`sf`$p&A(Ghvd8^W3JpMuDtd}mgez!eB`bI9w$)4`4_T4OcHrH z)e?=7IebW_)vJn*b5n6&m*lXrJa3eMMO1e#Gt`BDX&}YC`CzBi_dLkl=S|Fr6_g$b z#m2MQmVEB-)?hq$F5_z4p4TlU;#>D0ipHcyN0A*QTcup3dN}7Q6dog07W4<=O;C>((A^SX2J9t`e)JHXnjgc9xhicC5s&318qx zIUC>iUD}#q5SH5%Z8fDxTiM1?5{Hh{3XD0jDosHxiwLzd|JZO8%*UVOFrvNfQd+P4 z;9`7jgW)Ts7>mjW$;Hg7&JuLqSL|MluQ>;a$H*ys$(XR6BTMh4;nDVs1T7*=8i<$Z zoqu1^9+St#62EcdjiUJ9wds;Z@r)Kf60bkro%S7aAbyR*OHX1MzNi%d&oJil`j<*h z>Ub9my*<+ z4*`B~*8v&5@i7P=?}TwzM$X=|@o_Wf!G6SrU{i2O{2t#x#d2GDA zZEn%gCF-3P;5bM8#6?|};~Pf(_BSTt_=|?$!vKAlvniNNsfTm@Qu*b(vnyjo3eEU9a6E*LuY}|Gn0~p`#aH z;!k-x2CP;WQ{yDVsczCgVt71Wr1u#5+iIjzJ$-W@Gn6M-l#Q=fz&b^{HosW^c3QaC zVST7Y)@j;$%t*<}a4tnCR<9fHp|qQ2m1`B#7ogD<#Kda_RB3wY1oMxzzUsZfC23Mn zjDI%G_`7bt@$zt!Y(Jh_{f)&FO82W{A5HC^s91TW4e4FM4_X!2FZ7@1HVFbo(&ft% z>K-OVGr$)ok3;YkU@P;@V{Yh6=@efoK>sOy$Wz6(a?fT8&!RZc&15yRI`BrME&P-B z(LCqwtcJA7S_IR(M%OR(Zw1qE@4D|8*oR#x*6z1>!mO7|x&62^(Q`%B3<#7UG%?vU z6gK#{D~3x+t+Lx}JU8wTFJZU+wmxVeY1`ev2WALOFmv}rVSleKQM0m zwIGlZb~WwBeY=T0$&y2l-DvjRf%VDE*##hik{I^c)8}78>pDFdY5y@^yJthdldvSL zV?FJpctNk~L&M=SIKquhprfrfyX$_ClVJ5DOVOm|D@)}y&iptlg#>=5-s*Av1i&0< zzG%uiqj{$s*4f4_L>BzK7Phjx;lrJPl`fmGr`*^bptmr=L@Oq7#HR zKoB>Hs`L8Zc~3XUW?>|_@BM-2uGRR!v*poV+1r_Hd=nJ}{H1AA*KnksJV>sEgfD$E&rbwT*Bg{+UQsel z0vEO92axxC#~AXSTSWhMnQ_xpr;&k& zit{-x7tPdOKT!lK7NT0et$ZIhwl6$?MsxQk&9mB;>tXa1Ztu%eLIWYWC^1dazEd7|t~mgJ8vot1 zRo6cF>cP?Tvp$Q?upFdf>;2;W(p7AYk(b3yeDwbO09Ei*qD(!MG?Z2*EGQnq@Rh(K z=7zY_qG$CgPSsB65>}0^UBUW&&=jT7Sh%I@J_9pD&-Y-*cf342ol36n6;6w&zw>VL*V z<-$pNUnL2N@c?sHPQp3|10Oo^Q3=P0pY0S{YL+HHAff%78RLiEqRUyW)#I6o4Ob)Lc0N8<;AF2Q^fdLkj*4K_YF9R<<(R^@6;9rhi|Lt%P}DLc zM8mKbJei1CqOWEK4y#b+S`GZFeWapGNh$Sgec~EF2qqYs%(V-*-v2L!TAmxSGF4Rs zC@2qA85rFk7XnHDZ?e{(>0>hI7i_sQm9jCw!_Bw3sVEuG4Gw%%n*3Ub&aq)<$2TOkGjKW zhkK2G2; zPp{xWeI}K)=pdm>6!H_yqX59cN6e4kRdzAswzB5Ylhsf8yVJ8LW5~IWI75$8fu2Zq z{zGI;P=cNG7rg2Oq2BXGLy5Cv+(v{i*&S*u6Zpj(x+4WMKHDB{?A8r>ja_x!`)2${ zEt#755a3xM7g6+0@cnl$iDCV=d5pR3QVq2h=ZnMN5S@)OSrd>uMLX=^CQ^!|K>8 zmQ&#;`^WV%1EdayX-8 zv|9l3kw~G?QE~rOnTO^b9?F7__e)!E%1(PpII=B`oKtJ~)vOVE+gP*qo zt^h-W0NJc6SA-bP*cEiS3nzsWNjj*u@?Zb^d{gFiQOTyrk4=J=@a->BBknQ$q}T4= zqAtG^$Y;%$GUF_Mm_E-K(}1=r6td`hW~EGSY4w6w^DNDSV3sQ@SF(A|{`R_g^T%wc zauUPhNuBeL-;#%^kAP^^ceJ@#H~20RQ-EKZF7v_qt+D8cCM0)^oMGq_xu*YirbthC z4QvKPA({h5*U|5eBm5J&@Sn>c2k>EPhd|YWC?_gmDuI|BiJE8=GW(Hp|Hm19%j%wRirX4KtzmNSutAf>AA3$U{34?DFazOEBFrA^HjIQ8B5rfXl- zy{}cNRd8eWO)@K^PHB(6+6UpBh~lppRGXO?ZIa5rL{AsLwFR_2>qF25`n!~OwUfJ_ zAeYN>QNp&&&2J{2zBj>Oy`dd*z50kV)tEcP`m5>S!YMkL#DZZ}4XohDSePZgdUKxI>wfxtn zH~&ceUYso2n6{3(*}S>eJ9qYa?WKCb#2L&(gG6;vuN(nX;#2h?N_M%M97Kzbkc@0S zHAKs&eh$z6aXPnlvA*WLAM&e-gF*2=1!^aVEBr$Eab4VMBGN@Ml~lcCyiPE2+rZ+j z#sRBu(qg1(JioyW(t{OHnX;*Av~A;R^4r#uAzZ2irgtZJk`@`LSqfnC1wJ>q6f z60Fzt=sj6UhrFYQJ)9JC>*%_DS#f?K3;hj z+a9fd^{~DMlTNCh727&uFF7jxL@=#L zjAHg2Yu$k8;Es=Fa!9%w@uMauB6x-56g-Z1##@x1eXbQ+pYQ^X9il4&?a_N<=?>>_ zXM0X%kQm5dCQIT=viR@sMYiy^3-0B?i}P>Bm!b!zT3}7QeRDrwVqX7y7SnG5eid_} zq=UD}eK>1;jSSQ#U^`vbe6%3IjF3yiuE=^w{JLn%k}BQ%{!$%5ty{gwP@WCzyZeF6 z|1xhJH^0bi#cboYriA|8WmLrDuJB1Ds;rqk zr;NT&$H;ROsS!XkNKy*7Gbje7s~su$DX+dTE<{9&+7K%!{6fFlVvYL& zYHMrH(b%H)E>gZhLzBM7H%^<-ltK*`kBWguJP9JYbuclk0DARJwgmcKIQLO-^(YD3 zG208a2Hy%6DE*lj`bb}(D@czsnPQ^#dT9xr=&5v$4D2&cb;)1>xVF8&NEPr-x; znO$9F{^q?o67~f17gQYZA-%Tz1P8_vIBC?G(fKk-oJ&mnO?lZO@sxVGy-mxeBkQIKvKDYx0$cwhu=_RF zvD?E_IuRn!M4#L7Y^sWzbf3BUsOzQ#O(4~`vkdGB3GWZ;lWVWnI=t_bhP4t2(vVpT zsKs|5BhY<|Rs8jbD)QcTEr#Q~lf&At^0McZd zXjNM`iQ5(7es&W)2J7`jD>r7@QDm@K{HvmG-vn&F92W0XAO&j?>?qnrxl~Yf_ZC2fNZ1TStCy zh5RK6f9;24@#oJFIx;}&P+=BRl?Hyk^>@K({K5F&x-WKo&O)yL&e8lcz8>)cMpvC4 zRrp|`)REa6Qczvjz*x`;dTZv}wppzP9E8-5c2=NTTU0bK$l zu5@8MX6wG}M1>e6J%3MsBA=Ykh7>;%P)Q=rYNWqSN*4e--FOor3+jjQfKOW!LbClG zNpDwI=U2b2u2?K*k;RCz%e^4Y-J{)p4CS8KdUwOoR&TNGW3!h*pFf!K5*)4Dl=J*9 zEeR_5gIUER%VU7g$a5#I5m-}VwsY;*R31C8Pf!pXKWWDOfGUoL|A2qGcDbIKg%g!H z_egL%56COpAkA8Xb1zYF8oWhe)%itmj;JgSSUY$wXNlYUki5Z9ykO-=HWaoD0CoH_ zW$1f}s5qc+CA)bv1Tt#s-1caT9?arJb)QCzTJXk?f~D&#BlnnWS>Ri;9~A440@Of1 zmOu(lT(H0894ES-72eNZ6CL-3r|DcTa^n`3Ndy*%|R^~+fyV1$;*+@I~IJ%54V*vfV|1~zR+x-&1f zhdGeTJx|K!>tX19>{t(Dx7J%3z_))AsUiDyUdcl8lVen2xN6`>W?yb~B7zvUN)W@2 zl^Qh*n$Wi4^{K{E0zXp}qcRnCxyMDu<>=U}Vn-~pUm)9_py1npk#VrhpXy@rMhwC$ z^U~d}$97wsLx1_2tuy7H*>1e+Tx}PHDagH>da>@T?VVscfs=lRNu--qsC>XJb|t9c z*7L>N6r*OuSoDIwE8``-`(TT>Z<*(Zc=ah^1m26)EsrCsPvHl1CieO| zY^qNpq_>op>p|z8e??o;s>$TIn@fj@ZgI;afxJ$UKx;l3sZ2or+4@XPJ0TJa9=W%9 z)VBUZvs2-8>c2QgVVk}ke5f9%o@Iwy6R6d8EdwTMljoT{jG;e%)d;f>uu|TfP980^ z9{e%mq=qYZeRZP3(H@Pdi1tfMSimS6$j#F-s70CgBnUi5tN?wzOKRtW@A30&ooBC< z!q^*lJKVM7v$3{E?#$dLuvzJ+<<&Jt_H0CT08xw5pvqU`3ZmKfrJ7kN@hTZB+2Uv3 z3MS3%7T(69&^6GLFn5F=pyIHLSG1*=95+Db8D-owe~=P#^=|riN5^nj*4+-vZ=~I} z-xeD+%NAXMqeEvsC&7@Ih+}YLre3_^B*OdW%Jr?&oD!OZ915 z=Gud5;KeTU@}psA@wV})|0LQyidW1pBHxEwpGvddQv?Bbi0=b^KRm06>)P1e#BMT= zrJkoW2L&7oPX*cI?Q}WX@8sG+lV1Ze731r1x{FNeR_nD5?V}wJ zdvmTN%vnXXP@CU{VQ{O$XB5^BIdVY7=>BKMd85?(xUdnnxm`SGhM$*el(R${6SO%cn2&QxwKsMKC*?k%x=Qc_3MZKHmapbB$CSUsodpl1~Ud1FdY~<>a(cC ztXsxEHNZfj7=HB_n8^t41)wXT$ssG{#`j5O$8H-vb8K8nUNnuv^NzEO-x36$`i(Zo>;lOr6_n=<>}!6XW!`*0$w|CVvQ?+Wfr#Ewv=}{)R5mj-5JHDdB(L zw7Us*wB9Fm2&v#l-O^PEQ(uy6UKmJ|qS_?i_m82EF-fA98c@_*_YYd~<5I>7D!!CM z^SYzJy#*Sf?e$6Fw@~1JtKRg~Xtvv5D6e9?jyS(ZN{@5V z$^<(gSs&CcHoT%89;pr0!a%BIjl+s2SVM=hnZ@Km6Qr5S3!Ejj8xkk*ykth5HtL8jUMA z?eM{8)5U1&jU|cz$v$?t=gA^d=cOTMyn>zzR?l26dOs`Vfqj@|sp=hA8VUtI<%s4S zykk1QcpX~1!zK)5j;A%oEk5^HdgpZyghcybG(D1aR2^km7BVt1#_xnd4JmQlVk0?z z7L@IigbgEFQ|*M39E>6=i;8&fCh%PguZ^#xKl%OE(#Ntq#Op2tQr6}Z6U2zJl5V*k ztmMgCNG^nlTkQh{f1WVo*__q4?6?JsrAwQpSBNZ?KiP9fhmqzgUssD@@6Q&fM0$UJ z{HTtRHKG}_Tj+VZr}5vdS@v@Z^_U{T7Od=oX%3!~zsJlKsmyKpGsmOtbe(i%{~rC` z{R9F*;X!FCwMC%!%SrNXQkb9TEVL`pE-5rfcz>yW`Q7~2(z+9t$!_CdT?zP)VkrL* zas6c}ry@r{NQ(ry?`QcD{G~qS!B|;=ts{9XIowgD*JJ*!ej*S5MUCbXY@vaddoYuh z_>&$;Uk^a(=C&b73asICkD#m2y~|?nx@(hl{hKKbT4`K&oV`T9O*={C=?Giw zP_$XF&r9Z;Mf^!CZetw-eRU;+n4%jd6ZK7;w6NpxDzlP-zD7ILV|UVA%=yRXvS~Yj z7r;e9?NOtfBmEXDF@gHM*bid1j`qXP@zw@TnQ zki!>o=_ZP)TI`psJsp3{KhjstuVNues0<75cH1c?6~iO~_+#G9V{TX%umK_pWRn~4 zPZGCHxJvD2zFMrBiUvXVzz;`4xo->hE)m)cs_9~oi81$MTdjcaCfA(HMZa7Jc-tK) zew0P@p871-X}_nx*sj!gfNT@O?J9L%Ww6q)xQRom*Bio zp%UCiwQZdm=P3PMhibl=bX#sLVwUSDLTFL zBBYw5v|iV~m0CZp50JQSf!KD`IVYg(?@mGDVl^w7?B47CbeU;5Qj11e(LPjE?B%3e zb$z2B*xT#wz!%t0#GzfS;K5oCu_x%laHq|4EHTi>cQZsNy51nR8+CU1?l=#u?pfzz z`};SL%730f#RT+F=CGX_as_xI$7;X$EUCN)G(47wm29V0KCY#eDCko~DT)1Li(*od z6DIh?p68G>o~E*%Ky8H_;vT)$q?%L`}= zRA!91gAjlhJ;621R+qY9>b!Usw$wcS1L2*tN;vumqm|WQ8J9L46x>Y|Y~j#IXFT9V zqu#V@O7W3gRhNr1ID?68+qEl?_LEi9jv|b@4)15I&$pZ41#q!3ku3=jiE2PC{80La zADjAo&c_5rWh>D7?kmhWy|naQiwt4Dl`H}GDv2bg zv3Cibly-~NAdBMVw;6Rb;VpG^w7bvpsE=LYI*Tv2CZ&og0#bvCQ6*CI5RlT7k0nMv zLpp8tO0-XQboAsx$vcDCo{<#18`XjEc)eh9k?j2y*cYe`x%_cCgq?O^5SBR@jhaAq z2b09XSZ=M>c3lT#5$%?S5G@K_|ae!1RivEb_nS~>eVDv>3J+pxi9xn+H-y72hx z`J04yV%UEBknG87u%&=!rGY>#{aKM=#Zr!(O48H>XtDxZ&o4$-v%v9LhS=4$2T^T+ zqPr5x@D^EM5SOiKvSo19F)m-)%wmhb+Be6~tjPd%=t$%P)LwwB+5zftd*v})W+iaA z9|8RA^B)b~_e9mnoZm^vHoltUBOqI`{Uvt8&H48)!gh2bm>3}21Ko*#x=L};^Wp3v+NaEk611I=;zVF(XNgX)jp0hp0Tjbm0+Epqwl9=SJ8z{XuT6sDsYv^ z(E->u#}~k}J2V(MWo_?^9Y(H^m5c+Frk}y*N4`RqzW_vXv(m=hWSPCMzPm&6Wd1v> z86I0``X6sJCtSW_KaMC$uHP*gD52!P@S9=zcgul7>w9iR}~2RNR|>QU~{C-CW4 z5o(z!ZW;UVb`d*apE;OZXE>{nu~=A=fU(CE8ce<6hA%wBqXZ_t)-Zl3PcU@j280Y^ zWo6;3haT6#uJrS2AA1Z|aqC)|)wk7+R*aK#`75Xj`*IeSLmY0ykGw+P4`RrPI32^M zkb+X)!?)|D zcliaoT5=~@&Gs{#Gz13^0J99UHxap9E7E!|TNqx2jUeqLCOWyo{^TsOwR071i8NXf zbw6x}rvyKS&Br&oKg8LE8%L7ev5Q^1sH2gf9U0h)tQB`;v&_WwLGkeZVN=ww;pBG_tt4|MwXSSzn5|n6>`gOXW+|7FU|p?Rla}ng=%<6I`y@wF%L6 z+SZ3;T80>q8m6qcbyc@k;}r{n>OSQeH`q*=CFx(#;n5+ZD^#v!ul__FeLCyWyYJ&q zqa3_e*nXr_r_C#5o{br)c*t{E(k|P;6O1CQY5=Zm`S9e_P~90V{18(vjXE4ph=clJ z#@~G=us;kg)-7*sf*!413aKq=#r%5(vDLev0j84z%xkr7xsCc4^x-WTAQq&Hgd zuo!&t#@>2)T0Y1NAC=yeE_|4+%q4Jr)0Ez)iJ|vpiof1xo*Q2OR>zTH z$cOQ+aDRd6w?8IopF-+%MTeNxj71^nQsYisJ7Xt``QyVF7tXg!1~kTdm{r^RPL^o0 zuYIa17A-QER@t{-`b7}MD4}GZPK#bL`qA*a>grY>ffm*MXtKXSn++e=zqnIr1ZLar zF8~$Zdb769V`U-1dbdb#cUXy%q|77WxRX_s zKD#pf#ud#*bs}Y-MvLw${gk&8Nqk!2&d6&Mc?1F2=qZ0}-3L^YY%~@4#wBtj=8|vI zU$NnHyic$j8B%JjOMVg`@{+dR05H6X5BE@e|7JOy=`O85ponx|&J3_xjpg2*9LdRS ze9^-gb;-u=b9LuoBrw)meLriJy#9`+}iOye^ zwQvPjj3*e@QYNUN0XIDaE{z#<9Y(sd)EA@=;p=^VQRkoM^e-qG;D5D;Sy+v9Q4dsu zA{{HD=28eu_e7MG%THs(I1~_nS+#U1DvF}}sC{FjaoWd{fuy zKN+eCqbOyXtSU;aI=B8ykLEk=5OYL0tIMeN5Fo764wwf3S5bnwqLxdu@)Ze&SjSOE zXsiyRR53GDgK@S*QF!F11~l~oJ>d~(5H~7%`4J&Ke_}s0TLqlL9g~2Yv6%hlrhCe9 zP#D7J7KIdQ513I2i9O(rJ9YeLhEB5=foT(aE?gG#`%jj|@f+4AlSIokZ4IR(Pgj3x zySj=Tpa;KL7-^N2_S`iCvJGH%USrMPeM=GfL~O?B@>>l7LH8iWd= z7Q|jG4Q4=zj69koVvBmQq zK8Ni`83oo?)-Z0Y0-J9@z*t0?<3ct2)A%V>qx<*yHT&r>8ujV6Q8uOu?`o??3<&R& zm&syb?93d6%#$~g%+t&BGQ6e`M61jW3os&cKHKnT=wrm6=4glK@q5fwdS$<}EV6t7 z!&##8b&E0OTg*)%a1ZiMvFbIt?L-PoIualQ`~9m^Cj6VuQ5Ld4 zS{*6~6n``Llb`$VqoE$_7I539VUB-wqz9SRCaS&KE7Gs-* zox~gSBuQ3vf4#9}_B}_fSzV&su_UsOhVARKg(>E!46!;cv!)FUctOE3c1 z04(?(k=3OZPRSVK$;XqQMf*fM6)h%5IxI;KDdbYG0*1A9>L~}V5@xIpX?7ye3CA;gxI; zGXHmiU1$2a*YA`_ZB)bgH|P}}jtAKSj+kwI!|w+#3sXYubo(ReSf0aLj5@C@+#AP3 zr=5T`HxKYk+J54+JTZI;JWEubGEin8C#{^z=ipv&8&@h32XxtOU?)1{A!qDB(`Kt* ziH*=L!ZtL%cq|=SDFsVKuBRRMP=V%9%eP23L2u6-hwbQA6=pF{2{pJ&XxbsNYVMG8TbW01#q z88ov7_B*3uUPmrSVr}9rKy6npbSZEQd#xtV9o!r*H7JsG{jif2vQl*!vu&v<%j2hP z#O0e)Y6rX8Zp(QlWFY;7O#0`o<>I5AQtvC#y)f0BfS1Ptz?;}4-m^c^{cO6S3ohfM zB`y3;2JtpDwnWTZ;jnJ@U$n?3s*R{c_rihT=g5(r9NRaNf&bBG+VMa)ro@<@tX?pQ z^jL2_c`55TP!lxOLpgnYlqFo#w`2bNu(_|o^O0M@!Y3(v+Yz=tlY3;`*w}lh*XDo} zeUoJ`M@%OH2A_oNsy26_ga9(8i+^7!YwTge4|utQ*sB$;7_cQ}$0w>nSIFWGPwoDx zdzWBO|0syt9eeb=8dQo16Q$VU>7CPot?jY^RGHOty#HZ8T)OW*9#i6s={4APD7dT| z_{q-@?Z%M+^VhKeX_$iT9?t%iWs8ILl5rO>MK~^~2=>>fyNnvS)PCaoz=3M-Xvi_C zFh4|7kGXx4)t6i0zguWt9##5NpBfZN)<)~!8K7LsF4(@A1efJVhwJ^kj6=`SH}Guw zV`)S0f-r4)1;A1BD)oC{h+j;8)%J6*ANpUjjAAJDcdbvnOK!fOsF!Tp39_tQd!cFo zbG8d^%m}py)UY)gvioeY4HXGn5#C3Sb=h0JR8))^hANF)P9sxCc_wx(BQ#e8qa>xK zO5fYvhqSVL?HenX)((O~3{?+!d*2JjGy389{ke3pg8s^sYDrM~ChtI{{tTqQ^{WMi zt=Fz`44UC^{%Ogi#I3Qxt>?QQygD1DYkDoOUNAPIHc=tu|4O^ka4Oe#zjw+|$dJvV z6qZ>mQ=w2SvSf~^7M5koka>u0$UHV!mMK$M4d#%!k}FMOXQb$L}DmAU0+vUP@BpIpD(lh+2QR2W~Lu)nuDj#tjg7Ij<>M$JK%$A zhsS)=2MUsI@~c3#>xkIaqfY$cBTKsnW#yqujEWL5)LX6_3*QtcS|_7&*a8x}cVuE- zlbua`dO3~zO*&e?t+NE$JMVs~P9O8sN2)*1dEN%S9_!?%THFDXZL8mIR10P)=-Eg} zN8vBjKGY{I3p=3y6o)|oJhWfmo{3p(2_QLZE>hYVF?aB)s1N-e1Jr@{t(DJW#eEc9 zznoF__nKlzko&Pp^}dQe)?k!9sNP9JIs%3CkP!Y z33xq9;N2Q1U1{$+O{b1ZDkUix^=bQw59#=rcpRHemRhX|DhQVGoa}s^;)++5PT}e- zDY=Npt8RV$98WiH!xx4+E|XdYno#C;LfdP_Q>m{!T(s*IjueB8Lgy3^13lbxi8M*= zItu7s_LkFM7%3-avAu!JdX#hyd;t61#Uh`6-OD>E4UD!!+~_2%4JMJzmeQ8SIOkhXtT)4{H&vn~)c0{HM7X>f4{(}w zkObAYTTYgG8jyOaXMdc!8+6fwi*|R#=Z5zUx3VdlxHuKvme?cPXR1vLY(~b+JXnMo zE*x#&Di5W(`HUFScxg)F{l`6Vx6JVx>9z3o!>L+T+Mhkv&QMon8YY|&Eu6R%wX<9U z`qRTSfo88EM2$76tP?6&IpdqbX4YwmI|+1(?_?T7@qtt=G35_+{`IMhag7vovea_- z&9}OzGEUPnDg^DabVPW{{RI)Ac30ntH0m566WT5uM5ijoXg4gNrbhfo)M3xL_ekOL zCdGY}ZAt-OBzn75D5wyde5}w#=1q#!apPJK+rpWkDf`GoT++t{DYsRUgnQczxhl~BQJLd^~d4wGBYx~WZ0bi^}Z`S&at`O z!^t46oc1njlipqIN9b*pi;rFn`bxig{ID=0?nt84n9=7Y!GDD0g;;K#kNPKN?o-l0 zvs5{s9XyT*zCQQ+qFeG$WX6Ag%K!O7Sa9w&Bi+mM4`2>v(DErZp+pX)sr@z>eFniX zE_Ll1&)Bb@GeFK6d0s`)MUmik+})B6bWb8N#q-3{*(WW5MsJ>!Psc}n@C^Ao`XC6E zPQW@uoiUzj!xGAx=(P1?aQ9S1xP*1h9K0X>>(z-9*a<160c&hFW>Ltty4Tu2+>m_F z?g+{elNX+lSrRRN*wWjuQ(FwBd!mxGZ#lX+G;T%>HI000rdYaSvFN+kG0|!hQ9ytmK z*$;U$xhLR>l5cAJXi-#j{feh!A2pLM z8!^9eeDt;Cnb=fHV?5~j-h1@W|bBmIB_4uZ4q1h^8 z94OTlY7qw;jWuIw4{1ECdQO+v(SsFA95-lbXtkzg)R;>gfeS}()ejVz$vF_RXCnlEb9HU_1Jwpd^26U{BVC-NNc9oT1av_H@n#8A)s&)A` z22~YRSSfxZ;UA03W8u=#wnOcE2KB&Gc9-4I1AM)BAf>JLa#-9$I+~9V`30uAV&)BO zj@DWhnU#H!9kri2$-gz@m(@)9di2Yx#_IV5hS{B7&tG`w44SYGA-vHABdm+SxAq+^ zLyz{r-EHZJU-)&|=y^=~*`A&DXpiGo=LFW^_a^PbqvH-r!geHarpB@Uz5A8nq`_ko zaOl8B&m)t%cnhNK$UYd=v?$Sm41v4R752%moL|nGunUm5f(eu{7 z4vPB0jvvKn=iE+s1W59lVKk!KH|=`W7@7}h~SS3O&v39faB z|L3j{@s9A-J{EHy8s9N!CW=-Row7Q?@~~q4#zDi>7?J_0yPxT|*v=dJI_LBc4g6+V zYeH2wIY$=C`m9bKGFZ3ZJ1CokCpY={Zg|N1tU2h2O0!UD1_(&~V$rP?l!^a}1We+;&82X>#F=LWSuY4~cx{{r1gu00aLs^Wl2LX(^Eru8MBOkN3i z5|MPBh*7-vhmxl#HWDaGEMNHVBH+2L0F6`q;-mCXOd8lbnCB8h#MYl?iY|g+itp>b zY>{YQZEd1cU0n?(<+LFA6R}kAMKTbFQ4n4cN8`~nx}YzyM)<00t}g~$YG?o8QSy2s z58{ONTttm_;P-41UA($^wUAdt+>7L*qrHunqMPpSc1MWJ7%0WXfaNs79K?b?!?r2I z2=x_4ceo1LeqMzh=*?^aM*5N2Gx<`wz`|-a3v0S_I@oY<1}0_V!_2MmDYcS5@*Y+y z8w>*2$qT{IS%C{k$Z~j$$SkYBm_i4k>a%lx7MyT19yE!TsCUh8vv|y_Yl80Gq<-7R zvhsg}GJ?OEz+wQ1xO(niBkUh5+O)GEvM(fAN5<*^%*Ob0|Kfo0T|}Tpufn=eT(sc0 z;J6Ip)>ZDQ+y;_p89I5^obd~*n#~^oz}P5|d-~!O!TS1h@^CPhS1X5Uc$TjJ={&(r zSjhft`gNneOE`v=!|dFjb2p95chu;iB$7G0EqTSj5|Rt2-rNXKt_!X^k{n?`Wjpi= zX3x6IhA83FG{|OEZX52PU@xXrL;il&a>S%fLluy+3XpB61<=e^0M1o`bjgw*!m|r? z^M7{$2tbu_9~&^RR|rR!>)%_VbR%E14fL9HJ(Mxy!|FkS!ZLBL!L~P7qu6V)FGs%u zIPpQ~W)DRbukK(5BhM*`mHrud!TW$W|M=KxF*GnNPi?)=`rWM0e)xmQYmHz*nxNRa zcllD`?J*D;Q)C-kTLkTDI`KfH3+YdLa}+R9-3$)3Xf^t_vi!IZfl;*S z!HLMmv{adIW;G4NrRUR7pDF~-$)Z@va#@tnT6sVnE~)6|QPnurQKHK~k+ zPPHuj)qn@^eLa8^R1emYgB`*Fq2G3ff_GBP!SFX&Z?ErUP+1_&rsW60LSgQ$tUtfl zH#nj@SGhad1Cgg$qb1?}=?}FGCJ2=1fW{!5$X~{#7Gob^@H|kOO!;%b4i*Q)DESI) z4yV;sr zeuX~45_zEq_D#gfu18@#pYTwR!z|&wxgN_^A_gnV`Or+Pf=w;@#{+coV8kJ*=NQK8 zd6knByPqajqVhC{Sqcn(DRXHH!e<_;Mth0g@Wk8xu#O^woX~+ni?OS9!z)WY73B2u ztN|ChPu^YJ$X|@@d}^Z zrbVeHU$Uo_ifD3Jav!|iz|tqkad`*lh;w`Iv2*q_EPivCE?6R-ua?9jGGa*kUAWbCsub>zBuH=m)P5>8?3(mdXZR<`n0{3aM|2_Y*{e zK|xuGOi<#&G0y4-Z}($b>!E_<%ctx|X5az5JPY{0LT{Qby}RDWb~v>Hk{K#?%um<2 z_>9do5q#X`JxqL(ysfkrhmG9<=3#$zqVH0Sl}#7@Tp3u!1_7reU_fcCSq}||{$f@T z+azFMYAA_0qc$UY_Y&9x)hI_&+Z{_>z~zLK51wlZVD_kVvr_P0V}o-OlLAF^6*95# z!TGSz7@HUL4&Y3JT(|->@D7B#Ec~-?QM&XAMh46m3x-<;np^!7-{8^rixd|@c|i2N zrfkY#nj9x*%qho*RZ`m$&$kADl9uRS_QHd{3vU}?fFx=#?w*+ioC8*4TF~*l2yk7# zVu~}k7>pP)UxU%~&;bi_3xLmci9sc+^)8+}_ERc7@;+sk*b@=?1??PZEGe}Ol+44M z$h^*;y=4S!bckW`H3u9YDtJ zT$K_%Nk(DYXCKN$!?omd&6CItFpC!%g?nT$2E0vfA79zA6S!m`|ie+*@&>j%w?9WN$LoPg^>YLH@YoS>^%6qmdQ+b- z;u-s-%LhS`VO|@~5)t|hpQ`IGFAdVG2Db!9q8v_sxG=x(3Lp09j6{U3tKh>@t~apH z_6M!SS%%NZoH=u5{j$-n|F|E%6?7*%y{L=yhSyId*<28!CB4**+)Q+-@=hRXI_bOk zn$L4D)wOH%2z5M)?G0zy3NgA&()JgtH}^_lf+<%e^`DiHem@OY#6#1NfuLHVS5B&_ z3eu9j(cB*d!bNnD7j#gbk&b_0WtKSBQCt%2U1sV@iL*M7PUkWlj}tw)*hC=-FYt?o zw=;C09jpycM+s^tGukEWXPbUsr^{1c<7x>S0Gs#Mwo3Q5OMRA$t0On~i+E!Cv_U;h zU06Yfw<};0nD9Dzf~}N{@AD5uAqht(h9`fjWHU*Ps2JU6V`na_ygMBvM{ zN5pMNrk1S|*rc7Hg-+B7nXNJ{wa7VJWgGVg-#|;WSUzlB!H{f*vpfzlGAoaXEa89O-RHRrS~zkxRg{GP_V**vwY7hrIb zhm6*f+QMYo`_)=#mQ`~(_(9-bj>y&!VXK%Th^wKsiWerSIr4Bd(rv(P3E) zDdsP?HqUO=j280*i68m_^O<&=3uX|H3;&{Yaz>M4N1k@N2*kf@1b!NU~ zpro=yKIUh-`Sb5dafep((bz}l+5E%|_r)bpQb;>wMU5EoQp0gEJwP;g0YZRZKLvjE z-~TRvz-)ZU<6T6^Xv*91@S42{ac$Y!hW^Ut*5$LWtr-hg(r9TDRJ5r4VLoCe1xK*1 zf>VAjY4mTFqkq!V6f~X{KL2n2(}0k*79AqGx^_^wWv4jiCwbIJEzVFQSn4u$_cPrB zVym6l+ueKsZGJvjvVwe$tHqCjW3tN2;Y_J&DO$3b7-3I}TNSfLhUy zNj=|$&ky_WuF8tK5O4SHwI9ZP&uvNtCmfhQVtx&OX2;jhH&3$)1cVRZKp$=ldwwZ; z{Z^wX2Yyz-`?E90NL8gH18^>A99mRphZNnYY`6zJ6%nh!3%C$Gqrc!G6x9nsh2R;& zT{{p?;S_Lkr)zz@R$b0OrGz;0tuO$SJ0V@#L4doIKEl3wT-jd^omtlsXY*>3|LU50 zNpx)H)b0UEMj@wLV!Lk|%vzUADzsB9xc$W-x8i2&j6c?rsPp$F;7Zo;wvNFP00O!R z5D@o~23}k=<=aAyyU)zL>fuOMD}EdXapOIMgmt?5tlsDa%YZcv%zg6ULBqHA1c|)E zJ6A<>Iv>~QhsI2{#Q)(Pc4Z}{;aTqKiKC0G2U+@ zrJiToutX8*bolyrG`V!+X8{a#L6{GmaPCTSxUr2SIv!;Dq$iIGOAcL%DVSrKV@*Uc zeQwOiTKayCj`hDH{eQki6+M6*X*AiJqdU-DSi@DJ+!S_elwkS-bcZ-^s3^JVcdSC2 zTYCwWG)6S?%N#O}OutH4!2~%+q9bNhW{b`WdCy2kCcMsZmUlm{v4}3UmRZbgDxt}NIF4x7+{XHnboU?6|uQ%Z|u7b%{ZpWMb z3+|E*^rcJtN@g|LsyYS+< z6kE^l45EpyA$RW!?7oy5yQhhB)YCGSE(2=fZVN^@RfEbWl+c3NHn8Uxhk`%G20i}T zlk2reBRT|~GczGD86R)EJ}xq*^WRqUFB}e@NEpC8E!Q#M4n@i?P0yT?xr@#K=j@?P z(c#utMgVEq#5g zj1^PHsanAq_e#6t+2W(?CKP@bRKtZp zAP%(|JMj0rMzpZ|BF{b?)t;jjyd-GqSF8I$=&KqLjZpobw7DItLGaV+5gRm8oFu)+ z`gEzSjri=@vx$F419sQG4G-_+%6ryK_|{GK%i5P4{qdENV4-jpV;<^1ii#p;Vq(Jk zWWXnpsqspKnn1eiwVC}&6kb+ zK;Q8-Bj1(f&3b#`*lgyNZg08u>ICy-{PU zd2im}M>mH}xU|pynf9)!JnrX1AZii`@}4}Ac~1K&mMo6Zg3O>fqE8|Z!B`YnueUE3 zP8Nq1ILBkI8u)c{&$hqu*tY!8P=v|W({szS-;j^)qaLsMIE8h&kyDCFT)z#^1YcASk+rAH+oO1H>^DBN-pwZg++Db}nG4SFJIh`T~yHIsC zh4GIv`VBhtg_fmK)G7BTG#N_*%^M;*db>gd5({)(JnA1`GdHg`$ul@QI34+HR0R90 zRX{uA#!xen08=X{AgdgUZ=QMm=1tiAyd4V#3Cy}=ByME6b@tDXsQ!hV^74x?dH9Kf zf*AOTmoHyFc<`XXrP4{V7>4l<0->zkxriY3>o0dI8m7xAm06)YM0!(1>otqw%`H+c zXSr{a${2T*TxyJSsU&_mezV7&B1W z#LEao;tdEEo9L@4DzxO0MqWahozFD#J8jW(9+KY|MgI66ZQ*-*l+hszFPkmMN0SBy zmn?*fh>3k49=;V2ARVRJHC+benY7S zXyYDn6YG&~ReGmX=dBLk@Q0^KcOu**ddA01ilhvS^rCKFvMNR0eAl6^)fCY~`{^Ju z+YouN2XD9ViVr}*G^~oY{M(F7~CDO#S zEbJJx&ANYI{G9qF);U>-%Qq_Y9Fo$cb>-V%s|1AtF^Z*+fvd$&^Q3z8m23oXyXzO~ zs9WYAc<0T%_o7QNw{pg7d=hJtlY4r4kkZoKD?R6Ud3ht6XZ$rym8wG6R?^DbH?0Zg z@hv`WdJ&<=D_92`cj6R>)Txq4{!KF!qFpH62F8ZL7;2ZA7+JZvBw(?&zy3%-2-yhT zMWl14-+9()vn2bF%8%%-1=SORU1Wez9csyzo6Bv-g6Ab63N2ags;xBFh?^>pM>R{j zT2!y^D<#AYsZ1_ChYn$R`ToCuMWDR#@$n&LW!10Je%O7XJm=(l&kKDKZH{KA;VV28 zGZswIq~vlIBXm*AH|j=bmp$o7$cHqhRa#x$+0{iZ?lL*omnjX=jQ(6@ARQuoTgj#|~3w{e@JJf)Ub##pFUz@arKgKFuJ(mYHV{{(dl^T4E_o)6@T!J7# zc}iSXIH!%NeO&#_v5lzva>G?S$<-UvS0VJvPOnvvry1b!1+RaEG`y; zMT1E@IXQj&`0-P1t(sKk@OOPGzt=)s59q>{zC_8)OT0jQ3NthcxQGrx(`aMPS)_g= z=9!9nvZ9N7aDGuqiRWxv{Ag9sq1fQy;JZPG*jB5$d~QU5LWR&W1yJ(Y#7a-eM&Pi6agYM_;d?xODgT?^>%SU64*7M|9Ysjdpl&5Q9caU+`kz zm7eFL{Bj{Ho%m`ggV7FLoQSfqYcQi?ZJrc3x{%di;i16T2z7q{PMy5F_Gd9a+v9jt zwAj2}Lxkx{M(=Py7ox2Hg<$++M2dUKW-ZNNyf+K_wkL~3gahplqAH%|n1aVfm0rUL zgn2d`@f9g}oD!mOe4NE+eG-fAmxG+~MKAYho0Sr;snyW2u9Ek2N1sv6Fy(2*p63{E zHPI~&E;kCx#}5>P@~$B^TX6Gi|KRO*otB(4`7U(~QAS3_$C48CmoNVHgeyhHYU=7# ziS4>Yv`MT*L~}@0dwt%1N#s!Xjh^6MLyjksp6I$wG}r6WO(R|l%&=kH6B#Mo`hA16 z3r|wh(C|3idFV1(+c`JKDJ(3^NlgYd0@4vAAUL(VkCc_zjPZXG$q~|p`UswXOdLiv zEiu2B%rWn*PLJC;Puv0~JnzQd$scrfcD_InjrsZWy)N(iL{0ldjgO&$frX!+VZ6VR zjpqBc5jCA#xq*Hw6RO3KAzlj~|}m657| zMqd!5hE@s&h)fY5@LDsVUkyh~ZYn9+NaLO$jH}vM4;!>$8HR7h4HX%AM($`sk>C7l zPo}gFDm$Ayt-FBmoP={z`sW&tK?P% z?7BRJ>>(&C+dDeS1akvG`@Gk#yi!YP?%GfPHajL1$s|EkDE{P*QXi?Yo+WZk6v zw-FBI*+kU2)CIX$Zi>6O9Upkfo$OiTV&>>b1|~xr*DBSILq0qnr&Yek&Jzaq=^3lV4hoCTbv%H}?Zs?RgMo^|m~h3HS&G8+5L=jJL+|-O7OiG%z%z z%yHp08l9Y)N(Y^ZScbP_Y{x8a#@t#BuiCwtt4IS){A$UZQ@d@F?{3n?@uVUU(s!t~ zCS}XNbp2|L3-sOQ>Fw=hk$UvRx;?@DIx(?^^W&3Wb{f z{VhjCT$~pc`Z8`nB`=zE`0SCUq}*ZGdf2iqs-@v@urZ*xKIqGx7 zjBIRq0N6`LjMp7vJ1B5%ny78h_X5PTc9FGoqDkV(hKO$LmtGAer3yu^&#;*s4L19v_`*ru}t$Y*( zNv?3_U0%5Y|G(tO1nOo!CD87%4sj8};g_!;6T;Z>2tdw=>j9QXxF;PUAaRYl8 zB@$masz5JwNn8{{!x~cE6F4b-eVh66$1xVjjsop`-{b8OMpjnn>Tm;b#|`A3S0a{{ zORZ1mtINaboOxM5k)Kn#Z2<#AdB2>!AZjq zcBR~JB5K#2=HD<+5hURodFYK8Yc8{u`7Me!99_F65b}+{TiT!~@rW1evF|y1LnZgS zqWR^rF__ly@UVfg@$A9&GBkQZA|fr_0`)zSXXzz;H#mT1fX);Wj#a5esmyRa6udA< z7CWJc`8!FrJzu+)Qv}WZ`0v*j#5iYgHIPW`FHwpIU>8ohmf4TxCyA`BFObS?mcYqG zB#}Y|4?O7}IY&!==D(t;l=H1UJ*lG@Kze#+CZGab35B!I$j)x>?ELiWSGig<0gC7x zT+Ec*g^*3-v3zXHf}ZoD(k`zhGHGU!e4Fs8jK&bjE?3d@NiQmAQ#NJ&p|P3%vFsRq zuxp_h2VNEO(q^{=p7;R8XSu$285x#V1Qe|PbLP;ELh}O0w%TM()jYX>q0>eP`nsEM z`YXqH(z>Bd8}(>*j6@#FjC8Y`7+i^ZqHNWzkN7ZBtL`Be)+9&T~5VA`Wy78gw- z@v!<3tsY8Gvp0@%`*{>OBBK9QFYU9KesF%lrnLFdx>Pm0LA{#jJ3aHmj+Zah8e{@? zl0vRz_b2z-IlWo$)(O#DZK~GgPqT(jM+tF%xsU8qb@g2tHg4#+HS+Pb86i+EXKKKY z-{qt(AF&lmZ{JUjb&nWs!G8JvbYXi)cCUxlNB(djYF@yp;@5sS zP1B@veX9LYR9(U%9dDWG2i;rrc|s4SHp`8aKk6|RmXs2(WvMp==DpJRz4W-T@!?^1 z;H%K|JDiY=-)UX*s2*P+u#?KnGvL#@N(&gW{DU2=Sz0&X2Pajpt$mqllZ2aZUU%io zctYC&?d7ju2*|;l+Sj&xBrGC^fHZX_PwQG4#<^%;g^v!mo(6ok0IJfGC*9$Mv2P#b zbj!WC!@0M2;59!#?|WEODdGN$$iDB@Oe?+lTuTfM4$R0z9d9sRFDt}`l74z@NDy!q z&9Xx`|1(L(h=Nx$k&p(ju<;Y)gZF{v=c9+nt-R!|%PkY=X(X7#QoFW>PR+JOhup4F z0`*sFRAgSWc-M=}1(Eb#l(h@%0T2j|P^V3q7&K|n(>#(=2dYFD^+DAajo~ZM`Jl&G zbW-`%F|nW{hlef>ejI+Tke3%q5-yj*0f*{x?%cV7!NKsU_4d`t;q9}CO%!fnt3>8y zx+}xXtrJ)bn~5|<|0L!2h8Ntdu=wz-S%H#^tormom%i?r+V}?r@SQW(c z5Y^l6yQ%Hxojtc$FyDYLec<4?u^IuXf-Bk5!661Z?9{Y0Lm)Y5$%EFau~=-su6iM? zTG2~A-h6~Etcw~~v-Emx^H8Bapom}N)t*525|fZPxVpA4ddz&vP&JBFPddP*e0&vD z-HSn#3YNRUKBc`ol!EbDw7WG=!q@9Lf`w?$*zfYW^R zXkcJK!QP&`(c+m7k1`^O12Tmgms6(8$jAt0e4LXy209ODMwN2z0}oTgTilTb*cmo* zgu3I6t^FksKUOFu+xlgU78iVnU=r`=A2c`N{ zy}5w2op31$Dj!>wC^K9spuLV2DpH^yFx(&2XAEz^{~IOHe`|aFZ8!F9QPFBxNoIPw zB}7npxoB!?Dk?M6_CE*!F%0d{>rd5pFR^ha8h*P!E~GOxJ_U6I06lOtuwYP|)oM2g zN)67{^y*1}Z^3$4q6;!ncj|uoE51w6LItJhhxrJaTGEGZ`)jCpa~2N8POawyI;^M= zlaiA94N&oLP;+r_E8C$P`(Wlo?k;7X3MRBb<3nS@3K4K{KuE(@06u|o2E84G7Z3}; z;J-QDqf8Asc1jgoI4-t!X;2mvpHupvr>F0?`~8ZYy`As!FJ&|T#VZ=wa=ne=BtWu4 zs_6I%aIma*6LqDeutA2) z%0YnJP-5z^LZ<9N5dvw=#_RH-9g2|HY9|FwGmK=pY@s_gINB~TY;mR{^^||$V)gRX z72eC|Z3I*LzKivkd#5VNXdu|^-QAOnD_x-Hby}#V08sPo+YO-Ny=zPZgq8o{Dlt{d z4=?Il`C{tA9e&d^M`&W|fsr;VNrS9>aCpeb$T&0I82)#67seDhvYh)LF+aEnD?jta zk0!r2Puvr;J?>JuFFyTeAdxIVvggoBRHxX&rAJ+_Ef8Dni`_1hzes*YOkBMB(IPbf zXp^sj>Du`ke><1u zX!H6h&HoVDe?kQ*5dn_A9~@K+36aNf!9Za@k~%F5Q&uGW-E?;c526xKjRX2vS@dft z*~|MDqzw28mXq=$JpH!?ZwQksA&2^i?AG%>WCR!kUw`lFr>|elq}jNsW8kz%1|LZP zApJ1$o+im&6L3jJ51uPt2p)g)0+T_P1Y6bIP}{#n`}z!$!e4vXt%y+PuS^{FHX|cu7Rp$+KQN8~_IBO(}o$ z?9U%}ev_&OKxL2`D?oGT5Z0>uZP;S65qQpoaLsbS{x92ZCj=twV+5L zy7H-4Pke~Z zZlfOQGk6(VDrfGvR;xaul_e`@=Z|6uEOI>nT5*ksHZ6u`1!aLD`WrlBf2L6w0fQ&?{Fx*E{a#+2%TCVxiO6xYl$_~av~fJ zb62~F_Fw5Fw{uu!;d<1DH2rG34(Az{-JtwL)%dJ?9Q<|Ac$z5eKSvr|&mP_U=9U6N zGp5)>DeLh~+Xz9+O$1c)Zq!*ujPyr6r`4-e`GYadGw&n2FW*i;%E|Tp{(TiP>wn73 zlB{h~P&fH!owkA0g=7?$f;K86bOd=QmWFH;POP>xkR?z~>6<9|VzX1XI|-y6GcctW z%*>-b(joSNvUglxL~L$Dhahu?8RZfcLNM97f;LeKxW4-q-T;jd2_>72jZFjqWmvNZ zuC9>HF4j+(pH2O8j|!7+f*SB6McZ!?%?AaZ*ZyYGQkyu{T3fk%Yi1Hs``%o#<`boy z@q@qGX1+6L%!0Oc{R09ZR*HB3DtXJo#&X|l8~>(Z!7t-ty|Z^jwI?i<{7~Q%h*p^z zkei&Mo5jV%h7%~EkHHSSQN&@3iHRbGYh`gid7HxxrOwXF2GP)5T|llck{}o81gt+~ z#dO`Vnw<4I>Ri*gN^4+hYHMvBj!9<(C<QHc3IFH+Ai_w(ANwK3IW*K3lYqOIosJv;`g0QLz=$FGJk!gJ@( z3qtz@u?Pw(s5dx{bMu8Ep1rLIerC#oHtGYG^g;_?VP>NUDY^BR@Y}#te+Uq>^#LXf zC{yTi-`oRD<;FjKrHqY2SVl$-6gcR19s9U88UB_i&j~`qpDTwKOcwaKy5nB-&xu~F z$G7j_n;^^Jnx??OSBlXTAS6eDVz~HdIEp6)aTv!;BURUMqh~3FGq22#vdWAxTQ4ha zga&JH@qfJl_AfVS`S|&%DWa2!8Rn`I5kpYdmCEKD;rns z6m-7Ih>;hy#qVXXyJiW%+E=EW+}7NjJu@>ChcL#*x*Hns2nh)x2YwqEcpU_zcvUX6 zqM(SaCKw>z6AX}`v}7VIveK*KbE|JkZ}}MfZK0)4e^tczD(#(IEl@?F_%np8Nk&CS zNgyTeSSyA%<#j0jHh8yYo@JF|9 z-TJ+H{EKQ8*yBD55&gD~)CGN{_+UeLBe~r4Y6ki&n--Yt`tw#ON)4VS7Mon6ix&cJ9l9;wnMit^ z&|Wv`uc>Ks8yJ!O#{_nmWg%p|r2kwcDp#`<;1gRPG~Q57q%x}}T*h6*>+0&xQBn#+ zqWSrg;qv9nP<&^BjiEPE%KFgO^_y733VK&m-Ai#~fatnqlN~Yo`0Xgeor`^$*OKnI zE%dPhnOp6-K*7w+3=ae}v$(w6yy`s*M4+sC605SlKEnJ$s|jh~lf?_tF&ORS;)Qo} zZ$5OJ8yg!hvNKFWy=RdOtkNq2u^wdAnXUaF{$@&9)sFh3c+(9lLo#6nj{KH=npsWb z9VX2plv*9*)&G&Ms%iYCz}lV_sBM7ROF&74_`u+Ei)e_dm z?GL17g3vnSCb0p>87QZ%{om{B3mr+9WqdX{`?KZL?d|hZ8-N`y6eDpgcuJVEFpDap zgFO~@wP5N{=9O2qlJj{q-r4v3pYROrklg+p4WLNq`=K@M!U{opPizkd8-Z2nkAN=- zFMwk(jIA&^!rCy5ryt=U71F%jud~??TE;Mihx<-QhIb|P*~7znMj%!j89|BP&dPgo zC!XXt-dB8;Fpd_?Z_0%lK!Sc`+K}L03`6-ydBH08v1t5)7iI$Q# zpY(2`%p%as97xi?`fYr6j1S)ly?v0;rUB^u4ktCvT@j-Mf({V%f>KgOV+oha%&%E= zeWhy}7d$z$A@(V(z|PU(d*6>AKUzwy+Zq1L8*koRf>Q&Ng1BHw+4*CX#fhkC91eQf zi`o*Yk0e8(QJ!ff`cVY)eL$8Nnwnl=O9YvtnL9hMi85qQF)LtA@{Ag0gcfOQZq&dR zb42MLzosw_Y88Z?By1l`kj*qW*GSOsq9PFG$h}O z&p!fU5n~##vbg~b>qu3rQlJ&F}C(*xuZ+| zr1Xnjcd>p8pTNuX^qHkx)xb|*y2_Ov7kH$%`fF<7eX@LM{+Y0@;Yn}XlWt{meR>j} zq3(noZyC149sSsjulJh*gNv;7CVS}O_-M(;jm_*l?4p1$1(p#Y2`%~PbSVwwPxt8t z{H(LYlEOkw1&>}@lo~7x@s^Dl1|JNP*mXpc^mrKJdrJR5*OJCI>2ndgdaSX!`q9+H z#Q5YmCoTDX9)}ywvbt$e7(vx$f(EK-kqv|!FfZYY2&APakmQLFO4jV7CJH_OD)cjS*cGYVT$A_D7+!H$}zfIi?^GyBKFNNP7UOpryz4Pauv~x=j39o2VJD zat{Y}>Urlom$$-ERi2a`w_`m+~)mRf_8Ws&qcW)LE>Kh|or#=LpOaQ`|o zy+1j=_1@=?l)PL>e|&Z>CE~CJ-dSI)9~ITU2e^$gdT&8ahvSC_c><@+z>I-88vh!U z0eTuh6;S(tHI3|*>cC46%=($a%NKETZp-g``Z*wKcXqtNeWF)b4xFXm67JPs@J)y( z&&aj0m}C-0c1w8>s5e~e*&Gp6Yj7@j8g-zqu4FR;{uLG(-)F_e{2G~3t$?HYCnWOr@C`d1Gl)U14!yp_A;s51K(5cFwb zlGEyH*iD)qAwx{?knm(6D)*BqO0gxo@M*Y$&x9Q}qD&k%=O|bnYGzm%J`VJ)th@u) z3cP-PVF9#0JLo#@aB7X^UmMHO;Yk8^HYO*Q6VcZn2 z5*VtLZ>BYO8vNgUFW*P2|lo7+g=L%LitNGui#^08E{&q)E@^h_g{8*>^5Jg0|10;8B`4 za34NCgBVO_(&gJYS|Ql~W$U8Da|~bX%Q4XZN=r*`yt!xL=?NyYTRbVhfX{H64yPN#1}?qC_GSQ7a01SqgwT)dqsE$(iQ{Q~Da@k1uhS-q?xk7~721I~Y9#=iXN!YPnEekc12jLghA zm6h~~?b@JF$xuN8Pw_xm-;ryK=*}keS(eHoRpFEX}nxmU1rN*!UwHV!e19CK3vbFUq33s5D zZ$OwjJbYNROA8J}Dlf|~K|X{6*8Ys+@1I_fnsky@&bdG7zkD4EJV@Phk@RNMD;Ts? zmy$Ot%;};Ein5B~6TS&SaCCu1F)nB#Tdf+cN~gE|9UL8jc!~!}Xk)WmU<(Hzp#`j+ zynfa)=i7n09$5Sgw^@E!s-ak#A~Y!N&UO*cqs3z|!EZn9uK*F`GW8Xw0)t}%^krb% zp@C{!-?c6^_~D@EeFpdPSQJ)@oiKz*4o|K%@OLNL{vV#h6{OkrM9*I>WH_|CzMc<` zLLYr_)8R4C8(b4`BSmv>S@)EhXIn^BIEBok(|~(kLH9%d1sTCCU{w@Oe)Qm?PQwdR zFqe6MUc#havLLG>Jz^Rh=Qe5gTLoWQ9Ar%#wY9c3|95flm0ZwEAQFJOaj!P{>AZB7 z7g0w4GnC@>c~XKL1x;+VU61`bPhPrNo`&Z*CBQb2QejfCYkGw#ZEd%p$AnI&3F54B zncB>o|9JHUYY`Lw6yYRZv8B|+Vo&kv%%Uo*67UHdRyheB**1lLw|6I(K)cRaMYCpD^BM`Tvv4ZrZj7HhOAFC|m4=1lc3u9p zO(0urZ+8)P!*MJ@X_S)v#ozfT$wKkv%NGg1P0o_~6RGwD)>**Bz`n6iL>uM88x{Fs zRs<4Z1!fvn6(4J(F@**F3-;UqT2ykuY_zbmItIl8jI98FAn-54nNL7JSv2vX+G-Sy zTuYEs1v9KS|L7aVXxupin$-e%2iQNkY|Q{!&}RizZ6yTh6Y5Zod8~uyeiOTq&`8ms zR7HLOXsE2)S)f_3P@AdIaL{wP1rr2D?aO2r&DQRG0bV!z*xeriMu<>?ycIk~wb?AE26p7k=HQpU2kRaZELA4_kV}EKFOS7y(Do4IQvF(R zepN5euk-{@pK~i0GC?J*-{puec#yg*(q4C!I_4j%4OW{cO3-&gyuN45ULhq%Y58cQ zaz$M&o3Q>t`DlAx=Dnv037cKKC2mK1?r>hg2i!dS=XVE)-F{ZyJzsk+qY}_0VVZcONR)?b#z(q}S9%YM`$IBv=Yhsbz;o4QqlaYl~fNLz` zT5-Ozkkj3e{;hubL`Xl}z8LQVX6~`Pr;ArB!z4#GGrOwJDh*6N%?Cqgi~>i)#s(6% zU!%+SpC~>`k>Rg5BnmEkNE!6&TGgOBTqs*r5ff z&w0#kSmJs$5V>&0KPN|V!V+F^`z#(e-dVfF6;ZXsD6k49Y>o252?xeEQT_xKvY!?* zvpr(IP&0MR51HtOcGfk}^0-t`HP0;7XtL$;>l^q&u0df92!l9wEdLHRrK$CWzXjU0 zfom)P$n7^8@Bzq+WfTE0hC}n34orG-YWWzp*JPeFQbe4{5t^mJ4I8jKz^;Hg2uSo= zS~p;L_l@Zr|7=C-BWE|&AgKr^wef`q(eF*6Wa&nY|2zUZ5{~`UUYoe@J~j=<%>ym^ zE(cAM)}7mx3#o;Pu7T_k-h!Z|=Q+>g4LU9xN7Y{3)&Ri}xHl6Gz0AqH>q(Sr(6TWI zegj~%SYPa9124U%E*pBvgKhBA4r0R`Wn1>aBv=+g0ip|+%G{>$O6qo)rjF*t7gtwv z%gX`t)43UipXxkDYFQH2}w-_xLJqM+96Uo-_|M}_~R#tFz708osKY!jqGRy(N z2L7V|7#Iw&Ti5~>>&Mtbs5j!sFzuPm<*mvJq2OOc+?tuca_P-&9z1w5IcX-trdgK{ z*G@KdL@WsA3mZt?$o5D*-*q~(E|k+ldjj$&;7c~JWv7`3r_-AUCIP)V@jf+Q1z$TW zmihvIo}g~G50ahq5{Euu1#gY~WJn3%_mS}bdzFTU21kY#By)oR^@H^`xLCAVQf3;7 z)aeH(_5{U?=#fJ`GNT#$RgiX|bf%{>T9q<@RNy@PSz8KP``~)>i3M!Iz!budhrEH7 z%ix4yk4U>$2fNt`bRAq|VPIpMFF8FZkqp@3yPd%D2D1R^)MC&KoI9AD71U*Q4gBcP z*#?q^QDt4O{;HPNqJUM0!l+^sbKKm z9Cn;v4SM=D9xyL`wIP%eJRh2%8%2n|$o-gLeuOIimfvi=IE?%?9M77G;?Qg68N~+J zm?DcNEPLpb^^SR0GN}DPd4j)+TjSOAj{6Q6y&9>A4 zm~fo&Aq)>THgG*)${K)DI0+?=%zz3Xb&&>n$UDnnSN)ORGon*!ch~L%{=h6)2CN@G zJdam0(v3^?{R_=l4+p0N88JBc&Vp)HfoIX{n;K9Z3o)zSkVA1$2&duC&d##P`o92< zbiE)3PTzwf6i*(FL})c8=;ENQm@!0~9pJj7&9r*Xq&w3d)esALXf%3q@VV(Nd~G)1 zGosy?2CrB6v)s+gN*>LH{0o}naD^BJari4~p9J=kjc6S2iQ`*k!Rf_XQY|zpm}ysp zvi+Qlvi?r}pmSvw2s$eV2Vg3~;989i4_MY59z3{rMVl?1AWx=@){U8lFC=V{u27gi z`{~%~{O?lhSAlDiX7z4iv+W6>D8;wW7VQ3jt7_gCDF@CR;W4y+EdD}Z(*E(w^LC%v zw)4OPRKKeJ&dkb+JNSL*=M!M5WBU;57oOD?(H(~pe*bIx)enA~e^w6Mof;vbCX8!f z_+Y+<`_76XSQD534c@fVjPXW;xnEzR;Co_XV$cEK{~P@d z5xW}&jTj|<2vKlk_5EU9{Y38U{w#j3C^>q;ZY$mD zKpDsgP#kgOBOn*QKdtnVK?fp0i;TL$WwT9MjNqYAQHo{rqx8Di>Kj=K=R?_at4+9) z?jV5_%y9jBS1y}7xzlZL!xD1kKPl$z$~_2Ag*a5soyi6rq}T5HpK25S(XlbV#oV;L z=#V`UXjMS69AZX8-4^~HD%sSMh)LT&wPHG@z26XM0u;K>q+j$SsrYVe6UgF|lf}yn z`zr9z++l!$lqgUB_17+?iG`)5NsuC;!r`7Q0mD8%KK7Mi^RmLF=co@Cd+ZwUO&TJ4 zeZrVgPOo~u^t$*!tpVJTmzTHKe|iLWBhJyqMMBpJV}~HadET&|DyTfUt%k#fb-@Ld z&K%Hj;mpE_|Fr^N4|qZjD??O)CjXa~%St48XKklxxoo~5N2CpZ94)v**7{Udc2g>| zZF!sEhn`Kr%WKAf&K8uA0sK>V!SRbMyor4?Zqr-)xDofupUS{#1&|C<+p;Ve36p|) z$zGk2LaK*CBiZzEv}?rOtfm*ZBKgz(esFgI{0BS@RL;lU&o(4rRc)v(%>%`pRZTHl z6_*ICAQmysfN_DqX>uy5Yf}}dYXLkn)Nvb}(j=d(rMh?Uixkf0`TH>&G?|>exGYvP zahaAJZb@wT$^b14a<4<=5@&5HvSK zLh2JZAbnvhO&V^f`C!bZ>qAfR#O~!EwY&fC`EkH!JV&hCNvnYGImK(qlQtxqwvLzm zI(|J73{OxVJ7$`raqSDP(-Qc)hbSs4GNR)}Aj$|a$N<3!l&5eJY6*M2NAw=Gs8}E^ zII*FYOG!(^<-MP)-mq{WOpPX2_g}ME^Hk=DEin5Uj){9#y!_OgzGOrdI4pX8lj)L^ zr4pQWTvummYNZSZUV?joSj{4}_k@aue*xl72dtrYA@P-;-UH zz*4PyEe=&NaY>Ed&<_dJ2FHbIXl`&WQ++ePNT?Ce7&ZY4>EO30e5#?QEKFj6KHeQrDy}yG|MSM-@du+=Na9+l zT_a2B=`^TY3gM_{euUe3z9_Iw$*?UzYjbq8Aa4&TYs5Sx6Vkr4u=WlmEYLfXeWo*Z zP~xQ8?CwkQZ=~4!t#ynfh30F>NS4@g`7i znAifFwovH?>iPNF59uKVCj0ogHG&#Z&yaJwqF$0X= z>-DE{kgRa%6{;fz_z@@4t(l6p%DWY@1{Ddde;nUa%XNo%Gc+Xt&>{c3OX*p;T$y|*hY5PU|9MKaZPT4xB8UEU{@>S~<#LE>=b zcntCdFdc+oUNWh23j=q3qML-8p<(*a4B4fK3s%up14F9x_Yz#vO>fJ84v7j56_~IH z;ZN?wu@}(NffEfv7N8NF{fK7E!e*K=HEK0x6y6E@qsNj@)NUSfu_Zqlr%yOFiU>vLccORc|Y0DAlv)EX2IEOe$jI+N$@q-J>cljeP+$3f8oGX^%c&Z_y zK8=51GEe>N6W^Dk6pegvibIP_H~jZw157f@%S=lfYOt| zDv$G7T#?Hjnu)p2MP^5(LU`P8`}goqOQ+_}0H6^7A>b5?-TKoYcwrI6-G8I+i8M3! zVEP%)c0_Y#{u$BMGAJoovH`%WH!W|?{P8a+DS@$*!q{!N2JEkk_nGn=Fl$UYIsc<# zaWR6n@4IJe`q1kRZWpg|U>nZ7rZvR`Mr8dIFnb7>bjK=P?z5fKx^Jcd)EKnPdeK)Z zo^hg-5#hmBVnl%n8vN{rO!tGg{Oex4crk$a)(E1v@A@xgz+FWYs<=U($vY>J;F8k& z*0ne-Ow{K3cp*3*0Xl)q`XViD)}#7;K|$lsA_|Nhk0Dd$nbC* zKqBb*u#kjTM$5aGo<+d=-fvh6tta>}@DOcIFmgTqYW;ai%B^MdQ>HY#v<4fKbt6UwF_IuZNwM|WX;gS2(;gq-<1NW7eKK*;-^yBL8IJsOx2&&TETrC|vJuOpHC}5wY z`2Miod2IN)?DrCu?~CL9nGFVmav{*>Vkh;7m?^e2Tm@K7O?7m2J86VqDQ`Mob6t~q zlBL7$3MgF$LnkkZ^HIaPX+jb!28d% ziS5=7&i?|+#f9Vdqwn8_que(+;h5v(O}Li+PkF`mJq&kvsivtpI5N@>;`U>Qm$-{b zz{?dX(zq(Xd&)@z&m9pn5LpdJC8wGEp3pfxzjx_g;-uyk+?JKnyrLk1n;}2y4*7BS z07OK<0j(^Mwy3V`_RGM*N%z-M|UgMlL=wUQt>bX*o;r$YWn@ zAfx8PfF?CA(_Hd?*^NcOMFX$`fa;s=u{tU$cl=iyt|D{36ac9hE-t!*xWdEB3&|4T z-Sn<%%G=4vX8w11KLN1LsVz zwY>sPZlF1Z#KhX*a$TN-5v!G1hm8;}P44}%eu1;)0Hy+3)uXl`6!(0t(CFVOoRr@d zkgYK6lud?>%4+#xd^z55T%bjC0NwzT0ZvbWTk`eCtFHT?+TYqW@9*VJ{fbJwQ{Ii42V;YNOQ zju5O8U>XMI4<-Qg1Kgj(S!1N7;a*0HBiFM#oFMaIL2(Q`Sj-2G$a{4(a%{D2HC0h_ zUjw%BQ-Vum9oZ2bs#NS%t@Uf(wCfEaBpPqWtgy4UaS39-V`1w)oJ)WakPVMOsUzv` z?$+u&iUkj3FgVt=_4L|+rH8u?&n@Wi?jpAg=sNKF!vsQ|8nkiCP4W8N1CqXl;<}E{ z2LDD}60b7~aCaTPn{nrgaN^y^>Fs#~o!Es2(hImH_@$6tB16n_yRvl+ zlE~&;I$W-}1O`kMoBY=03^`jHU2LUd{1F$@smSs-=afkARM_9%A$zFQiC$A*Xgy@k4|&u{vhHO)1L7p2>wzzz!# z$(zv&7ce0wlsL!fs8})(YvgP9WnL6a>sG!>iyIjj8%~AO_)UKS(7r+!clT{NTu(3I z?mqdGST*iK;pKH-SJ&3d;1@5v>@wFEmFkE|FTaZnJ;&7pwF;60XOHme7PRz|=IU4U zi$~sk^!Vm@Z(FQx~Fj1QF6D4pr^iA@+G)#qmd8!G-PL8h=l^EOSZ}Y z&#KPuxP_GGnypsTkEFnHe#nH>x&k|}|l6`+w@UaxA^It}d zczAeV3p`w(-NucK(SoHaE{o~#!V@E=`zMRUC(KffAI}61M_o44K4%(}t-n;xyD9fK zeUy5TGc@?q^lkk@Z1j^0h^h3vyF%%l|GwIQ%E-0{!3Hk=1GIipR8(3~aSI%W>1s>I z(bX+mg)g+O=E5tX{5Pef;6#_oNq;9#rh=<%{{bz4Eckmsw0A>tv~t(kzf6@Vj6{aQ zXHxvuftI8M6K$KdmxWa_C&~{IKItPFT5K|Tn>*tsFShkwHai@!?(6Y)0-04CWOEtr z$KKEN&AgS3chBx6(Tle%@5R&~|85yPU!_h%KYgQ8-8FD^PO~r*(&~g5PhzLdbFfE( zfDV`V9XXrew$RquvpAoQ*groU^ve*EdY+y3h$P?DQ@yLSR{Ex_&=ulpAtZ3fkd=RY zxc}u-hI1akD}%HNX#8cS9~jVKx)laAV>y?HHo)onxP+I;AW(`QdfbsFviMaRp2fAP!)-?6+GQvVR< zKgj9)QV08$;*B|b!s7^EZI8D%+rN4S&DFD#txNf!o(+yB^eiYRzp zao&ke?raMN;((o%#*1+?;_8r~8pOF#r~BE`7ovQ3Rv5(z@Lk$w&*f=x7ExT)1ShNa z`lPz6L{Fpz)Yq*V^|*)5@S&iYwTU9~`?V@UWHZRl^`Jzs+z>C!SILXE-r-R`hcsWP z9pF7-YZh_8rhI`E`@G9&@ZEQj0-`0gWR>Xf&~`;bhikUBwi#()NY#ESjaE^a-mQ^<^I=J|!G-=cNjGCeJ9 zh&+Q>g;T6pCuST?&R>HRIR5(72%sy6gY4d5SKdt$? zd5@_s*h;7vxUMnJG5ac+VFX`9wtp->!LkRlgE>VeLb4|G4wr@YTQISXTm#7Bm!XcM=b{=TAk)6cEHAGjjGJKGLlxjGV% zKfZRN(6IC=HfywIS75RuXsfyS+qdgyZyi;;TaZ>!kq(#}b*Ttl>%4+9QaCx`1in}D zAzA;2rt6N!vTxt^$PC#dB1Crfo>?i%-ZNR*dnH*(*^*fZA%tv_y-D`WxXa4k^*gVg z_xJwwe%|MO?)!Fqzt=gA^Ei(4MJbQ`!9hCt-rU4&y?AZn_`%^NoYr+V-3LnZziz}) zQbyVcl#S7zQE`SxHFc|FmWfv_57?%e8CiJ+W%3s!L^wEn>+gdGK-2TV75EQSn#hw; z@)bik`ENt$9%bC2W{SAto7q^>(|b^57dQ55LV+;u0bCZSwP20*v1E87Br}j zii#)4r__Kp2a^yBGY2jhu$dakN6I89$$Wi{!N}Q8^{mw?FZEt@`^?7*jV%H9lq)z% zOX_Xe{OL9|GYS+pas6<@nJyL-a?H}bwD{y?W>hf(2Qx1pA6v~Z#<8YSCSZ-S6r*ya zYeKa`T}J~}9=b_9f?ligZ5Y%V0C95g@^=1AOnJoI{rY+_7Z;=>erf*Jne+1(JW+EK zf=9c-f*E(nW7;D>lnU^Rsm_Pte*69%dWHVdI`LoLo4NV<&+6*Lp*C<98|8RfVm-83 z=HBvI`#D!TR-K_(T6&07`Mr|9w~YydNlT^LZxqK@63#2Ff zuXsyLN&>$xk(AfHEbh$FgUZ+fv87Mor(5NHPE((Prys4&x_f*fQ%Ld5f-j?=Ot8N{ zur*h-b~xcc)120%HeG=vv%)`K4BQ|fNNL8#A~Qq~9$h7!n7PK~^@253f;%ke*Ef=L zGLu#cLuglk9f{ZsG#mvdwzC$;Jg84K~MP-prSldeox>alg#Y$h^xdaX`QYkO{h;yBtqJ2)g2Cz>r*W`$=uv63RWr zJ7jQplgJCCM8La7C?UVTaSmjPDb#2@;(nNpZ_6sr8b{uzasBPlNJ*KXm>7NtSdqaG zgIOCqa!{by0WI+<7Z*Ns(aFh6dx6CUvGRB^Y3DzqUs03lM6*NE_eo91kw`Aqr+m$N z%Du{y_wXgwC}mH`oqY#!44>h)_re3$rY1p01CmkrSioN%+S}(C>uPLrsPcJFkp0F7 zjE1G|X6F{vMicekyi~lV%V+a{rN_p`bR$@s-g=1l|L(#gv9;Z;dvbCEMCZW8(`C7g z^!5*Q$x1&gBP4biujgU7#JAV0NwGVYmAEXLwfAXo;u4o?wKa0Q4U~tIvgJSBYyEIP zT2L*t&*NjP?ZWo3onT6c#r|(53H3Z}C^W!71Q{Kv$eg}{GloK)p@RQc0O>5HL`cw+ z*Hr=>F*MIYp)C5Zr2kK#^LI7)?sC;F^Esh3pjisjvZZl2D>eS*Z!Nb#;|hRioaFQm_nK`X@3| z@%61G{5{PaZ@%@?Gn?dCVJmL*_QA-H9SFYtP?`P%r+~9Q#vFB%FO2c0OuE{uK27(V z)=;B>R27DlzJJcenEo!3+z)Sq-t+ONf{40{_7S;l@5H9HX(Xvx*qz}!R4d(*fj*s(jIwof`9Wf*ucx0M3*3?zqYFs;s%2?iS?8!y{ufaMw*8N$3QyR`Jh>({iPR%A_= z-}uNaK5U3#n`lXBGVK4lSeKZi{gd`Pv`W09WL`n{=CVk8fl>;cd{unpr?1FzI+hmK z5=tuRRTBJV-${pQ3~)XWW(LefVLS*TkN(nY<$=qUcDNt1+5H3Y1LSrj`2%&pUICf_ zU_;8BbZfy7;yN{9PkQ5R?%VVm^8gG7h|v?uVJS*zB}A zz^JUL$d9d+^HbXi*EZ%SgrdN()UdWZ{#|N&lBGVUp?h19^S9t|kJ~66s8J!xDS9cdYsQ0ccE_HU# z$|tp4Pi+vj63d~uhEgq3s9iVMdTxW$MX|Fs+)IY~OQoasDp^jZx?<KlFj-bL2N?;z-VJ5Oxg)+dcnV@ zWo-}GJnyu5zj}XsC6MRq+Tlk3`9yon&5$#Yu>HE~3j9zjQJo2qoR1Pzq!@GEfsG+s z+|hT>ubekqySc?9EE#aj0*cV{wx6sEM@9^~!|_<|bg{V!y=SOa_Hgk(0mU#wLzrOg zF;qW){$!>nR(CT{Tte-2#C#NMA998q0CXEjRJyvlpZ&KP!4h-@=5roi9v=ZIKHtUE zj1)2(EHnNUIRL-Yb+gO4DwNBkuAIcejU?g9(j(QE@Rspg{;b z5Xd1lLUNdpUq}56=W2OP#D)7iH&;yTR{QcdimeEe!lEJ;@J_o^a8K=?j*)uQV8rxh zGA=j35klhS&$IP{W(5gLIong7wT5W3mTS>%n8j;Hi+OZ@6F>c%K7*Q!!_2t9B^Ug6 z9AKpJFcbD(Fkk>(HArQRYu&;D(IDUa#=W!3?L5{I?Ey9^=nuntQ_-1*tPZ zDGV>ZEQCcQK2<-F{`-kT#5WyGJ;27y_;f=MLfy&3BWH-cqQ2*%a7A)TO9y_DhI8Pl zx7>CPUeQE4(6!p=yo>_tpbQ^pOXn`3!cXGV7BozEN$3^4sV*)b&x}NV5RnpWqtYw= zSWp-RS>vvro{ExE_?X2N235YAmr;M1MF?ilw$R#=m93>PQ>YnH26kr@_xlLX4mYi|bjTMU z`?v?xeb~C}1?dN9-#VAceM(o(kZO4;DYdK@!114zc(>+DJhyj|}Ko0dzgt=r2-m zCu51}?+z1N?Wa&15A4d+BQxhbP=NqajIaPlW&XS(*ly}QfhyE%p9AVTfJjyO!V!ix zqSWAKTpK6GZByek-gue={KK!nk22TPr zReYP!5Y|+q+i+|zmDy7+P~p`iLrlNC&Mh8Nqr4P8+9;^Bk|+^mdr($IVX zneNp`(M)-Z*VofDZ1*B&V$($o3`|#HehxBtw|DjFP@l`^yd29}%^*B=oD=sOpVyOd z7?qXh)U{YQjdO5#yglbVU-F&;WUpCTBv_`ksOiPWFb?J5KQ!*#mJS22|{HF*ZWvHib*RJxC8vk1gF1654UD5P4Dx(}68~64LH^OR ztXrROYd+%kvc!eM{Vir==p7I0y&89CN&qu%YHC8^%KXE`tbqyzMTYCo%E9CFU7HK4 zmC9uaRkXd@2yXd+2P81sqxelNT#vN@{vdon2jiwhn%w`;JKm!bBS@Ls98uD1zd27; zhdv+|d&RBXVVnm!Balh}IFrzmNA%&X(U;Apbx$ssW5eC~>Hj+fOg7KJaS03^+?VlS zPymKjdb$m}CX};d<*sZ)XQ#TuYatr@{r$zxk$Op%nKGIzm9qCamr%F?Wku%Khe@QW zKRls{Y3)z{y<9IPe_su0Vg?H(%wEaT*5Z1amK|vgEcr<>2C%U~;jnPvgLY9%M~DNE z{AUxMH;8F%OoeO+;KuOZrOQ&x`6Ahm2K8?Oe+NV!aKzqQGmFr=5)u>f3rjnDK2);W zb2lLK+_}Vam9Qb~kK_fO)c)FotO766n07>$0Olf4@sE7_299R&RyXG57H12W(>UrP zE(rD~d$$iA>mSoRlLHMUL?>jz2g84z2M^fr^NBuS>Zp}FdR|pBe{19A*`R=CBwRW=LzlW+Ql0;-!ko0MGYl}P9|zi3 zh;>XJgmcGo(owLt=Tze)Y@2Xwoc&Bs+`0N?CnY$r*!d$wGytc;mjtTv&-3G* z;5c#u`IKKsQiJ7HOQP<;&1+XQc2Yz`-4?LKCn0%+b6XDL_d~d!sq+MZOdAM~ILh8% zrMR^C@pSDDdIHv-gdd?X#I!hV>3;{uiiCa z;oD{%4_{syc*5qAB{K-Z&4-U1-+lPd_v?2mu5E}?o__z$1~Z)eBugR_CF4G}q{5l3 zg2X8eHSz{(zE>+_S30qR=P(@fKpy}Qp5-vdz|2~48y_{8kga(A=wge0)>fY8Nc*hZ zcXbq)?Z0ddXp(YB|Hz_2f!eZN(9rM(K~Q^o!M!AXT$e2sn58g?Y-$L~027fNkH;_J zwam{)aPN3y=knOM1YV8om*@MUoD*hojk_+Un9A*PSi$cX_>jWlJ$ZxDZHpdmtNZr! zz9R?sB3WAl6!1M(@=1>AQ_Tq?R4I^R3MobqG0DIiq=$n4p}37qg0+-l^y-y9r;pXu z`CQU5G5aKh;K&hGQZfu3Jq(%O7nXKp^jo4CWz3Z|d$bQ{xpW(o)!wUpb2pmPBab!y z%ps=bo%UC^zkOdivM=vs@O5VCAyseSfno@B|+pmitVfiNvCP1ns| z59F_0`BYPdu&(?XbtCj%BG0B5mHfmAg>QV%p{@KrKnO^E0n=Xy?%LYgmY%mQaoL8~ z0=~0GO$gK33G$lMeN8CP`niEx==(Vu@VgcFeu4J1+YeEa=bY`-;udfEt11W9$U0*2 zOL+CzG)?c{5JcTjdqihR?s7drO;D=u|G5C&Fh$e<=R$Ht#X0ij=wb_)5V_X7u1;BJ z5aSXTB$#-5ej6XxF)&aCqz*u@Z)0P_AN@s=l9I5(TANeN2f+2NeXKYDq-Ft!Cu@FE zT0&|9X)~?!wSgsQVX~Natz5ZTWRlP}Q9Uc>TjPv|R4?+7^4D{n654raC_e`O4T8xX z%x17v$@)Zu&;xJ?L!793>t~%|)&LF=3!63bV6vEG&iBw$-!dZ4r(8hZkz`Z|2BQF< zkjJ(|5CLW%VcUXiuuSYvp%vK$qjL#C)Zr?}=^0i31BUToF6sPXJBNZ$gFJmjy=y7% z-8LGG92D=swn-qJEzPg-Tks>dcmS1pdV3*t-G3&J;E_f~>Z0`dxw%iEUh41t*FESX z0H#;6%Eg6oa}el;x8Nd-I{lfADpSjuFXptDqcm&7Pek_*tr-fN=olg)-Ta=G0;(WW z(^Y8bpytJn>%4})N*9l{M|6PsSL9Ulp&pE6;oDq65b|e{>5tr$rPGb@QggK@wSu6E zf#%36C@2$JuDyW~vf!lKL#;LHe4{AN1O+wzY>I1Y{6!R_wR@lFoIdiJ(X|CEYrG5O z=DGRvkzHx-&&Q(RDgbj)panyvwoz347W5jx0rwgkTRiYfOMSBpCc8gc+ads!Adj7@ z9aM=tuc13eKfV1ma6jZ$JzFXr2w{#-27~Xw$Poz0x)C~XSI?7IL+nr@^L(eOakGvZ z^o}krYcQTbD8W5FYVZbAM!g;1>mu&UfMNxL5sX2BkuxqpW7$I9mOUzDFR1xzm}yIS zE6YHsrh#W!H;8-rM*Jx6gBuXwoeVg0cN;0h=tj-VYyj1RR^Hau7Iac?o13#>3=9KK zsN5hVAg*IjRZV`7O#b+#gYTxqmMF#i3wCb?oIete*}R=Juxk>)SQ03rV1V#rs>%U8 z2JY$U*}*kaBI|Rp2fF%af(cK_Pz!2clp!S8=JVcWFk&+Iy!{3GAw{KU=Nli88-{+M%4?18;p%%YoIZxfjdPH9)TWdGuK*|TxZGiSb9%sPt z!Y5qlV=0Bb{i`cwh2#_ATX*Wh|IoP9V7dRO1QX{t#P)|o`WOlf7r6Q3iSl|}xI+Z? z5g&*;wV`}ng@=j=`k+k$smmBMK7oyUF`G4gQi@#klOom*!YLBw7jkBe$j0A$k9(~I~=2(fr2bSkG#aaJ|B%tbzH&!3czm)^~m z;dRjmjDsE9qELkv)%{0J5iL*hE*q?UFEIix&z^VikvB}6^%?HS0U3$T+K0d51gB23 z#knLzjT7dxIX!AGJiOfjx&k_rfvTlDjfWeJ0$E?ftMoswF?90`IiHd)5n-cI4aJsP z4&>l=R0;=k0r&94>GqnVPH4O?bsP~r3e5;a0_p{c5UXfZ$d#>*jIA=;3N&iE3Vs24UG)U@!B0f>$ z0&i%PWFn4kqNNfibck?5EPBcH;zOGibl5Z!p8TL+27sCxwQUE};JX~G_^Vu9G<|v~ z%%D)`S5Tl6k_W-5StMb{abpmwC0`5sqL2nq!&cRubg!5p{x2rX0eV zk;m&tKMrB^V5^**ddz(}N)gIS#Ksc<0l3vA#GGZf4}Zto?>F@Z?Sl;m@M`Wql}DTp z5F}@6>PC0ozaMl=uDmrBW@>OqEp=>nS-+C6G$RpU#yo8pq&?M=xu5`EM_^#%n8gYa z{EgNW$3&;GmLg!MNH6UX2^vvQ2Jq-u{Uc9(9lw;LmqM?iC%EaeCJOFMyul~x01K56 zvz6U`5|v3S5pst+3zO^nv&y%L+CVjZ_Si6{<;nu3-^^}Z)#3(68y_^ZkXl@! z(Di#k-^#B3zh5QtI9D(E4W?lT+UfIr6Mzd4UmpJ>9-ydL+S+#fdb#_gguIX2&uxSI zF{VkYh9T|n02e1`PEAb;;+W9rf23__7~S^qp!eU8lW)MmPDHDR!XnCcXe81r)Bd$& z;Avv9UYP)p&%op{z2A@_InOae)jEWl4}As)XSnyr=9k6CckkVU*|44OT81|e3OhHw z-X>Ov3;jFES8Egt7)7C#Ez`ASo5I(3;s1sN4`8$-Jh{Bh#CzvrM(nA@Ees2^d?fEa z5ZQHBeX4eYh>ift!0`P3kM)GNQ{o#Uo{fpZp8BX4pLVAJh)GKw{prRhO9b#omk@Vr zd!5d?2n>()DtWBzDsQbnPmehg0zCs^OJq7|UXx z(y!WkTwW8a(-|V}&xP&`Qu@|RZP?(t&32{~jG2 zpyiZ6YafOV#CMuQhq#iWB18}X<^cc=;s@Io!ds4EogMu6_~TF9C?Khck=%8D?el?H zapD=tL$s;THrW!m7w;j`Eq%cl%#vAy!VmJ`OSMVPHlNnyn-!edB#p1Fze4~43UNnV z@VOPtXQ2_G7PzI`fKEj!tSO(*snrS0Ba#!%1i#U*F0XYXSRB8|%1k`O{DVGwOVrw4 zQNjhTCy*MUi$qR!{lJi6Orn!(t>D zCj!MoH=^pT<55~=q;qT|u4IdJSRfkEYY;~;Fad*iJ4t;fgF2*B$Tj`?p+pl8Jo3mg za#@+DTNr*r8DU&xJja!@bo?ijX7BWEeQy~4w=9LeUB9Zfj>{$=EU=%q! zXcs;kd-?gtY%a;xv>cZYBiDlBrFJ&sh1kufSBzz8>NF1nvj?Ugd))`yVGugQL<-^) zxUf`483=?=Vr{EG{^$5yrSe*eQRnS2}NRwywZ@A{zf3hZ;O2VcWWfn8uv#-|yei_3y_ z8kB?aP`ReZE2lnd!xDC>Kuv*2<-q2r+j`{J%W9Kh_SAbojWypg{3QH_VFmmpytn8< zx09Wl`{mbT#aC{r*BLiFADiJZ?;3CpS-*Z-LaZ2>l8CVuLV$WY$^*@$@Sp`T2?=== z#b4IcTrEDT(DasT`(k~G@MH1X_$I0xs3J(1K!KPb<$nk~7T||daEg!$XwtACVgCz$ zBAWA0?#sSkv4zkwT5@K_y?jJ7)bb+REfIe%AmiHF#RSu83?Hcvprs5En2u6*R_H(@ z0*Z%*i^FMP0|1I}S1nmJa&r;$QK;&u^*vL&e@_(~Q>rEh-=zDwRn`(o3$X6_3By1e z4`kejo}$x554loR&53=833J#xr!3B3)|?M0%*ELecx5O6ZStAL?I)bou>>3mmC|rg zMH*yF?6sXeugW(l=8(s^d0_9M-Hi&w`2+hh1R?Rk@&C7$q*!4}SjnhWBbU9?`AsAD zAIndxdndr)%!Nk)d3bTJ+o^fNlxKf;nXDM|vOFGo$h^=2jRy27zVGR!?s*X&W9Z{V zi;VeMKnDgyHE{O?&jlaJ%v_K&eZsfJ`b<27^Zn)v8}_Q|>fP@~F7Wn8cm8PQi>|(X zbN4CTMO&_-vo%sI><|%pjJc8g_SzaRHKZDNp;j;oQc38;R5&Pd8yZB<2%~w<_=X#2 zVo=Mw=yjd-6aOaa7C@Fl9&Ne=F9Y%9U5@IMPNBj?W*Oum2s(!kvp$i@5LLm1Q|GrVPJINUxmL>8Qk1!|4UYg2~Cr{wg*Qv%b@A7g>Fe zBI_gc+g=GYr`KB%~;i_DTH1O+62M+e?k{%a`gjzw`WBU$1?A16RObH*`6;qjFHDTrF2-p~iyP#XEbeWe%h7HJv<`i@#=S}kDd$y38mX+$5ZexXC4K# zPe{}QkqOXspqdiRP&&AI1-qroBq+N>$l!hvYCaeaK2F%ss%^sVMgd2_z>FtpV@(i` zx6RNrbM!0w*PuQDa>{4FgB!r91-s7N+Bn{#ORHCZ4@B1(DA_cbHb?!Th`ay zp~P(VZZE4W-AQniMxju)#T!eOuFpAcMq{~OMyar;=%6fQ+BG=;w`c`QPM}7G4X!0% z>F5{HKjhbh`5Lg|*(y*cTOFc0d&O19fpVG^&zA1t? zGqitDUIPI1L?F9c2wx3b2alQi)r06;d8v1!CDi!i>FScp#rc>`69}XRbFMTpRg(D= z7DL1G7Qhgo@Bnu%O~azuf#8(Thb(Z;4a=nUxgp)a3qY|Do4mt~$^PXLzDuWKp&Vo@ zD1{SkNQrn3v0UwCM3^b|BhIg}LbQv+$d+z#c#KsLqm<^?%yN&{is1}lf`N#50Xagr zV0%}#l!u-SXy}Hhw2;H)@0)sDodLqd4TT-QFka93t>fQ&6I!gn5dZn5k-E6M(c1LKNfq4xH9&jhFV+$GV z4D*59tVjDs3|+)9n*oU%aR0x;Z1%rC^lMfjpXT9mW-0;m(+OXiebz~TwVhy5`k4pO zp4mRhS0gR;USzWRV@VlQe}xhPaazs_*i~)KYUl0(AZcTT{xK7EB_z&KFq;6M0E7*^ zebhUr{wk#>#BcPS;ti;AEQs>>k}Tyof$Qekwosv6o%(<|I*fewdn27F{zeu2+kyb6 zAx4N`1DB=|-%n{fFDIATDm0A0Dp}`epTcPm5eZrB1iG_gh09A0Nom(T^SgEIXF)`u z-k!*kPcc4pq-itB9lQHmi{d5ig5<{#MwGz@fOk-!!2|;x^^+F4Y_X%NX*f3%SVcz}v$NbyzBS*h#j2gU{oSS194AbIw4;W+-?o-2ZZzc% zIe$Nt1%W(NW1(mzw{Cgd5<;07n^p_Imrv4oGM|-Fwk~f2Y8Zhmjgc%3w@$v#4??u2 z0lU!GywT2bw~PWEc+R~_g>9kbbQJYtyLPj}{7+g3~>kn-zzvYki0mXW>-G42s z+Zw6{Nx$Ql&!!B2VW7)n`)D2XXr@Nb|C}gCjkQ( z15exTH|-IZ7TtLCXLJ5>_u9dsn|MyuE#B<{g6_<2RcUI*)sZR(Zm9sI)VPtL#y>OO z8P={e5V#Z0^PD2p z%S;HJ$Oq!$j~5HL;;l24oxg5JD_c9ifFiaDeAui~V&2)SAt0CU^|us*A}!xtXRQ&K`->q(dd>R{T%t_9K~Yzefrbn6O(>zy4w z0>T|ael7R#!*7WeytHIX)7S+PIQT$zf@>EHqckqhchwD(e|jBah03dxUrvYid~eU} z{0VQVDOipg?^<`Vf6;sM}`oN|zEp$p5W? z1C?Im?0PVD>zRsj^l4}u^0mM^$BB4`XDjgO-RQd^kup<{@kG*-_n$r`!WV-jSSRcS zprNM+Ceg^RkJXyA`Z$aj4`i=}Cz(@zD;$o++Jk?NE%D&z^n08EG?Ng=28t78v!u-V zB1yphPA3eVCYGe&F^3NbX+oe3`ziFd455P=X)IH(poNW>oP{ zRQasRsbQO%WbmIi(A9EE-u?w2LuiSp$$N6V9asJO=Wpq4UHUi<#DAf1xKR7 zZR}B&dce(&k41s!3cf8=2mK!~@z97`EcUmURQZ&eU`!*)K)(zo=m`4P+S-~MBy)*b zkv|$!P|cOyJ8Y}Z)}CL}0RlK3uu3p~pR8pe0xXbAL@9n*dSBhC{6q}nIp#sg;7FvY zS?jwC_#OnWfSs(l&1naiQnDhX@-o;j+m2Y6fV>F|zySaSYxgJZAOlcboZZ7?j*i#1 zPO=2kPgZFjC!v5!1q8{_=~x&EOfG_WD44|CWbW!Z{A&mbq5#}I zwVffp&&3o+L}9-BnkC-^l$v(^8vpaqR)-qDC{mB|Nf62%ms)na^5)Yc+qs%9ATk0= z3QBJ1KPV2aUJf@^*N$P_s3d7TQpPKGY9J|_|J)h@uP@vR7>(MnAsuIwbRHieCNy3G zn&(|1a<8(W1O$~Lq7wmkVvziS28e6QKc4zG1$BSmCiCCF1h z3k)S#8M*5*oGP(C9b1ZUwg@8HL!mpwtd)+KMND7X-;^yo9UpR0kc5Fx&(}ihov*nF8WdOW!Lcy z=wnEE>1Y{O-^R(T9>NaLfr0qj*Z+x(zf!7U7OU;F{~esmkm~fb!_E9VXZ%Xm`Su0@ zx-$!>+6}e5ydrg;;@P5#X{kd+m5ITd&FRX1l}Z0sKzMFi5AM={vHi{TR)>S%eDnm>+9JBy+(#{ISlAm!hjt~uG<4(e>Iy7lOwPUsLiuQra}T>P1x zljE5R{VHw&6rBZo_+r&ia&0CjnT-DI!TM z%LiYc`b2|S6k>4zBW*Ywu#@UpsVMJ$&#+L_;@x1{CB5$yVm~chWf;4;>9jT1=&(Ph z9>VGIxHe>qh3jbweP_<3BeG~!=I;_!0652hjYC-qsAF?e#0~m{en;6{K0Fa!5&b%p zq-%Thiy|yvqQV;HnBWTm`$ON4J^C~qCeZi8{D$OAM4Afw+tVsN_4(wk@9UmkUS1Qk zv#>#G_@PjPskYWlG?(1URC%A0u}Al~DQjJS;Qalu{Wo*4`S{B^8%QHXuiGr>WW~kZ zjCpROn)U(Z0Omx-bsoqf9w>9idw-@~7yme;l+u0Zu4yojlL{v|4|c7vh?O?|7Y=kA zP>&59U!0>!06Pv7uxEYrJL0J|zEc5dh5y~7=mh`t9&da0T5vngMUrl+R^ zJXbF1m6@(=HTr)e+MeMCM~h&A>Du4+und^aZ$~AerK<$H32jr--6xL@mNkB9DsTJG<)9h*| zy4gkp&<_4d3aw9Wf6%++-pjIn@C4r1%jWc=1OZf)Du2aVZv1BR^H6R6nT|Hxx_iQmdVSPC5V-fh4tdaDUrAN&sPZdioEr zNdw^Ar;(L^87Tr~{*20ihE}b9HhBYvNRb6a=syR#;-^s~2F$1ZqJB)P^e?fV%<&Z1 z8GEd{5q&1u*I9es)NMXh-4B5mi5yji{p&0H8hq3Uof{}ph=oj|(9vbadf#=*ziYu~ zF3Wot`t7_B#>|AcW2EvvTNrQ~P+H_g`ZjVfXTFrjP3lG2%A|)B3Ua%B!sn~UoGUYHcJ>INiB(3Pe_6xsB@i^MuS7B@ciX}a=(X?vY+-3fZt24Lx_=7g zl4iQrQn6ma`hYi=v+ALWdoJwkrb+hlhs`h0~RVX@Fw}m<>WwUWy_IeJ>f_zGip@ zHA}SwCPFlb!2QK;ByWHRjk_kMXH~NN4AS!?_g2gMzeXqzE-`~FhRJ|A=?sUx|??A)| zma_rnICt;Fg_Gq+?BSL2wILImYjBAQZh+T$#-G%PNhnh$40*QQRsP{aS8Xw@4LS`c~_xey)f{Ys8cCtb__jvK#cg}AQO8j@@y_XfZQwH}I zBbeMkXkxzs8DiHJA5r05uZW}&~0<>B7qHX zh=!f)-I*;WK+oC6BjR53a6lx-}5-9UUGb&gT*m5<=;k5J0Q* z7#qRT6Y=kdExS>Q@^zh;v?k!qgZTI5mst03HFdp zMI|aQb#!0#Wc9N9u+6&tg5jDLukWeL8@LDX4U>-Fdu{e-fHi;&PN8{P&x>UK?kJ2@ zIxu7W_G@HM3*M)gVhpb2_GdN+?Q^`$nb)Iu5~N~@#Wj;~n{d3OOjXRVQXxi~^1LnJ z?gi7pD8xY)0H?B)YtLS4U+Q#yKemq4r_)?q-{3su@m#Tfwba>^N6q2duG+HmqdJDs zS2;ZT`LWx6kD)?ss(29&}F?5bAP7DvUm{xl~h~pUfFo}nj0KJ zd40XZ#(&SYS4ret)reA$JBFc*iuJ3GVrT-YG4*m^za?epbjWyBPUiX9RJCTKshziX z3ebN>9EBV8l?RnrF2lZ5SQLgdCnGZ|K3_adU}eM6_wN%kbHa5-l@JPlP(c$a;3BltrT?a$=yk-S%m?HP!w`3vFGS`(V&NU?(4l)RC%5olN2Vth2kFXA+WJrP_`p0G#@*jQ-iyAanbIY{~u{CF_7= zazkQs)6K5~ownurW9)5#v`nm2NCd!D0~Siy577>1_-baJN z*C<&j;}7*A&({Ro5bsbMNJ3U(=GYhRKe4qi`s5302M1oH8MR`DqCvxj;Jq;4M&3Sn z2t|e^@!hsC00erW)qf8m*~;LX1Y1ST&Q^zRqzk!%cYKDD$RBiWw zc}a^8?tR%RDa%79FEuL(gm!pZB)=2pJ59qc0DAICz}$pE01W$Lz#QN)r({iKeJ`+- zyVcwglZ?)6bAy>mZnfl<1MR0i`34KOuC5%&`@IV-W$E&G(ZS#RryM6WRyiyqgQ2>n z27aXwZRf=%V;r<)fQ)<{8HpcPzpUWw?*L`OdHn3B@oV0|upkVh|7dBT&BAp$h4I_O zd}KX*|2DZ)zBSeCy~EEsex0=D$vrlu#*ICY!CzQ82lM0eDK&Sk?16btO0GxT6?mHn zy>7<9>zQfIr^I9=>z$CX>&GlrjbpreT;I*;5Moex|FiGjb>LAeH zIC+@Y+8Jy-KF{-&-%!D7{OgwQuGnC5XV7}spzlW$fn+jLb-nJt-Yy?n(ys|A?XDU_ zr#cgOQu2c&1jf480bnA0J$0_XUk|0%_wSUGjZ%-QXiKU!Sb=FW?B7%Im^(&DJb^P# zL`min+S?ZV1-AWTGV+zsvkV!!5Pyv_e@ArNDnn$C?wtZo%9zhvu7NR~?6k3NU@VFd z%s41^{lqLI9~3=6P*1r-Qy2~WmYqU+$Q!1-ijj7|G1Xg?t}gBv`sHE08}6^UL2uT5 zT8@>v>6H%Ga?AVhNtNOCJ8xd0>FmeBZ|qpj-)Mxmw;1)@#&x{n{q0Jo;euz(Esk$7 zdx`dg`d0ZHx8UD~Lx7%dw%$87BM`q%@eno+aP#s)V<`Eccnqq-WHdnhpR!l9yiV+j zmR`lB4BeBR`BAkWA3GOO+q1J7CHX<~DB5kO*xXatJ`*UbdQ0s= zSvNc=$`?m0py@a`iBk>fs3WPXw5-e>N-o;i4%dd|@=FnI4f`YN4d=VCsO38QWP3Jb z3&-t^yF4k4rqK|6nZIE?f=E6&5KJ%}_XTyQf)~?@u`G|u(VQVn%{oc@+oN0Hvkk2T zNJFmCor50$Qg}iS5UKnY!XF`jr|Ux@+WR-ITsmoZMdE?9Ff!v65A`Vx;7!URK(`BV zPZc8>mD`S*Q;y>*9657klOp0{=(Oud%4eX z71ORCt_C$d@m(~xWHu-mjO5JGXYYA^g;UWc`W!PCGr6ACIfs*4+WY-bxJFMG9;Cv* z#qKaeLfm5%H3ANqag>V3EO}F4Q%nxDcW_OZaixN_1X6ReutR}=IEhtf{ax{aM@VgJ z2ySZWkN>p^?{)hf?`Qn0<*fi@gk{TD%`N|O@^cuLP(la!s4Cjc-vkZfmb|19-9#n# zA$Lsmc+BM`ngCgfRIJqy*3NJ5R#V4@{rPKX_Tim_7a0~_-QyQ(c>~?Se}&zX)@%qd znH5GiVGr~T)hNV!NJ|w*hY*7xqg^BS$bu)=&iZve@r(*?YGcsC=oy;3cS@E2(RBo-?0lyqA+l-MQCQVZ02=v8WbF4v$4Q(Y-A>^Ev!V>Gk{vG<8o5N#rw}QRmucvJ21Zlxq5t-n-f15inE)3? za0G%)G;y79K}>m7@r=jYtDOv;>e3yD3+HpA82 zw8=_WOyb#_(-fO8W%pWl4qK_`BK=qq)E_6hW&4sXLY{wCfT@F+s*@)qnDQz`;!c%N zwr{19;UkR6{m`wsGWy1CQ_in3w75LEVH)HQLj3oITQ&@$TzOJ{KwRjsh@A!V0QUjfAgWi^{#09w-!kjVYRs-&YcG<{ps9pdOe<*Lx9D>%U8;%D4n>Ja5hRajVWTsZWo z3Ub3T0rsP+sj#<(C9r~vBdHhKVA|Mc)?#NGbQ}hhSMpw}VCK%V4gFBdA0C&+eJ<{j zj#?0i;7JMGM_;-pwu?4e?F0)AV9ShU`NJ6<<*Y#!QF_>FfnZb^=;U-X1k8T@aRYY; zINR~_QXfQPo6B(~OQ<}J$cvh-P-LoO-D#b+;tycIWA3STiKNHV1X9CZtn3}m@bx;; z7kjbmpV#Y1;@G9jOv`k*DL5!%CBH!%1=-C=KN&~?$^(DxS9ms5hr%)WKQTtiA~qnJGwZPm)CY9 z`;gYxp(u5nPQLL%dIYBjwUuN$d*u?j((w48s>dy5%*ugj%G0&-Au%#SS){~+)i|() zi{?aKhBj6JM5Yi2u3gI)=A#VDpLN!Ohfi_olZ~Qk@K5WQTvYlQzDI`}Ej+RAfoU=| z{ujig*N2-Y4#(1`wj*9$hNnMW&D6^y)q}j%N1qnT>7EKRPI@1)BG{@rZe<=>iLS%^ zdhz%=4k-$x;58tp8`O@wK0Id4=9HHTc2%)~wyzUP5<{7`tuo+$zK#$78@=9-5y zYi7K~#+-)IVeOwxTAI)`Nj}xsI6(=)wr=gH0BJ4oJpa#$ZpCeR*B6p(*Vg8%e(Nsl zNkNfBmyv8rPo}&~h@_edqj@qE zI&+QcJa!|0qa(oH5d1T3A3f>;aAilfc+BsyyXVVvr(u7}Q{`Ya&N(*|Q{Cu<7NtC& z{ua6t;B|6Pu=sX8e^h28KqFjJ{ocFdWMjJL(#8hr2j1~;>&$(2_rTATnr&Q+apZBG zVmpaP4{lt6#&NvVY^`Uk7+J&Jo5EXJ)p!#AqHqFjnk0N^#@-{6(B-T&QjL z#mMHvSGcK=tO4D#!t6sD1yH@tyxEr{zi5LZxLR|xI;*ZslfH~IFI6WRI}eoOO6E;E zIO+0se0hIAiFD-Nqg-7hnM1D`4!Mo>0<~6bWJ((vXv5q7$CK$X_yx;}Ec+ik2s(eu z^s3u>Vrp*n5167IZCBP-DHYxqDAiMxd4xgJ%Tkc|obxiK6|E0ZMyv4w#MvPtzQKb9 zha=W7d$*9ui@aMB66;9UBg?7OTMd(oo{xcpVJ+j6d%{nMsZHHXcsLHOs{1zSka0DL z&_?mmiYYQb6eh@dJD11emy@m(*ZJd(u_?~J@Dur*7HAqyeifH}4p_MahK+Vs?g<*# z6&g(oCLNc&4*jCvj$!O3D|J^qpX$BdCrs3UaXyFiM3))NDKn2kBd*f)VFDTMjdY-4 zM*~~h1_%{E2Za$Y5I2j<8kNiS5#bQ9BX`;_xNrkO;O4d}vy)%@W$0;ik@_cR`a~a%VD1mAjXPnlK*pd;0pQ=?f+K z$hk`Kw~Az_t8S{CruU+^>v*<3dd%N4mfgeKxm$x7P(u(f4s2wgXIomj#e-WU(u%?& z%4nrWRj)VfWmu3}Cs))@qD{1}_YqxXUAJxskw?g+B5t_K7|B8xMjvF-f2-2(a!@q! z(>V=cW1s_34BA@|J}vXH>B{3>I}RmR+bPmEhDUy*UD9vcCi<<*(aoo**urjAWq@!1 zeen+djftQ_DH-{)5Je#5{^%(2&5_7|7i}Pd`r>#EC0l3|bzd3RGXLT3$8<-0lh`qD zbZCM%HaA}luGtIGcEoZ3dj^_yJ~1&sDw(Ng#?jE3pE5tmI0+NXSd}W{YG=#yY4;Qh zAJFf4AQ#yR_UQBkmhtc;~u1ECHc|t%T6e05+a>jaEzWgQ0A9#rrNs4SrdS z3@b3&&FZ|4ok~oC*++P~czlmYQlbK_a?&v#tZCQwl%+Rg6j>14T_DQ^G_^f{NhwcQ zanIb4^G}!OiC$@M?H%ults(!~8+iN^z>)?*m<^P6$aVuG5trS?PA1sjb*_xjNA*qF z?)D8R@CY+i7g%4ah;;C4qE9Goi%At-Y)B*n4G|FIZRx|>NDE(W}A z%891h^=d|6Ud#r(^LAwVIL^L}FBvB>zYov>%~du+A+8Ap~zZW4{U7oTchARR;+0{SRWH0KpXiCg^cKBhQJpm$^H6asZ|h zQ2$oc)-sVP54lc8NyCEEVjJe$MII>E2tyM3dYPfoINGC^vC(LN$*KRp z1Lo{N{DK={gOAv@4o55}V`I$Ep%Yfc9D3>4>fTqX$ATg(afR8k60_YlJu^WA7twQC za!fR;zJXXM)8uUmWvaDH$W9Ji)4Y@jWn2TAiimwz1iXxx?{b`gW@TY2QjRu4j`ngF z|Jv_hwVzX*A1->iIyOME3bo66ou6X{JVh=XoH0XP`!4V>|2K9kpZ9%4vj9j7q!7s& zSVH12Y!mt4E+ro*oXX zo?U|X>gb#Q9)%9sDYpg7i7ri~KKC=T!(iW8YRkiJC<=na&HFF_6@9=1l?4>Hs&l=r7nH0F#&& zcftV(sDqphp^%bw)+=2e;j!m5=#oewS*cgbISn+a#KwvKPOAgx9!rzqf8I3jHfffO z(*AcXzOGU}U;P8C0HOYS`c&~)15^4b5~D$q_&+mtRc9NYJW@lX^w0ZUF@vQd zBBQ_u@j7z>TlQPfYGxH@yiZz1wZCM|99{ZIL2n~t~fJmt72c#B3k~AdHVRBjrm?};e66k z02Ypi`K<(pV$Y72&3yo`@M5QU<)L<>(zUqD?~BSMR$OC6-hAWjcI905oQopE zac77fC4F&Zn=Sj-(>JN9-zb7#h*3`^ihMeMf9CGCOp=`OUZ#Cxlmb5!pN|iHC5_55 zpXhSbND}{JB)Wc5om@arCM%-5ngxr z4oViRm4X?%|An`}a(x~}uy(`KLFeKZiD=2HmEX`H-OO&CC{1kZ=uMP-ao&zF#0Zo< zH*Ib?f8;GrDSjTB;O~;U?v*hCq_x3+pWKmOG0Du2FdxGU+ibafBH+3`B|aa7+Go1= zVr~YdBE93=t^=9^OIM(E+}EwyogSr!o>$nk#P5`r>sF7l_E6P(Y5yIp3zj;(JkSC_ z(~{>W+`DHGq}Yd$TRwzEdQ`!cJ?16mjrww2aK`lwFDY5f#-Tmg*Mo^UK^2sr6$%Y( z)_ChAbod=vJuAf zT;^I=x^;o+GuGsGPxnE9J8}WOsE%mRY$3^!i=dR(BXJK+7u8?{=$KJ4Xaf?eH?SApC?Z%&+B*ZH|i1iTM!Cx4xszy zAnkPhf&MNSkHg?WbViElck!*odgKB#jv!JixZVJtp0aKEb#uAu+h2FE3YCaQ*(X3R zehBO~Z{+wzn5zQ}yM}Qn71B0x8&a$DVonHw@c~+L2s(6d*gr*84#MN$_VXTR|K07i zc9j&~id1t$V7dk|2loG#6cO`3!xpDdc*(8bIC-T)nz>QZPz;}kHGFx}ySf-=ZXzc+ zGY?)~C~a9W{41scFgN4?-?OD9_)A1HNRGC)2u%N7+u!WwejIa-@U^BSB4Cf7kM4tq zz<#%HUrAZ>&ykV%m==OSf~#(fKtHIK=A4U>`7f`t@i{<;tsmUgdjCBVcTz755$z~e z2aV*F%re_BlyhE0MY}iNrRi*wm6HRb_r~*|k1oNtfTmC-!^}*^MGJ=}DmZ91TF~F- zyz&ciCQBFk2kPJ6$@6xnk{Bv9=<4)D2wMv%-AKueUvZH^2W42~KZKL?<0FN!3UY6H z3l0tX6R=f+d7Qq-mGi9og*7v%72Hg5XL{#zG#Z!dYsKaU(UXDv*Vo?%?iD~lfI04M zj>5u1d;_t`0k{fNtP-2_w}ZHngQL>*v;0z!S4cS`GrY+pp!`4&HP;2_>%^qQQ-0s` zLa&oZeo$~BUXRGU^xPBHM_ny0P`b)0FnhhnwG_wft=K)g3bvu34TLc=@RMurEeKzRB-$aw`jqxbqUqXNKfWR1b3AaW6ZrRO}s@v8m5P@O| zq`o3GmJyfLvT^2fu%FO$?jppq-&?J`0A4K{Ug~!DCz_DPNPd{~HzEP@;Gv?sVz(O)QZvr{yJ-k0 z5Hv?9!4MrE5PlZOA0lUJq^+Z+Y$TfNv*XYxTf7Nn^;;Ae*>Hv(edKYahQEQI(8h{9 zC9%bkDT0*O6HUr9<3DTizGh?3lD-|Gf~Ri0V2itR=f7!W28&;Fi<=@dTOHdXjJ-Nr zIR#tM;DFuS-qv8fi+^+$Tz~IzE^6PuY{QD1t`DNgreB>fJT6H4MU%@dmx5$6fG)@x`3@52X**gawdQQME z1N95g5$=3Q>1;~*Ps$5LuiRtd?;Hq`&ZsEMD zkn=u0!dn33O<=sp`j+&dRw_i&BzuSZ;h_J@6D6`MwJCrBi9#VteEFO;0-{PGZVAlw zV-)CN&ls|=D>$E+Odij>gizOqTirRhe;GI!sgcu)8LYg6Jx_y!$;|7tx(x*0GNby= z(^L4~gi;}^6@&PwFI!VoI;i7Nl@Wj$F))=B{g@*_5ejE1xTeGS)!tx(5#PlOQE`7{z9nRYJHA3MWj#189}v-vNHY8WYln#IhRuM2nmsa~|vy{TcUU&U^*@ zHq8aNvOz}%aS*KRkKLQnUJj+J!?+OkL7`sPvoK(jb&d&MuHkrn=oZFJ_0TZplFq@%vy(2#L$V*Uhle{tP*Cqy~HRT$5m^pfZ=;qYWHS3OaM2^*%8Gf2u~q zpXD&Vhk=Nw0Cvlb=%{wM!GmzNy&Wp{@B-p>ZKrUcCSfLa4R6Om#L3^N!* z!Iox8z&?u>%fao-p+1)z@+2wr*IaX)h^N9rJ{0Y4)BrJ1lz9xQ@|5IG5|OS+kr`JH zNI@rNXOBIY<$qRN!?voLoY$*Y@;eJrcRJBwuDBEMGk7+D>>KOLj9uSUL_9TQZE^7P zuO4Z5d;;vUWE6k~M3(KwpT{8B)G;t%aNW3@pdD`gAaZt?WN}_(jsYYi!)H6M4{w+D zosk#On_(NM+Dc5`9h`9mqyg7}&`5{m3-MPKZ29TIXlS+f( zSnA%8ZZylFggDwX`WNIDX``uGq*?S?*|{Pd`{^%6E&ajNK0gpNbkOR-u=!2Zc~*+d ziQN#s^1g`SKT&@?9$(Bxj5Jws0Wv4fd^cHUz68^*RwQm~jKTd|zgA`6c}Px1 zMw6gKHn!AVy|swLk-D}=PjXm9Gz?t@x`6~UK%@onL*@#QdlkVL*T>Gv0VydQmP&2Y zi$EJlO-)7kGwC;ZBp^IzfW@v^s+|ea#&rrld_ zr-J;@qLPi%vB}5p|B*=ZWwc2P$&Ek$St@Ku$OcA5?=oC_qJt-HSxA+5o2G`2nO|T4 zRH;J9sf;3$w)kehY*$949~N9nYU)cfv(9ny#K_3o2vZuL04!`a+{kC@Y1ws|X=3Pg@vpPcX4~*-pt#k1N%EsjQE6;Jg z#cWX+ocJ6+p!TW%&C}?+f8Q9}n9J6)iJYu(HV#Eu~L;x$PfSa?Vn-3mjX7;OKQxpc}P4Gbl=Y_fBD;L3P2fZ zxBgRq6lDzW08>+U*0u2S*HA?S^akUx{bD8cwiHQOTIgjbpPIIK>zV3%zOH%(-cJ2x zzDFf=SCiNVdOETgNuFz>R#z{@~n&h$cF%lPD^(C;xjztpv+kGh9~ zq8-NQ$&!Zye+52hg@u`u9dXRfJ&w5@3+^m|6gXj~al0mg~_nohHXZi?U@T!N1tM zuB|O7*9;nLkD|WA-plkkXGY}Tzyuwy%e360>=~*}E;U}JY|f|9)+^Bakt zED6>T>wRvqs5y4o)^?FL;}3QMm!%g!G1T)lOrV#aK%KRvTsxnV;1B1p#xKYWF75wS zmlke9jP@{|HY#Pc;=e)>gcueo{{!Y3D6#U1zihw)J_VfVbhiWl?DAj$z(7&Yr}vs% zxA^KCIdB`p*oNXBXi_9@)brfGjY!Xd$gk6*GT&c7e2A3GwJ4jA;lIX0W*oX8vlzsW z#@Ld45z${u)Vq)|7A`0Sh#i#fP#d8ow<|!w1Edl-tgEe6t|Wo(?CN^bI%9_Kv}K)p zB0@SQMlSmHZCcxfIelj?)#Dgm&ejMST3`Zjff?}lcrxeAOM|g|eYVQ_`k(ARdpKg( zr;E}x=;B2}cGRa7r_A;CP&toU@|*%){0x!z0wL0EaL|?h*|YkrhJ=>hvgY$J1kDJHg7NHQ(y#idTX%Eg{Z&Mlr+bKG^B6sdU>(e!6h)>Yd@KT4m_Iac;-hKdfZNy+50sZfsW_?Xpw1%W=` zDgtLj&N;etYy)vZdL0hQ!(1OmgLop%^Rnh{0_WMS{Hyrbdm?ZanwFpbl~l}D+cl%y zXuS!*Y-N`wVUrs(d-;?Ms+X_vsicUUb`o!YiJqk?Vg z)KHW1@rbaaBicue>(3dt@%U3E{s2KyUUOx{kPJvPE4}P3OZ&^cP!g!#M~nC8{VTM~ zAoQ1b;Q_c9LNwD7cwWIxs#fNyxf72rCWVpgiK{*O3@tf-cvP2}RrvBJkYj zU738`nG5{^K;+OrcgMDEZnyDRD=Q)yB+?=maL8h&ckz_!KKWlu1}1Rij&TsOgwXmT z$l@?Qp|%17jB-$TAwJ0QF<-T{=O4v#v}sw3#pgr#-!WuKXYgs? z+f?(0q}yeFAEVSH!UjGD$8RWb0QXd5S~}8*8ZkLBrur2AnZHK7=?;3qAlPiwnv-;V z@r;Y@_#As216@=WlH<#l0gs-4fry&dd`*v)pRMgnVYuBfct|c`@jb{b@xSs4!Qw?2 zaw|V{++>)Ib{JaS7X1scj>1fL92?SY7ZFaiy1hBBsD>T`s|TEXdqMnZ#64qFI*%W5YxOs511z8Q~OP=ElU|5{bIrg%C8 zM;-2QPodbQ2h~E|=;se-g3*!}rUav4G_<<%E7j|AuR9~*yVyF_?u)-@y9Uu?4r-jn z$XCX`A5fLS$m@+)T2Cm}J7mrMaw#uOu!#e5TP;$hFvdaF=ratq7~b-RtjyqC%0LcD z*Tl(MnhV!@)wY*IOvuvrWt@6dfB=5M(z>Z9ztgo@_AJyV{(t;fsONa@M>dmjWuQ09 zW%k~3q7IcL)C_YUGq-9jn+Ga4Hp1^Jwux8{2R#6A0@AV0PlXH>pBx3&7$>`j?JiGG z2R$jJVCrG=o)d=CM5sQFzn3dnzst#k|8a-KkFKd|Yed<+GiPC*e^a1pgEBUlA2du= zCVN-|nkEDj){Lv0@4!KPe+^^dMS2UyV9P2-8|nF~&B#Vjf91v2(28eAE*fT`7C02?gU+yc&gzpH zEhC}=Cb8_E96@a`5(DLEEn9_wC>DqH;X_AFRAuUOQ=1iLn)gFY9*KH=8$lE?z#N|5 zWCdny;O#m$SKFT#oExa;A6tgchUK7m+~c{*XzR=2-VYc-ZkbwQ6#6?w0r##)ixb|9#JcGg3-& z$f&*VxYxgWFkNdOpw9-SdB#sU+i<3=fIeb}NaE&s|$#1`Y3d#>r{t2<=mlN59Wd8 z9BQ^doNsTM1nwVsq&o@CoOp7~o7B1bxBW2wXe^Rq2BTaB`UM~y2;2ogScmnMjC4EW zDEaNM{NK%ww2xM(LVje&&F6>7?)P{o1U3X*(+;QSJcIlqP>y zvH0^UdNF4hLBSf|qj-&-MMT)Z8!!D8qp)lf-Mdigsxk5GUeRWZSn(BWmwcPLC_(1j zXb{h`3H=N_kAkqQ6O*Xi%9MQygxJg;l-Y<`IxRzmse;q0@k1i4#T8?!5jBitWT!$t zU^FT(%SSJysD-)be=s@#7HyO?E!7zE%8w8P2~P*UEJT$?ESvm5RTdX&1>PG+3jPeU zyY8_ma03M%_Q<@0;*S=oQ_z7PtA8FayZF8NiOX4t9Ub{m8{ z*60E2>x=OCa~e311t_S_3sV8sd8(}ZmHwqtCqX$YPUe8c^z{=zxPJiBNKi62qHZY@ zPP6f=J3+zOkpDv$OaT8RhD)Yqn2~2wvb4sRCzV54LzbJutyWc8hQU7J@+G4WqVAx^ z;NXRK;mU}dCC9tEr_J^J z6Tn=A8XE#eXrdC#b@B1y0A0}^6P-jF){5?LiwD4jg_@(7xOXjfS8~LK0ysBdB&7Y; z_vP<0egB(tBbwB$y#>4?wPc34Gb(cOgVyLq!~U8#+45T6NO?nJz1dYM?{2PGFFS!% z68-B}5=hs4w<4z3cXX4T|Kc3FUn0BJQ(w*Pi=Wn9HU&RgD+PmH01A3!e8rsz7K%jm zXoWYQDM??=T=;VyKCMCQUoj^e6K!TwB|@z*zAW^$^^Y6%@sCJ;E^|dywn(CGZ0yEm zwod9r-*YwY>EDZmea?0-{p%y7F;TTzSIquJ>ZCJY@=}NL0{yO&9ue7!Y`WVRx$U`Kg7-5pDwPQztny z2}u(--R7R|>wWGe`viQ^cFFTptT^4ZU}i#NLLDiKJoGmhA2e#CKtxj1!N;OhD&e(g zIR^6L0nOCFcEztJ)OL00FA1h97>KYE6B9$a-q#ly;?n#_zIz3T!4Elc49*ec0)h^D zG*;#==KNZ7UE(IgL1dtN9k?7=oV3de?q3xN$km zwtaIs*B}`P&8qYCXd4*k@%PVXOT;8Rmm6S;CFr<<8)^muCfGk8G{Q{Fe}H$kqxf+h z@(MNx#XAcvr9y(K%s32^LIyBUofa3qO<^F^)&v2c(5z4{$RUdl(TonH#hfKck$!hJ zfLjG*Q108^V*J3=uS^Q4#s90z>hv-b>yS#BCQ7O1b8+YOvB0E6e+6C@bp=ZN&oLR0)>5rH!1PHjD8=lLPjjfJ+g_{&8Q({*Q7%o1zSa;fOk0b)|X0kG!>F zZ!c3Rt0gellf!z7 zZ$;{HAi=|PXiHB-Bd%m2bt4AMK_jE%MBc?t2L;`Nyt2x&Xi92o_(byuXHZ>61H%~~ zrSDCZQ2fbbX>#NDgA={;+k0k-a4DAS?})n1*qx@(G1Jn~$*_hG zl|081A9}`v8-bFmMCiV7Ahjm*;|JZ#E>*7vX5alun+j<%<9FBJ zrPuauFSs$~!<1E^e{nu#QD6=eGeJWD_C|e?e8weHK9%QOF6?CCh6b%iBp)NYeIN6G ze2OSI44agOtL>@J{9T764GEdV=*AuW45$(-g;2Fkh1P&-tIwv%L~J>-@omZ)7#oR~ zz64UFMK-!itZyHn_Q73P2Qn%$ZyLb+Ny+KdnK+JR>UN7X=>5Q4Kl8Lv-B^yBmK#C5i+s$PTQZOPp*5VrnccRRSLwMIKK4BIx?3h0L4x0q3j};-eziea zRbF!s`xY=SsBlO@P!1J7oJUquJ_Kf<=dhZ3n1t{Npt=x(v8i0{-r<8k&H(s*a}Z3E zL#4vvAQ8$P`)5X(sr@5sP&GDnz^z4q3M>|!9!di}GePOd%NG>LZu64pnp8Qrzj-u8 z4Zl&hslpW5yWuj{Mf3llAwu^4bm&FxI}znT9f_|8<@l@3F-_26Db9QST6yLVUCJ*@D>n0&jzcYy_Z+!v4({k#^I7w8i?UQ|D~{$U z&9GE_`azqLLLb+sZ1(Vj4xQil$?~awZ6=ZfhC{eSD>Zk`I35b#1G}i=l^FE@=K{1` zd(T~rM)%Mb%&dQfFT<9kNbx(Q&6tBUiu`HTZs78rfYu6DXt!X3b`>e!TVYqH4>f`Q zb_YAZ=L{RXs#*V|j>?rRUB!*o`-}EQ!`bp`8iTwa*iaf!&1HLdKP!3Wa&oLy|EA%#P*oLB{+nvVDyH&h z-pni~GFqobiE%!e+HP6VCq^IrB$cI7q|V&4Ye{%-usaZsMsDW3DON&Gtj;!z?#-QZ zPw{`AKD1~zndbJ=nA%aHt(z`F@lP0_-`HpNQAH1EBa8p=MeND7!bv1bBP zT6BLLK;`rA-zz_E)4k4(xcDUXw@(SFCb0F_HF|ZW&)(YGLcfO2TQzEYS~iP z_M$3TeI<<|Ubzv$?V!u}_lxfdlNpg1Q6|=%w8CB&N*B&F?^NG>RFQVJA&*1{@N@_J zIS3DCXA4SY4NJ8VEO>y{|HU~0+f|MAwVasXziK6{(mdt#>wID@6(T8|?_iwF-xf)t1=e6>R0{2b|%S5pHFJ#nB zkJOpjpZCnGTirZlA0lme14uouy$Z*0jTSWr)@Kk zG0=`*gwV(J&>eMt9(}WPaJE|Q?lo!jHMQP-k|}vr8ZDa}|s) z`uWA@)o_`|3j(w-|xNfF3}_I@A; z%%^9SnbTsTWxzU?E#yucF<|ukS(fQoZmZ;EdpOK7ncT96l{K}c!IlKvxSve)O*UKhG& zPaD&4G5~YQa-9e_R+qUi#lGf2r;uJ={wl6W#kDDki6fe&)t8{(CaaSBl%v!CC0^Wz zi!78&#(87=o7|8mJ?_kPj>c=p zWg0Xo%xQUr=v$*k4qjf3w*O8<>}D^R-X=6CqkBegi_L5u9c#YqH9y^Gd7sLUJlf(x z&OrZS`Z33b)YmAbXfXvcb2%MJS(YKA7ZNFV65Y>zjwr9ZKS^j~n%}3FnM3=*N$4Q@ zm#=^>Q=M5+u_us^X&<>#gUj>50$F!RbX@Dpo9`Q~RKahTeDv+^UQ2TIF&gW7g&!?k7DYto0lJ!~MrQS0hjB&ZvL`*anX#TIhUXp)Q=mQGLQi8Sj%ei} z#ie^fs5AP`bR5hCKq>|qdxc*bt_wFf#2maC!es>r+N>3NNR=MA)V(0B&RhCMFtSb9 zcsu^o>T4$7jBJ(8+pNw{2PC{(rGqb9O7*10cRnwdoWJ!b+VF|K zbOfTPuBi5%$MoXvno?JIe+l zo0Bd--p-7U}6Fq~bMr>lN z00%R}aBFnmBR|Xk|CQaOPt7PjHJ4__pXo4EpB2-@rHyZ=-(#ScwkiGuYhBFwYz z@G#VxMO?X4?I_ydm@fJ0Uy;FK+N$^GY0gzeoAMk-FBuK0b9VTh%68xT41Ds@A6}^N z|3oOtYW;u_?OD8^{%BREiI#h8<`w2E8F?AXgX}Dume`?J?>XPIFZM0&0aOkXH+dC8 zY7&(t)yHaIo=0=PCL@k=J_del5}VP=KqT4qSJo2o zwADa@i|EHVG-#n_v3tsL`KjnAGCArC<)r00xS3H%D$2?r6`S#$0}-bP6~s-RfRnNK zoz@rCzoL4(7EkifpES%oOzn-Cn#tELnLoLZf0Xdkm?O>dqXZrU(tFC@3gC+XShTXb z0%&nSMy$X0VtRvsl-9R=d6nn_mC@OuoQj|@mu*Z*Nu{uJcgE%FV5Ko<4W}*C==9b4 zBA(p^8b11V4X$n6cwd?OIy`jX(9V!hoz|I9< zpsVJ1k~fc4*KB^-o9ijfCdJNC=EfO= z=f+0Kb6rC{)9Z|HZvxtk1-`_qZ!zpkXFNsu_fZ_?aSICz-eijJ7sH3EJ45k~^R(1e zyr-mPACYf1j0;8MY|4usNPTtAYOZ8LbJwc3dFH!i66=#{Y5xe#Rc%ODTuCM~A@-(t zY|+`8)=WFIBjD@>E)86upyqDAI({K`vB_;S)9gLA5%nl_YU?}XR~>jjew8=pn$T|J z*ec!q&<|wfbQucJvW3VZco1AKU(#zbdz~kPq?6}<*Xlv~IAv0t0!qSruKZ!Of4D6Z zs`(o8FxLPsIvvMt^o}2D7<}Izt$l@HY9MW{f;$gd#_#cN4w2f!-Q5tXq!T%@e66aC zq911D%QBwwI0NWPIb zyxuy@#Ek>R5%V=)Dll5go698+ke|L!2jWSLF~s))TP!vdjc}{|K9KJ~zi(xQ3q|JJ z?q`hkYeNeo?)}RSM_r$wkEn`b#I>l|kB@I;VVI+^{3G%i+6r)l=z<|!R-q{eDegc- zJ%LqQxn1-TlxPT9_wm1y!1h<}zQ6aflm>E`)CC?htmbVNey^rf4<(A?WBFMZNt930 zRIWk%?&+1+HRn)2-`B`6yH|N4iSH$H!w8e5Lo|8B`GtECrcQ;!wXEUB912Xt|HyY? zcmY)Zb@?IFA<(LSHJih&sI_cGQyzP7vW}EyWc0N zxLYs^ zs(-O|yq-Ue!30CmqgtHfsTrWeV_Zabo zrJvq&&X^;S8a2i{bBA!j%9@5=@vHr$&EBCZ)UjI7`TfpEuJbpqx&RVP@a5WETWad6h^S?P9B599F0g; z$JTB9JGwgGCT!oO$&<9tJwY86s4K$xwWZ;deWhbLyOcOz8f<6j1y^9_@AKx;jZdq%ihI>ydUw&o2u66oc|jMY zgwxB7_I@j6{J}~<|6WIkHH;8=>u1=Om2QpEbk2TXc?dU1bc72!3bJYWcmQ28TT+#AGHEsg<<9IpIP(@FIY#U%%NQ=((Z$tzuW+NSq3I!8SbVTZ%63c4VC#wE1~3 zJh0?J7bTIv>Vs(kEH~tqmK|A$HUa}cuqx%w=s|km^vN2CVh*M`bFaEef;K>&x^DBF z@=>S3;$O!X%5tU2KxLSw5LV>#RCJ_EJlWp9 z4F`dVZP!a!zuloMcG8%Cf=DM1w!YHk=jpJ56Hvllb~Cta1@&&Ntdzb$L;0kqio{k! zo;mh}gLG3~>+y`L2r2HdrjxfA^`1_I!~;KY<6k^l7`3?}q+C7(548pRci9Anlw`Mq zq=5bWj{W+%2?uUkcUkB6?(ETb4rH5)6=lbyfgsY%QO686(ZO|WJ~bWW7SI+Tlx4IY zB@?~U!(qTSY5896dco(^VCJ03AWtw$_)heyIRW*TKeCJZcbt=t3nI6Ht&Y0e)R2>C zE~>#)cO<*#A0u>iWRp(hlx%6Juk<~y6XS|X14^i=&(B%BQhsT?t+^m#^{dx*ZZJ@)xxI(vhMU?3dWRC37^8+D z85t2gzkwY_Zaz7BqPCp_!at%tbTOFf67fp4A{jnA;EQ)&+>q#Ub0SdoR?4L&;E@~o$GY}8Wm*tcI1{g^$2{jK@I>v6?~puRYj@r4Kt(5wZf8{?Pi|9CF$|z zpFb~aVs8+Tuz>-SsPdAseRLoeBFZ`AL{)Zat_Wx!TWFx8C)I~?zR+BHM^9_SLwgH_|5R;>et-Y z@@l>j=8ByuzMFzEx}WoD!oo!xb}7L|^49TBJSeNOr`-ICDvsXDj#Qn`GF(L2nCyul zIH)eJJ@>G$wCxgmyMQ%tUX_|?K0i#JrcxqMGs|?0G+V_h6^aHP1a<-u0~-jIu}a}Z zR4x1uGuojYXR1({uZI`pcs*slw|%e12Cc-d$5#~_Zl5*YmyVUXR$g=Z`;!E6vC4zR z42{`Xi^NBm^3!$i<_+7eL=dHP41T^!Y6g$WwJvvz<8FVA)Q|$M5rXMB_vf5 z<)Axr=UrozNVR%XY+8|-ruY}(dtVssG7c`TP8$tJZM9A)j?TT%F0Xy^26s*thh4V% z9aXM^hs%hyh`EX{Qatc6m20LVA$bT4H^RH91fn4~18j^?Z<9b$h+$b0oQqs3UJJ8k zO@`4RqwUyQ0X9i_zS&lPI-^I~YG{0{VOcluoH7kt`fKBr59vznja%=L!C_pR6m;u! z2n8wqRov!3mbX(=W=*r%&e6A(6j9usD*31?wNn@xujJ>ocibwF36)#boAnB5ot6eX zlG->hp5)!M=zt*M5FbmbB9+_hYn)-x-D}a~DgUF@Ti-lIKOPC~Ghg$;4+Q-FXEoLY z->hM@WzCa{neVo`r-2V9EI;g?VWJTBYP2j$`1#F6_ik+$Zo|>fnuJqk_yVF6As=-z zODr&MN8zCBo|0LjQndIVJEy$BCQ)9h4$NY?jv_VrEsaFAdy&t)=b1JO(9uv|HYy9+EKss#A1O*NsiOtB3g5hh_;*TI20Aiff zyj@FybXI3peo&F)gu`!h1HDc$%%t8?)lzSQ{xR`L?}kcpVPNm#Lx7NW32!{g@H}~M zJ8I*^#$LLl>UY2_@jy#!;%prWK4rrcP9w{NdH&C>QyCuf;CnjTqbiQL%yopZ(!Z%3 ztg{g>qUhk9b5t_kUjBPDn|Vd?g3`JjG9g1vrGz-S^C?#?0EL^kun>Bxnuq8=I%0HLeax9YW3Op8hb6&Tg?sCWZR|sqn z;?Tc;)H~p-aS*6g5g4*(8-HcTMfLYnQXje(0BjTiitT%+o+4DVF_@t;IYx|xs`Mj@ zhGV({JK(Q*E*#m7y!sBZN!=C~WdHp6b9xx3TEu_W-LFYdyg<(K~L9Sc=0y zT=al>f^U=7h}2e>t@}qbD*3$%J<$3!#>?voU>mC`W>ChvYdlqYvxzgzH+kFeXY-iU zb8#cWckReK=oU{k#6Kjy2x#W0QfF>@dORlhSd0GKFQ0GU*chy7ENdt;&pOJo1GMyVN{;f~VtkqS$wT{$n7-<`e|QE~3xj6cg+3 zJQWaY$pnu7NGBRx34VyQt_4#gyW__{(nE3ybfg}zZhXPayCWz;_de5V?L=?*VWfCh7{V`{`xT4T;-=KAeL5u7=#!F z1nIDqN8~wFC?dR9>Ec@S%w=>@&qi#Fb?3C_zg+acRnda}GG983BPsqgkN(}K+gK95 zfP99X+j%P1mARqAq1O9-f?PiC|N{crL0_Z=p&JxiMTAE{i^ zv}T|-y*`b;4#B@!&-}4^5Rmc5TY;wNNzXkgj#s+MQ^y?#<*;&0S`R%$D<)XMcESR9 zeWv9KH5WXJ$pgV3;*}M9$e2@5+5<8M3EgyjR|~tON`)n4nM#T<^EG!Sj9Z*_@2#C) zY5AOM{sVu6!l``qGR-eqYu~1v>J5OB1}M5pp>)Y;4xrX0qgv5JuMU2A%RL|a!<49W zb^f$vRzme55t=m3k=FwWCa6Ba2LpsRw9tLfMjcqwOXf8})9j zzY^I5(YxD!3)Gq#T>{tSS#hM)+|%6RiSjz7(p$UyU#vDCj7Jm2#%aXLRZS`&VKI|o zJp8tXtJFiwvF#PT{`z$6MlXex6z|u<0}Zx-gNfdH;ocw(!2 zt(litO`t}-ABheS*A2fdPb##vUn?u6D<|?m6!B{rG!tOv5avPAxT3^d?kP%QJ=#&d zb#0xkmZioda=dEibr(Fnpd&Q~{|5j8fhw1hmIlx|M@G-#RFS}<@e(xC#_En-8#3^QScC{9Ckz~>tm z6N8V|d5LPYUp$(+HUIRqBMpZLA>iELBg&`Nik}5GNegf_Tc%C+U@^N7RJ%`9V`x7SWWl6?*~(AW!PVTU zt>0TmIzrB{Map+(XRUr)fj`p}oKpx#DUDE#Vwu9>Z1pnmlVv6j*LutQ#sjcIP_Dqh zXqLu<-9?D9qK@K7E&w9eK`Ci~$O6YkjA)?j*iovBWF+!l>b3Ii3e#9(_F^hS z$?F7tBaC&yfMgZOz{Fu)lB(-sA`*H^ck`E=)3FZCo|fU_seBt)+@laYastcHnI_Rm zp`hb_$V9eEgr^7J1fYH=4ZsTkScT`sic&fQqd(Sfg20_$4dZT`o>AAq6=;P)(+0%>pt*F^Qia7g~C{gqHsVH z>serP0N2cf6xPqD>Hj8W@*h;IZ(BaTs_mKAAf#i8Nk)&Y57t&vDyTA6-YCl5Y28%{ zy>~=&Iq$@zeFo3cDh7Fs|fP=<_in{33drrs^@A=nbqpv*~f!N@p{JF zVh@GZhlY9rPzDKueY9BKD*eR3?qk-{;wp{iF3g&T5Cunw2{rUyCV`10q*eVJOu6Rq zyG`>osJH{B4ISM8*FOKEZ{qzjKq-I!l-(_6jgQ_Qh*Z&N0dILt)hO~y72x>{%T97L zKuolNiuQ^xNfYHrg2e{h42pjR0nh-L;0j&Ddl4a1!9?!{{2x>cS9Gn(@hqhz=QXdl z#Q4LBK4xI#{Sb;##DB=*P65z1pt(N#ahU|6a$qDX&B$RrvZ_rR5%U>#v5?K@&wsCX zrTO^zF+>wC2qXxS(by*W%KqIp>DX&iYy;@c?0fgRix7)!^_V7erI2j(kQKsyix?ZW zggIOMuZr^Ww)7)scuNolkUwK1J~CfBwFN@a7gJN4+gtW8&GV^e4%div853L}xgFSL zuU=Vz3fA1^m7MG=Z!y40KHOpE$d3o)0%SEYsk3;GR04m$zNH~NNR=0;L_R%QAfiHP zj?9!3;rS6CCW=nNACP`pG3G?N(rOS%$x_DEi~Z*OYp?8KD#Vr2HewTj4a`SOG#x{| zoZD}3XyJC9MSZP& zxL<4k_0NGiT!#OS>WNY&ORK@CFSWNkt{2SRK#F!%%?xJ|OtLlXN}l~pz)nyK(kqqw zuSFBvy#TzHXioqDp*`jIeg5E@`RoPp3>5<*!rCcRhW7NTd#tiH+@`mC=%P9rn^D{N zF7~a8iA}XXVj@_NvyeXL+(#^_FHY-Ve1cJHVe2Y-;Sopk^?syz~ED056G}sb?#w9kc)m2bhHP+}n>Y zsR{lvdZ#ENr^Y%}yxMvtuakcbi!6g2K@|0GoNdhDu`0m5(4&I~<=uOC-PSMN!O$9kpqJlGrqo&u z5_!|)P2~Q$6+%}YWDYF4L`U6C&;Tof^XkFwpogDG6sUfH6{i@$>KHcR7#ZvvWmVJ! z`NTp(WJA`Hu|*+f#0lpg2TLW}nfS-@zI59~VM))0blY(eNd0xFgY!fmTrz&<6G67# z%6TODl0%)O>Hu^O@9)3v&DQtK%QI6sX%xw?j913{u|^xXR#;H4kKfN7r-88Ec|(^8 zDorR)z@@2iyGECZnCUqS%YrV8`j1r@-NpYjhjR`zzuG1Ffqz7ctKmq751p-ph}$li z^XdQ-7LZFgvB)Y#n{gFuSaXvBav?TnXX`z_Np6BS$M-w#Wp>4VykW&_H55m0Z|^0v zg17*&2;mSsQLW^rlAU|%!n8F`P8HPoBg|zCS|#rTB)fQ*k_C@n2NM@^DZ+{%L+#kyNcpg%0- zpeoP!sAv)lAMU=x{wa81LTyT|BvYXNU05ZvC(vhhotLb+u$ikUxNVo|RYBp|u%-QCutgj=jD=qmjZ_7(yN=o50!<}Z)pO&q`rdcuu5AMy~ z3b!Y0nCn63j7Ygf|F#UhrhbSrfDfjBwL&g-zD5W176{i&Gc;UjI+W~yy-4`Mo3rayoDU-W?tC+w(sQi59#^Ol}5yUQy@*)FG=5a=Yzf}cI-w^vhOD)Aq`?f2-Fh_K2=ymq)go2$_}!iD|+Xu9gCs@tVY zNeI#sN-8bV-6BfY0Tqx=K^mmHL+O+T0TpR!5D*a%5D<~>mhOgcj_>{MTJKu-AC~7= z^UUnMXYbOcQ#SaB@-+&fWg<}C;s1{m!2kGj_cr};X;S;m?%bBV=OIG2B_tw~{CRfF zRc$YohSf3E3&iO)*9axQ)BoIdhBR3ahfTYmm|f0+|4J6PUO>hTXr4kVes;n~fp?ak z7?-v0q5C@%&-{a}TN11$0!rSh76x`a`kov7ppJo!$|ktKbyTpe0)Kq(E_lxT*__DH zVwc#y0I3>sITq4;H)VNA!oT5Oe!z=v!|tK~_Bg+B6BUFAfgjuUvwvx!OG$0)BLK0S(O*;#!!q~Uh3opae)@FZ;3 zeV)(72i#3?Fwj6sxg&WCaC%@S6do6T`@+a*@s2?NDx?Y(2op+&fs8S9w+u&aQ(Sg! zY&ycWt!-(EBa8*MQ;l735+0+Ywp|!8&OCq{#*jP7YQMu^>YN(0}drZ4@|%ppBPe ziU%0-%ZjBW+3hErE^#JBaN&_o!{wM0>W;3uJnOj;^VXE&h1* zlb0k-=H${dJ03f=lUjea7gyx7uU#CR$uG!cYW!P!MamefbOJMfdSi>9v!Jee2~DO@ zKW^JL(I%6qNqa=^)?M9|_p7lK=fNPhGF&(Xwlp>2yt+ zdtAw27p|?{I?r9s8`x^k7tkWiYB?rAJ%igl=S07PcPGyMpf9_2d#&_|4X_aRW@)4>ZEWD3ag*$NRpkSqoJ@`C>8@PimIVld3{ z9oEB@V)-fXIFp37-zFH2Yqj`RvP*Cufcm3#TNmg&c!_-W+h}(^B~OX$8h0=UUhHfA zsRBXQd|S9gn;a`Fe8HG8@$j#V8P{vH2jcHay4F#y(VbB}Pr)t^E%QNlJP7|X^@ahB z!8uD?^5K}Oiw7ndSqnQw7UvM#L@jFmT($+zX%FZ7zJ0<$D}HzeVA=|YsLK}i{l0JU z8Szm8glOFrDL@Q682KZU!)blDQ2{rWqT8NmZf>Gl7ic~A39D8=p{o0E#jo>WTy%PQSaD4y=ec2|h=G}tcxcRN{XnJd$ z{kAKj%fF>`#FYC=kJIb~XReMVXI-=KJ(%+PRIe1g3qn&iHtzTy9ntQByI)A@m&>=0 zFR)cU884qGE5X|cFsmSk{sQOad7nF^h@_;a^I4W-wmH4S()8zHZopznw?}GS!0-(= zv0z(Pc;^;gA7vJeMgF(yjW5ARNra>a-kGs8q`7#x=idzM6y*owG;Pu<7`4l6RC4Z= zKYUd{aYoemOT)c0WLXaVtDv7^U}onEZ~2W<0uSONIJI90JXvt`o`3nace>yDf{fLU z?$fNL`;ucF=rYp9okEZXh42$KFT#}Q2Tuj24uaCRjoGt*Wx(qYL~OlZ59oTFuuPZFmyv5VR6uw&i|2ViqFUezIk9K z2eUi)&>(&+in5B@*<4Y?YzL4OOPRL(EQ0euoz>B#>S!3wpqNx6t$EEdLN zWwz9XH-b|$7e~|2<{Zs2OOLvKU;th-P_90zm6wxn7>=s(p1q{ap2eRMKNNi6vOx;S zk^F{^mjX}q4X)X%jJUW*tf^A@KazqBQ+{$O-{L)19cW(NB&` zwn@A8yJRX{BIg#~-N$vh=D<2mdmmELdY^M6!&R8m@~4CXa{6%Tz@QgE(zNLd4rC5p z)iVPiHQs*K3Y@(*Xd?OO@Lf>^NfV8TR-k2W1!kL}eI9~Sx+TCS{+D`>oj-rVq^kvX zP{Dl+0eeO4KkpWj%p4RIKKd2E4XTDi2?6WZ3Vv4$UcoJSI#N18b(W7`t=w}^$^SO}WorL)lXV!|MQxA2O!j&6}e z;4wD^Uf{RYH%(Pl?avIn+nKX`ew6y|-G)=(V@p)or2(GpXPTC}o(N*qq z@FaE3?44kW^9Rn#%%z;C2r!0{rT~q#ce3r)6h{AiMf^s!%~9l$Y7gvqIkyY94sG1Q}{5C?F*ljezPHuh*Et4{B4+8_3ovDhH)j z&9qN9bC%avBo@{ud6llyB(btOi6rFMy|H_Zc=Ss&0u+LgGHFCG6=wWPkZ3c1dUr5`bHl8ncsl~WWOXi}X z97S(#3KbD~O=Xk*>Tn!?lsTPmi|W0v7qk0h>p3b*I%qyVuCy8_y&pM`HgI$n=iVX?dQMW5Xr!=7H8LUhw&A5R#H+km*DMP zgsgzZi$BkiUSG&(*P30f{xY5|kGvHR%|XZ+r$6V92=J?Z(~^!Z!+@Vay@IAR^rQW> zAs378d+N%R1f?SnFInu%KZ|q3{S*~0OxXyN`j(EQ_T-j;ghtcx#!_mFWo|f4C@?|1 zS~scZa{w{F$aflI<_zH#w<>Vg0k>h7qsTSr_8=zMZrT3gt{O<3(R~Ak41{S z6J0yu!7R({gH#F{mm5y+=YydA=SK`EsuA@75zwSBNTd{KgiZ8*l82lNOA9eqVM7)? z6KCcitMD{9JJQjenhy~<#io`VS5263KQfol>ptTif~UySM`h(XoYv>%$n7WC_q2HR zD)IKcdlQYXB9T4}_rPXhYKkTwVc9>}2+CQcRqnL=DkBoIZP@zK4YqNqO6Cg!7dJxY zqcCp0XIXmx;ky5Bm(aSxnv7k+c(pQIT>Yd1^bCR=bZF^VKgR`1aa$!7yL_wIU4pX1 zBWUnRstMOoJ*BsA62`@`vetp{i;>YTM+Q(|w@ZjQsM1;d{^Ppu6~R>t(qACII~mO1 z12f0&!ZPPSDSdm^l`!&s2ag48MdINljbkfCwSp0y_^-k&&ZmfI37NA z!b_1!1XDXa{%Thjuq(F!)Di9y=ys5{H)9({<4K5;3)`ABSU~~-ll#TNu=_>Tun@fb zv-T9pYh^T1P^BNu|2BL|(ImhqugRo+9Mh5I<`2dWO0-IWvnkvm#Hkkf3s@~zHro4s zKnC1n)cd_T%k`PhVdaHW?zw-MIaMv(8l!Ptsk%ibwf6lIbaeczBxA00zH~fLldp~n zG}$KG)^sD0bbyAtOTWxj_DL@9^+|$HwNp!_HfUL1O+ zPr1JjM;QG|&NnlhyIiXKkKF-X`e%EugfVC+6mqQ2+(fI`m22blM4<$`^(MU*d4PzO ztOJE5>b02)LhE{6uTOVVoe(^sf3Jz$1##4z$Kd2oLpLsj0(^CF-wxi~_#Z_GlPOXV z3sU6CafoBX_xMP_NQ%cJF5U~?7Cp#w1?-R)K|u)G8)yUIrp1h~5QOl23?7wV>SvNf zO1#I#5sv{)8U%w$U{nA%TcyvA%}nID>eGKp_0k6jQ<_fbz*FgTlm@rfp%(~ONW ze*e&tOp$ci$E--pyV;ALk98I9usqnXnC{wOxpoA93n3jyDEzJR->O@%AObKj(xC}> z_>;-ytjeY)WeMofHEAP2JhOHHEItUKmjD`ZU*4!WX`;Od12Yx~#mz2!0W5O(n+P3& zeF}cv_ir}amda@q3_+|uw{zTi(CWN$;PF}KK7g?jS$6${P}Wub$Ww-m*ZEoN*f3~u zTbIWi{#erU^!)Z4myRI`=mx~`;HPed%~HN8kyb(+XrVE@kh-W;a0LQvx?Ncu+#j^3 zM}WmqV<%(18Ois&ZJY&mZeV!Rh>!QWYC5WQ+qr}Esd2Q5aAq_6a|g4HI}e?YQqL)i zE=HN@gFUiHnGyqLJ_!}j(2`z? zpZ^Zlp&(ZQ`d85PCtio15r7oHDr#(}k)|)8as&6Mk@4}{R?pl(U)wQn#GYXeBm;mH zS~@y&#arIdkP!1$L+C5z^GLfD8eCc z1#Y<uVEuUms7#(#R?foG~5>^aAE?jdaGj0s>t+&Kwy)OznzWQM7r51F8X3I?b z!UMItqHM#c>ZgzhprEjmSTuC&Z)7|aeX%HR6%;d!-?7A!F@K7c1)SNeP=}UZbxD?XXQTKz1fPB9r3C#NP!w`V1``f5SZ{~{!55I{^W4=BLRx=4 zyx0=1zU0s5z!+K^X1!XsfTQxiC1g0n;mib&8IWp2qZKlBFlxH76-bwZE!Z7)ZkBu@D{3I&sCI$cjin?<65H6@B>TI`rSL$M8Y()`w0YEk*=ecgm)p0gq=pzSKx)olRB)iDe>X zC6jug!nrtpgd={FYpvooNx;5B1#a@ngp=W$ak-Doo}nqMsvOda4k#~INzwJwK7M@* zKT_uY=f5mFTEl6A%Hq2sFSD;}24x3)eEwtYbUuO*9Qdwh-~+^OUMZYHyMPnkZVW2e zg2I9npfJE7AEitM2EA@$lID9KX#8LfvU{+*5XOGJRheGv zW&nFxQM<*~RNupvcH_3JZ}G1B98@z7LfTHyMPWn@BQXzDTJ&ep=Lv)|o)O|3a;ignY5eML@03jb#K`sz`o zdI&k_+jD<)ut`0+QmqocTr~}MOAl^;q_XO~548cA)+Um8Cqsqg&0{R_N6>_!z0VW) z^|*NCXS>hVMxOn<`6hkNffvpTRM#6oW9v8y?C)%lQI4)Qv%fs6Fv0J43n7GFj2PGY+tb&}&Ck!j@&N!T@}BqCm1qg)w>RXeqI3g= z|D`wx&(%=cB6|@ozmJ2EWd8~`1{YCr%^JJ)75(w!=(M|KS`yc(^$3Pv@QqB4x0z{c zagalM-LkRMzjgrB&0wr@bcd6{txw~ieRY{Xbi*II&Ng!dGy_Z?!0cuo3T`?!?6@}p z+y%Yjz_g*wjfh8X-)%nKT9-Xw>)ZCuIQ@P-bezz^in+m~(^LN?x=rEcv*>D?pXGU0 zeOrW)|CSHn`vmt{hs||uxIoQ!JY;u2O}>SLsw*#Q?A`4ui4-G4ooSljyRuv+9vEyJb~|Z+XF&G%A6mk2h$VS z(Z&%xj2M*k6yU^U(=e@*ll!tKq-m&YaE7nRH&$gFzSz%XDN`17Tp25aB)C0ZGz$49 zce#qBw0#AlJ-=N*6Z%Bt!)*DB1TByu9t-gf4!Yt1b;Io?k+qs-!NY`sN&A zOh@R}$}2e)dTX*seX3|ku}TPKhnEd!mM>GJE4*KXY;mUy z!(}R1Y>5^eTv^W})}7q?;sZeF1>^?5a2L`h78naa92hbbV&#}{Uc`Sg1NuZIU6rbT!zd(xb5T zr-U89^pqLM4{3D16kG1gvRM7i3S&G_$w2pj;>)&XT!sza>4y$Fd~a@XzQY`x-`UrY zehdosvCv$6rDaltU<1refgpykeoN*CW3o|9s`b8t11N; zH~)b=9Ps(K!u)GAKefA8d_^t_lL>B|tjH}sp zz(8TD@z{nd8B;uVISA_so3rMkD}z6Ld|(rC*Yg)RrU2)hCdYvMCh3rZg2f*MH2C#`n+P>c==d5u43mq6n>2M_QNTNs4tv6)$ zQ<90_X*Qv&^HV+xo`GC-l3FGVEi!)AvnI4HYNi`7VTnj%5B>RGaoV=%2px0yqdaht zaXbY*h=?ydK}Kl5z;TV2k_vu(I4i0krJn!l(lzWJ@CgGQ%Ivl}dVWVBe4-yTJ>K&c zwr)3$_AVaJ{bF<^_)zRc1M`MLJ~5DJOa?6WkQR;PSm9VrNy{*EbaXToOw42sxEQ;p zsK8{CHmqKidTreNId-)(pA-4bQT7+i1N5K7_$WfiIu7_ruftb9B$t1BG`~~(QF8cT z33LbGz{N+*&7X*Q`-QjO|7!sPXFt5iIW>r~5>~=akvdVM3cj0m4lB1nPjDpTj#tb6 zAT5MwFBZ~Fk(+?(BCfaJ87|e!(_(2X+k%bs6=xBzy^R{A`lrvB8$3NA>SYOni1RGQ z;TyUWE7zPkxb229Gko{jO!~cp4K^T!KV5HSD`UgBU9avPeBl#>Sn88N-ZoT`NXY50@PI806@ z)3px(uZUNbT!eG&e5UE>7@{3s!=~!!t#xwcTiXgoJQK5=j$tNCfldY(K?GW*ekpR2&EI7o*Sme` zd$_qSUm_~HettAHarDVsHYXxD5d~GC%iJ}7!`!uq@t~7N-ZolnmYj9neOrd*>m@Gx zYL_a>z^vNqY4fiHad)YBU7{zR7MUqdV&D*Clye57sY&G=_WbztNtf-Y=PWJMfN2C* z5GB!_*Dga<29pdev9RUSC(q3-_POrJj(I9km)BSXv||Xy?1Wq};e$<8i192b-f=Sv zR>%(+UWSa{B#4HR-E7;aR$D_A6JNAM- za1#!1#2WneY3fKYCQU&^Q09lFODL~5Oq)Tnf~pHOB|Y(*xdXTD&mURDiuIZ$N{?2# zz*T9bn!Rk|bUNN**3WzO%c!v@3gXUl1tokD$PT)8?J3BKt4-H=N)8dQpw2cD1 zJ8?rMz*A8XR>a51R6#(h$yN^P8#qIu3AU>Gfs`lgm~>Fk&?M1QV!hW>8Id?R;a5<9 zu=Q^2+F`;SenHvOvuO(hR$yg3N7?IiqafSygC;y;^`fE7lJ~5ib#9L}Pg{SHo4xbP zlhr32cCPlp%pgpFMsI9CcbPe=DH&)+t< z67e^TX+G|5{>68rX}6m&OZ#Fviw(9@^M(`K_tkX!b8IlKW*nnLwjx|7;uV$ zN038978o0S0@aU1majMnPuswRM8rPhSz!)IE zAwl$Oj{ct>6HD)xG1b>J2JsFj zd>+4@d6aQnM*>IIOl@YUOP3Z1j}afh)}OJJv>N!?{wCSHyhc9BzN?e1D{(OWf#)-> z3f?EgTLz7tZHs1(Ct@Itg3Ky;F3&JXnt|Bh4<9~oo>#*A3vX&%_cCj8x0w5G5abb} z00rC~O;g^`fGc$;6$H>%zdjT)B>yBuUDA=y`#=gFupu;GNuEWpI&Ybx=#7aCo!aek z&;<$My>EEF9S4apENeOruv?o^VD9*%{>&8b zzB=T*yas{f^Yf5f1Tyvw86cdk-;}Dc*hA;=U!x$X@0(HTwRo@kJ40s1@S2&abHcwd z%+S;=1p?7f`mOo)am*i)U%_+SJvkr5*lTSI6?5D61E9t7{)*G%d#T_kS<2Ght>94c z>iS6$bBfP?cz)@@n$+6tr{_Pxrff7q>bm`(+CfzeKkohPtmPeD9CN-~ubcx?0cr(Q z2fz(JK2ukrxfmYhcrYzsp)mEZipT@+zN3>`_cgNXfN;UTKCZ&2m`{9^lmzd=`o`*+ zE0~bNv298vd$sM+gePGlYz*RIE%sdl-*Xe_v-InThL7;}uRWj=$|E(XVgJec2qQ!7 zR&gkVE$iJ%YpKI2prt76#xZ9gHga?XtKa>0-&%s3*RMhL8MHK&qNMa($|PBR9p%B- zE@vP>ZCKy)4J21@Ut-bPpX@H8r(&Gm0beboj?CX56{$#RKIgIcB4b&wVsJz&1_vyl z*hkaI+)7o&7muzg{BD(*Q=E75X>;SzJSQt?_fXE!+PFX&gN)7L;rR-<6A;g!AyyhhvXKjg``=$F)**5l zn|gcG1b5uT>U)08)9Y~D-80MhFOt2^>x4)0WL34!_eug%>s>+_@dJ$dWenKOZUi=( z#qug&hX~N7JV#>h0lNG$I9z^qF{dz{VmP6QD<8UxJqv(N^c7|LboB6AzE1Jj6oE_3 z;nC43Xh$_2$DZDv#elgD*1lm;Qzb*J%lB-pd1(%dwyX+i33sngEfBV@6AUSkWHJ?r@L&T?a1wN@0S{x|cFOU#ID6MGZ_Sc8Ptf2`0b z6?&8N4Fr0h7kBJMiFlVZTfAigUIS1Bh@=Fs5UU|!bdT|eKJcqH@E?U441TGDrJIzu z>F=HvfeIGZ?8smTc>Nus+Dn}5dT?Q&FB+)4dX<&j>Iqc$OCduO1Vgm?_1~reendW2 zQyxoKt=vF`kOw#{sZ6Z-YEpw0LPey!oocl7-)5J7lPHmU1Z$E`lI=8Z?e#SUw(%)r zVq#KIQ|D{43A43Y6P(0iXzcR<;K)ukFW7t}u97L#I(>05jg0T+XuSGTY!L0bIc0V> zaQBlJO|+4{3adQV*#sPCzI!0S*#im$G9><;<-~dj6t<8DKl!wI@Gd(mu(inM<&gKK zF?}p>6*Xj_A;Q2^eIA!F1-|{qk7Y;4rhNPfJybnAqcavmq`hKY?4UvH;8ULRSi27q zi?eb;<280pSFPwDhpdLrcwi!cq}cAH;66T_=VViV9ADMZZE!+mhC>Kmb~6s$+7{Rj zf!Rf;*xdC+t|EI|_D537wrop^bJ9+91NDfyKekFI^<>gi0vi~Emdq(Mh8Prc?Nj4f zqOE*BvlxR%ukUVp>WQ`{kSGmsg4eKt_xueo)<}U+^itnllIrRjAUUe>E;S)RgGf?K)Gx5i-RK#Ef|wL7T?Z9r7S&R0g$8p=-E` zaIW7nxpQd)4&EwNuF$eIj6p7nu#Q&&t1Z+oU`(6msLiP1A@Lk8M9@Ge z$?+Qi#$l@p29M+IUyR_^Fig@bQf5YRPCob!<@}2o_jOhBn#d^^(72W8HvRD2YVL!q zL9>-qDM&sL#0$)-)&0#Lsa4s9aT*|lO`l#OKEaH`XC0MK;!`g3CyAuTg zn%60B&RH~M1;TLKiN-EfU*xT5Vk?ph`Xkb%gv#31Qba0yBd}6|=#j5p_i#1g*RCHe zB4vSJW|#Py-2yCC!#^1TmrZf&*4MQ%V(oq$bEbGBI1%p3MvYKM5%w_y`peJ6qGxpu zYe@<15q+PH;eI7YHkxr8YkwPv#|kF=`hl&5EarP1b4s8TRhlYShVGrTE>mDAlYemy zxB}z{1I4g`=bPYU{jc*oYHW$Mu3I$F$sBkz6)~r-wM@TdqM5NSdZ)r64FCqGw{4==3R>?|!In=gZQj@BRH?)KpmHpy@~5 zHj`wuJ^!a3ec(BiEs%gBozl-&N-ra1qiM&f<5nD$v#(F^;azejN8T=w&p$Ym#-5eo zcXnT=`RN724AvkQ9^kl8@BW## zgFjppm`n+CiGO^QjA*+n-ajpx@ZI*iI+DDy*yP}VRfu{G>HAbU5i~A4IYu))%9kw_ z6tTn6gkSx~aF%F(vcCxw*n#D$y z%}Z#OAtV_2a!fS1Mr*P$cICSzxxpr0EW{^R4oCV>EO%Ze7 zZ~Q&*7|lzYR*EtV6cUF#nB=P~Ak7Q$ zZ+^8WhfRN)acw;>z8i1m^G+7WzF}6N0#~#BuaMJt$&-oaqtEN8Bmw8il63z%ZDU(8 zU*^+ZE*B(u`KRVMlv$+=HolVJRH=g}^F?ju^y2J%vV+#CPG_-+<4C0;;f^VV7c`A zC*OI{d^t`3Za&7?L;k-jC(rZ^xwU1LK^D@H%bn=a^PT9_oIrH>%LUaL)vM1Mw0fT} zR%9V#j{j517H>8j|uih!Mq*za5O3qV%%dEn3dh=7f|~dP27W$_lK3K%Cd; zB*j^x%IMKG%qVp2#1A*{6@(N(&<5Y%Z9!Wu2%Lub85;v_mmkuvpM%85$w>vy{SSwa`M~u?7?~G%(`176eX=?oQd<*Rk-MRJj|HQA=kIM0S!AFW$Cb+7ENN8B$nNhG<%Zp(pn)B71#s zsrEX{a7Av%d8vGIB9^AYgxwBE2o}k3S;%~m+}#c(8seg`cJ(j5;uJ)xk~!h$dXh%2 zG%Tp}%cw?@&38n*Z-Y9%J~Opkl$}1v%^ZHr zKRKz3X#l{{aGpY%C@~%;!Gg&b`+(6U*&`?M2h7GQsSigmDpoXl?wsa6U+TQhEK)>T zUCp@BV+4D%Y)V<1m?QeV##_rS;j@p<^{bwTJ9yMs#)kBsrD7qB)^uTOfWViB*H z4$4P934U=KQ-!5{m_72@{URrlcu8OxVN23s?a=0O4Psp<+mRXSpL&I)&Q^}fZ?+je z^5A?F%9<~?wdr{A{l-&*odsKZ8Q<$1>KO@6e;J}9zYJicmY});g zl_+P*jbdb``JDdL$PGlocOqyvId?Fuj~u;%+&DlB&8(VP*1Xj-UIF+}`HsUmR*E6b zh>;0O$^+(96_Hl!duZJ&uNWOO@1%E1sRm@C>OYOBRN#K8?N;wqSOPf{U8eu?j=Hao zY3rc-AF_I)!b8yV*2un#OO7IBvow)dd%$R;bh+x_Rnq1(bNuQOHaGm!4shHfXI#iN za%G|B78C0M_##JbrA1=N|Ikn+k3@+%lm9bGPcpRkLdmx;_`Q@^^1D&j`1?2HMF2Bs(2u*4a|KYj(%ifVgZ)K(mfY%Vq#%! z;6v`@m(TF!Z%#L>N@UfDCPV?0Wq#O6B;7O?=uV+v>Ka3%H0#yYQgc5N(&GIPSgy=} zDdCVpCN@FudU@D<okidHy^S$uI{o zopJdKxIXYdhtTJ(UK%A%kCr|Zkx};9Pcok(Xrf}RF2q_;FXwRvOmbW96<0CJ>J+ip zduwZb(3Hy`1Q{MKh>pQnkK#HvVRUy?kA)`cp&gNs zKt7-*$hE452H2v5?ZI{YRjJg1a8N?fMDz0SIA%9Q5U|TSq7%_gc_a+T7ijSLp?O4D zlV!-rTECGC`^h~Z_~v{68MmTB`OCHs&!A+ze2I$=C^Hn#FDHlNFcv$DC;23y)7-+e z6s{u`=vv<>cfOJUyv8N;P7tAiLOudkcYq*-^(ekule$xX+~IwMBu2P`TS$*5{B;vr zt$Enr=?_zgl8Oos7ngnZVtKzmTOYPZVh2Zz*b2cE`t=r*{bgY@Cw6J)F_vwD1Y>2^ zORUoayN)-Yf%^{JqkeQ~c$Yki{@IUb3up(5KW<@0hCD#1a0MgpH54(^JII|YfQj%3 z2*#A>A5Equ5)qKVQXOF*II_Rnt15Ox8bp$baphLAznwm5N8N1sWthVyDi3QaSnQB_=Vp3lO^3N8ji8o@A78=Fo$|ZGD;QmAk6WLE~D_A}{E&rk-lCk8A z3DHCV$^cP`f+t+;S$|dWng;Qw7gbr>>n+rD@G=?U1o#8_PeD8b1dTxPxOeYf6xFr~ z;CXK8uv7}}?Eb#z=&D>zQh4IZ0wFZm2+V(oh!MBdkwM52NI4=HHf9v z*x1^N|3`N~v~))?GyG-%bO7AiaXXhfGN^vV(7K-s!?izkdLm?H_c7lPlPa}J=T5MGR&Jba|d3)CM*8p@O#2s*Tp^eq~v5Iy7bfuL6&#oB>^)F1r^nL=PIK! zU90tNnIq$;{oau(@tC%Gidf6mQIEoGQ&Cjd+G7xI&&9oyCLf>z%JnZBh@F5|V&SF1 z*)8TMS_^yoZ7FiBqe#s9^eY^D=ojsr_QZ8jclkiJxuDNB3%vhI7=RdnJwlU7#iP6!`c||mF~4eFkqDjw`WfO{j}bS=4Mq0 z6|bz3E!Q*#SSlH0X#=rDP~f?hNd}#5JDkz=^kN?+x7*&rticP6R*JtV+)65*EB^jo zayK{_08<h+YJV&Go7~q?!^S{qdPKUpI7yPnwqr;#xX<$on7%y-w zq_y{{aotOb^*|VLETBTeAuRfVG%zqQNSYoX66vtQF`R;QLy6|7EW^hl2N(k5SONoW zJ`sM=_?ITv2kt7-VW%S^UYqTd4NVW@LMOZS3PgL*V>u$N9Lxm)WpIiI^ExJ|6BJZl zV|k-}i}8`JBv? z>?jV|?mS5Yd9HS&8T6=okMNH_OtyMOHCZR!7PQ+1F3*)ycjmm#DcyJRrb>oHFA!&x zt_^1*trOGJ%LDTr6Ds*ynh}hH3ptjE2hEaC1`3mS#19Qq3c|rL3k=I71TdxY5s+{y zA8_&-3NBnXe9N-<{lK9Vg7iH{jV`ShP8{m9DH=RXWPY2yeVIw$KzTX~#_QbB8N6)O zlk|NXnHX5jbXGx_q413hkQX+5EF_ zh35C-!W&+ZHy)Fl_CbVb{fQ4$GsTPmpw=l4LHw+Lw6^00s-^!BYH6W~I+K8gYJ=Hcd5~ohl(|JMSXUIF$|2f)tZwee8)?q7mR zyY7GS$2pmURt!KJ4*oC5*jRxK!MYYe2t-7FfTjWPL+TCRtrt%U!zJ3&7vm9#LTz+g zl+qFEFhV^t3>6(RRi*gx6}Dg>5N?CZ1f(988L<3A%kDh`V}YQD^j~8kL@Ee)7WP|= zx58%#Fu<7t7Lfll{hr2U$blEhStlCj za`gL`DCQKC7WEl*=B&=gX)Sj=MpQ{Igu54Gh49c;h(~1=h){PG23F!1K&uUAE`S1S zvR&)$Zr+~;qeh_lpcDTtD@#cO%q~6zSA~B!{`NfD@a0JNo*Y9w$Z62jN{8hc;=yYJ zSSfgST;k+AvNqikz6Sc-KS{Xrk^;EVkE&HzgfQ5GBo{6Z+%Do7^#K>t{kc=>KrgeU zp#XtUa2G&}2uCATn&D4KdXnJwZ)oFXsdouj{Y}3hY=|qDqx#~Z-$n2%Y3EFW6zOE* zFQ(d>N+gBWuRjj2kscm>u(Jk}X)utj6{mrJ2xxc60T^CuUvv~dasp_xkU2KVOua-C zkSr)%;C^re%g5>LNnVS3K85CWTKk(?tMO^1O<>dvT~fAZBo0!wC-xQ(kf<TV|9 zn8vyXBpcW{|NgDnQMi(paXAAZ{f9HI2S+z-a?iN)8x^Sp+7xz{IF-gp=OSeW8Z@V$ zM);a)rzZ^m#N7ka`nyD6!E`+KtoaAQ<&NZ%?^W_uoZvKg0Mk(F44G?_K}mam+guP4BL(el%&JtAG95a$3b|g=P>7Mn5b<4VcmQX+5|j1(vc3n z$DSTM(D^`9x)?3F`2iPMbV2+6v=n$_i1VP>y+tTJlKr%3=Xl42M$B!db5Jq4`w?b!a#`vMTeKQ*3CQX_u&Gw!V|NXy0_hW=Fl2WC@tAV`t~zn=wAh4WyIdXG=kZ7to;ZZqGi1 zpeL5Z^kXAb!wzp^k|I*q;@Rr?+`(&zXWq0c5>l?ItbP$(nZ|kG?-Og^0$_>;dFok51R$z zf?;ylvtA0U@Y#Y23}le-LIMfz68dTe{wzK|9um`F7qEUeT~CpVxu1mDvk-S-hHv1d zLbX3%833Jg+wSs^3Ua#oZ8?m!eLSf>EvbEv(~Za=$?`289-h6kOAzHCq4li-LqX$jwH3c>I>iKSptOb*{u#Zr{s^=1#aa$;d zw3PMHxrR#h9Ent>d*6)aQFCbs?3zxP znlGL=w`&oU$P!MHpkO8%KV~&Q-j_I+d->7&z3i#Wy_Hs*rb_-@Lns_7RFXfT?x-eo zJuP|ykR}N8qo_Us%Bcqj3m|*o>Yb`|_&akZkPiv84CDoUoh^~Dd$!j|Xph%a^6k>j z2CGlnAm-gbQwpnR8_`!XrWw};VedJN>EqL3VV85EhYuf$J3P2oZ>Pp;o(P(pJ6@;u zw4A4B4@-egM4@c6*A0M$XIPrCF!rK)Mv!hOa6j_GIM(%QuU;HA*b)miZKAqA?a~*D9ojjJzYDX&)WchAd<5#gJ&iIl^(kdw`#S>fG>f z_5J8wSs~cMLr0&y;FuT^>x<505)D@oSX;4MP#IL=iXMlKLVz13Yq%REU&xDPea2?$ z;yS9r0M<+IX;_0vGXzo7t3RnyZw?kE81-YEGS6``1C_@u@pEQ|uAnW>0>CV?w6rwc zCXYnTAE^f+`laNcXn@>3aD~ALoSc-H9Kslkq*0Yb`!*mR0j-r&3t;cAbkZY`jI{mz zww)S#V(qIvrgo$?9Rto1JrbsQ>yI1>g~DkL=VhMk$7C^h%%~1b*$0)q0SpMXVb({u zzg%5x?F|V|#fW=__F!|Bl1^@15@r=N5!@%lhN`u&riSgX@}D#e={6*?F)}N0_wLe&;&yry3y&fE3g7qAtCJO<^u>i9bQ=Zk4 zAqEt{pVNh%LUMBGpJz@d-AZNQBETEpSuV_1N6G_W8 zix|8BE;v$W%(A5mDxm_m7}|m}^Tav4%(*G7trOxB4m^Y%<}f&t6{jD79}Ene2zi0; zBC)g-YS&Y#Cp^9MInj57{96ib7&mD0Nt4Wsw3F_ZqC%u$-h~gq>PSflB(AuG{w4}B zf;C{|%@lLUT^lqRx0dI^@*CWCUUj*t_w+BH<&1#Hz^Cj`DtV}@l>p2P7OKQv{B-3~ zif_JxxC+msl1Za*{O!DMlM5HDJ03|D?9fkDS>0rWY+*ubWTNMg71H<-Tt9hIKa0ML zg7X=Ccmcx}@;qeEi4j-!sAfpH{9}TbVaha6B%WRnrr%zHYMrMTup#`OELRY;KES71 z==)G6TOv3Tp~(SI+OaNuayA@&;Ymao!fgXz=KNOHbYK4roj*r(@zs+z=J8$t|~{3 zzpNh?oNXw8k9KSwX|N{(k^yR!2gFLD4moxV_3yAMm!Y4BBCF-I-}y%f)~o<;1Wb@p zfFWq*Jt#`znN>$dMzVj`*KNoEhz*Rw_*>n8UYsQ^d$JK}Wr%4P z?h@mZKq@XqAb2A^g)72F*C?h926dF^2H+mBI}CfVRC?S2owESTQmGln2Nh*+kNl@r<>`}(i1fiJ7^e78IF48y7HAVq3=aSF@I1@kw( zC$vZR4aq4U!E+n~ z&*tVBH9{5~Xuv%OCP*qtpLEE+wG*qB@a!g?M(yReUv&AZV&ybRFgh) zTJP>mD>^)5h_r?Rzzs?T5d3j@E`+5UR=+{*7`RBG*)O9le5K3Z-{zBvlGcLe(HU!L zp(edg2m4av8%xLKCREVV8XEe^F$72w8tzPq1L}YM>@4c?G4evfmMyf&pbZ7XD%b=D zi2)2*4Q+q1K@SD%4@O4*U0w1@gO}^M%)~tuT;WqBl&HHaK|S)Mr=+~N?C7%oEFw8% z(q1Ap*nM)2b{%bI-T%e5m0Z749h6ZNkmA>6%lfp~v)5#|t(BO;g7 z^h+n{QN`m7(T@F0R#1g*Ln*;vK@$X4_y`G6`pi1k0gA~$7U^*Mn-vhwI>!SxTCZbz z->b?j03)cysa4>52o3b}24*fV&i;##f9WbjJ->G%&G zkIc-Hm1M6XdynKHBC=;jvL$;LqIb!bJ+eabSlNW6$4o*p3y;j~?RVaNUfVC}@P)!O!h>SjfX(_S0or6RYmJX~s z18nuv;q=5q)dQv1?rN4pwvzX1T7J|K1UmS=Qa(s#iSHe?<>Y_8T{a?%^OE9v zXSMT-V$m<<-RJxTG3TLxnPdN-F&7;Eo}Qkf)>dHCfBHn^RQ~A*;YDwmH;movEo&~SzY2Iy4=~mc@PMHLw?o8S2|(#b1!*)VAlU^ z5by9{vr|wI8+XYFcTF&9NqS?eLl#s;0nQ_Aq0wCfce8;ABb0` z-3Dw+p-v!C&22=p*|CD6IPRi`c0T4u$gDn@geAvVO`___53z{N3Q*ZOomg}fFT z9iA4|y1P!?>`eiV38WW7n*w03N@}Gk(vN8ud@wJMADga&ERcznbz%SSFSr#UzKQt1 zHz`@9(aPVsKxCo9og#s(BOmtqjQYgH&nCYFph0tSajj5lK2zyh_5S4@a!{vIKnHg{ za592z=3XaD9tFxnlGtvwVO7|oL6rk{kczlvpuxkmh@_x8(`$G=GtF(*wl00^qFP7-4Q%~M$`K}f8md~QB-WhS_) zC%9^9j6TW*3W=r@=sd?lrS`?)PhU0T2LAo>Zkz_^?>#>>t?!m3{yU)XPlp(H2UqQ# zuqu~|HvOAH!U-iIj09u9K>mZ}tHYmhf?;BE++S^C{cJ|yUkgn~N)Sdt!4+@-pVaHA zV;V%{r9DRF?HVrsc}p7ezaJtXw*d9~|J(pRmmD6-njiAAbjM+pT$r0e+Tu)MkXg ze0v7Llrnd!&^8V`Hz=2YX28J62tkIa-mHJ^6|&iYa(5rDe=Bz2Nx;qcGp0>&M!Z35 z7b8r*tN>;SfB$++1#aDb$t-2#BWYQ@NZWgUM%G`rFh!nZpAb+hK*v6K&Ywe?(a=wT z=K;KT6gVIzWlVC}zfZnlZmeMAza4Pdh{;$;t>bWhk!G!yUp+{}f{qoJ*P`AE#aSf~+ zdV94jwJO#R)`eWX^rY}JaQx4*w-0y=pt^?A!gac(5Bd;bI|593csUa2Wf$YchNZW0 z9dZt%Z{+o#i%>>{V$ha@DUAT(dq-^}t0p$6)Q?}0&yA6O4P=2TV<0Vm1WG=%0{(r3 z|2+ujdD~U?7gY(Gp^&SApOO?@?NFR|U{9jO4nhBL3;S>cTYmlu*|dssXe)zhWERj`|Ga3ejbn!K>-4mJ0Lel zG-0sbjU6=qp7BwBHAiDckkcU5MP@+|2nC=XTbi3E# z`)s`uguDZ=w;gas?1y_w?;};h<){0Bm*7IXy`4tGZOIbQYyoFe((^Y7xPHQr)0T_< z-`R9)Aq#55V3*L^DOy|yGf$`hA*js&lo%HDnTiXkFZ3^^&B4nTGP?|L#kUf9;3GNk zMwqs@s*QaHEs^mOs5rl%9Qq%nQw<^Raw7kjq+1SvD6#ya6eXP3H0rbaButv+$nG#2l)-+2DY$Z{lW6ezh`uE)3n)buVDoI4WjQ} zj8uY{ZetT(g#-=O^_30D*Khs|Zt4O7cI07M zMcKyG^r>KF%?%h*utHhdT3+5h;ns1m<*h#FY$5z+cq5-}9QcJvsEzbi(wZOKt%f{p z%>l0}JzA#PaLB1TK9h9*%06?z*s*N=NDH3ajuCa3!RnrDwJRB!ggY~YGWo|_KX&Y? z-3abEm6!D=U<)ojlT*+UCyRc1x>tKQAGe-a))yyaOQQ8ydMVe5s$1HVU@C;o_2+vT z8i&%6?SR~-Ld(yeelRImn#^f5Yxm`jp15#{yrUCdT^D`4C-fv}{~*{S{Gfx)`|^Jd zv|0s{J8O+)%|}A%>n)liv!$})hWGXxGg-6`1CJv|ArU=UU9FpqJ-hI!d-Y}K`0n29 zz?qqXs>4Y_2;SMkw4&s3&-!E|@!9V5$9c?d*9{r6>EpuSz#)pv7Zkqx)L_TEP3Ts! ze=;4VaIA8&HE(y~?`r;E3i%U)SL;dZ3O$@=A8^=$2;`?1&x|o&d(2C|Wsb>fmJ^wp zzHcOB6jl!K?P5F8)v*YW>_1vx9`)j|_TlVjpj=*lsc?F~@ye1@>DiLPUx~A|>B`rA zfA)llAMtmYRepXQu=nhABg*nPYwAghWV`cp^XlbUkV)Mub+)fEs}Ih!Dfx}%E$w=k z^x|QXo!6r+$qm9q+_|a@g^C0WYoNIdN}Md|+&{kR)(s{Rxf4v0LOt`oi^an4t))~h zu9lyprb5JFtm#zplKUDf<7L6s7Q>IN*ox~XXa0mmrocxfRpy`*rR%WEt%7$?|tcThi#J0S)?zGu*z{15vUzJ!JnDW)8Kl2xt_I@I<0&B9wyrP}0{d|e$d|d& z`}E4C>yPxZj|szmwec%{n{v-Gwd8^!c!;451b*lfIygJ`uDz1h#>KP^gbG3fM42Ra zIt7lpmo{J09H^P@J35l?*p-SNj)}O_q$*O0u8v-*ZqX9CJ=_W1Q2=id3E#JGiI8)2 zo%7!tU^>(vu2*aS7jfp^Kcs5-`QyjjT-S4;-wdw3YOrB$e(6EpESE1#d*e{T6$e86 z{`b0;E+{)zC=2+%V4D@{LQC7;HP0epPnpDH<{w3H>i6N!GDzuB-c(nY;|XUZ2A3}! z8C!CLdvyk4adEuw0rlR-gxt5hjz3t7-ibDKMVg?PrQ>ki%TE(V9^L@$Cq)#M8$9vv zL82az9uO~QxYa-ni;P+LA^dL6lby{!bP;cZ-mAn}VHtEJV5}9}4G8jLspZL^T%M%z zeA?cb^r9OFUQUdpD$p|R5fWP+f zCNNaMZ4(N1-)-!92#Zm94R!>R0a6tEL(8Z`WCdIx^hPZZ(0VDqR@$?fQe3y8{kQme z*#>;{Yg5gb8mCdj>;GOUOUzQ`{WhoVkaau2fe>*j5<0=-59*bd>s|V=ZZd5**a`Jt zSs>}}Ne2NQws9vCO0vrij=0 zKnDOmLMc`2QGDB~*4A{i)(GNG zaNcIIWOd3b>TaQ6RyTYs8IeCVOiWCio%}^xM~9Y#V1=^e*Cs4ydYj7j2HW4WDj$bQ zm&~QG^|SR)TA^F)dWn+J-vso&Ia4GPOO^cj5U;N{dGX%&rEj<2c@C8-D1|&V+kVU) zbojEsr@>t%ub#2?%m7e zWQMf#bY4C_w9FfdI`aQOrVz~jz)kYsGnC6rcnfSgY z9$oImL>4-{^m{N@1)7W^VDs_wXU62^`A!1&^E_&!9tiNKOcJ+#^XAQcY>*}6Ixt!o)tFY1NAZ$x-dC0mt$z}1# zj@h@@|_39oT*SNJaa^P387xuinpa^{L9AX^16$)fc zSSq?z)YJ&41pUK#Ay53MUFe7gMhxg#vcW1hmQ@bEW`+lDROql`L|>)z8^LtM_m7E* zX{$oxrP6j1$R~QaB3(e2Zhx<-Kz>AxPf1#H09mbfRFY^wSY4QZBYsbqV8|Oo0|Vruk#wJde;a~%nHi!>bb-(nH#U^l z$|+WoM!D(ptot1^Gc9&%o@b-7uy+rHGqs^>rV#fmRK6XG3o&tVc}r70-O41>hasaJ{&_2EZ}jgyQ=W5|{s)M~86s5_IKU!hCLLb} z|FB+*h2~d0x`|8L+Rg`WHDbG;bpOhQH3X6?!fRStDVwyOS7mNytRj~rCqPrx|D>~V z5>5QL{CCEqkt}b|3`&zz&`v`o0ag)pu9I_6_YsPY5nEkyC(ksy_k&sU9bIpddQgy@ zTkDBzcT zZ{m0r!UU`2q@+r>Y5BCYwBq98wkkEo2d$r#*FR?9H4L7lUbB^e5+#rkRLatso`?KT zsVjIA5GyvnWvH1rxfzC?3M_pIQz;OMnoHoXG;#$yA0 z{m$AnrkI%8O(y5dPseaC`sK?-Tz%a@dhH&XYn zryUV-57p4I7Bj4aFW0*D$3Xx;cDbcVi-(y@SMe@k1hox6T7V3!=+o2l>*`XFbEy#Q z>|-QlK){S6Jw$6uw#c*WM3`cQCz+{D$s(-^RTALp(Ee;x`BD-*6Oy0sg$2uNNO+)1 zt^7M8=~7U{b>G`0muvZk#Q^l*-r4#4-10blYU-m?FCVUU4y{&pU*%ZA49ZrC>Ug~J zKJn4+>izDQEQ!gnW9%0^!?N{iSLqhuZTrw>w)TvAB z>qVud2)+RCa1lS#?0YWpkr=L!=@qn&5?3mU7n(#nJ3Gv4D{q?fpD5x|JTf9$7_vhf zhC1v<{;&3{4TX}orOErn+C&|+W3I9aXWSW2)9<6oIl)1^3P$^TLAu>ohZ#{Fv>QVz?`5pS-qzf@~@ifx0%(FFji;Ca9 z{kSSrR`ij5`%Ex&?*Ul*M+oe%~Mqa)$Kxc>amK2mDKB# zihOuv(%@l+AKTqg>oOr3d<;$872aZN1)OU$d>f=9M4Uhg2QiDzdH+``m6KtRf%HM| z6}U8kyW!u<1dzq~hZvVHvbT|A^3t$uug9Y2u}}P;2W{!TZmzvfbRVgO|Z= z4myR6KI=bNw6zODN!%HO{{A(@PRhfL0yAzd0;=8qgjiKVx8$oQGSs#|oo2j-=ceTY z&Y^Om^k_yNLWcJa{=PIp;ZnJD*S3#hGYH7y&VT{7-z6NZWN0{A7_=H}AlR0jThtw+ z06eAXoU*e2AgS_RpStbj#2+^Iaoo#3cb!8gzvzp+>fU{!v5Se+HU?k@0$5(|tTls6 z*6&4kN%#6m$$K8>9+)t^)*`|z$lrvUw500z&VtUCanx{tKr+84XCa)gq zS`pm|>YCkMX60ui;J+ywbeM>UCHL0Mp-kPJtC2~G3ANw;6k(t9ams!3yM3U}Pj`NN z)?GHqw&(=zlDB0*?8r!0p*pUAk|o4{*Dm672<$Cz=_Mi}Hmu9Ig_cE9x(HcZ5o5qy5p%0A)htuDoKyK59y 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 J#zFII{|`3vBbxvK diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_InTree_Visual.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_InTree_Visual.expected.png index f93814556efd9612494e36855f48bde1ba408cdd..a8ec09df99cd9246621f8baf884d0e086e5b0b38 100644 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrgOs=jq}YQW5v|?oL4_LlIWT&J!GS&#<(eNwv_)dRcaFd#LF)kWmZ_2RzU2 z^`LP3CosgXLw17_KOw^s9)km^8$`i6RwW3nZ|Jh2)Y(=LL9Jzf1=);T3K F0RY;IRZ{=} literal 375 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 diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipX_TopLeftDest.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_FlipX_TopLeftDest.expected.png index f2346a64a06ad77a6ce228ba71c126c0e17679b9..a6bc0daee39629be4200b7d6485d88a7e91e9ef4 100644 GIT binary patch delta 2763 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 literal 2997 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 literal 2196 zcmb_ddo&wp7Eg;b9Mkz&zN>k!d z)DnVfX(|zqDr$peP))^5J%S=lij;(I?3woL&N+MbkC}VU{qFhQbH8)H?|k?B{qCG| zbx@F1mjwU-3UEg|4@vCZaS%|l*7;D2B|$p=G~5d$v0I=^=>P!88E$9el~}Yq$&5ZU zuGP&q$ya^v6hau@2SKQ$Mh&M*3jlBSTvOD2J>U~Gy?luJ<4sl2TeZ%RSMY}-CdV6s3HxkokX75T%+W*@ciuR35 z85>bT93J*Rps}5bY(3l*SP=M9JLLQ_Xvj`U`ulT=?Wb%2QZl>bzXDv7&Y)hU@)8J) zM=~ts1Xtitc)37Wxpt=fFDOKqX$B!K;l_LCiHYuqDVtO3GfPWHG~|I3t-b^#iaHzh zs_6rlk+rI?<+QjtRvV$kJ-d6Ecg?7(t zM`z6g2Y@j+`bRky#L1>JjSkJu>H5s*gD{8a_;aGsm~{) zl|@QD1cOWt?)191w;g8`b&v#E@ef|_m~4&l9;~BMBPdgdqg(53ErSf6t6>lKkhA~#T&Ya)b4u9b?zrf(1nax4an!{=zm{FLk@I{;(hZ+zh(xxJ)?3Ub&*q5cEsOc}3Wq z%+B=Zd*IjB){Mujy#o2%6y1Kfp zEsh@Mp1IOQ>H$9)pS${qS}`?ndDF80=YC@{J<*1vPa+D3_?p}*AK!#{*ogxydKXXQH zP;}g3bD<4at@ZCb=ANO)PxjEVblFM^(s$=-Nbu%B&<=8fFTt3eB46ALl&8-uoa_pAS!f&8lNl$Fn2yJd|PHC~>Y^2VSx$1)h zF~fs;sZ8)0?`avpovqor{U}lF%!L(;1@!2(hKT5!H(Ni%_pt*VIUO<+-%Os8n`9<2 zzhu&Uo))cC`nhd{Kd2dhA8t%av?kKGtOQ`5;`^MMg`iRY7WQblLk_*ffzz$T`a$-- z&6u7R<)yaO*e7KdL5Y1YRDBk65|zehu^ke&%zeavyDY5J zZEk6anQ`XKk_at*B1Ouvg>wp)D%6eqBz+f8g*4l&o@ttpfb@?SWFyl@?{`GtqgyCl zUA789oQ5zLdCQw)9~$Y=+&XV`3tlBgF0ZUyp1DBor@IW;)>e5mmjl}}%r3oRuK4Dq z(FPPY0#^3kFRJ(*OVf diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_Center.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_Alignment_Center.expected.png index 08f41b3ef572e2848b97bcf6394840591f08d257..bfe5fd7fbbb2282578678fa18cfe024c6fdc65f8 100644 GIT binary patch literal 4317 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 literal 4406 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 MCSDs?p<*5OUm&_hbpQYW diff --git a/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png b/tests/TestFiles/Direct2D1/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png index a0b6afeeeb541e7040a16cd7aa401297cdf3b90c..f3c3c4aee277cfdf8354a81e8a505f6f9833a65f 100644 GIT binary patch literal 1230 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yF%}28J29*~C-V}>VM%xNb!1@J z*w6hZkrl|T@N{tusfc@f$2LDWT;{+-;SiVQN4(9s?paM#n3ks+Wbg1>FktFd=hOGv zJ~4KLYz$klDQwZ3wF*43ll?EW7=?B{DskrA@qC7~h|8z%-W8VD>*Sukh_RN`xotoH z^=oN$pq11EKOCOTn(6h0-Cp-f{`0f*PR}}MVws1TD3PWDlX1%_UzebO$(XJHfn{-9a|rt_em^fciGzv znJpI{UiyFQhhhJo!1o!A(cAN$&i-|*R(ex+==@~)Ev+_YpEU9xtPU|+8F6##tFqmh z`T6U2J`>#?ae0Bwn!cSrdAYf7cUZJ-YPzCcqj~S_;#1~tMAs`Ed=(hsxa{QIw6v1% z@9)pg_^QEj$%siZo--w=Y~w5AlK7>k?yl)7-`Mu&_RiQfnZbQ&hO^rFPaj`1S=fVn z?mNZ#y3*3it1SgRxN}X74^LH&SgtrhOz6amH%SMrRp8+?BWv!tmv%v4J*!H!?DK10 z{U|G+F++5T+3LgRk3Q0kD%BJ7@lg;E;9y~4Vr+D9poCdto?lwC`}gmsx9=t?lwyE!N@Y=5FpND=WJ+RXd#Rx@^^Y!`cH5r=p_geP}oPBwVk5UbW-wp4c_! zpO^ow`}O?9eL0(IwFzdDrV}nl?J3bLwVL}Z=#9al3%$~3k7aE8H2KSm$yGD#}cj8pG~dO!lti1n19uG{yI692#H3#6S>KWoF~zEP|A`MbOS zzI`jJ+OlunwoiYaoSgj3T;002_Wb8Rk#VlODs{g9PGn|U zd8RP__vVc|XMU^N>u7TH;huj#J|^hxj#%7c@^;?||3679ITJPSPn~PS_W6N%{wYR| zCBAAuivHDK%w?3ixFSrmNPpVYc_A1RJXT${Z5nH`_4}M z^Wo3W&ecZ?fhq4Xi&CHY)bEn}-@acSc-}$S<8+TyhlO8Q+0K6_CdSA;Tqh&ead?le zO5ct8;^LR5H>Y2|`;6z_WdV=VQ_P<{l33@mX_9iK$+Ml|kfLC-;?n<&k;Vc?Z{_sw P1qpe&`njxgN@xNAmlzPi literal 1223 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 literal 13912 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 U{bUnhs~Ci=q>@C9xMAS`0Zc0XhX4Qo diff --git a/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png b/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_Fill_NoTile.expected.png index 078bca57bcbe54b3956964b34ff9fdb6a34e59cd..474e2bb2bf827ca5a3f18b35e22e259c626e2051 100644 GIT binary patch literal 37676 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%0AS3nnGSMP1Lp9U6f9n zcDqK#MtwWyFz^>ZKL3-&;y(UmT?B4=H<`>WxLj9RIHIKZrqX3m3yjfiTT)rXaSx*| z^M!Px`MgdI85y=_IaQdS-(!p@tEytjhc2W|r7~gGppOFk$Z>^XX7Y_uzk>q!R}O;? z4)U3rrB{P%?0kO6+FX-AJDl?mn>zD?iWq9Wd2dS|Gfu?vmY%h<$l9EUb?o1 zZVjT!$w_m)mFxz0yl9*Kq6l4LCVe{d^}jwUY{gsl;HQYH^OL*9Yt`W#J(48)pFGByTlZ?-KR6bvOrMiml zflyw`()?rn$@kU-&o$M-7~$SadWkQ>{<~B>wkEJ)y<+Tme^lV+p=?}yyas}otCV=6CDgHetZ9uan-d<_f?gtCe+1;o<|4usud;QnM4)~fT^88yb{nvY z_ts2(1;om>3<+@z$ZG1j1C)Z$9q;A*l7=q5P?rB}X5RR0rl%8&^^q()c_TB< zPOQW!cI>!hH4ZWU9L~G9kjInEd;YQz#ZD`ui)-TZsiOc9X0tB(+Vf9`hKGmcShY+# zZ6&T95t33X^1xFIE&*DnXxUn)U}9oIplymS=8G=^PW4ws9nMS$c>KNq9H)V6*<#=| zF*J@l+kGQ}dC<-6ADxfxD>M$|cU2wWywU#J3qVppt;7iTZXW@d1BQ3^Ib{k0SQQjpMjZQdb;{4x7-(LZIEP1qimgQaKNmlixtMB5Hb`%KJAm%(@Jd4i<9!fjlV)0-O>rb1CD^ zbPtXE<@v+p$weMqIIc3H;wy9QznsSzr^YW`6CLGTho>9wX7!J> z%x-VHeH&1Cs;?mV?+)emP15sV`(Qg2iv2CFrJZtgZC2^~zY;PkA|YPF&#I?g&bG6U z{G(;Jdwret=FH!!+{io%M}l~=?$cy#P{pD|X-l`wf8$W!wk)&X&BV2U^nJD%dBC1E5K=gZTfya{Bei_5lsv722j9A^ja$Z8ojRHO8_;?>V9nB zd_$5v`Y$LaJk|=Zr^SMjY@HfIzu2}}4;RMmp;g{T=euc+G$aIhDICJ=tof0Y=^miQ zed2puJ79pGKM+n zLr$x$c}aKYAWbqopC~GDIsU-{u3&214_Fbv5RDiuakK@5vqu^7Hxf2QCB%h*M^O|wV

fcyb1`We1~4NH*@ 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 z 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 delta 130 zcmeyw^qpyfiJ6|Ki(^Q|oVS;E^Rg%kusYuOQ~b;*!{%FY=r;*}<*yP9U~u20oISg@ zH0eb6*`5Cl&zDZjR$_8gn5@WXB7EW5yM(nH{dgL!&)npVS>AR)nsed<`^f@~{LBg* fEI=hz;{Pu5AKk>3?EU>+DabTWS3j3^P6bbvU$icxuSglr1U*~GI8Xg=RjJsI<8Tb1gV>vjf!#cm1 zVznS=?^Gl;B>DZuENvNSL4qLA{QSI{&E~nsE0u~GjfQ;R`B%Ej@fIYIG%u-n`Ke^* zVl^c#^t%zRwY0Q!DIAj2Y=1Vjw6rva5>2KBT^WuRK%B>Xh8r2lYj>x zlZFQxlZFQx9&mMc-uTK>!1jfCnIdM9#%}^6j^( zR4S^>&Z=B4r%@(gq*|?(ntOX{Hk*;_M$YKF@%iVcv(Toer!{vHmQuN_x!GBjN+mag zlYz;Kfuw&F3i_|4eb3XILbpM$b~-ABp?)XnPo0kZaTYQz2PZ4GS}pDG?`wB&Px~jK z*ljj-czAfa&hf9mniZvguYg!)W@c0_l~gPiHCL(V!-o(0`s=S%E|pH#Ni|Gk3`k4e z3g5F^D5$M&Aetv3*g3iVG7R;fYsz}|x!awNB&l)|n4+Y)lgA{f6owk>$5cuI=~epE z`}_NP`}VDF-n^;ZW>f8UTdnWFg@5$Oe7aY8;|PL4d%yhB-`^ilW&)B|X#@n< zBOrhwDj=NZ1q=iPFpMN1Gcz-z*zLsn%@qg4S3QR7jjGPkf;ix}F&{(vB1h6UfA~TB z`}=ycvlILLa_7u{`FUJ#_GC=skDZSGaOTu%%k%Uv&(l8(1qG7!3Ve=5iCgD-<8{^B zw^b^Yv~>5bxqjqXtT4RX*6%i(Y6pSd?CeO=>Fv%>Kb;mL?m*2XyEwR42}Ai|*uCv@ zUxB2i=PB^K?yW8lI_BBgI(PeC?#OQU#KpeD;~XyAjz_&V@URi+aAf+1ECy283{2HrwgwZ%0Ro&y#9N`peW5$0rx` z8A~9C(EFhS3mAqD z$g`(Ub!TxgiLy+z=`hsh(UGb{9EVg-_A$*glt_1f78eIP?Ryai=_%kKJzdTnq)XEC z%}rX8E6jE}`uXF>#KIv-b782TKYr9KQ+h5LWGuvz=rIT(IdA3oSg%Jg1|msiNw1HN zv~qkrg1u)`(&3OsaFG6db5kqJ%SrDxQ>MdEKOPUmD{V)^kXQGvC$B>&2_nz{RTv z$Il;(06%{)I!^!m0Y9LVEPg;|v{Ly2oySimo`jkF3APLbWTH42kn5cN3ARTMAEtj@ zEGH0a-^nP@#ECtDCnYDt=tWW36wX+c)ya5yr+_kGpt^~m+=^}74v za9CO0x;jeX#ii=N*AF6>jHuOWmtNoAQmfU*UA*|l{eDL*)oWhksLJ1W7po$vp$r^* zINrtT34%cL^Ydypo97;{R4QsT8rf+*9PNK%^#tk;9yTvOm0TAqGvUY(-}lvMG*qot zPamsRtJw-i2KegM-G0YLVznSeb^CGAJ!Xewqy;&vcT5uJ*u*)Gw;*TLC2i>Rz}+l( zqV002ovPDHLkV1h$!TTlQ1 delta 2194 zcmV;D2yOSr6t@(RGy(3BH6aE#OF;hs2a#Mn4H%Y4`Z4u<^gQJANR*MKV1IsQN`^+# z>*|K1-Tigwf``4OB83Ots^|WaAqNKsVYOO4J$n}1C$EiH|qM3d>Zt_(*aE;dP_r0|ggO=i}+SnKQSS03B5 z%li8IxQiLjxLzo}#2(N#z(j7z@X{SV0h|TrR8KZky{Bi$%3sE%&=x zj&`wHlIC=JLVlIeOm}Z9V^_5tv$3%e84gKmx7*s-h;u;_SER_-$wUIe z%NF16?%*%oFx%!$Qb=_&k$|+4*hx+V!QgYFhuJo7lB$ygBxQ85(&1DGWYC;Q>&<7%aA#yI(lW)IOrBYF4c2?zbIgK&_Bh_lP z)ZE)sv)PPXH*!Ybjn6+norN|%J*~Nuu$0PW&CSlLR4Ta{oD57>3?%)dP|$xR?R%cy z6uJ$1wbM~44D~xnf9iDPkF$_*IXGFd)oN*fe_y+Md)hw<#cs2y!^6YVb&h}i)vPFg zeFelaGc%)dsib1DsJTi-A3l80*I$3Fa;bE>PO4!VV?bK!R`{OXLP2eH1JOJQ!OqFg zFT+s(xu&dVpPTP=BuSN%z!W9TojfK3a6{@Cg04`(i|wmeV&@;v>sP*5OgufY3Ql(==SH(pnrpI50=($d|#=K7IWvBL0j zTff_EsvQJ+v$G>fr$2Xo`suU~aR+K9*~P)VN*Kxy!|u;M_Z3KLdY%H$>;BZ`LB~8h zTj%D#`9_jdou5DbS@iuY$Id)|&%Ta6P(Y$QSX$4u$!DMGyBm=` zKXiJpTHlJi!MkM(*4V<3`Lmh}4QNGr$3BiMU3B^?fF1Sjdw zH#fDiyqxrIGi5pq_2bczo{ex6U6OoB&pv(9kDQliWqCRAa7avlRvalNE2d{`lNDdQ zd>QsT-Tl_BTYCTgedKz1$8`7P#I18zOm|QJOB-lG`g7H{m+*}y{TZ~*@udwJ@V}Uk zA$@%94|0tb1Q-GV0Sp9W%)T_nFRbT~4re~Anb$9`P6J6M1{VE^!aB2JF~REg)3lTD2P%>X8j=VWf8h29$T@C*01PZf zK)lGMDo>$nODHFoYPA;Ym|l6DtF^J0|Jr5TulI$e8vD2o9S|VD2nb*xAb^2@0ER>Y zQchwgIZ>4u->V3kwUWY?Eicx^;6{LkDCjfkNcX z?c29g*(UFjsGCD~v7GE)NltgMf*?@2Tvof?jNHeBW2SUXNU_Uaz|!4u_T1t*fIHURpT{=O)f^yahR{E@?xjC+=p!Bmb*)DO^$pTa63`B-1h!5UJbcdLikr!v-Xb zaU$a+0+Ozb1*FFt^;|4qk`WNVKtKQk0RapI1TYW~lV1Y|AOHXW0000000466{{>is UN!}L8@&Et;07*qoM6N<$f(Usx%>V!Z diff --git a/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_NoStretch_FlipX_TopLeftDest.expected.png b/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_NoStretch_FlipX_TopLeftDest.expected.png index f2346a64a06ad77a6ce228ba71c126c0e17679b9..e9efe1e79698009dcc9a3a6d773cea6db2d2750b 100644 GIT binary patch delta 2559 zcma);c{CJ?7soRsT1kziVFn}55{gPDgru>IF!r4{WF2CXtx>jAG-hH#mKd_nvy5#r zV|_%5UPBp6vJ8!e7<fQ=7A-IQHQurnhog7`t%R%cts3MfVxn2rjE)M`m2nl&W zAaM`k4ha4ykkx`j4HZLtCAl%;pJZYXD zgMF~-lcnp$8Q z^@9~u%b-0^tOmr-#_2atl;Mee%@B0?!C2YwbHnk;Cv4S-wr-AAWk}N^i#CVIJjIPo zhiZ0G@R^oE^wi4igmQgxu|n0|4r|qn`j*;4ubLMFU(MUSjNL!xH^1B^AR|E1bEDEx z#SH87LR@|LWP_8kd2PBCDx{{66Z`ZGf7eFd@T*zLy62!@&)Pc zQ7Lw2cqB*Qthyg%^#$~F{53J&3sWV?c;OPyh0I=KkF?yGee7Rd;ZvtXb{kd%l51CJkFDCeA-9x*+tKJ8 zItPe8MO$KT4&>bXpie3j?tNn_50Q8pcOdDHxR7jd4H1zxjm$Vzb@gY{e`vDn^xPlq z=q9!QX&c6cNG=<9_26iOSzKSs{Bk!kdwKr1m95#~=G9e+z+%nUKP@V-#pDmUPHP|& zEG%ueZ+6B^=l#zsz_b1X7#3SOAV3-TWV8v>Kc>f3wG(k!WCv7Nlq~JHxrvY3Fd@6G zNr_?#eKKQpn(dDRPCqP&1+O~Lpd+C(FvO0VxS}-c%T~5C^}Z_}>FCTJXB|nTh54p= z=bM0)A)cI|poO0VtYTdCph_UlWX!wyMGq$705w4!(t zVJYUWI1AtQ3{78B%ztzS{|R8IE$Dn0zzdBkXCxrThe7Tpljqdlui^SmDndQ^;4{<7 zA)gUC2YGT2EO*44K~q9M?_k{z*u$1o^Rk zUhFt?RBB6m%1G5u=XH2i3S#7W(y;K`1Cz^yTS5|85hezBY zw2GNQk!#c!x<&epB2lDr#su4?4EgXz(fI|RZq0=aSVz@RnP+T_rtx=!_j|W8kr}mE zgIT2ogP6&Y?d|PEl~iIs%C>^hOY{ciHvOA|vDK`+MJHAJkEu;C&w|v{R2q@+Lr@M& z{;|d6a5$tK$pO+Ndb%Nq{%6T&qsr7NKsxtIDv#C39Ve5tcF(qEb{WiFr#R*I(pJxwWt&4G zZ-Ryx{+)D8(IO0uFMoR-@a=C9PVID(Q)N(-kp!g0N!;`EU8W`_0Khv!KH#wOgE&&) z^EG6a+mnk$a^_f{$Zep6?cu!#$2BTC_BMKQ1FLHIPM%&dvEUM}@q-C%LdX8c1wi|# zn*-TL97+O4VK&Ns=r5iSga(-&QK&SZH`o_~95$i4J8F6PRo`rFpNfidhN)k@u!PEo z)fpLZKW2O|$jF|1&V@GSoY+ubPhub(9v9>7?Cp@Mz&gp7N)DCtX4{&?zp(i4X+@nb zR3mb|ld|B0UBv~aomnFM(uMM)YIfYKmTOV2lxc4U>{V%VH3ET%V!mv}qJgHBaSoYS zBGFbEnDK!{aZ+QCQzKgL{>V1%_Cn_%JGI*5?)i(y*q$ z3)?vC56AcAw$1DlScX9I61iOnwoy7ra^|+?voWprc~17#E>;5=M&PAc20LnJJ%}`2 z48&PgxwMuW%8vS?E+>@iYNGdOaQ2tC~46uBaf3ZZE4djlo&W>8quLdJH??M+>=Zy|R-|gSG?)?=gCs@;4Nr?Mv(R}jtC&F%CKXzfg;~`@1 z-uoF&E^K>tsOa-fu?&uxlM~fU2m2DUFdK{J`q)j41`3i!Iz&`k_-QzQGg9r>z15OD z{b*o7K9b*1Tg}Oj!euV_ePffZ!u3_vR(LaFp+bF%b3~I^VII{ zW*KY8ZwXLUNJ`8vk>gHG`0E09=(69Q98n%5>&97Puh03&^+;_=QyVG9+H%^VpddB1 x?;!~tdW)d=kc8-FIyu_enGh`a&kJ|WhX=k+?jNHMlD+=U!Hp5us|`IK{tJWZ0K)(P literal 2997 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 literal 4406 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 MCSDs?p<*5OUm&_hbpQYW diff --git a/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png b/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_NoStretch_NoTile_BottomRightQuarterDest.expected.png index a0b6afeeeb541e7040a16cd7aa401297cdf3b90c..778e3f6c131a2e097b6756207d2b8c98e219bbad 100644 GIT binary patch delta 1037 zcmV+o1oHdG3CszQG+~2DL_t(|obBAPZc|qn!13=|M085LbZqRc6LG}Stwibrw2y!) z)($0m8_EL^sbWD@)vBzOQubC!7`i4;P={`nP#iXt;M*Z2A`m{?vBD2 z-!E_7x^;3tr|iY5pED0yFCsQ0qFv2c#@CR&ScAbJR#sMGcYk;Hvk_^Rqb z%#ho+Z@(D_4OE_Y`M&BU)C?@K9z1w(-hG?0#HycjAGC#t*oose@U>L)CDvdth;FwV z2L}gl|CJ@yEI0_CY)xZ*ef_*RMlyrcPx?~4A2of$UgH@gnLQ%RAhYF{st3?O8yg!J znmr-}(l`Q{+<(T##)Xfy#Hyc>Yn56qvueD=8u7DpORQP5Q}qBEWOH+Ks^bOHK+`?s zSIf@MbT20YX`p`9189)JV7k500%;(DjL#AaJ|KZWLLiV32qXl;Ol!BN`%2X}>9tei zucT*^v%ABEU8{Nkyk*U#eyK+M$i@r;34uUDAdnCUB$HbLJRd?JkZ>Z{+HrRG%jN9u zaAD5wUNeoIKk^si+8Q-#Gm~!uAAdFT!~Og5$CD?~@As=73Sql@?OeNl{dBwH{QP_@ z_j=J=T8d7$8_P>e(dl%e+wE34#Pc;^v*I8k{%*D6zlhi?ir8wk;;+NQbl~;>UtKY8 z29jA^T#Rm~6AKFqvE1v$^XJdw=FOYY?Q~9WbEz>^7)U>kpYSJkTCF&U<9{G_TgQu} z?bp|zlx6(;#%+&Yz7$B4j2pueYB*jfmqV);J-}y3b#~Q1o7h&@0Pmm*w&GdyXkaG$4?gIWLe= z?yj!Jj}ISyh~YHCd|AfNM@RAH1!hu#G|Z%de0}Fm{Py_qhZ;_!e0Fnm6yLpi_1@Xy zJOXK$NdghayOxH-`2FxO#@&G?kcJsI5OKWUd|AeyhljB|#$7oo5Fhh4kT`NLiXy(4 zn~Pst(?7ih(lB>dSH&@g7ex_w=H_Cn0l!lL000000I0(MZw3mwv!peV00000NkvXX Hu0mjff4Bl< delta 1034 zcmV+l1oivO3C9VLG+};8L_t(|obBDePFrUfz~T2;LFoi69gDqn3PxGFHAuaH_7b8h zYlnutCCvo{smc;nRjX#LM6WK z|NMP6$94pfp+S+b41ZLksCod-DKf)*#SC0)d1;AR!P)2m}%W zfrLOHArMFiq-HiEqF?n8oDoRPd>av+h*+3A<>{##Q68Ke#8LlKgB%W2auCB)3-hbZdA2}AQ$@U`RtEz{X zA-8YeelrdlsJ!U(ebrm28Q5Yyc<|t&>o#SJRX-QrXbTas8z)cTYpLd2tbV^AolYkX z4-en|D_g8ta2Q_Mn#RV)#zk=qWd*69^r845YWjq|#w$p&dPG=3X3H;C570oHo0}7@ z9uWd*9D$5)b8B;R;>+4%)z8qqN-eipHQr(kdE2=y)~wmBdVmJm+S;1x@&aj~>2C6? zWp{VFhZBJ`P_OC%8l>N!?$~I7G>||>XNv_NkU$_I5J(6F5`IxwJ2n1|+f4G|)iAMZ zRS&>h)-CFnYRG#Ctdnp8E|bp!3X{$P3zNGCD)FxKe$}J{s1QC>kn$CvFk_v zKwMkHrnZ8UzycY6kPrwY1X43U+`k`xJb4nmUa#s=2#34Z&b8~;&kk3dpP!GFZa2Ei z%hB$1Vr6+b+U<69I-M#p{s7ZLkK5!$Q3ILQ@{Jp@xVSjdc~2uu-Mcr|zuzm0b9d@t{wa!cckD?Cq~R_r zkgICkKs-t3N*Q+*5(p#&0ttc4fTg9Ssz+#)kH&c8zd*QhJ|5$|KGmdVetPsM_V@Q= zduJzl`}^^K?Af!Sml+HOmoQoLEe{5<7!jWh2JvZGMyD)eb;xDB%v&>M`R@9^ySEpI z{eEok>_kMI{oHx_G$Ky6SfhkA>pp+|K+%02Lbohqu`Ex1zUMN3+7%$H^Se0&^VPOy>+q+!Mlfy9w}Q55mT++6(H zn*Q!BkcPRtwkD1dyeNveGdCC84S1gl0000006-P~2f26(ic;Qnk^lez07*qoM6N<$ Ef{{k|xc~qF diff --git a/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png b/tests/TestFiles/Skia/Media/VisualBrush/VisualBrush_UniformToFill_NoTile.expected.png index 1f1ac058536a75594f11ff0acac146caa9034a78..d7ef9209676ddf4c9364d94e17266cdf2d2ab4d6 100644 GIT binary patch literal 8679 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 vbfEHyrw@AdeKSQH{{L-%0Deb`JkXFU=E@}$gd77qH$ZYy%97<0M*jZ;Vpp7V literal 8637 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 PF+i${S_%zvmSO)7)P#Df From 4bc1801c2af491dcd9ff6c903c37b4c11421c7b0 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 21 May 2020 19:55:28 -0300 Subject: [PATCH 031/201] fix popup tests. --- .../Primitives/PopupRootTests.cs | 9 +++++++-- .../Avalonia.Controls.UnitTests/Primitives/PopupTests.cs | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs index ddf109f80e..08b9c75dbc 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs @@ -77,8 +77,13 @@ namespace Avalonia.Controls.UnitTests.Primitives var templatedChild = ((Visual)target.Host).GetVisualChildren().Single(); - Assert.IsType(templatedChild); - var contentPresenter = templatedChild.VisualChildren.Single(); + Assert.IsType(templatedChild); + + var visualLayerManager = templatedChild.GetVisualChildren().Skip(1).Single(); + + Assert.IsType(visualLayerManager); + + var contentPresenter = visualLayerManager.VisualChildren.Single(); Assert.IsType(contentPresenter); diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index 0b9c94f850..fd06ba295b 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -275,6 +275,8 @@ namespace Avalonia.Controls.UnitTests.Primitives Assert.Equal( new[] { + "Panel", + "Border", "VisualLayerManager", "ContentPresenter", "ContentPresenter", @@ -289,6 +291,8 @@ namespace Avalonia.Controls.UnitTests.Primitives Assert.Equal( new object[] { + popupRoot, + popupRoot, popupRoot, popupRoot, target, From cfbd6991f6f7223c973df79b957c0f8100fa48e0 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 08:39:25 -0300 Subject: [PATCH 032/201] always give fallback if you dont get the setting asked for. --- src/Avalonia.Controls/TopLevel.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 53b9d081d4..be2efc23e7 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -381,7 +381,9 @@ namespace Avalonia.Controls { if(_transparencyFallbackBorder != null) { - if(transparencyLevel == WindowTransparencyLevel.None || TransparencyLevelHint == WindowTransparencyLevel.None) + if(transparencyLevel == WindowTransparencyLevel.None || + TransparencyLevelHint == WindowTransparencyLevel.None || + transparencyLevel != TransparencyLevelHint) { _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; } From 2db3eee7b924c9bb0a3f2710781f973330c181b0 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 08:49:39 -0300 Subject: [PATCH 033/201] add blurbehind api for someone to use for win7 support in future. --- .../Interop/UnmanagedMethods.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs index b06708ebd2..da52c3116e 100644 --- a/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs +++ b/src/Windows/Avalonia.Win32/Interop/UnmanagedMethods.cs @@ -1305,6 +1305,34 @@ namespace Avalonia.Win32.Interop [DllImport("dwmapi.dll")] public static extern int DwmIsCompositionEnabled(out bool enabled); + [DllImport("dwmapi.dll")] + public static extern void DwmEnableBlurBehindWindow(IntPtr hwnd, ref DWM_BLURBEHIND blurBehind); + + [Flags] + public enum DWM_BB + { + Enable = 1, + BlurRegion = 2, + TransitionMaximized = 4 + } + + [StructLayout(LayoutKind.Sequential)] + public struct DWM_BLURBEHIND + { + public DWM_BB dwFlags; + public bool fEnable; + public IntPtr hRgnBlur; + public bool fTransitionOnMaximized; + + public DWM_BLURBEHIND(bool enabled) + { + fEnable = enabled ? true : false; + hRgnBlur = IntPtr.Zero; + fTransitionOnMaximized = false; + dwFlags = DWM_BB.Enable; + } + } + [StructLayout(LayoutKind.Sequential)] internal struct RTL_OSVERSIONINFOEX { From 3dbe59062a58070a7ba62535cf62030edcbc5285 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 08:53:34 -0300 Subject: [PATCH 034/201] fix win32 generating borders in blur / transparent mode. --- src/Windows/Avalonia.Win32/WindowImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index 193f60a7cf..b2b173ce64 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -259,7 +259,7 @@ namespace Avalonia.Win32 break; } - accent.AccentFlags = 2 | (int)(AccentFlags.DrawLeftBorder | AccentFlags.DrawBottomBorder | AccentFlags.DrawRightBorder | AccentFlags.DrawTopBorder); + accent.AccentFlags = 2; accent.GradientColor = 0x00FFFFFF; var accentPtr = Marshal.AllocHGlobal(accentStructSize); From 3e7b8933b2a0e0a4fdc1b0d1da022136e3a47c7e Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 08:59:06 -0300 Subject: [PATCH 035/201] whitespace fixes. --- src/Avalonia.Controls/TopLevel.cs | 1 - src/Avalonia.X11/TransparencyHelper.cs | 1 - src/Avalonia.X11/X11Globals.cs | 1 - src/Windows/Avalonia.Win32/WindowImpl.cs | 2 +- 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index be2efc23e7..fa5f16f891 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -15,7 +15,6 @@ using JetBrains.Annotations; namespace Avalonia.Controls { - ///

/// Base class for top-level widgets. /// diff --git a/src/Avalonia.X11/TransparencyHelper.cs b/src/Avalonia.X11/TransparencyHelper.cs index 6d62d21ec6..0578680136 100644 --- a/src/Avalonia.X11/TransparencyHelper.cs +++ b/src/Avalonia.X11/TransparencyHelper.cs @@ -68,7 +68,6 @@ namespace Avalonia.X11 return WindowTransparencyLevel.Transparent; } - private bool CanBlur => _globals.WmName == "KWin" && _globals.IsCompositionEnabled; public void Dispose() diff --git a/src/Avalonia.X11/X11Globals.cs b/src/Avalonia.X11/X11Globals.cs index 54032831f6..afde15b808 100644 --- a/src/Avalonia.X11/X11Globals.cs +++ b/src/Avalonia.X11/X11Globals.cs @@ -75,7 +75,6 @@ namespace Avalonia.X11 } } - IntPtr GetSupportingWmCheck(IntPtr window) { XGetWindowProperty(_x11.Display, _rootWindow, _x11.Atoms._NET_SUPPORTING_WM_CHECK, diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index b2b173ce64..b7ec6e0d5a 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -66,7 +66,7 @@ namespace Avalonia.Win32 private OleDropTarget _dropTarget; private Size _minSize; private Size _maxSize; - private WindowImpl _parent; + private WindowImpl _parent; public WindowImpl() { From 730862b753d6eafc2e053cbd2db2840c77d9b0ba Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 09:35:30 -0300 Subject: [PATCH 036/201] Add acrylic blur level with fallbacks to blur reported. --- src/Avalonia.Controls/TopLevel.cs | 16 +++++++++++++++- src/Avalonia.Controls/WindowTransparencyLevel.cs | 7 ++++++- src/Avalonia.Native/WindowImplBase.cs | 5 +++++ src/Windows/Avalonia.Win32/WindowImpl.cs | 11 +++++++++-- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index fa5f16f891..bd41eb5f28 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -376,13 +376,27 @@ namespace Avalonia.Controls LayoutHelper.InvalidateSelfAndChildrenMeasure(this); } + private bool TransparencyLevelsMatch (WindowTransparencyLevel requested, WindowTransparencyLevel received) + { + if(requested == received) + { + return true; + } + else if(requested >= WindowTransparencyLevel.Blur && received >= WindowTransparencyLevel.Blur) + { + return true; + } + + return false; + } + protected virtual void HandleTransparencyLevelChanged(WindowTransparencyLevel transparencyLevel) { if(_transparencyFallbackBorder != null) { if(transparencyLevel == WindowTransparencyLevel.None || TransparencyLevelHint == WindowTransparencyLevel.None || - transparencyLevel != TransparencyLevelHint) + !TransparencyLevelsMatch(TransparencyLevelHint, transparencyLevel)) { _transparencyFallbackBorder.Background = TransparencyBackgroundFallback; } diff --git a/src/Avalonia.Controls/WindowTransparencyLevel.cs b/src/Avalonia.Controls/WindowTransparencyLevel.cs index f5fc0ca9dd..ce7c03efbb 100644 --- a/src/Avalonia.Controls/WindowTransparencyLevel.cs +++ b/src/Avalonia.Controls/WindowTransparencyLevel.cs @@ -15,6 +15,11 @@ /// /// The window background is a blur-behind where nothing is drawn in the window. /// - Blur + Blur, + + /// + /// The window background is a blur-behind with a high blur radius. This level may fallback to Blur. + /// + AcrylicBlur } } diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 5072d98256..77200b0a95 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -395,6 +395,11 @@ namespace Avalonia.Native { if (TransparencyLevel != transparencyLevel) { + if (transparencyLevel >= WindowTransparencyLevel.Blur) + { + transparencyLevel = WindowTransparencyLevel.AcrylicBlur; + } + TransparencyLevel = transparencyLevel; _native.SetBlurEnabled(TransparencyLevel >= WindowTransparencyLevel.Blur); diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index b7ec6e0d5a..0cf5a73b9f 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -239,6 +239,11 @@ namespace Avalonia.Win32 var accent = new AccentPolicy(); var accentStructSize = Marshal.SizeOf(accent); + if(transparencyLevel == WindowTransparencyLevel.AcrylicBlur && !canUseAcrylic) + { + transparencyLevel = WindowTransparencyLevel.Blur; + } + switch (transparencyLevel) { default: @@ -251,11 +256,13 @@ namespace Avalonia.Win32 break; case WindowTransparencyLevel.Blur: - accent.AccentState = canUseAcrylic ? AccentState.ACCENT_ENABLE_ACRYLIC : AccentState.ACCENT_ENABLE_BLURBEHIND; + accent.AccentState = AccentState.ACCENT_ENABLE_BLURBEHIND; break; - case (WindowTransparencyLevel.Blur + 1): // hack force acrylic on windows 10. + case WindowTransparencyLevel.AcrylicBlur: + case (WindowTransparencyLevel.AcrylicBlur + 1): // hack-force acrylic. accent.AccentState = AccentState.ACCENT_ENABLE_ACRYLIC; + transparencyLevel = WindowTransparencyLevel.AcrylicBlur; break; } From c0a04699feeb2fc271b491ec0c595288675f65a5 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 09:51:34 -0300 Subject: [PATCH 037/201] add acrylic blur option. --- samples/ControlCatalog/MainView.xaml | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index 5d62e61d0e..add5dbde84 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -74,6 +74,7 @@ None Transparent Blur + AcrylicBlur From 76316e4a4473979b36f00fe23dcd2d8a3d5ac0e4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 10:09:08 -0300 Subject: [PATCH 038/201] osx reports transparent as its minimum transparency level. --- src/Avalonia.Native/WindowImplBase.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 77200b0a95..a7ca528b2b 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -400,6 +400,11 @@ namespace Avalonia.Native transparencyLevel = WindowTransparencyLevel.AcrylicBlur; } + if(transparencyLevel == WindowTransparencyLevel.None) + { + transparencyLevel = WindowTransparencyLevel.Transparent; + } + TransparencyLevel = transparencyLevel; _native.SetBlurEnabled(TransparencyLevel >= WindowTransparencyLevel.Blur); @@ -407,7 +412,7 @@ namespace Avalonia.Native } } - public WindowTransparencyLevel TransparencyLevel { get; private set; } + public WindowTransparencyLevel TransparencyLevel { get; private set; } = WindowTransparencyLevel.Transparent; public IPlatformHandle Handle { get; private set; } } From ea2fc5459022657a8bb5138dafaf09361ce2abae Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 22 May 2020 10:10:24 -0300 Subject: [PATCH 039/201] initialise render target transparency in toplevel. --- src/Avalonia.Controls/TopLevel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index bd41eb5f28..8335e03487 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -118,7 +118,7 @@ namespace Avalonia.Controls PlatformImpl = impl; - _actualTransparencyLevel = WindowTransparencyLevel.None; + _actualTransparencyLevel = PlatformImpl.TransparencyLevel; dependencyResolver = dependencyResolver ?? AvaloniaLocator.Current; var styler = TryGetService(dependencyResolver); From b99834ccc61a464290021dee7da6f3b9e4618bb5 Mon Sep 17 00:00:00 2001 From: "Luis v.d.Eltz" Date: Mon, 25 May 2020 14:22:34 +0200 Subject: [PATCH 040/201] Update BoolConverters.cs --- src/Avalonia.Base/Data/Converters/BoolConverters.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Data/Converters/BoolConverters.cs b/src/Avalonia.Base/Data/Converters/BoolConverters.cs index 817d1cea9a..6740c2168f 100644 --- a/src/Avalonia.Base/Data/Converters/BoolConverters.cs +++ b/src/Avalonia.Base/Data/Converters/BoolConverters.cs @@ -3,7 +3,7 @@ using System.Linq; namespace Avalonia.Data.Converters { /// - /// Provides a set of useful s for working with string values. + /// Provides a set of useful s for working with bool values. /// public static class BoolConverters { From cd37520b7141c8d0140be887e8ee0fcc85471c6a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 25 May 2020 16:43:22 +0200 Subject: [PATCH 041/201] Trim invalid selection when Source first assigned. `SelectionModel` can have a selection set before its `Source` is initialized. In this case, be sure to trim invalid selections from the model before continuing. Fixes #3919 --- src/Avalonia.Controls/IndexRange.cs | 47 +++++++++++ src/Avalonia.Controls/SelectionModel.cs | 7 +- .../SelectionModelChangeSet.cs | 2 +- src/Avalonia.Controls/SelectionNode.cs | 21 +++++ .../IndexRangeTests.cs | 82 +++++++++++++++++++ .../SelectionModelTests.cs | 44 +++++++--- 6 files changed, 187 insertions(+), 16 deletions(-) diff --git a/src/Avalonia.Controls/IndexRange.cs b/src/Avalonia.Controls/IndexRange.cs index 1dc161c699..e45d013af4 100644 --- a/src/Avalonia.Controls/IndexRange.cs +++ b/src/Avalonia.Controls/IndexRange.cs @@ -132,6 +132,53 @@ namespace Avalonia.Controls return result; } + public static int Intersect( + IList ranges, + IndexRange range, + IList? removed = null) + { + var result = 0; + + for (var i = 0; i < ranges.Count && range != s_invalid; ++i) + { + var existing = ranges[i]; + + if (existing.End < range.Begin || existing.Begin > range.End) + { + removed?.Add(existing); + ranges.RemoveAt(i--); + result += existing.Count; + } + else + { + if (existing.Begin < range.Begin) + { + var except = new IndexRange(existing.Begin, range.Begin - 1); + removed?.Add(except); + ranges[i] = existing = new IndexRange(range.Begin, existing.End); + result += except.Count; + } + + if (existing.End > range.End) + { + var except = new IndexRange(range.End + 1, existing.End); + removed?.Add(except); + ranges[i] = new IndexRange(existing.Begin, range.End); + result += except.Count; + } + } + } + + MergeRanges(ranges); + + if (removed is object) + { + MergeRanges(removed); + } + + return result; + } + public static int Remove( IList ranges, IndexRange range, diff --git a/src/Avalonia.Controls/SelectionModel.cs b/src/Avalonia.Controls/SelectionModel.cs index dd4934f9e5..7a64421326 100644 --- a/src/Avalonia.Controls/SelectionModel.cs +++ b/src/Avalonia.Controls/SelectionModel.cs @@ -45,12 +45,9 @@ namespace Avalonia.Controls if (_rootNode.Source != null) { - if (_rootNode.Source != null) + using (var operation = new Operation(this)) { - using (var operation = new Operation(this)) - { - ClearSelection(resetAnchor: true); - } + ClearSelection(resetAnchor: true); } } diff --git a/src/Avalonia.Controls/SelectionModelChangeSet.cs b/src/Avalonia.Controls/SelectionModelChangeSet.cs index 6e77dc5755..d1df38656a 100644 --- a/src/Avalonia.Controls/SelectionModelChangeSet.cs +++ b/src/Avalonia.Controls/SelectionModelChangeSet.cs @@ -135,7 +135,7 @@ namespace Avalonia.Controls if (index >= currentIndex && index < currentIndex + currentCount) { int targetIndex = GetIndexAt(getRanges(info), index - currentIndex); - item = info.Items?.GetAt(targetIndex); + item = info.Items?.Count > targetIndex ? info.Items?.GetAt(targetIndex) : null; break; } diff --git a/src/Avalonia.Controls/SelectionNode.cs b/src/Avalonia.Controls/SelectionNode.cs index 0b00db88c3..1a3bde1765 100644 --- a/src/Avalonia.Controls/SelectionNode.cs +++ b/src/Avalonia.Controls/SelectionNode.cs @@ -101,6 +101,7 @@ namespace Avalonia.Controls ItemsSourceView = newDataSource; + TrimInvalidSelections(); PopulateSelectedItemsFromSelectedIndices(); HookupCollectionChangedHandler(); OnSelectionChanged(); @@ -108,6 +109,26 @@ namespace Avalonia.Controls } } + private void TrimInvalidSelections() + { + if (_selected == null || ItemsSourceView == null) + { + return; + } + + var validRange = ItemsSourceView.Count > 0 ? new IndexRange(0, ItemsSourceView.Count - 1) : new IndexRange(-1, -1); + var removed = new List(); + var removedCount = IndexRange.Intersect(_selected, validRange, removed); + + if (removedCount > 0) + { + using var operation = _manager.Update(); + SelectedCount -= removedCount; + OnSelectionChanged(); + _operation!.Deselected(removed); + } + } + public ItemsSourceView? ItemsSourceView { get; private set; } public int DataCount => ItemsSourceView?.Count ?? 0; public int ChildrenNodeCount => _childrenNodes.Count; diff --git a/tests/Avalonia.Controls.UnitTests/IndexRangeTests.cs b/tests/Avalonia.Controls.UnitTests/IndexRangeTests.cs index e0f46d9fa9..e01c752658 100644 --- a/tests/Avalonia.Controls.UnitTests/IndexRangeTests.cs +++ b/tests/Avalonia.Controls.UnitTests/IndexRangeTests.cs @@ -127,6 +127,88 @@ namespace Avalonia.Controls.UnitTests Assert.Empty(selected); } + [Fact] + public void Intersect_Should_Remove_Items_From_Beginning() + { + var ranges = new List { new IndexRange(0, 10) }; + var removed = new List(); + var result = IndexRange.Intersect(ranges, new IndexRange(2, 12), removed); + + Assert.Equal(2, result); + Assert.Equal(new[] { new IndexRange(2, 10) }, ranges); + Assert.Equal(new[] { new IndexRange(0, 1) }, removed); + } + + [Fact] + public void Intersect_Should_Remove_Items_From_End() + { + var ranges = new List { new IndexRange(0, 10) }; + var removed = new List(); + var result = IndexRange.Intersect(ranges, new IndexRange(0, 8), removed); + + Assert.Equal(2, result); + Assert.Equal(new[] { new IndexRange(0, 8) }, ranges); + Assert.Equal(new[] { new IndexRange(9, 10) }, removed); + } + + [Fact] + public void Intersect_Should_Remove_Entire_Range_Start() + { + var ranges = new List { new IndexRange(0, 5), new IndexRange(6, 10) }; + var removed = new List(); + var result = IndexRange.Intersect(ranges, new IndexRange(6, 10), removed); + + Assert.Equal(6, result); + Assert.Equal(new[] { new IndexRange(6, 10) }, ranges); + Assert.Equal(new[] { new IndexRange(0, 5) }, removed); + } + + [Fact] + public void Intersect_Should_Remove_Entire_Range_End() + { + var ranges = new List { new IndexRange(0, 5), new IndexRange(6, 10) }; + var removed = new List(); + var result = IndexRange.Intersect(ranges, new IndexRange(0, 4), removed); + + Assert.Equal(6, result); + Assert.Equal(new[] { new IndexRange(0, 4) }, ranges); + Assert.Equal(new[] { new IndexRange(5, 10) }, removed); + } + + [Fact] + public void Intersect_Should_Remove_Entire_Range_Start_End() + { + var ranges = new List + { + new IndexRange(0, 2), + new IndexRange(3, 7), + new IndexRange(8, 10) + }; + var removed = new List(); + var result = IndexRange.Intersect(ranges, new IndexRange(3, 7), removed); + + Assert.Equal(6, result); + Assert.Equal(new[] { new IndexRange(3, 7) }, ranges); + Assert.Equal(new[] { new IndexRange(0, 2), new IndexRange(8, 10) }, removed); + } + + [Fact] + public void Intersect_Should_Remove_Entire_And_Partial_Range_Start_End() + { + var ranges = new List + { + new IndexRange(0, 2), + new IndexRange(3, 7), + new IndexRange(8, 10) + }; + var removed = new List(); + var result = IndexRange.Intersect(ranges, new IndexRange(4, 6), removed); + + Assert.Equal(8, result); + Assert.Equal(new[] { new IndexRange(4, 6) }, ranges); + Assert.Equal(new[] { new IndexRange(0, 3), new IndexRange(7, 10) }, removed); + } + [Fact] public void Remove_Should_Remove_Entire_Range() { diff --git a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs index 211fc44caf..1dc5fead26 100644 --- a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs @@ -1775,7 +1775,17 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void Assigning_Source_With_Less_Items_Than_Selection_Trims_Selection() + public void Initializing_Source_With_Less_Items_Than_Selection_Trims_Selection() + { + var data = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel(); + target.SelectedIndex = new IndexPath(4); + target.Source = data; + Assert.Empty(target.SelectedIndices); + } + + [Fact] + public void Initializing_Source_With_Less_Items_Than_Selection_Trims_Selection_RetainSelection() { var data = new[] { "foo", "bar", "baz" }; var target = new SelectionModel { RetainSelectionOnReset = true }; @@ -1785,7 +1795,7 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void Assigning_Source_With_Less_Items_Than_Multiple_Selection_Trims_Selection() + public void Initializing_Source_With_Less_Items_Than_Multiple_Selection_Trims_Selection() { var data = new[] { "foo", "bar", "baz" }; var target = new SelectionModel { RetainSelectionOnReset = true }; @@ -1796,17 +1806,31 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new IndexPath(2), target.SelectedIndices.First()); } - // test that going from non-null source to non-null source clears selection [Fact] - public void Changing_Source_With_Valid_IndexPath_Retains_Selection() + public void Initializing_Source_With_Less_Items_Than_Selection_Raises_SelectionChanged() { - var data = new[] { "foo", "bar", "baz", "boo", "hoo" }; - var smallerData = new[] { "foo", "bar", "baz" }; - var target = new SelectionModel { RetainSelectionOnReset = true }; + var data = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel(); + var raised = 0; + + target.SelectedIndex = new IndexPath(4); + + target.SelectionChanged += (s, e) => + { + if (raised == 0) + { + Assert.Equal(new[] { Path(4) }, e.DeselectedIndices); + Assert.Equal(new object[] { null }, e.DeselectedItems); + Assert.Empty(e.SelectedIndices); + Assert.Empty(e.SelectedItems); + } + + ++raised; + }; + target.Source = data; - target.SelectedIndex = new IndexPath(2); - target.Source = smallerData; - Assert.Equal(1, target.SelectedIndices.Count); + + Assert.Equal(2, raised); } private int GetSubscriberCount(AvaloniaList list) From 605ede79945df03ff6efb7a50304e5d0dd09381e Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Tue, 26 May 2020 12:07:31 +0200 Subject: [PATCH 042/201] Fix invalid navigation direction for Tab. --- src/Avalonia.Input/NavigationDirection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Input/NavigationDirection.cs b/src/Avalonia.Input/NavigationDirection.cs index 34bedac141..9b9af0b0a6 100644 --- a/src/Avalonia.Input/NavigationDirection.cs +++ b/src/Avalonia.Input/NavigationDirection.cs @@ -102,7 +102,7 @@ namespace Avalonia.Input switch (key) { case Key.Tab: - return (modifiers & KeyModifiers.Shift) != 0 ? + return (modifiers & KeyModifiers.Shift) == 0 ? NavigationDirection.Next : NavigationDirection.Previous; case Key.Up: return NavigationDirection.Up; From 79ff5f48c1a336547a7b7cd84286551f6d90fe6f Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 25 May 2020 14:25:16 +0200 Subject: [PATCH 043/201] Apply global clip to adorner element. Previously, the adorner clip was not taking into account the clip inherited from ancestor controls, resulting in #3984. Fix this by appling the clip from `TransformedBounds.Clip` by translating it to local coordinates first. Note that this doesn't work well for controls with a render transform applied, but at least it fixes the issue in the common case. Fixes #3984 --- src/Avalonia.Controls/Primitives/AdornerLayer.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/AdornerLayer.cs b/src/Avalonia.Controls/Primitives/AdornerLayer.cs index 87ab6cf450..9834bf3d3b 100644 --- a/src/Avalonia.Controls/Primitives/AdornerLayer.cs +++ b/src/Avalonia.Controls/Primitives/AdornerLayer.cs @@ -3,6 +3,7 @@ using System.Collections.Specialized; using System.Linq; using Avalonia.Media; using Avalonia.Rendering; +using Avalonia.Utilities; using Avalonia.VisualTree; namespace Avalonia.Controls.Primitives @@ -78,15 +79,20 @@ namespace Avalonia.Controls.Primitives private void UpdateClip(IControl control, TransformedBounds bounds) { - var clip = control.Clip as RectangleGeometry; - - if (clip == null) + if (!(control.Clip is RectangleGeometry clip)) { - clip = new RectangleGeometry { Transform = new MatrixTransform() }; + clip = new RectangleGeometry(); control.Clip = clip; } - clip.Rect = bounds.Bounds; + var clipBounds = bounds.Bounds; + + if (bounds.Transform.HasInverse) + { + clipBounds = bounds.Clip.TransformToAABB(bounds.Transform.Invert()); + } + + clip.Rect = clipBounds; } private void ChildrenCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) From 9dc9f9debae7cd082acaaf95276f2b49691754bc Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 26 May 2020 13:17:02 +0200 Subject: [PATCH 044/201] Ensure selection is reported correctly during batch update. --- src/Avalonia.Controls/SelectionModel.cs | 13 ++++++ .../SelectionModelTests.cs | 41 +++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/Avalonia.Controls/SelectionModel.cs b/src/Avalonia.Controls/SelectionModel.cs index 0a74306e84..a40e0a62f4 100644 --- a/src/Avalonia.Controls/SelectionModel.cs +++ b/src/Avalonia.Controls/SelectionModel.cs @@ -629,6 +629,8 @@ namespace Avalonia.Controls { AnchorIndex = default; } + + OnSelectionChanged(); } private void OnSelectionChanged(SelectionModelSelectionChangedEventArgs? e = null) @@ -664,6 +666,8 @@ namespace Avalonia.Controls { AnchorIndex = new IndexPath(index); } + + OnSelectionChanged(); } private void SelectWithGroupImpl(int groupIndex, int itemIndex, bool select) @@ -680,6 +684,8 @@ namespace Avalonia.Controls { AnchorIndex = new IndexPath(groupIndex, itemIndex); } + + OnSelectionChanged(); } private void SelectWithPathImpl(IndexPath index, bool select) @@ -708,6 +714,8 @@ namespace Avalonia.Controls { AnchorIndex = index; } + + OnSelectionChanged(); } private void SelectRangeFromAnchorImpl(int index, bool select) @@ -721,6 +729,7 @@ namespace Avalonia.Controls } _rootNode.SelectRange(new IndexRange(anchorIndex, index), select); + OnSelectionChanged(); } private void SelectRangeFromAnchorWithGroupImpl(int endGroupIndex, int endItemIndex, bool select) @@ -754,6 +763,8 @@ namespace Avalonia.Controls int endIndex = groupIdx == endGroupIndex ? endItemIndex : groupNode.DataCount - 1; groupNode.SelectRange(new IndexRange(startIndex, endIndex), select); } + + OnSelectionChanged(); } private void SelectRangeImpl(IndexPath start, IndexPath end, bool select) @@ -781,6 +792,8 @@ namespace Avalonia.Controls info.ParentNode!.Select(info.Path.GetAt(info.Path.GetSize() - 1), select); } }); + + OnSelectionChanged(); } private void BeginOperation() diff --git a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs index b9f93090b4..59552e7f93 100644 --- a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs @@ -1512,6 +1512,47 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(0, raised); } + [Fact] + public void Batch_Update_Selection_Is_Correct_Throughout() + { + var data = new[] { "foo", "bar", "baz", "qux" }; + var target = new SelectionModel { Source = data }; + var raised = 0; + + using (target.Update()) + { + target.Select(1); + + Assert.Equal(new IndexPath(1), target.SelectedIndex); + Assert.Equal(new[] { new IndexPath(1) }, target.SelectedIndices); + Assert.Equal("bar", target.SelectedItem); + Assert.Equal(new[] { "bar" }, target.SelectedItems); + + target.Deselect(1); + + Assert.Equal(new IndexPath(), target.SelectedIndex); + Assert.Empty(target.SelectedIndices); + Assert.Null(target.SelectedItem); + Assert.Empty(target.SelectedItems); + + target.SelectRange(new IndexPath(1), new IndexPath(1)); + + Assert.Equal(new IndexPath(1), target.SelectedIndex); + Assert.Equal(new[] { new IndexPath(1) }, target.SelectedIndices); + Assert.Equal("bar", target.SelectedItem); + Assert.Equal(new[] { "bar" }, target.SelectedItems); + + target.ClearSelection(); + + Assert.Equal(new IndexPath(), target.SelectedIndex); + Assert.Empty(target.SelectedIndices); + Assert.Null(target.SelectedItem); + Assert.Empty(target.SelectedItems); + } + + Assert.Equal(0, raised); + } + [Fact] public void AutoSelect_Selects_When_Enabled() { From 2255518851914fa1c6558d833aad837f88d531ea Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 26 May 2020 13:28:28 +0200 Subject: [PATCH 045/201] Apply auto-select at end of batch update. --- src/Avalonia.Controls/SelectionModel.cs | 41 +++++++++++++------ .../SelectionModelTests.cs | 24 +++++++++++ 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/Avalonia.Controls/SelectionModel.cs b/src/Avalonia.Controls/SelectionModel.cs index a40e0a62f4..314c36d28d 100644 --- a/src/Avalonia.Controls/SelectionModel.cs +++ b/src/Avalonia.Controls/SelectionModel.cs @@ -46,14 +46,25 @@ namespace Avalonia.Controls if (_rootNode.Source != null) { - using (var operation = new Operation(this)) + // Temporarily prevent auto-select when switching source. + var restoreAutoSelect = _autoSelect; + _autoSelect = false; + + try + { + using (var operation = new Operation(this)) + { + ClearSelection(resetAnchor: true); + } + } + finally { - ClearSelection(resetAnchor: true); + _autoSelect = restoreAutoSelect; } } _rootNode.Source = value; - ApplyAutoSelect(); + ApplyAutoSelect(true); RaisePropertyChanged("Source"); @@ -111,7 +122,7 @@ namespace Avalonia.Controls if (_autoSelect != value) { _autoSelect = value; - ApplyAutoSelect(); + ApplyAutoSelect(true); } } } @@ -185,7 +196,6 @@ namespace Avalonia.Controls using var operation = new Operation(this); ClearSelection(resetAnchor: true); SelectWithPathImpl(value, select: true); - ApplyAutoSelect(); } } } @@ -381,21 +391,18 @@ namespace Avalonia.Controls { using var operation = new Operation(this); SelectImpl(index, select: false); - ApplyAutoSelect(); } public void Deselect(int groupIndex, int itemIndex) { using var operation = new Operation(this); SelectWithGroupImpl(groupIndex, itemIndex, select: false); - ApplyAutoSelect(); } public void DeselectAt(IndexPath index) { using var operation = new Operation(this); SelectWithPathImpl(index, select: false); - ApplyAutoSelect(); } public bool IsSelected(int index) => _rootNode.IsSelected(index); @@ -562,7 +569,6 @@ namespace Avalonia.Controls { using var operation = new Operation(this); ClearSelection(resetAnchor: true); - ApplyAutoSelect(); } public IDisposable Update() => new Operation(this); @@ -589,7 +595,7 @@ namespace Avalonia.Controls } OnSelectionChanged(e); - ApplyAutoSelect(); + ApplyAutoSelect(true); } internal IObservable? ResolvePath(object data, IndexPath dataIndexPath) @@ -816,6 +822,8 @@ namespace Avalonia.Controls if (--_operationCount == 0) { + ApplyAutoSelect(false); + var changes = new List(); _rootNode.EndOperation(changes); @@ -837,7 +845,7 @@ namespace Avalonia.Controls } } - private void ApplyAutoSelect() + private void ApplyAutoSelect(bool createOperation) { if (AutoSelect) { @@ -845,8 +853,15 @@ namespace Avalonia.Controls if (SelectedIndex == default && _rootNode.ItemsSourceView?.Count > 0) { - using var operation = new Operation(this); - SelectImpl(0, true); + if (createOperation) + { + using var operation = new Operation(this); + SelectImpl(0, true); + } + else + { + SelectImpl(0, true); + } } } } diff --git a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs index 59552e7f93..24e82a69d0 100644 --- a/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs +++ b/tests/Avalonia.Controls.UnitTests/SelectionModelTests.cs @@ -1754,6 +1754,30 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(0, raised); } + [Fact] + public void AutoSelect_Is_Applied_At_End_Of_Batch_Update() + { + var data = new[] { "foo", "bar", "baz" }; + var target = new SelectionModel { AutoSelect = true, Source = data }; + + using (target.Update()) + { + target.ClearSelection(); + + Assert.Equal(new IndexPath(), target.SelectedIndex); + Assert.Empty(target.SelectedIndices); + Assert.Null(target.SelectedItem); + Assert.Empty(target.SelectedItems); + } + + Assert.Equal(new IndexPath(0), target.SelectedIndex); + Assert.Equal(new[] { new IndexPath(0) }, target.SelectedIndices); + Assert.Equal("foo", target.SelectedItem); + Assert.Equal(new[] { "foo" }, target.SelectedItems); + + Assert.Equal(new IndexPath(0), target.SelectedIndex); + } + [Fact] public void Can_Replace_Parent_Children_Collection() { From 0d9ea706cb82eac1f5220e67c0e23db34ec9b452 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 26 May 2020 09:43:17 -0300 Subject: [PATCH 046/201] update xamlil to support static resources aliases. --- src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github index 4c4b6cf8ff..0681622454 160000 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/xamlil.github @@ -1 +1 @@ -Subproject commit 4c4b6cf8ff0894c925d87b27d4fc7a064440c218 +Subproject commit 068162245473ec39ee36da12150e928072b96403 From d504c861993bb002635e64fc470ba80509769a05 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 13 May 2020 13:00:51 +0200 Subject: [PATCH 047/201] Added a "Select Random Item" button to TreeView page. Causes an exception due to containers not being materialized. --- samples/ControlCatalog/Pages/TreeViewPage.xaml | 1 + .../ViewModels/TreeViewPageViewModel.cs | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/samples/ControlCatalog/Pages/TreeViewPage.xaml b/samples/ControlCatalog/Pages/TreeViewPage.xaml index 6019d5f91f..789b45e62c 100644 --- a/samples/ControlCatalog/Pages/TreeViewPage.xaml +++ b/samples/ControlCatalog/Pages/TreeViewPage.xaml @@ -20,6 +20,7 @@ + Single diff --git a/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs b/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs index d396ef2b3d..5bc23e2fe5 100644 --- a/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs +++ b/samples/ControlCatalog/ViewModels/TreeViewPageViewModel.cs @@ -23,12 +23,14 @@ namespace ControlCatalog.ViewModels AddItemCommand = ReactiveCommand.Create(AddItem); RemoveItemCommand = ReactiveCommand.Create(RemoveItem); + SelectRandomItemCommand = ReactiveCommand.Create(SelectRandomItem); } public ObservableCollection Items { get; } public SelectionModel Selection { get; } public ReactiveCommand AddItemCommand { get; } public ReactiveCommand RemoveItemCommand { get; } + public ReactiveCommand SelectRandomItemCommand { get; } public SelectionMode SelectionMode { @@ -74,6 +76,15 @@ namespace ControlCatalog.ViewModels } } + private void SelectRandomItem() + { + var random = new Random(); + var depth = random.Next(4); + var indexes = Enumerable.Range(0, 4).Select(x => random.Next(10)); + var path = new IndexPath(indexes); + Selection.SelectedIndex = path; + } + private void SelectionChanged(object sender, SelectionModelSelectionChangedEventArgs e) { var selected = string.Join(",", e.SelectedIndices); From 87868cd2bda806fd584a08860bb2222a05c0e7af Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 13 May 2020 14:30:22 +0200 Subject: [PATCH 048/201] Materialize TreeViewItems on selection. If we're selecting a particular tree view item, then materialize and expand the item's ancestors as `SelectionModel` requests children. Only do this if a particular item is being selected, not when an item is selected as part of a range select. To do this, needed to add a `FinalIndex` property to `SelectionModelChildrenRequestedEventArgs` in order to know if we're selecting a descendent of the item whose children are being requested. This is a massive hack, but I can't think of a better way to do it with the current `TreeView` implementation. --- src/Avalonia.Controls/IndexPath.cs | 20 ++++++++++++++ src/Avalonia.Controls/SelectionModel.cs | 27 ++++++++++++------- ...electionModelChildrenRequestedEventArgs.cs | 22 ++++++++++++++- src/Avalonia.Controls/SelectionNode.cs | 6 ++--- src/Avalonia.Controls/TreeView.cs | 9 ++++++- .../Utils/SelectionTreeHelper.cs | 8 +++--- 6 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/Avalonia.Controls/IndexPath.cs b/src/Avalonia.Controls/IndexPath.cs index 6c5aaf7ad1..73b75bc23d 100644 --- a/src/Avalonia.Controls/IndexPath.cs +++ b/src/Avalonia.Controls/IndexPath.cs @@ -123,6 +123,26 @@ namespace Avalonia.Controls } } + public bool IsAncestorOf(in IndexPath other) + { + if (other.GetSize() <= GetSize()) + { + return false; + } + + var size = GetSize(); + + for (int i = 0; i < size; i++) + { + if (GetAt(i) != other.GetAt(i)) + { + return false; + } + } + + return true; + } + public override string ToString() { if (_path != null) diff --git a/src/Avalonia.Controls/SelectionModel.cs b/src/Avalonia.Controls/SelectionModel.cs index 314c36d28d..ff1c0260bb 100644 --- a/src/Avalonia.Controls/SelectionModel.cs +++ b/src/Avalonia.Controls/SelectionModel.cs @@ -141,7 +141,7 @@ namespace Avalonia.Controls while (current?.AnchorIndex >= 0) { path.Add(current.AnchorIndex); - current = current.GetAt(current.AnchorIndex, false); + current = current.GetAt(current.AnchorIndex, false, default); } anchor = new IndexPath(path); @@ -420,7 +420,7 @@ namespace Avalonia.Controls for (int i = 0; i < path.GetSize() - 1; i++) { var childIndex = path.GetAt(i); - node = node.GetAt(childIndex, realizeChild: false); + node = node.GetAt(childIndex, false, default); if (node == null) { @@ -455,7 +455,7 @@ namespace Avalonia.Controls } var isSelected = (bool?)false; - var childNode = _rootNode.GetAt(groupIndex, realizeChild: false); + var childNode = _rootNode.GetAt(groupIndex, false, default); if (childNode != null) { @@ -474,7 +474,7 @@ namespace Avalonia.Controls for (int i = 0; i < path.GetSize() - 1; i++) { var childIndex = path.GetAt(i); - node = node.GetAt(childIndex, realizeChild: false); + node = node.GetAt(childIndex, false, default); if (node == null) { @@ -598,7 +598,10 @@ namespace Avalonia.Controls ApplyAutoSelect(true); } - internal IObservable? ResolvePath(object data, IndexPath dataIndexPath) + internal IObservable? ResolvePath( + object data, + IndexPath dataIndexPath, + IndexPath finalIndexPath) { IObservable? resolved = null; @@ -607,18 +610,22 @@ namespace Avalonia.Controls { if (_childrenRequestedEventArgs == null) { - _childrenRequestedEventArgs = new SelectionModelChildrenRequestedEventArgs(data, dataIndexPath, false); + _childrenRequestedEventArgs = new SelectionModelChildrenRequestedEventArgs( + data, + dataIndexPath, + finalIndexPath, + false); } else { - _childrenRequestedEventArgs.Initialize(data, dataIndexPath, false); + _childrenRequestedEventArgs.Initialize(data, dataIndexPath, finalIndexPath, false); } ChildrenRequested(this, _childrenRequestedEventArgs); resolved = _childrenRequestedEventArgs.Children; // Clear out the values in the args so that it cannot be used after the event handler call. - _childrenRequestedEventArgs.Initialize(null, default, true); + _childrenRequestedEventArgs.Initialize(null, default, default, true); } return resolved; @@ -683,7 +690,7 @@ namespace Avalonia.Controls ClearSelection(resetAnchor: true); } - var childNode = _rootNode.GetAt(groupIndex, realizeChild: true); + var childNode = _rootNode.GetAt(groupIndex, true, new IndexPath(groupIndex, itemIndex)); var selected = childNode!.Select(itemIndex, select); if (selected) @@ -764,7 +771,7 @@ namespace Avalonia.Controls for (int groupIdx = startGroupIndex; groupIdx <= endGroupIndex; groupIdx++) { - var groupNode = _rootNode.GetAt(groupIdx, realizeChild: true)!; + var groupNode = _rootNode.GetAt(groupIdx, true, new IndexPath(endGroupIndex, endItemIndex))!; int startIndex = groupIdx == startGroupIndex ? startItemIndex : 0; int endIndex = groupIdx == endGroupIndex ? endItemIndex : groupNode.DataCount - 1; groupNode.SelectRange(new IndexRange(startIndex, endIndex), select); diff --git a/src/Avalonia.Controls/SelectionModelChildrenRequestedEventArgs.cs b/src/Avalonia.Controls/SelectionModelChildrenRequestedEventArgs.cs index 974da0cf71..b1f3e0b2c4 100644 --- a/src/Avalonia.Controls/SelectionModelChildrenRequestedEventArgs.cs +++ b/src/Avalonia.Controls/SelectionModelChildrenRequestedEventArgs.cs @@ -16,15 +16,17 @@ namespace Avalonia.Controls { private object? _source; private IndexPath _sourceIndexPath; + private IndexPath _finalIndexPath; private bool _throwOnAccess; internal SelectionModelChildrenRequestedEventArgs( object source, IndexPath sourceIndexPath, + IndexPath finalIndexPath, bool throwOnAccess) { source = source ?? throw new ArgumentNullException(nameof(source)); - Initialize(source, sourceIndexPath, throwOnAccess); + Initialize(source, sourceIndexPath, finalIndexPath, throwOnAccess); } /// @@ -65,9 +67,26 @@ namespace Avalonia.Controls } } + /// + /// Gets the index of the final object which is being attempted to be retrieved. + /// + public IndexPath FinalIndex + { + get + { + if (_throwOnAccess) + { + throw new ObjectDisposedException(nameof(SelectionModelChildrenRequestedEventArgs)); + } + + return _finalIndexPath; + } + } + internal void Initialize( object? source, IndexPath sourceIndexPath, + IndexPath finalIndexPath, bool throwOnAccess) { if (!throwOnAccess && source == null) @@ -77,6 +96,7 @@ namespace Avalonia.Controls _source = source; _sourceIndexPath = sourceIndexPath; + _finalIndexPath = finalIndexPath; _throwOnAccess = throwOnAccess; } } diff --git a/src/Avalonia.Controls/SelectionNode.cs b/src/Avalonia.Controls/SelectionNode.cs index 1a3bde1765..d99606673e 100644 --- a/src/Avalonia.Controls/SelectionNode.cs +++ b/src/Avalonia.Controls/SelectionNode.cs @@ -162,7 +162,7 @@ namespace Avalonia.Controls // create a bunch of leaf node instances - instead i use the same instance m_leafNode to avoid // an explosion of node objects. However, I'm still creating the m_childrenNodes // collection unfortunately. - public SelectionNode? GetAt(int index, bool realizeChild) + public SelectionNode? GetAt(int index, bool realizeChild, IndexPath finalIndexPath) { SelectionNode? child = null; @@ -192,7 +192,7 @@ namespace Avalonia.Controls if (childData != null) { var childDataIndexPath = IndexPath.CloneWithChildIndex(index); - resolver = _manager.ResolvePath(childData, childDataIndexPath); + resolver = _manager.ResolvePath(childData, childDataIndexPath, finalIndexPath); } if (resolver != null) @@ -864,7 +864,7 @@ namespace Avalonia.Controls int notSelectedCount = 0; for (int i = 0; i < ChildrenNodeCount; i++) { - var child = GetAt(i, realizeChild: false); + var child = GetAt(i, false, default); if (child != null) { diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs index 95e7437838..3e6ade39fc 100644 --- a/src/Avalonia.Controls/TreeView.cs +++ b/src/Avalonia.Controls/TreeView.cs @@ -395,10 +395,17 @@ namespace Avalonia.Controls private void OnSelectionModelChildrenRequested(object sender, SelectionModelChildrenRequestedEventArgs e) { - var container = ItemContainerGenerator.Index.ContainerFromItem(e.Source) as ItemsControl; + var container = ItemContainerGenerator.Index.ContainerFromItem(e.Source) as TreeViewItem; if (container is object) { + if (e.SourceIndex.IsAncestorOf(e.FinalIndex)) + { + container.IsExpanded = true; + container.ApplyTemplate(); + container.Presenter?.ApplyTemplate(); + } + e.Children = Observable.CombineLatest( container.GetObservable(TreeViewItem.IsExpandedProperty), container.GetObservable(ItemsProperty), diff --git a/src/Avalonia.Controls/Utils/SelectionTreeHelper.cs b/src/Avalonia.Controls/Utils/SelectionTreeHelper.cs index 430ecabbb8..5adf5bdeea 100644 --- a/src/Avalonia.Controls/Utils/SelectionTreeHelper.cs +++ b/src/Avalonia.Controls/Utils/SelectionTreeHelper.cs @@ -28,7 +28,7 @@ namespace Avalonia.Controls.Utils if (depth < path.GetSize() - 1) { - node = node.GetAt(childIndex, realizeChildren)!; + node = node.GetAt(childIndex, realizeChildren, path)!; } } } @@ -50,7 +50,7 @@ namespace Avalonia.Controls.Utils int count = realizeChildren ? nextNode.Node.DataCount : nextNode.Node.ChildrenNodeCount; for (int i = count - 1; i >= 0; i--) { - var child = nextNode.Node.GetAt(i, realizeChildren); + var child = nextNode.Node.GetAt(i, realizeChildren, nextNode.Path); var childPath = nextNode.Path.CloneWithChildIndex(i); if (child != null) { @@ -90,7 +90,7 @@ namespace Avalonia.Controls.Utils for (int i = endIndex; i >= startIndex; i--) { - var child = node.GetAt(i, realizeChild: true); + var child = node.GetAt(i, true, end); if (child != null) { var childPath = currentPath.CloneWithChildIndex(i); @@ -112,7 +112,7 @@ namespace Avalonia.Controls.Utils int endIndex = depth < end.GetSize() && isEndPath ? end.GetAt(depth) : info.Node.DataCount - 1; for (int i = endIndex; i >= startIndex; i--) { - var child = info.Node.GetAt(i, realizeChild: true); + var child = info.Node.GetAt(i, true, end); if (child != null) { var childPath = info.Path.CloneWithChildIndex(i); From 9df84abbf3db84a74bc9fbee1b90e14b816a23d2 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 13 May 2020 14:55:33 +0200 Subject: [PATCH 049/201] Bring selected TreeViewItem into view after layout finishes. --- src/Avalonia.Controls/TreeView.cs | 2 +- .../TreeViewTests.cs | 548 ++++++++++-------- 2 files changed, 298 insertions(+), 252 deletions(-) diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs index 3e6ade39fc..1e66bf4d69 100644 --- a/src/Avalonia.Controls/TreeView.cs +++ b/src/Avalonia.Controls/TreeView.cs @@ -346,7 +346,7 @@ namespace Avalonia.Controls if (container != null) { - container.BringIntoView(); + DispatcherTimer.RunOnce(container.BringIntoView, TimeSpan.Zero); } } } diff --git a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs index 373f3e6861..c1bd45bcad 100644 --- a/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TreeViewTests.cs @@ -118,313 +118,340 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Clicking_Item_Should_Select_It() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var item = tree[0].Children[1].Children[0]; - var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); + var item = tree[0].Children[1].Children[0]; + var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); - Assert.NotNull(container); + Assert.NotNull(container); - _mouse.Click(container); + _mouse.Click(container); - Assert.Equal(item, target.SelectedItem); - Assert.True(container.IsSelected); + Assert.Equal(item, target.SelectedItem); + Assert.True(container.IsSelected); + } } [Fact] public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_It() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var item = tree[0].Children[1].Children[0]; - var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); + var item = tree[0].Children[1].Children[0]; + var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); - Assert.NotNull(container); + Assert.NotNull(container); - target.SelectedItem = item; + target.SelectedItem = item; - Assert.True(container.IsSelected); + Assert.True(container.IsSelected); - _mouse.Click(container, modifiers: KeyModifiers.Control); + _mouse.Click(container, modifiers: KeyModifiers.Control); - Assert.Null(target.SelectedItem); - Assert.False(container.IsSelected); + Assert.Null(target.SelectedItem); + Assert.False(container.IsSelected); + } } [Fact] public void Clicking_WithControlModifier_Not_Selected_Item_Should_Select_It() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var item1 = tree[0].Children[1].Children[0]; - var container1 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1); + var item1 = tree[0].Children[1].Children[0]; + var container1 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1); - var item2 = tree[0].Children[1]; - var container2 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2); + var item2 = tree[0].Children[1]; + var container2 = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2); - Assert.NotNull(container1); - Assert.NotNull(container2); + Assert.NotNull(container1); + Assert.NotNull(container2); - target.SelectedItem = item1; + target.SelectedItem = item1; - Assert.True(container1.IsSelected); + Assert.True(container1.IsSelected); - _mouse.Click(container2, modifiers: KeyModifiers.Control); - - Assert.Equal(item2, target.SelectedItem); - Assert.False(container1.IsSelected); - Assert.True(container2.IsSelected); + _mouse.Click(container2, modifiers: KeyModifiers.Control); + + Assert.Equal(item2, target.SelectedItem); + Assert.False(container1.IsSelected); + Assert.True(container2.IsSelected); + } } [Fact] public void Clicking_WithControlModifier_Selected_Item_Should_Deselect_And_Remove_From_SelectedItems() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - SelectionMode = SelectionMode.Multiple - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + SelectionMode = SelectionMode.Multiple + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var rootNode = tree[0]; + var rootNode = tree[0]; - var item1 = rootNode.Children[0]; - var item2 = rootNode.Children.Last(); + var item1 = rootNode.Children[0]; + var item2 = rootNode.Children.Last(); - var item1Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1); - var item2Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2); + var item1Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item1); + var item2Container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item2); - ClickContainer(item1Container, KeyModifiers.Control); - Assert.True(item1Container.IsSelected); + ClickContainer(item1Container, KeyModifiers.Control); + Assert.True(item1Container.IsSelected); - ClickContainer(item2Container, KeyModifiers.Control); - Assert.True(item2Container.IsSelected); + ClickContainer(item2Container, KeyModifiers.Control); + Assert.True(item2Container.IsSelected); - Assert.Equal(new[] {item1, item2}, target.Selection.SelectedItems.OfType()); + Assert.Equal(new[] { item1, item2 }, target.Selection.SelectedItems.OfType()); - ClickContainer(item1Container, KeyModifiers.Control); - Assert.False(item1Container.IsSelected); + ClickContainer(item1Container, KeyModifiers.Control); + Assert.False(item1Container.IsSelected); - Assert.DoesNotContain(item1, target.Selection.SelectedItems.OfType()); + Assert.DoesNotContain(item1, target.Selection.SelectedItems.OfType()); + } } [Fact] public void Clicking_WithShiftModifier_DownDirection_Should_Select_Range_Of_Items() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - SelectionMode = SelectionMode.Multiple - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + SelectionMode = SelectionMode.Multiple + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var rootNode = tree[0]; + var rootNode = tree[0]; - var from = rootNode.Children[0]; - var to = rootNode.Children.Last(); + var from = rootNode.Children[0]; + var to = rootNode.Children.Last(); - var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); - var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); + var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); + var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); - ClickContainer(fromContainer, KeyModifiers.None); + ClickContainer(fromContainer, KeyModifiers.None); - Assert.True(fromContainer.IsSelected); + Assert.True(fromContainer.IsSelected); - ClickContainer(toContainer, KeyModifiers.Shift); - AssertChildrenSelected(target, rootNode); + ClickContainer(toContainer, KeyModifiers.Shift); + AssertChildrenSelected(target, rootNode); + } } [Fact] public void Clicking_WithShiftModifier_UpDirection_Should_Select_Range_Of_Items() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - SelectionMode = SelectionMode.Multiple - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + SelectionMode = SelectionMode.Multiple + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var rootNode = tree[0]; + var rootNode = tree[0]; - var from = rootNode.Children.Last(); - var to = rootNode.Children[0]; + var from = rootNode.Children.Last(); + var to = rootNode.Children[0]; - var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); - var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); + var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); + var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); - ClickContainer(fromContainer, KeyModifiers.None); + ClickContainer(fromContainer, KeyModifiers.None); - Assert.True(fromContainer.IsSelected); + Assert.True(fromContainer.IsSelected); - ClickContainer(toContainer, KeyModifiers.Shift); - AssertChildrenSelected(target, rootNode); + ClickContainer(toContainer, KeyModifiers.Shift); + AssertChildrenSelected(target, rootNode); + } } [Fact] public void Clicking_First_Item_Of_SelectedItems_Should_Select_Only_It() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - SelectionMode = SelectionMode.Multiple - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + SelectionMode = SelectionMode.Multiple + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var rootNode = tree[0]; + var rootNode = tree[0]; - var from = rootNode.Children.Last(); - var to = rootNode.Children[0]; + var from = rootNode.Children.Last(); + var to = rootNode.Children[0]; - var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); - var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); + var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); + var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); - ClickContainer(fromContainer, KeyModifiers.None); + ClickContainer(fromContainer, KeyModifiers.None); - ClickContainer(toContainer, KeyModifiers.Shift); - AssertChildrenSelected(target, rootNode); + ClickContainer(toContainer, KeyModifiers.Shift); + AssertChildrenSelected(target, rootNode); - ClickContainer(fromContainer, KeyModifiers.None); + ClickContainer(fromContainer, KeyModifiers.None); - Assert.True(fromContainer.IsSelected); + Assert.True(fromContainer.IsSelected); - foreach (var child in rootNode.Children) - { - if (child == from) + foreach (var child in rootNode.Children) { - continue; - } + if (child == from) + { + continue; + } - var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(child); + var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(child); - Assert.False(container.IsSelected); + Assert.False(container.IsSelected); + } } } [Fact] public void Setting_SelectedItem_Should_Set_Container_Selected() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var item = tree[0].Children[1].Children[0]; - var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); + var item = tree[0].Children[1].Children[0]; + var container = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(item); - Assert.NotNull(container); + Assert.NotNull(container); - target.SelectedItem = item; + target.SelectedItem = item; - Assert.True(container.IsSelected); + Assert.True(container.IsSelected); + } } [Fact] public void Setting_SelectedItem_Should_Raise_SelectedItemChanged_Event() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - ExpandAll(target); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + ExpandAll(target); - var item = tree[0].Children[1].Children[0]; + var item = tree[0].Children[1].Children[0]; - var called = false; - target.SelectionChanged += (s, e) => - { - Assert.Empty(e.RemovedItems); - Assert.Equal(1, e.AddedItems.Count); - Assert.Same(item, e.AddedItems[0]); - called = true; - }; + var called = false; + target.SelectionChanged += (s, e) => + { + Assert.Empty(e.RemovedItems); + Assert.Equal(1, e.AddedItems.Count); + Assert.Same(item, e.AddedItems[0]); + called = true; + }; - target.SelectedItem = item; - Assert.True(called); + target.SelectedItem = item; + Assert.True(called); + } } [Fact] @@ -564,7 +591,7 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Keyboard_Navigation_Should_Move_To_Last_Selected_Node() { - using (UnitTestApplication.Start(TestServices.RealFocus)) + using (Application()) { var focus = FocusManager.Instance; var navigation = AvaloniaLocator.Current.GetService(); @@ -647,7 +674,7 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Pressing_SelectAll_Gesture_With_Downward_Range_Selected_Should_Select_All_Nodes() { - using (UnitTestApplication.Start()) + using (Application()) { var tree = CreateTestTreeData(); var target = new TreeView @@ -694,7 +721,7 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Pressing_SelectAll_Gesture_With_Upward_Range_Selected_Should_Select_All_Nodes() { - using (UnitTestApplication.Start()) + using (Application()) { var tree = CreateTestTreeData(); var target = new TreeView @@ -768,97 +795,106 @@ namespace Avalonia.Controls.UnitTests [Fact] public void Right_Click_On_UnselectedItem_Should_Clear_Existing_Selection() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - SelectionMode = SelectionMode.Multiple, - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + SelectionMode = SelectionMode.Multiple, + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); - var rootNode = tree[0]; - var to = rootNode.Children[0]; - var then = rootNode.Children[1]; + var rootNode = tree[0]; + var to = rootNode.Children[0]; + var then = rootNode.Children[1]; - var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(rootNode); - var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); - var thenContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(then); + var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(rootNode); + var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); + var thenContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(then); - ClickContainer(fromContainer, KeyModifiers.None); - ClickContainer(toContainer, KeyModifiers.Shift); + ClickContainer(fromContainer, KeyModifiers.None); + ClickContainer(toContainer, KeyModifiers.Shift); - Assert.Equal(2, target.Selection.SelectedItems.Count); + Assert.Equal(2, target.Selection.SelectedItems.Count); - _mouse.Click(thenContainer, MouseButton.Right); + _mouse.Click(thenContainer, MouseButton.Right); - Assert.Equal(1, target.Selection.SelectedItems.Count); + Assert.Equal(1, target.Selection.SelectedItems.Count); + } } [Fact] public void Shift_Right_Click_Should_Not_Select_Multiple() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - SelectionMode = SelectionMode.Multiple, - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + SelectionMode = SelectionMode.Multiple, + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); - var rootNode = tree[0]; - var from = rootNode.Children[0]; - var to = rootNode.Children[1]; - var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); - var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); + var rootNode = tree[0]; + var from = rootNode.Children[0]; + var to = rootNode.Children[1]; + var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); + var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); - _mouse.Click(fromContainer); - _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Shift); + _mouse.Click(fromContainer); + _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Shift); - Assert.Equal(1, target.Selection.SelectedItems.Count); + Assert.Equal(1, target.Selection.SelectedItems.Count); + } } [Fact] public void Ctrl_Right_Click_Should_Not_Select_Multiple() { - var tree = CreateTestTreeData(); - var target = new TreeView + using (Application()) { - Template = CreateTreeViewTemplate(), - Items = tree, - SelectionMode = SelectionMode.Multiple, - }; + var tree = CreateTestTreeData(); + var target = new TreeView + { + Template = CreateTreeViewTemplate(), + Items = tree, + SelectionMode = SelectionMode.Multiple, + }; - var visualRoot = new TestRoot(); - visualRoot.Child = target; + var visualRoot = new TestRoot(); + visualRoot.Child = target; - CreateNodeDataTemplate(target); - ApplyTemplates(target); - target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); + CreateNodeDataTemplate(target); + ApplyTemplates(target); + target.ExpandSubTree((TreeViewItem)target.Presenter.Panel.Children[0]); - var rootNode = tree[0]; - var from = rootNode.Children[0]; - var to = rootNode.Children[1]; - var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); - var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); + var rootNode = tree[0]; + var from = rootNode.Children[0]; + var to = rootNode.Children[1]; + var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from); + var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to); - _mouse.Click(fromContainer); - _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Control); + _mouse.Click(fromContainer); + _mouse.Click(toContainer, MouseButton.Right, modifiers: KeyModifiers.Control); - Assert.Equal(1, target.Selection.SelectedItems.Count); + Assert.Equal(1, target.Selection.SelectedItems.Count); + } } [Fact] @@ -944,7 +980,7 @@ namespace Avalonia.Controls.UnitTests public void Auto_Expanding_In_Style_Should_Not_Break_Range_Selection() { /// Issue #2980. - using (UnitTestApplication.Start(TestServices.RealStyler)) + using (Application()) { var target = new DerivedTreeView { @@ -1183,12 +1219,12 @@ namespace Avalonia.Controls.UnitTests } } - void ClickContainer(IControl container, KeyModifiers modifiers) + private void ClickContainer(IControl container, KeyModifiers modifiers) { _mouse.Click(container, modifiers: modifiers); } - void AssertChildrenSelected(TreeView treeView, Node rootNode) + private void AssertChildrenSelected(TreeView treeView, Node rootNode) { foreach (var child in rootNode.Children) { @@ -1198,6 +1234,16 @@ namespace Avalonia.Controls.UnitTests } } + private IDisposable Application() + { + return UnitTestApplication.Start( + TestServices.MockThreadingInterface.With( + focusManager: new FocusManager(), + keyboardDevice: () => new KeyboardDevice(), + keyboardNavigation: new KeyboardNavigationHandler(), + inputManager: new InputManager())); + } + private class Node : NotifyingBase { private IAvaloniaList _children; From a3d3690470aa6787a5c2531dab7c0208df6373ea Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 26 May 2020 18:20:19 +0200 Subject: [PATCH 050/201] Use SelectionModel for DevTools tree. --- .../Diagnostics/ViewModels/TreeNode.cs | 38 ++++++++++++++++++- .../ViewModels/TreePageViewModel.cs | 24 +++++++++--- .../Diagnostics/Views/TreePageView.xaml | 2 +- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreeNode.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreeNode.cs index c8a9da600d..aa27538abc 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreeNode.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreeNode.cs @@ -1,11 +1,11 @@ using System; +using System.Collections.Generic; using System.Collections.Specialized; using System.Reactive; using System.Reactive.Linq; using Avalonia.Collections; using Avalonia.Controls; using Avalonia.LogicalTree; -using Avalonia.Styling; using Avalonia.VisualTree; namespace Avalonia.Diagnostics.ViewModels @@ -82,5 +82,41 @@ namespace Avalonia.Diagnostics.ViewModels get; private set; } + + public IndexPath Index + { + get + { + var indices = new List(); + var child = this; + var parent = Parent; + + while (parent is object) + { + indices.Add(IndexOf(parent.Children, child)); + child = child.Parent; + parent = parent.Parent; + } + + indices.Add(0); + indices.Reverse(); + return new IndexPath(indices); + } + } + + private static int IndexOf(IReadOnlyList collection, TreeNode item) + { + var count = collection.Count; + + for (var i = 0; i < count; ++i) + { + if (collection[i] == item) + { + return i; + } + } + + throw new AvaloniaInternalException("TreeNode was not present in parent Children collection."); + } } } diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs index 26b5fe2524..4496cc0a1c 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/TreePageViewModel.cs @@ -6,28 +6,40 @@ namespace Avalonia.Diagnostics.ViewModels { internal class TreePageViewModel : ViewModelBase, IDisposable { - private TreeNode _selected; + private TreeNode _selectedNode; private ControlDetailsViewModel _details; private string _propertyFilter; public TreePageViewModel(TreeNode[] nodes) { Nodes = nodes; - } + Selection = new SelectionModel + { + SingleSelect = true, + Source = Nodes + }; + + Selection.SelectionChanged += (s, e) => + { + SelectedNode = (TreeNode)Selection.SelectedItem; + }; + } public TreeNode[] Nodes { get; protected set; } + public SelectionModel Selection { get; } + public TreeNode SelectedNode { - get => _selected; - set + get => _selectedNode; + private set { if (Details != null) { _propertyFilter = Details.PropertyFilter; } - if (RaiseAndSetIfChanged(ref _selected, value)) + if (RaiseAndSetIfChanged(ref _selectedNode, value)) { Details = value != null ? new ControlDetailsViewModel(value.Visual, _propertyFilter) : @@ -83,7 +95,7 @@ namespace Avalonia.Diagnostics.ViewModels if (node != null) { - SelectedNode = node; + Selection.SelectedIndex = node.Index; ExpandNode(node.Parent); } } diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml b/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml index a1e6ca7d37..4ddb320175 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml +++ b/src/Avalonia.Diagnostics/Diagnostics/Views/TreePageView.xaml @@ -6,7 +6,7 @@ + Selection="{Binding Selection}"> From d6cce80809ad8303cc48b2fd827d9b1c93f65f5f Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Tue, 26 May 2020 18:20:42 +0200 Subject: [PATCH 051/201] Add clarification. --- src/Avalonia.Controls/TreeView.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/TreeView.cs b/src/Avalonia.Controls/TreeView.cs index 1e66bf4d69..a91655855c 100644 --- a/src/Avalonia.Controls/TreeView.cs +++ b/src/Avalonia.Controls/TreeView.cs @@ -119,9 +119,10 @@ namespace Avalonia.Controls /// /// Gets or sets the selected item. /// - /// - /// Gets or sets the selected item. - /// + /// + /// Note that setting this property only currently works if the item is expanded to be visible. + /// To select non-expanded nodes use `Selection.SelectedIndex`. + /// public object SelectedItem { get => Selection.SelectedItem; From 55200b708081b878f5d9aa2fe24e8b94b6ef8fb8 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 12:44:22 -0300 Subject: [PATCH 052/201] prevent so with ResourceInclude and StyleInclude. --- .../Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs | 4 +++- src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs index 87e2ba3a2e..5f5c0211b8 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs @@ -13,6 +13,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { private Uri? _baseUri; private IResourceDictionary? _loaded; + private bool _isLoading; /// /// Gets the loaded resource dictionary. @@ -21,8 +22,9 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { get { - if (_loaded == null) + if (!_isLoading) { + _isLoading = true; var loader = new AvaloniaXamlLoader(); _loaded = (IResourceDictionary)loader.Load(Source, _baseUri); } diff --git a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs index 2b39263ee9..6bffaaa804 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs @@ -14,6 +14,7 @@ namespace Avalonia.Markup.Xaml.Styling { private readonly Uri _baseUri; private IStyle[]? _loaded; + private bool _isLoading; /// /// Initializes a new instance of the class. @@ -47,8 +48,10 @@ namespace Avalonia.Markup.Xaml.Styling { get { - if (_loaded == null) + if (!_isLoading) { + _isLoading = true; + var loader = new AvaloniaXamlLoader(); var loaded = (IStyle)loader.Load(Source, _baseUri); _loaded = new[] { loaded }; From 98591e7574b7da56a79b356eebea1b262686f583 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 18:40:56 -0300 Subject: [PATCH 053/201] remove workaround. --- .../MarkupExtensions/ResourceInclude.cs | 8 +++----- src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs | 7 ++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs index 5f5c0211b8..2e8fd49702 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs @@ -12,8 +12,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions public class ResourceInclude : IResourceProvider { private Uri? _baseUri; - private IResourceDictionary? _loaded; - private bool _isLoading; + private IResourceDictionary? _loaded; /// /// Gets the loaded resource dictionary. @@ -22,9 +21,8 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { get { - if (!_isLoading) - { - _isLoading = true; + if (_loaded is null) + { var loader = new AvaloniaXamlLoader(); _loaded = (IResourceDictionary)loader.Load(Source, _baseUri); } diff --git a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs index 6bffaaa804..00320ce4e9 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs @@ -13,8 +13,7 @@ namespace Avalonia.Markup.Xaml.Styling public class StyleInclude : IStyle, IResourceProvider { private readonly Uri _baseUri; - private IStyle[]? _loaded; - private bool _isLoading; + private IStyle[]? _loaded; /// /// Initializes a new instance of the class. @@ -48,10 +47,8 @@ namespace Avalonia.Markup.Xaml.Styling { get { - if (!_isLoading) + if (_loaded is null) { - _isLoading = true; - var loader = new AvaloniaXamlLoader(); var loaded = (IStyle)loader.Load(Source, _baseUri); _loaded = new[] { loaded }; From 455c8998766cb6c5806e095b965bcf12d785aaf5 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 18:43:24 -0300 Subject: [PATCH 054/201] Add failing unit tests. --- .../MarkupExtensions/ResourceIncludeTests.cs | 30 +++++++++++++ .../StyleIncludeTests.cs | 44 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs index 7ab6c2de40..e827627938 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs @@ -44,6 +44,36 @@ namespace Avalonia.Markup.Xaml.UnitTests.MakrupExtensions } } + [Fact] + public void Missing_ResourceKey_In_ResourceInclude_Does_Not_Cause_StackOverflow() + { + var styleXaml = @" + + +"; + + using (StartWithResources(("test:style.xaml", styleXaml))) + { + var xaml = @" + + + + + + + + +"; + + var loader = new AvaloniaXamlLoader(); + var app = Application.Current; + + loader.Load(xaml, null, app); + } + } + private IDisposable StartWithResources(params (string, string)[] assets) { var assetLoader = new MockAssetLoader(assets); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs new file mode 100644 index 0000000000..f4e96942a3 --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs @@ -0,0 +1,44 @@ +using System; +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.Markup.Xaml.UnitTests +{ + public class StyleIncludeTests : XamlTestBase + { + [Fact] + public void Missing_ResourceKey_In_StyleInclude_Does_Not_Cause_StackOverflow() + { + var styleXaml = @" +"; + + using (StartWithResources(("test:style.xaml", styleXaml))) + { + var xaml = @" + + + + +"; + + var loader = new AvaloniaXamlLoader(); + var app = Application.Current; + + loader.Load(xaml, null, app); + } + } + + private IDisposable StartWithResources(params (string, string)[] assets) + { + var assetLoader = new MockAssetLoader(assets); + var services = new TestServices(assetLoader: assetLoader); + return UnitTestApplication.Start(services); + } + } +} From 8f396d0570165066194b5f13fb3e42e705fa6c4d Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 18:49:33 -0300 Subject: [PATCH 055/201] add fix for StackOverflow in resource loading. --- .../MarkupExtensions/ResourceInclude.cs | 15 ++++++++++++--- .../Avalonia.Markup.Xaml/Styling/StyleInclude.cs | 7 +++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs index 2e8fd49702..ce9e3fd4b1 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs @@ -12,7 +12,8 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions public class ResourceInclude : IResourceProvider { private Uri? _baseUri; - private IResourceDictionary? _loaded; + private IResourceDictionary? _loaded; + private bool _isLoading; /// /// Gets the loaded resource dictionary. @@ -22,9 +23,11 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions get { if (_loaded is null) - { + { + _isLoading = true; var loader = new AvaloniaXamlLoader(); _loaded = (IResourceDictionary)loader.Load(Source, _baseUri); + _isLoading = false; } return _loaded; @@ -48,7 +51,13 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions bool IResourceNode.TryGetResource(object key, out object? value) { - return Loaded.TryGetResource(key, out value); + if(!_isLoading) + { + return Loaded.TryGetResource(key, out value); + } + + value = null; + return false; } void IResourceProvider.AddOwner(IResourceHost owner) => Loaded.AddOwner(owner); diff --git a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs index 00320ce4e9..9d5b56ebb4 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs @@ -13,7 +13,8 @@ namespace Avalonia.Markup.Xaml.Styling public class StyleInclude : IStyle, IResourceProvider { private readonly Uri _baseUri; - private IStyle[]? _loaded; + private IStyle[]? _loaded; + private bool _isLoading; /// /// Initializes a new instance of the class. @@ -49,9 +50,11 @@ namespace Avalonia.Markup.Xaml.Styling { if (_loaded is null) { + _isLoading = true; var loader = new AvaloniaXamlLoader(); var loaded = (IStyle)loader.Load(Source, _baseUri); _loaded = new[] { loaded }; + _isLoading = false; } return _loaded?[0]!; @@ -84,7 +87,7 @@ namespace Avalonia.Markup.Xaml.Styling public bool TryGetResource(object key, out object? value) { - if (Loaded is IResourceProvider p) + if (!_isLoading && Loaded is IResourceProvider p) { return p.TryGetResource(key, out value); } From ed375b578008586617ec5380e9fc5dd03d6f4b79 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 18:53:49 -0300 Subject: [PATCH 056/201] Allow tests to pass as we expect a KeyNotFound exceptions. --- .../MarkupExtensions/ResourceIncludeTests.cs | 10 +++++++++- .../StyleIncludeTests.cs | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs index e827627938..1514d5bd95 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/ResourceIncludeTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Avalonia.Controls; using Avalonia.Media; using Avalonia.UnitTests; @@ -70,7 +71,14 @@ namespace Avalonia.Markup.Xaml.UnitTests.MakrupExtensions var loader = new AvaloniaXamlLoader(); var app = Application.Current; - loader.Load(xaml, null, app); + try + { + loader.Load(xaml, null, app); + } + catch (KeyNotFoundException) + { + + } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs index f4e96942a3..dca936d229 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/StyleIncludeTests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Avalonia.UnitTests; using Xunit; @@ -30,7 +31,14 @@ namespace Avalonia.Markup.Xaml.UnitTests var loader = new AvaloniaXamlLoader(); var app = Application.Current; - loader.Load(xaml, null, app); + try + { + loader.Load(xaml, null, app); + } + catch (KeyNotFoundException) + { + + } } } From 46151fd35bd36860f4d2d0176ffea576e3caaf7c Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 18:55:25 -0300 Subject: [PATCH 057/201] remove unintended change. --- .../Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs | 2 +- src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs index ce9e3fd4b1..1627053e67 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs @@ -22,7 +22,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { get { - if (_loaded is null) + if (_loaded == null) { _isLoading = true; var loader = new AvaloniaXamlLoader(); diff --git a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs index 9d5b56ebb4..ea9042f779 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs @@ -48,7 +48,7 @@ namespace Avalonia.Markup.Xaml.Styling { get { - if (_loaded is null) + if (_loaded == null) { _isLoading = true; var loader = new AvaloniaXamlLoader(); From ab6ff87a73b9d707176de8f15d5cd81cf2f5a70c Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 28 May 2020 12:16:09 +0200 Subject: [PATCH 058/201] Fix spacing. --- .../Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs index 1627053e67..0cedf4f364 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs @@ -51,7 +51,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions bool IResourceNode.TryGetResource(object key, out object? value) { - if(!_isLoading) + if (!_isLoading) { return Loaded.TryGetResource(key, out value); } From ff7e724f73e8220550930f5b5d1bff52bba45934 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 28 May 2020 12:59:20 +0200 Subject: [PATCH 059/201] Make ItemsRepeater.GetOrCreateElement public As it's public in the WinUI version: https://docs.microsoft.com/en-us/uwp/api/microsoft.ui.xaml.controls.itemsrepeater.getorcreateelement?view=winui-2.4 --- src/Avalonia.Controls/Repeater/ItemsRepeater.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Repeater/ItemsRepeater.cs b/src/Avalonia.Controls/Repeater/ItemsRepeater.cs index 069da6e9ac..2c870b4efd 100644 --- a/src/Avalonia.Controls/Repeater/ItemsRepeater.cs +++ b/src/Avalonia.Controls/Repeater/ItemsRepeater.cs @@ -219,12 +219,21 @@ namespace Avalonia.Controls /// public IControl TryGetElement(int index) => GetElementFromIndexImpl(index); + /// + /// Retrieves the UIElement that corresponds to the item at the specified index in the + /// data source. + /// + /// The index of the item. + /// + /// An that corresponds to the item at the specified index. If the + /// item is not realized, a new UIElement is created. + /// + public IControl GetOrCreateElement(int index) => GetOrCreateElementImpl(index); + internal void PinElement(IControl element) => _viewManager.UpdatePin(element, true); internal void UnpinElement(IControl element) => _viewManager.UpdatePin(element, false); - internal IControl GetOrCreateElement(int index) => GetOrCreateElementImpl(index); - internal static VirtualizationInfo TryGetVirtualizationInfo(IControl element) { var value = element.GetValue(VirtualizationInfoProperty); From f46c62801ef473af174640d99537c9fc02f84681 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 28 May 2020 15:04:46 +0200 Subject: [PATCH 060/201] Convert Color resources to brushes. Make `StaticResource` and `DynamicResource` automatically convert `Color`s to `ImmutableSolidColorBrush`es and add a `ColorToBrushConverter` for use by bindings. To do this I made `GetResourceObservable` accept an optional conversion function. --- .../Controls/ResourceNodeExtensions.cs | 35 +++++--- .../Avalonia.Markup.Xaml.csproj | 1 + .../Converters/ColorToBrushConverter.cs | 88 +++++++++++++++++++ .../DynamicResourceExtension.cs | 18 +++- .../StaticResourceExtension.cs | 23 +++-- .../DynamicResourceExtensionTests.cs | 21 +++++ .../StaticResourceExtensionTests.cs | 21 +++++ 7 files changed, 186 insertions(+), 21 deletions(-) create mode 100644 src/Markup/Avalonia.Markup.Xaml/Converters/ColorToBrushConverter.cs diff --git a/src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs b/src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs index 7771629e0d..250274c39b 100644 --- a/src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs +++ b/src/Avalonia.Styling/Controls/ResourceNodeExtensions.cs @@ -1,4 +1,5 @@ using System; +using Avalonia.Data.Converters; using Avalonia.LogicalTree; using Avalonia.Reactive; @@ -58,31 +59,39 @@ namespace Avalonia.Controls return false; } - public static IObservable GetResourceObservable(this IStyledElement control, object key) + public static IObservable GetResourceObservable( + this IStyledElement control, + object key, + Func? converter = null) { control = control ?? throw new ArgumentNullException(nameof(control)); key = key ?? throw new ArgumentNullException(nameof(key)); - return new ResourceObservable(control, key); + return new ResourceObservable(control, key, converter); } - public static IObservable GetResourceObservable(this IResourceProvider resourceProvider, object key) + public static IObservable GetResourceObservable( + this IResourceProvider resourceProvider, + object key, + Func? converter = null) { resourceProvider = resourceProvider ?? throw new ArgumentNullException(nameof(resourceProvider)); key = key ?? throw new ArgumentNullException(nameof(key)); - return new FloatingResourceObservable(resourceProvider, key); + return new FloatingResourceObservable(resourceProvider, key, converter); } private class ResourceObservable : LightweightObservableBase { private readonly IStyledElement _target; private readonly object _key; + private readonly Func? _converter; - public ResourceObservable(IStyledElement target, object key) + public ResourceObservable(IStyledElement target, object key, Func? converter) { _target = target; _key = key; + _converter = converter; } protected override void Initialize() @@ -97,25 +106,29 @@ namespace Avalonia.Controls protected override void Subscribed(IObserver observer, bool first) { - observer.OnNext(_target.FindResource(_key)); + observer.OnNext(Convert(_target.FindResource(_key))); } private void ResourcesChanged(object sender, ResourcesChangedEventArgs e) { - PublishNext(_target.FindResource(_key)); + PublishNext(Convert(_target.FindResource(_key))); } + + private object? Convert(object? value) => _converter?.Invoke(value) ?? value; } private class FloatingResourceObservable : LightweightObservableBase { private readonly IResourceProvider _target; private readonly object _key; + private readonly Func? _converter; private IResourceHost? _owner; - public FloatingResourceObservable(IResourceProvider target, object key) + public FloatingResourceObservable(IResourceProvider target, object key, Func? converter) { _target = target; _key = key; + _converter = converter; } protected override void Initialize() @@ -134,13 +147,13 @@ namespace Avalonia.Controls { if (_target.Owner is object) { - observer.OnNext(_target.Owner?.FindResource(_key)); + observer.OnNext(Convert(_target.Owner?.FindResource(_key))); } } private void PublishNext() { - PublishNext(_target.Owner?.FindResource(_key)); + PublishNext(Convert(_target.Owner?.FindResource(_key))); } private void OwnerChanged(object sender, EventArgs e) @@ -164,6 +177,8 @@ namespace Avalonia.Controls { PublishNext(); } + + private object? Convert(object? value) => _converter?.Invoke(value) ?? value; } } } diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 06c5375520..985a6b9f5a 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -11,6 +11,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/Converters/ColorToBrushConverter.cs b/src/Markup/Avalonia.Markup.Xaml/Converters/ColorToBrushConverter.cs new file mode 100644 index 0000000000..5b44e9eb50 --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/Converters/ColorToBrushConverter.cs @@ -0,0 +1,88 @@ +using System; +using System.Globalization; +using Avalonia.Data.Converters; +using Avalonia.Media; +using Avalonia.Media.Immutable; + +namespace Avalonia.Markup.Xaml.Converters +{ + /// + /// Converts a to an . + /// + public class ColorToBrushConverter : IValueConverter + { + /// + /// Converts a to an if the arguments are of the + /// correct type. + /// + /// The value. + /// The target type. + /// Not used. + /// Not used. + /// + /// If is a and + /// is then converts the color to a solid color brush. + /// + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + return Convert(value, targetType); + } + + /// + /// Converts an to a if the arguments are of the + /// correct type. + /// + /// The value. + /// The target type. + /// Not used. + /// Not used. + /// + /// If is an and + /// is then converts the solid color brush to a color. + /// + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return ConvertBack(value, targetType); + } + + /// + /// Converts a to an if the arguments are of the + /// correct type. + /// + /// The value. + /// The target type. + /// + /// If is a and + /// is then converts the color to a solid color brush. + /// + public static object Convert(object value, Type targetType) + { + if (targetType == typeof(IBrush) && value is Color c) + { + return new ImmutableSolidColorBrush(c); + } + + return value; + } + + /// + /// Converts an to a if the arguments are of the + /// correct type. + /// + /// The value. + /// The target type. + /// + /// If is an and + /// is then converts the solid color brush to a color. + /// + public static object ConvertBack(object value, Type targetType) + { + if (targetType == typeof(Color) && value is ISolidColorBrush brush) + { + return brush.Color; + } + + return value; + } + } +} diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs index d0d4aae9b8..03fd2e60dd 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs @@ -1,6 +1,8 @@ using System; using Avalonia.Controls; using Avalonia.Data; +using Avalonia.Markup.Xaml.Converters; +using Avalonia.Media; #nullable enable @@ -54,11 +56,23 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions if (control != null) { - return InstancedBinding.OneWay(control.GetResourceObservable(ResourceKey)); + var source = control.GetResourceObservable(ResourceKey, GetConverter(targetProperty)); + return InstancedBinding.OneWay(source); } else if (_resourceProvider is object) { - return InstancedBinding.OneWay(_resourceProvider.GetResourceObservable(ResourceKey)); + var source = _resourceProvider.GetResourceObservable(ResourceKey, GetConverter(targetProperty)); + return InstancedBinding.OneWay(source); + } + + return null; + } + + private Func? GetConverter(AvaloniaProperty targetProperty) + { + if (targetProperty?.PropertyType == typeof(IBrush)) + { + return x => ColorToBrushConverter.Convert(x, typeof(IBrush)); } return null; diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs index 6d9fac638c..4ad68fc63e 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticResourceExtension.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Reflection; using Avalonia.Controls; using Avalonia.Markup.Data; +using Avalonia.Markup.Xaml.Converters; using Avalonia.Markup.Xaml.XamlIl.Runtime; namespace Avalonia.Markup.Xaml.MarkupExtensions @@ -24,6 +24,14 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions public object ProvideValue(IServiceProvider serviceProvider) { var stack = serviceProvider.GetService(); + var provideTarget = serviceProvider.GetService(); + + var targetType = provideTarget.TargetProperty switch + { + AvaloniaProperty ap => ap.PropertyType, + PropertyInfo pi => pi.PropertyType, + _ => null, + }; // Look upwards though the ambient context for IResourceHosts and IResourceProviders // which might be able to give us the resource. @@ -33,30 +41,27 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions if (e is IResourceHost host && host.TryGetResource(ResourceKey, out value)) { - return value; + return ColorToBrushConverter.Convert(value, targetType); } else if (e is IResourceProvider provider && provider.TryGetResource(ResourceKey, out value)) { - return value; + return ColorToBrushConverter.Convert(value, targetType); } } - // The resource still hasn't been found, so add a delayed one-time binding. - var provideTarget = serviceProvider.GetService(); - if (provideTarget.TargetObject is IControl target && provideTarget.TargetProperty is PropertyInfo property) { - DelayedBinding.Add(target, property, GetValue); + DelayedBinding.Add(target, property, x => GetValue(x, targetType)); return AvaloniaProperty.UnsetValue; } throw new KeyNotFoundException($"Static resource '{ResourceKey}' not found."); } - private object GetValue(IStyledElement control) + private object GetValue(IStyledElement control, Type targetType) { - return control.FindResource(ResourceKey); + return ColorToBrushConverter.Convert(control.FindResource(ResourceKey), targetType); } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs index ed3e4c986b..e651c5f29c 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs @@ -797,6 +797,27 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions } } + [Fact] + public void Automatically_Converts_Color_To_SolidColorBrush() + { + var xaml = @" + + + #ff506070 + + + +"; + + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var border = userControl.FindControl("border"); + + var brush = (ISolidColorBrush)border.Background; + Assert.Equal(0xff506070, brush.Color.ToUint32()); + } + private IDisposable StyledWindow(params (string, string)[] assets) { var services = TestServices.StyledWindow.With( diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs index ddfa96c094..efcda47f0f 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/StaticResourceExtensionTests.cs @@ -511,6 +511,27 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions Assert.Equal(0xff506070, brush.Color.ToUint32()); } + [Fact] + public void Automatically_Converts_Color_To_SolidColorBrush() + { + var xaml = @" + + + #ff506070 + + + +"; + + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var border = userControl.FindControl("border"); + + var brush = (ISolidColorBrush)border.Background; + Assert.Equal(0xff506070, brush.Color.ToUint32()); + } + private IDisposable StyledWindow(params (string, string)[] assets) { var services = TestServices.StyledWindow.With( From f8a95fa2a124b977d957071e0fb0ad84952cfd8d Mon Sep 17 00:00:00 2001 From: aguahombre Date: Thu, 28 May 2020 15:29:56 +0100 Subject: [PATCH 061/201] Fix tooltip memory leak --- src/Avalonia.Controls/ToolTip.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/ToolTip.cs b/src/Avalonia.Controls/ToolTip.cs index 3e57ba529f..2f11746891 100644 --- a/src/Avalonia.Controls/ToolTip.cs +++ b/src/Avalonia.Controls/ToolTip.cs @@ -246,7 +246,7 @@ namespace Avalonia.Controls if (_popup != null) { _popup.SetChild(null); - _popup.Hide(); + _popup.Dispose(); _popup = null; } } From 59172a3f7906c2e970a3fb3662d6cfadb7e8059f Mon Sep 17 00:00:00 2001 From: danwalmsley Date: Thu, 28 May 2020 14:26:52 -0300 Subject: [PATCH 062/201] Add a Fluent theme (identical to Default for now) to allow new theme work to progress without affecting default theme and templates (#4004) * Define the base colours and brushes. * import base / system colours. * test textbox using alias for resource. * add a fluent theme * revert default theme * revert original theme. * restore default theme. * remove old accents from fluent theme. * rename namespaces, etc for new theme. * make control catalog run again. * undo textbox work. * Revert "undo textbox work." This reverts commit 477665c306cad1c82fc655e7f22cf90e1855a015. * add missing fontweight. * add the UWP base resources. * Organise the Fluent themes to separate UWP base resources from Fluent resources. * Add fluentBase dark and light overrides. * Add xaml files to contain control resources until we get equivalent of ThemeDictionaries. * undo textbox work. --- Avalonia.sln | 26 ++ build/CoreLibraries.props | 1 + samples/ControlCatalog/App.xaml | 6 +- src/Avalonia.Themes.Fluent/Accents/Base.xaml | 18 + .../Accents/BaseDark.xaml | 350 ++++++++++++++++++ .../Accents/BaseLight.xaml | 349 +++++++++++++++++ .../Accents/FluentBaseDark.xaml | 74 ++++ .../Accents/FluentBaseLight.xaml | 75 ++++ .../Accents/FluentControlResourcesDark.xaml | 7 + .../Accents/FluentControlResourcesLight.xaml | 7 + .../Accents/FluentDark.xaml | 8 + .../Accents/FluentLight.xaml | 8 + .../AutoCompleteBox.xaml | 38 ++ .../Avalonia.Themes.Fluent.csproj | 22 ++ src/Avalonia.Themes.Fluent/Button.xaml | 34 ++ src/Avalonia.Themes.Fluent/ButtonSpinner.xaml | 104 ++++++ src/Avalonia.Themes.Fluent/Calendar.xaml | 31 ++ .../CalendarButton.xaml | 81 ++++ .../CalendarDayButton.xaml | 116 ++++++ src/Avalonia.Themes.Fluent/CalendarItem.xaml | 183 +++++++++ src/Avalonia.Themes.Fluent/Carousel.xaml | 16 + src/Avalonia.Themes.Fluent/CheckBox.xaml | 69 ++++ src/Avalonia.Themes.Fluent/ComboBox.xaml | 64 ++++ src/Avalonia.Themes.Fluent/ComboBoxItem.xaml | 41 ++ .../ContentControl.xaml | 15 + src/Avalonia.Themes.Fluent/ContextMenu.xaml | 23 ++ .../DataValidationErrors.xaml | 38 ++ src/Avalonia.Themes.Fluent/DatePicker.xaml | 126 +++++++ .../EmbeddableControlRoot.xaml | 19 + src/Avalonia.Themes.Fluent/Expander.xaml | 138 +++++++ src/Avalonia.Themes.Fluent/FluentTheme.xaml | 55 +++ .../FluentTheme.xaml.cs | 12 + src/Avalonia.Themes.Fluent/FocusAdorner.xaml | 10 + src/Avalonia.Themes.Fluent/GridSplitter.xaml | 23 ++ .../InverseBooleanValueConverter.cs | 20 + src/Avalonia.Themes.Fluent/ItemsControl.xaml | 15 + src/Avalonia.Themes.Fluent/ListBox.xaml | 31 ++ src/Avalonia.Themes.Fluent/ListBoxItem.xaml | 41 ++ src/Avalonia.Themes.Fluent/Menu.xaml | 16 + src/Avalonia.Themes.Fluent/MenuItem.xaml | 147 ++++++++ src/Avalonia.Themes.Fluent/NativeMenuBar.xaml | 26 ++ .../NotificationCard.xaml | 92 +++++ src/Avalonia.Themes.Fluent/NumericUpDown.xaml | 38 ++ .../OverlayPopupHost.xaml | 17 + src/Avalonia.Themes.Fluent/PopupRoot.xaml | 17 + src/Avalonia.Themes.Fluent/ProgressBar.xaml | 81 ++++ src/Avalonia.Themes.Fluent/RadioButton.xaml | 60 +++ src/Avalonia.Themes.Fluent/RepeatButton.xaml | 40 ++ src/Avalonia.Themes.Fluent/ScrollBar.xaml | 142 +++++++ src/Avalonia.Themes.Fluent/ScrollViewer.xaml | 47 +++ src/Avalonia.Themes.Fluent/Separator.xaml | 20 + src/Avalonia.Themes.Fluent/Slider.xaml | 93 +++++ src/Avalonia.Themes.Fluent/TabControl.xaml | 62 ++++ src/Avalonia.Themes.Fluent/TabItem.xaml | 45 +++ src/Avalonia.Themes.Fluent/TabStrip.xaml | 20 + src/Avalonia.Themes.Fluent/TabStripItem.xaml | 23 ++ src/Avalonia.Themes.Fluent/TextBox.xaml | 78 ++++ src/Avalonia.Themes.Fluent/ToggleButton.xaml | 38 ++ src/Avalonia.Themes.Fluent/ToolTip.xaml | 17 + src/Avalonia.Themes.Fluent/TreeView.xaml | 23 ++ src/Avalonia.Themes.Fluent/TreeViewItem.xaml | 92 +++++ src/Avalonia.Themes.Fluent/UserControl.xaml | 15 + src/Avalonia.Themes.Fluent/Window.xaml | 22 ++ .../WindowNotificationManager.xaml | 45 +++ src/Avalonia.Visuals/Media/FontWeight.cs | 5 + 65 files changed, 3612 insertions(+), 3 deletions(-) create mode 100644 src/Avalonia.Themes.Fluent/Accents/Base.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml create mode 100644 src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml create mode 100644 src/Avalonia.Themes.Fluent/AutoCompleteBox.xaml create mode 100644 src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj create mode 100644 src/Avalonia.Themes.Fluent/Button.xaml create mode 100644 src/Avalonia.Themes.Fluent/ButtonSpinner.xaml create mode 100644 src/Avalonia.Themes.Fluent/Calendar.xaml create mode 100644 src/Avalonia.Themes.Fluent/CalendarButton.xaml create mode 100644 src/Avalonia.Themes.Fluent/CalendarDayButton.xaml create mode 100644 src/Avalonia.Themes.Fluent/CalendarItem.xaml create mode 100644 src/Avalonia.Themes.Fluent/Carousel.xaml create mode 100644 src/Avalonia.Themes.Fluent/CheckBox.xaml create mode 100644 src/Avalonia.Themes.Fluent/ComboBox.xaml create mode 100644 src/Avalonia.Themes.Fluent/ComboBoxItem.xaml create mode 100644 src/Avalonia.Themes.Fluent/ContentControl.xaml create mode 100644 src/Avalonia.Themes.Fluent/ContextMenu.xaml create mode 100644 src/Avalonia.Themes.Fluent/DataValidationErrors.xaml create mode 100644 src/Avalonia.Themes.Fluent/DatePicker.xaml create mode 100644 src/Avalonia.Themes.Fluent/EmbeddableControlRoot.xaml create mode 100644 src/Avalonia.Themes.Fluent/Expander.xaml create mode 100644 src/Avalonia.Themes.Fluent/FluentTheme.xaml create mode 100644 src/Avalonia.Themes.Fluent/FluentTheme.xaml.cs create mode 100644 src/Avalonia.Themes.Fluent/FocusAdorner.xaml create mode 100644 src/Avalonia.Themes.Fluent/GridSplitter.xaml create mode 100644 src/Avalonia.Themes.Fluent/InverseBooleanValueConverter.cs create mode 100644 src/Avalonia.Themes.Fluent/ItemsControl.xaml create mode 100644 src/Avalonia.Themes.Fluent/ListBox.xaml create mode 100644 src/Avalonia.Themes.Fluent/ListBoxItem.xaml create mode 100644 src/Avalonia.Themes.Fluent/Menu.xaml create mode 100644 src/Avalonia.Themes.Fluent/MenuItem.xaml create mode 100644 src/Avalonia.Themes.Fluent/NativeMenuBar.xaml create mode 100644 src/Avalonia.Themes.Fluent/NotificationCard.xaml create mode 100644 src/Avalonia.Themes.Fluent/NumericUpDown.xaml create mode 100644 src/Avalonia.Themes.Fluent/OverlayPopupHost.xaml create mode 100644 src/Avalonia.Themes.Fluent/PopupRoot.xaml create mode 100644 src/Avalonia.Themes.Fluent/ProgressBar.xaml create mode 100644 src/Avalonia.Themes.Fluent/RadioButton.xaml create mode 100644 src/Avalonia.Themes.Fluent/RepeatButton.xaml create mode 100644 src/Avalonia.Themes.Fluent/ScrollBar.xaml create mode 100644 src/Avalonia.Themes.Fluent/ScrollViewer.xaml create mode 100644 src/Avalonia.Themes.Fluent/Separator.xaml create mode 100644 src/Avalonia.Themes.Fluent/Slider.xaml create mode 100644 src/Avalonia.Themes.Fluent/TabControl.xaml create mode 100644 src/Avalonia.Themes.Fluent/TabItem.xaml create mode 100644 src/Avalonia.Themes.Fluent/TabStrip.xaml create mode 100644 src/Avalonia.Themes.Fluent/TabStripItem.xaml create mode 100644 src/Avalonia.Themes.Fluent/TextBox.xaml create mode 100644 src/Avalonia.Themes.Fluent/ToggleButton.xaml create mode 100644 src/Avalonia.Themes.Fluent/ToolTip.xaml create mode 100644 src/Avalonia.Themes.Fluent/TreeView.xaml create mode 100644 src/Avalonia.Themes.Fluent/TreeViewItem.xaml create mode 100644 src/Avalonia.Themes.Fluent/UserControl.xaml create mode 100644 src/Avalonia.Themes.Fluent/Window.xaml create mode 100644 src/Avalonia.Themes.Fluent/WindowNotificationManager.xaml diff --git a/Avalonia.sln b/Avalonia.sln index 38f8e5f720..e8d5034fb0 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -206,6 +206,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.FreeDesktop", "src EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Controls.DataGrid.UnitTests", "tests\Avalonia.Controls.DataGrid.UnitTests\Avalonia.Controls.DataGrid.UnitTests.csproj", "{351337F5-D66F-461B-A957-4EF60BDB4BA6}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Themes.Fluent", "src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj", "{C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 @@ -1921,6 +1923,30 @@ Global {351337F5-D66F-461B-A957-4EF60BDB4BA6}.Release|iPhone.Build.0 = Release|Any CPU {351337F5-D66F-461B-A957-4EF60BDB4BA6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU {351337F5-D66F-461B-A957-4EF60BDB4BA6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.AppStore|iPhone.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Debug|iPhone.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Release|Any CPU.Build.0 = Release|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Release|iPhone.ActiveCfg = Release|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Release|iPhone.Build.0 = Release|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {C42D2FC1-A531-4ED4-84B9-89AEC7C962FC}.Release|iPhoneSimulator.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/CoreLibraries.props b/build/CoreLibraries.props index d61268173d..2b54ee3f56 100644 --- a/build/CoreLibraries.props +++ b/build/CoreLibraries.props @@ -11,6 +11,7 @@ + diff --git a/samples/ControlCatalog/App.xaml b/samples/ControlCatalog/App.xaml index e40509dfda..c9441782a2 100644 --- a/samples/ControlCatalog/App.xaml +++ b/samples/ControlCatalog/App.xaml @@ -1,9 +1,9 @@ - - - + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml new file mode 100644 index 0000000000..2b13fb0d3b --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml @@ -0,0 +1,350 @@ + diff --git a/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml new file mode 100644 index 0000000000..3db9915334 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml @@ -0,0 +1,349 @@ + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml new file mode 100644 index 0000000000..9623204e2c --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml @@ -0,0 +1,74 @@ + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml new file mode 100644 index 0000000000..2d8e457457 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml @@ -0,0 +1,75 @@ + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml new file mode 100644 index 0000000000..70599aa51e --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml @@ -0,0 +1,7 @@ + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml new file mode 100644 index 0000000000..70599aa51e --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml @@ -0,0 +1,7 @@ + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml new file mode 100644 index 0000000000..80ad15ee15 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml @@ -0,0 +1,8 @@ + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml new file mode 100644 index 0000000000..38601a2f2d --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml @@ -0,0 +1,8 @@ + + + + + + diff --git a/src/Avalonia.Themes.Fluent/AutoCompleteBox.xaml b/src/Avalonia.Themes.Fluent/AutoCompleteBox.xaml new file mode 100644 index 0000000000..788b60892b --- /dev/null +++ b/src/Avalonia.Themes.Fluent/AutoCompleteBox.xaml @@ -0,0 +1,38 @@ + + + diff --git a/src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj b/src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj new file mode 100644 index 0000000000..3c3e14010d --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Avalonia.Themes.Fluent.csproj @@ -0,0 +1,22 @@ + + + netstandard2.0 + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Button.xaml b/src/Avalonia.Themes.Fluent/Button.xaml new file mode 100644 index 0000000000..698ddec2a8 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Button.xaml @@ -0,0 +1,34 @@ + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Themes.Fluent/ButtonSpinner.xaml b/src/Avalonia.Themes.Fluent/ButtonSpinner.xaml new file mode 100644 index 0000000000..89fbb9d64d --- /dev/null +++ b/src/Avalonia.Themes.Fluent/ButtonSpinner.xaml @@ -0,0 +1,104 @@ + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Calendar.xaml b/src/Avalonia.Themes.Fluent/Calendar.xaml new file mode 100644 index 0000000000..6bbee4ef17 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Calendar.xaml @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file diff --git a/src/Avalonia.Themes.Fluent/CalendarButton.xaml b/src/Avalonia.Themes.Fluent/CalendarButton.xaml new file mode 100644 index 0000000000..3314534b3b --- /dev/null +++ b/src/Avalonia.Themes.Fluent/CalendarButton.xaml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/CalendarDayButton.xaml b/src/Avalonia.Themes.Fluent/CalendarDayButton.xaml new file mode 100644 index 0000000000..2d79e62a75 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/CalendarDayButton.xaml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/CalendarItem.xaml b/src/Avalonia.Themes.Fluent/CalendarItem.xaml new file mode 100644 index 0000000000..dfd89ed82f --- /dev/null +++ b/src/Avalonia.Themes.Fluent/CalendarItem.xaml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Carousel.xaml b/src/Avalonia.Themes.Fluent/Carousel.xaml new file mode 100644 index 0000000000..955a49a974 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/Carousel.xaml @@ -0,0 +1,16 @@ + diff --git a/src/Avalonia.Themes.Fluent/CheckBox.xaml b/src/Avalonia.Themes.Fluent/CheckBox.xaml new file mode 100644 index 0000000000..f87ae2674f --- /dev/null +++ b/src/Avalonia.Themes.Fluent/CheckBox.xaml @@ -0,0 +1,69 @@ + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/ComboBox.xaml b/src/Avalonia.Themes.Fluent/ComboBox.xaml new file mode 100644 index 0000000000..95bd9550a5 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/ComboBox.xaml @@ -0,0 +1,64 @@ + + + + + diff --git a/src/Avalonia.Themes.Fluent/ComboBoxItem.xaml b/src/Avalonia.Themes.Fluent/ComboBoxItem.xaml new file mode 100644 index 0000000000..23456ec744 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/ComboBoxItem.xaml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/ContentControl.xaml b/src/Avalonia.Themes.Fluent/ContentControl.xaml new file mode 100644 index 0000000000..d76eecee84 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/ContentControl.xaml @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/src/Avalonia.Themes.Fluent/ContextMenu.xaml b/src/Avalonia.Themes.Fluent/ContextMenu.xaml new file mode 100644 index 0000000000..75f8f7c23d --- /dev/null +++ b/src/Avalonia.Themes.Fluent/ContextMenu.xaml @@ -0,0 +1,23 @@ + diff --git a/src/Avalonia.Themes.Fluent/DataValidationErrors.xaml b/src/Avalonia.Themes.Fluent/DataValidationErrors.xaml new file mode 100644 index 0000000000..f4145a51f5 --- /dev/null +++ b/src/Avalonia.Themes.Fluent/DataValidationErrors.xaml @@ -0,0 +1,38 @@ + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/DatePicker.xaml b/src/Avalonia.Themes.Fluent/DatePicker.xaml new file mode 100644 index 0000000000..7adb1c2d5f --- /dev/null +++ b/src/Avalonia.Themes.Fluent/DatePicker.xaml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + Light = 300, + /// + /// Specifies a "semi light" font weight. + /// + SemiLight = 350, + /// /// Specifies a "normal" font weight. /// From f68d81941401cef9c1a7bd1184093a18e4a024c9 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 18:10:22 -0300 Subject: [PATCH 063/201] Add TextBox control resources. --- .../Accents/FluentControlResourcesDark.xaml | 25 ++++++++++++++++++- .../Accents/FluentControlResourcesLight.xaml | 25 ++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml index 70599aa51e..38e4778e24 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml @@ -2,6 +2,29 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard"> - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml index 70599aa51e..276828c587 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml @@ -2,6 +2,29 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard"> - + + + + + + + + + + + + + + + + + + + + + + + + From a596e0bfb8867c49b37e6bf3b5be3993db9f8e98 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 19:40:16 -0300 Subject: [PATCH 064/201] Almost Working fluent textbox. --- samples/ControlCatalog/App.xaml | 3 +- samples/ControlCatalog/MainView.xaml.cs | 44 +++++------ samples/ControlCatalog/MainWindow.xaml | 2 +- src/Avalonia.Themes.Fluent/Accents/Base.xaml | 6 ++ .../Accents/FluentBaseDark.xaml | 32 ++++++++ src/Avalonia.Themes.Fluent/TextBox.xaml | 73 ++++++++++++++++--- 6 files changed, 124 insertions(+), 36 deletions(-) diff --git a/samples/ControlCatalog/App.xaml b/samples/ControlCatalog/App.xaml index c9441782a2..d59c15bb6a 100644 --- a/samples/ControlCatalog/App.xaml +++ b/samples/ControlCatalog/App.xaml @@ -1,7 +1,8 @@ - + + diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs index 8c4818fb07..fceca426f4 100644 --- a/samples/ControlCatalog/MainView.xaml.cs +++ b/samples/ControlCatalog/MainView.xaml.cs @@ -32,30 +32,30 @@ namespace ControlCatalog } - var light = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog")) - { - Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default") - }; - var dark = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog")) - { - Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseDark.xaml?assembly=Avalonia.Themes.Default") - }; + //var light = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog")) + //{ + // Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseLight.xaml?assembly=Avalonia.Themes.Default") + //}; + //var dark = new StyleInclude(new Uri("resm:Styles?assembly=ControlCatalog")) + //{ + // Source = new Uri("resm:Avalonia.Themes.Default.Accents.BaseDark.xaml?assembly=Avalonia.Themes.Default") + //}; - var themes = this.Find("Themes"); - themes.SelectionChanged += (sender, e) => - { - switch (themes.SelectedIndex) - { - case 0: - Styles[0] = light; - break; - case 1: - Styles[0] = dark; - break; - } - }; - Styles.Add(light); + //var themes = this.Find("Themes"); + //themes.SelectionChanged += (sender, e) => + //{ + // switch (themes.SelectedIndex) + // { + // case 0: + // Styles[0] = light; + // break; + // case 1: + // Styles[0] = dark; + // break; + // } + //}; + //Styles.Add(light); var decorations = this.Find("Decorations"); decorations.SelectionChanged += (sender, e) => diff --git a/samples/ControlCatalog/MainWindow.xaml b/samples/ControlCatalog/MainWindow.xaml index a0bb956425..670e30725b 100644 --- a/samples/ControlCatalog/MainWindow.xaml +++ b/samples/ControlCatalog/MainWindow.xaml @@ -7,7 +7,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:ControlCatalog.ViewModels" xmlns:v="clr-namespace:ControlCatalog.Views" - x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}" Background="Transparent"> + x:Class="ControlCatalog.MainWindow" WindowState="{Binding WindowState, Mode=TwoWay}"> diff --git a/src/Avalonia.Themes.Fluent/Accents/Base.xaml b/src/Avalonia.Themes.Fluent/Accents/Base.xaml index b94c0ecf5f..6dc59bed21 100644 --- a/src/Avalonia.Themes.Fluent/Accents/Base.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/Base.xaml @@ -14,5 +14,11 @@ #FF000000 Segoe UI 14 + + + True + 1 + 2 + 10,6,6,5 diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml index 9623204e2c..d2a8cac601 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml @@ -70,5 +70,37 @@ #FF00459D #FF000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/TextBox.xaml b/src/Avalonia.Themes.Fluent/TextBox.xaml index 4fb3653e89..4e4cdf5231 100644 --- a/src/Avalonia.Themes.Fluent/TextBox.xaml +++ b/src/Avalonia.Themes.Fluent/TextBox.xaml @@ -1,17 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + - + From 55995c258b8cf1ff91242ba4a29cf1240e41e004 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 19:48:51 -0300 Subject: [PATCH 065/201] fix fluent textbox background. --- src/Avalonia.Themes.Fluent/TextBox.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/TextBox.xaml b/src/Avalonia.Themes.Fluent/TextBox.xaml index 4e4cdf5231..fc88212fde 100644 --- a/src/Avalonia.Themes.Fluent/TextBox.xaml +++ b/src/Avalonia.Themes.Fluent/TextBox.xaml @@ -2,6 +2,7 @@ From df06ad1b11e4d72bad3d8f34b927ad209fb50540 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 20:45:41 -0300 Subject: [PATCH 067/201] add missing light resources for textbox. --- .../Accents/FluentBaseLight.xaml | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml index 2d8e457457..a77fbd80fe 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml @@ -71,5 +71,37 @@ #FFFFFFFF + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From fb0cced162fcc7a4e26971caa1df04642752afa4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 22:27:08 -0300 Subject: [PATCH 068/201] Fix Textbox layout. --- src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml | 4 ++-- src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml | 2 +- src/Avalonia.Themes.Fluent/TextBox.xaml | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml index 80ad15ee15..5b6da70233 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentDark.xaml @@ -1,8 +1,8 @@ - + xmlns:sys="clr-namespace:System;assembly=netstandard"> + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml index 38601a2f2d..5825a2bf34 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentLight.xaml @@ -1,8 +1,8 @@ - + diff --git a/src/Avalonia.Themes.Fluent/TextBox.xaml b/src/Avalonia.Themes.Fluent/TextBox.xaml index 1b766376b5..e89cf2b49c 100644 --- a/src/Avalonia.Themes.Fluent/TextBox.xaml +++ b/src/Avalonia.Themes.Fluent/TextBox.xaml @@ -46,9 +46,7 @@ + Margin="{TemplateBinding BorderThickness}"> - + Date: Thu, 28 May 2020 14:38:10 -0300 Subject: [PATCH 069/201] keep control catalog on old theme for now. --- samples/ControlCatalog/App.xaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/samples/ControlCatalog/App.xaml b/samples/ControlCatalog/App.xaml index d59c15bb6a..20ca291910 100644 --- a/samples/ControlCatalog/App.xaml +++ b/samples/ControlCatalog/App.xaml @@ -2,10 +2,9 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ControlCatalog.App"> - - - - + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml index a77fbd80fe..5ef54abeaf 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml @@ -103,5 +103,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a8d598d9c87b721ee9d3ddad53b4f1f7d686164f Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 23:19:20 -0300 Subject: [PATCH 072/201] add fluent resources for checkbox. --- .../Accents/FluentControlResourcesDark.xaml | 90 +++++++++++++++++++ .../Accents/FluentControlResourcesLight.xaml | 90 +++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml index 38e4778e24..edfc487647 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml @@ -26,5 +26,95 @@ + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml index 276828c587..70bee7074e 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml @@ -26,5 +26,95 @@ + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 91caa451320c63eaab9fd800153e3c8dfbcbc015 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 May 2020 23:53:35 -0300 Subject: [PATCH 073/201] add initial port of checkbox template. --- src/Avalonia.Themes.Fluent/CheckBox.xaml | 89 ++++++++++++------------ 1 file changed, 46 insertions(+), 43 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/CheckBox.xaml b/src/Avalonia.Themes.Fluent/CheckBox.xaml index f87ae2674f..1e6300c3fb 100644 --- a/src/Avalonia.Themes.Fluent/CheckBox.xaml +++ b/src/Avalonia.Themes.Fluent/CheckBox.xaml @@ -1,50 +1,53 @@ From 50fe90f8b5f0ef55184714a1a320bb24ed42364e Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 01:15:12 -0300 Subject: [PATCH 074/201] almost fully working checkbox. --- .../Accents/BaseDark.xaml | 4 +- .../Accents/BaseLight.xaml | 4 +- .../Accents/FluentControlResourcesDark.xaml | 4 +- src/Avalonia.Themes.Fluent/CheckBox.xaml | 99 ++++++++++++++++++- 4 files changed, 101 insertions(+), 10 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml index 2b13fb0d3b..7ee211f249 100644 --- a/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml @@ -161,8 +161,8 @@ 3 374 0 - 2 - 0 + 2 + 0 21 64 80 diff --git a/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml index 3db9915334..309759705c 100644 --- a/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml @@ -160,8 +160,8 @@ 3 374 0 - 2 - 0 + 2 + 0 21 64 80 diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml index edfc487647..56c6de1144 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml @@ -28,8 +28,8 @@ - 1 - 0 + 1 + 0 diff --git a/src/Avalonia.Themes.Fluent/CheckBox.xaml b/src/Avalonia.Themes.Fluent/CheckBox.xaml index 1e6300c3fb..beadc28d13 100644 --- a/src/Avalonia.Themes.Fluent/CheckBox.xaml +++ b/src/Avalonia.Themes.Fluent/CheckBox.xaml @@ -1,4 +1,9 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7411c3ae7b48f0bde6cd00daa47f73b4c63982b1 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 01:46:57 -0300 Subject: [PATCH 075/201] further progress on checkbox. --- src/Avalonia.Themes.Fluent/CheckBox.xaml | 43 +++++++++++++++++++----- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/CheckBox.xaml b/src/Avalonia.Themes.Fluent/CheckBox.xaml index beadc28d13..7f93c2842d 100644 --- a/src/Avalonia.Themes.Fluent/CheckBox.xaml +++ b/src/Avalonia.Themes.Fluent/CheckBox.xaml @@ -35,15 +35,8 @@ CornerRadius="{DynamicResource ControlCornerRadius}" /> - + - + + + + + + + @@ -109,6 +119,23 @@ + + + + + + + From b3040728fe0aa93809babad3dc7cad4d963d9bce Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 12:22:43 -0300 Subject: [PATCH 076/201] add missing state styles. --- src/Avalonia.Themes.Fluent/CheckBox.xaml | 192 +++++++++++++++++------ 1 file changed, 146 insertions(+), 46 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/CheckBox.xaml b/src/Avalonia.Themes.Fluent/CheckBox.xaml index 7f93c2842d..fa6b044cf6 100644 --- a/src/Avalonia.Themes.Fluent/CheckBox.xaml +++ b/src/Avalonia.Themes.Fluent/CheckBox.xaml @@ -21,34 +21,34 @@ --> - - - - - - - - - - - - + + + + + + + + + + - + + + @@ -84,8 +84,8 @@ + + + + + + + + + + + + + + @@ -108,7 +142,7 @@ @@ -129,8 +163,8 @@ + + + + + + + + + + + + + + + - + - + + + - - - - - - + + + + From fb3900aea3758b5fda19ba65488e432a285aef4e Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 13:22:54 -0300 Subject: [PATCH 077/201] fix accents. --- src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml | 14 +++++++------- .../Accents/BaseLight.xaml | 14 +++++++------- .../Accents/FluentBaseDark.xaml | 14 +++++++------- .../Accents/FluentBaseLight.xaml | 16 ++++++++-------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml index 7ee211f249..7ce6c5a19f 100644 --- a/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/BaseDark.xaml @@ -4,13 +4,13 @@ - #FF0073CF - #FF1D85D7 - #FF3B97DF - #FF58A8E8 - #FF0064BE - #FF0055AD - #FF00459D + #FF0078D7 + #FF005A9E + #FF004275 + #FF002642 + #FF429CE3 + #FF76B9ED + #FFA6D8FF #FF000000 diff --git a/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml index 309759705c..026edca4f9 100644 --- a/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/BaseLight.xaml @@ -4,13 +4,13 @@ - #FF0073CF - #FF1D85D7 - #FF3B97DF - #FF58A8E8 - #FF0064BE - #FF0055AD - #FF00459D + #FF0078D7 + #FF005A9E + #FF004275 + #FF002642 + #FF429CE3 + #FF76B9ED + #FFA6D8FF #FFFFFFFF diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml index 0bd95eb108..c8761541e8 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml @@ -2,7 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard"> - #FF0073CF + #FF0078D7 #FF000000 #FF000000 #FF000000 @@ -62,12 +62,12 @@ 1,1,1,1 1 - #FF1D85D7 - #FF3B97DF - #FF58A8E8 - #FF0064BE - #FF0055AD - #FF00459D + #FF005A9E + #FF004275 + #FF002642 + #FF429CE3 + #FF76B9ED + #FFA6D8FF #FF000000 diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml index 5ef54abeaf..65f4023318 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml @@ -2,7 +2,7 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard"> - #FF0073CF + #FF0078D7 #FFFFFFFF #FFFFFFFF #FFFFFFFF @@ -61,13 +61,13 @@ 1,1,1,1 1,1,1,1 1 - - #FF1D85D7 - #FF3B97DF - #FF58A8E8 - #FF0064BE - #FF0055AD - #FF00459D + + #FF005A9E + #FF004275 + #FF002642 + #FF429CE3 + #FF76B9ED + #FFA6D8FF #FFFFFFFF From 6e7656dfb6d95b9bcdaa1fb32cbb482357dd8011 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 14:12:22 -0300 Subject: [PATCH 078/201] fix checkbox glyph size. --- src/Avalonia.Themes.Fluent/CheckBox.xaml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/CheckBox.xaml b/src/Avalonia.Themes.Fluent/CheckBox.xaml index fa6b044cf6..d1d7f36478 100644 --- a/src/Avalonia.Themes.Fluent/CheckBox.xaml +++ b/src/Avalonia.Themes.Fluent/CheckBox.xaml @@ -35,10 +35,12 @@ Width="20" CornerRadius="{DynamicResource ControlCornerRadius}" /> - - + + + + + - + @@ -208,7 +211,7 @@ - + @@ -286,5 +290,5 @@ + From d80403aca91821356870a2ac3ee7a6ce61c52352 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 15:02:39 -0300 Subject: [PATCH 079/201] add button resources --- .../Accents/FluentBaseDark.xaml | 14 +++++++ .../Accents/FluentBaseLight.xaml | 16 +++++++- .../Accents/FluentControlResourcesDark.xaml | 37 +++++++++++++++++++ .../Accents/FluentControlResourcesLight.xaml | 37 +++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml index c8761541e8..ed6f56b211 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseDark.xaml @@ -71,6 +71,20 @@ #FF000000 + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml index 65f4023318..ac7b792a9a 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentBaseLight.xaml @@ -61,7 +61,7 @@ 1,1,1,1 1,1,1,1 1 - + #FF005A9E #FF004275 #FF002642 @@ -72,6 +72,20 @@ #FFFFFFFF + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml index 56c6de1144..a0f3ef0d62 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesDark.xaml @@ -2,6 +2,43 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard"> + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml index 70bee7074e..ec4f35664c 100644 --- a/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml +++ b/src/Avalonia.Themes.Fluent/Accents/FluentControlResourcesLight.xaml @@ -2,6 +2,43 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=netstandard"> + + + + + + + + + + + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + From 966519e23d844b58b03f05332361396f9d85ad5f Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 May 2020 15:21:15 -0300 Subject: [PATCH 080/201] new button template. --- src/Avalonia.Themes.Fluent/Button.xaml | 98 ++++++++++++++++++++------ 1 file changed, 76 insertions(+), 22 deletions(-) diff --git a/src/Avalonia.Themes.Fluent/Button.xaml b/src/Avalonia.Themes.Fluent/Button.xaml index 698ddec2a8..42fcee6cd5 100644 --- a/src/Avalonia.Themes.Fluent/Button.xaml +++ b/src/Avalonia.Themes.Fluent/Button.xaml @@ -1,34 +1,88 @@ - + + + + +