diff --git a/.editorconfig b/.editorconfig index 25e0135725..30edee1633 100644 --- a/.editorconfig +++ b/.editorconfig @@ -21,6 +21,7 @@ csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_between_query_expression_clauses = true +# trim_trailing_whitespace = true # Indentation preferences csharp_indent_block_contents = true diff --git a/azure-pipelines-integrationtests.yml b/azure-pipelines-integrationtests.yml new file mode 100644 index 0000000000..c3f6292703 --- /dev/null +++ b/azure-pipelines-integrationtests.yml @@ -0,0 +1,48 @@ +# Starter pipeline +# Start with a minimal pipeline that you can customize to build and deploy your code. +# Add steps that build, run tests, deploy, and more: +# https://aka.ms/yaml + +trigger: +- master + +jobs: +- job: Mac + pool: + name: 'AvaloniaMacPool' + + steps: + - script: ./tests/Avalonia.IntegrationTests.Appium/macos-clean-build-test.sh + displayName: 'run integration tests' + + +- job: Windows + pool: + vmImage: 'windows-2022' + + steps: + - task: UseDotNet@2 + displayName: 'Use .NET Core SDK 6.0.202' + inputs: + version: 6.0.202 + + - task: Windows Application Driver@0 + inputs: + OperationType: 'Start' + AgentResolution: '4K' + displayName: 'Start WinAppDriver' + + - task: DotNetCoreCLI@2 + inputs: + command: 'build' + projects: 'samples/IntegrationTestApp/IntegrationTestApp.csproj' + + - task: DotNetCoreCLI@2 + inputs: + command: 'test' + projects: 'tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj' + + - task: Windows Application Driver@0 + inputs: + OperationType: 'Stop' + displayName: 'Stop WinAppDriver' diff --git a/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj b/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj index 6fc3977d4e..ace4a71a56 100644 --- a/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj +++ b/native/Avalonia.Native/src/OSX/Avalonia.Native.OSX.xcodeproj/project.pbxproj @@ -49,6 +49,7 @@ AB8F7D6B21482D7F0057DBA5 /* platformthreading.mm in Sources */ = {isa = PBXBuildFile; fileRef = AB8F7D6A21482D7F0057DBA5 /* platformthreading.mm */; }; BC11A5BE2608D58F0017BAD0 /* automation.h in Headers */ = {isa = PBXBuildFile; fileRef = BC11A5BC2608D58F0017BAD0 /* automation.h */; }; BC11A5BF2608D58F0017BAD0 /* automation.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC11A5BD2608D58F0017BAD0 /* automation.mm */; }; + ED3791C42862E1F40080BD62 /* UniformTypeIdentifiers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED3791C32862E1F40080BD62 /* UniformTypeIdentifiers.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -101,6 +102,7 @@ AB8F7D6A21482D7F0057DBA5 /* platformthreading.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = platformthreading.mm; sourceTree = ""; }; BC11A5BC2608D58F0017BAD0 /* automation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = automation.h; sourceTree = ""; }; BC11A5BD2608D58F0017BAD0 /* automation.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = automation.mm; sourceTree = ""; }; + ED3791C32862E1F40080BD62 /* UniformTypeIdentifiers.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UniformTypeIdentifiers.framework; path = System/Library/Frameworks/UniformTypeIdentifiers.framework; sourceTree = SDKROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -108,6 +110,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + ED3791C42862E1F40080BD62 /* UniformTypeIdentifiers.framework in Frameworks */, 1A3E5EB023E9FE8300EDE661 /* QuartzCore.framework in Frameworks */, 1A3E5EAA23E9F26C00EDE661 /* IOSurface.framework in Frameworks */, AB1E522C217613570091CD71 /* OpenGL.framework in Frameworks */, @@ -122,6 +125,7 @@ AB661C1C2148230E00291242 /* Frameworks */ = { isa = PBXGroup; children = ( + ED3791C32862E1F40080BD62 /* UniformTypeIdentifiers.framework */, 522D5958258159C1006F7F7A /* Carbon.framework */, 1A3E5EAF23E9FE8300EDE661 /* QuartzCore.framework */, 1A3E5EA923E9F26C00EDE661 /* IOSurface.framework */, diff --git a/native/Avalonia.Native/src/OSX/AvnView.mm b/native/Avalonia.Native/src/OSX/AvnView.mm index 5436ad22f3..01725ace03 100644 --- a/native/Avalonia.Native/src/OSX/AvnView.mm +++ b/native/Avalonia.Native/src/OSX/AvnView.mm @@ -439,7 +439,12 @@ if(_parent != nullptr) { - _lastKeyHandled = _parent->BaseEvents->RawKeyEvent(type, timestamp, modifiers, key); + auto handled = _parent->BaseEvents->RawKeyEvent(type, timestamp, modifiers, key); + if (key != LeftCtrl && key != RightCtrl) { + _lastKeyHandled = handled; + } else { + _lastKeyHandled = false; + } } } diff --git a/native/Avalonia.Native/src/OSX/SystemDialogs.mm b/native/Avalonia.Native/src/OSX/SystemDialogs.mm index 535b6c3b66..e133a5d31f 100644 --- a/native/Avalonia.Native/src/OSX/SystemDialogs.mm +++ b/native/Avalonia.Native/src/OSX/SystemDialogs.mm @@ -1,5 +1,6 @@ #include "common.h" #include "INSWindowHolder.h" +#import class SystemDialogs : public ComSingleObject { @@ -7,6 +8,7 @@ public: FORWARD_IUNKNOWN() virtual void SelectFolderDialog (IAvnWindow* parentWindowHandle, IAvnSystemDialogEvents* events, + bool allowMultiple, const char* title, const char* initialDirectory) override { @@ -14,6 +16,7 @@ public: { auto panel = [NSOpenPanel openPanel]; + panel.allowsMultipleSelection = allowMultiple; panel.canChooseDirectories = true; panel.canCreateDirectories = true; panel.canChooseFiles = false; @@ -118,7 +121,15 @@ public: { auto allowedTypes = [filtersString componentsSeparatedByString:@";"]; - panel.allowedFileTypes = allowedTypes; + // Prefer allowedContentTypes if available + if (@available(macOS 11.0, *)) + { + panel.allowedContentTypes = ConvertToUTType(allowedTypes); + } + else + { + panel.allowedFileTypes = allowedTypes; + } } } @@ -207,7 +218,18 @@ public: { auto allowedTypes = [filtersString componentsSeparatedByString:@";"]; - panel.allowedFileTypes = allowedTypes; + // Prefer allowedContentTypes if available + if (@available(macOS 11.0, *)) + { + panel.allowedContentTypes = ConvertToUTType(allowedTypes); + } + else + { + panel.allowedFileTypes = allowedTypes; + } + + panel.allowsOtherFileTypes = false; + panel.extensionHidden = false; } } @@ -250,6 +272,32 @@ public: } } } + +private: + NSMutableArray* ConvertToUTType(NSArray* allowedTypes) + { + auto originalCount = [allowedTypes count]; + auto mapped = [[NSMutableArray alloc] init]; + + if (@available(macOS 11.0, *)) + { + for (int i = 0; i < originalCount; i++) + { + auto utTypeStr = allowedTypes[i]; + auto utType = [UTType typeWithIdentifier:utTypeStr]; + if (utType == nil) + { + utType = [UTType typeWithMIMEType:utTypeStr]; + } + if (utType != nil) + { + [mapped addObject:utType]; + } + } + } + + return mapped; + } }; diff --git a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm index 7f2bb128da..77f53332cd 100644 --- a/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm +++ b/native/Avalonia.Native/src/OSX/WindowBaseImpl.mm @@ -48,7 +48,6 @@ WindowBaseImpl::WindowBaseImpl(IAvnWindowBaseEvents *events, IAvnGlContext *gl, [Window setContentMaxSize:lastMaxSize]; [Window setOpaque:false]; - [Window setHasShadow:true]; } HRESULT WindowBaseImpl::ObtainNSViewHandle(void **ret) { @@ -224,7 +223,7 @@ HRESULT WindowBaseImpl::GetFrameSize(AvnSize *ret) { if (ret == nullptr) return E_POINTER; - if(Window != nullptr){ + if(Window != nullptr && _shown){ auto frame = [Window frame]; ret->Width = frame.size.width; ret->Height = frame.size.height; @@ -298,14 +297,15 @@ HRESULT WindowBaseImpl::Resize(double x, double y, AvnPlatformResizeReason reaso } @try { - lastSize = NSSize {x, y}; - - if (!_shown) { - BaseEvents->Resized(AvnSize{x, y}, reason); - } - else if(Window != nullptr) { - [Window setContentSize:lastSize]; - [Window invalidateShadow]; + if(x != lastSize.width || y != lastSize.height) { + lastSize = NSSize{x, y}; + + if (!_shown) { + BaseEvents->Resized(AvnSize{x, y}, reason); + } else if (Window != nullptr) { + [Window setContentSize:lastSize]; + [Window invalidateShadow]; + } } } @finally { diff --git a/native/Avalonia.Native/src/OSX/WindowImpl.mm b/native/Avalonia.Native/src/OSX/WindowImpl.mm index 6db586f3ca..95f61422cb 100644 --- a/native/Avalonia.Native/src/OSX/WindowImpl.mm +++ b/native/Avalonia.Native/src/OSX/WindowImpl.mm @@ -24,6 +24,8 @@ WindowImpl::WindowImpl(IAvnWindowEvents *events, IAvnGlContext *gl) : WindowBase _lastTitle = @""; _parent = nullptr; WindowEvents = events; + + [Window setHasShadow:true]; OnInitialiseNSWindow(); } @@ -119,13 +121,16 @@ void WindowImpl::BringToFront() { if(Window != nullptr) { - if(IsDialog()) - { - Activate(); - } - else + if (![Window isMiniaturized]) { - [Window orderFront:nullptr]; + if(IsDialog()) + { + Activate(); + } + else + { + [Window orderFront:nullptr]; + } } [Window invalidateShadow]; @@ -488,6 +493,8 @@ HRESULT WindowImpl::SetWindowState(AvnWindowState state) { } if (_shown) { + _actualWindowState = _lastWindowState; + switch (state) { case Maximized: if (currentState == FullScreen) { @@ -545,7 +552,6 @@ HRESULT WindowImpl::SetWindowState(AvnWindowState state) { break; } - _actualWindowState = _lastWindowState; WindowEvents->WindowStateChanged(_actualWindowState); } diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj index 04c67e84e8..e52430f50b 100644 --- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj +++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj @@ -9,39 +9,37 @@ 1.0 apk true + android-arm64;android-x64 - - - Resources\drawable\Icon.png - - True + True - True - True - - - False - False + + + True + no-write-symbols,nodebug + Hybrid + True - - True + + True + True - - + + - \ No newline at end of file + diff --git a/samples/ControlCatalog.Android/Properties/AndroidManifest.xml b/samples/ControlCatalog.Android/Properties/AndroidManifest.xml index aa570ec504..6f551d2b01 100644 --- a/samples/ControlCatalog.Android/Properties/AndroidManifest.xml +++ b/samples/ControlCatalog.Android/Properties/AndroidManifest.xml @@ -1,4 +1,5 @@  - + + diff --git a/samples/ControlCatalog.Android/environment.device.txt b/samples/ControlCatalog.Android/environment.device.txt new file mode 100644 index 0000000000..107d68ca1b --- /dev/null +++ b/samples/ControlCatalog.Android/environment.device.txt @@ -0,0 +1 @@ +DOTNET_DiagnosticPorts=127.0.0.1:9000,suspend diff --git a/samples/ControlCatalog.Android/environment.emulator.txt b/samples/ControlCatalog.Android/environment.emulator.txt new file mode 100644 index 0000000000..299a0ec30b --- /dev/null +++ b/samples/ControlCatalog.Android/environment.emulator.txt @@ -0,0 +1 @@ +DOTNET_DiagnosticPorts=10.0.2.2:9001,suspend diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index fd080cfc5b..13751b56b5 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -115,7 +115,6 @@ namespace ControlCatalog.NetCore }) .With(new Win32PlatformOptions { - EnableMultitouch = true }) .UseSkia() .AfterSetup(builder => diff --git a/samples/ControlCatalog.Web/App.razor.cs b/samples/ControlCatalog.Web/App.razor.cs index c0b7ddbe1e..560e8079a6 100644 --- a/samples/ControlCatalog.Web/App.razor.cs +++ b/samples/ControlCatalog.Web/App.razor.cs @@ -11,6 +11,7 @@ public partial class App { ControlCatalog.Pages.EmbedSample.Implementation = new EmbedSampleWeb(); }) + //.With(new SkiaOptions { CustomGpuFactory = null }) // uncomment to disable GPU/GL rendering .SetupWithSingleViewLifetime(); base.OnParametersSet(); diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index 903c849834..8358fb3cd4 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -1,6 +1,6 @@  - netstandard2.0 + netstandard2.0;net6.0 true enable diff --git a/samples/ControlCatalog/MainView.xaml b/samples/ControlCatalog/MainView.xaml index d8dc3bad2d..40591c2d24 100644 --- a/samples/ControlCatalog/MainView.xaml +++ b/samples/ControlCatalog/MainView.xaml @@ -69,6 +69,9 @@ + + + @@ -109,7 +112,7 @@ - + diff --git a/samples/ControlCatalog/MainView.xaml.cs b/samples/ControlCatalog/MainView.xaml.cs index d675324d9f..47d11738bc 100644 --- a/samples/ControlCatalog/MainView.xaml.cs +++ b/samples/ControlCatalog/MainView.xaml.cs @@ -24,11 +24,6 @@ namespace ControlCatalog { IList tabItems = ((IList)sideBar.Items); tabItems.Add(new TabItem() - { - Header = "Dialogs", - Content = new DialogsPage() - }); - tabItems.Add(new TabItem() { Header = "Screens", Content = new ScreenPage() diff --git a/samples/ControlCatalog/Pages/ButtonsPage.xaml b/samples/ControlCatalog/Pages/ButtonsPage.xaml index 059b4d9788..8a474a203d 100644 --- a/samples/ControlCatalog/Pages/ButtonsPage.xaml +++ b/samples/ControlCatalog/Pages/ButtonsPage.xaml @@ -90,6 +90,7 @@ + - - Use filters - - - - - + + - - + - - - - - - - + + + + + + + + + + + + + + Use filters + + + Force managed dialog + Open multiple + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs index efa30c2741..f7b6db1255 100644 --- a/samples/ControlCatalog/Pages/DialogsPage.xaml.cs +++ b/samples/ControlCatalog/Pages/DialogsPage.xaml.cs @@ -1,13 +1,21 @@ using System; +using System.Buffers; using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Threading.Tasks; +using Avalonia; using Avalonia.Controls; using Avalonia.Controls.Presenters; using Avalonia.Dialogs; using Avalonia.Layout; using Avalonia.Markup.Xaml; -#pragma warning disable 4014 +using Avalonia.Platform.Storage; +using Avalonia.Platform.Storage.FileIO; + +#pragma warning disable CS0618 // Type or member is obsolete +#nullable enable + namespace ControlCatalog.Pages { public class DialogsPage : UserControl @@ -18,13 +26,16 @@ namespace ControlCatalog.Pages var results = this.Get("PickerLastResults"); var resultsVisible = this.Get("PickerLastResultsVisible"); + var bookmarkContainer = this.Get("BookmarkContainer"); + var openedFileContent = this.Get("OpenedFileContent"); + var openMultiple = this.Get("OpenMultiple"); - string? lastSelectedDirectory = null; + IStorageFolder? lastSelectedDirectory = null; - List? GetFilters() + List GetFilters() { if (this.Get("UseFilters").IsChecked != true) - return null; + return new List(); return new List { new FileDialogFilter @@ -39,12 +50,23 @@ namespace ControlCatalog.Pages }; } + List? GetFileTypes() + { + if (this.Get("UseFilters").IsChecked != true) + return null; + return new List + { + FilePickerFileTypes.All, + FilePickerFileTypes.TextPlain + }; + } + this.Get + + + + + diff --git a/samples/IntegrationTestApp/MainWindow.axaml.cs b/samples/IntegrationTestApp/MainWindow.axaml.cs index 9a612aa94d..9e180b12c5 100644 --- a/samples/IntegrationTestApp/MainWindow.axaml.cs +++ b/samples/IntegrationTestApp/MainWindow.axaml.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.Linq; using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; +using Avalonia.VisualTree; namespace IntegrationTestApp { @@ -46,6 +48,62 @@ namespace IntegrationTestApp } } + private void ShowWindow() + { + var sizeTextBox = this.GetControl("ShowWindowSize"); + var modeComboBox = this.GetControl("ShowWindowMode"); + var locationComboBox = this.GetControl("ShowWindowLocation"); + var size = !string.IsNullOrWhiteSpace(sizeTextBox.Text) ? Size.Parse(sizeTextBox.Text) : (Size?)null; + var owner = (Window)this.GetVisualRoot()!; + + var window = new ShowWindowTest + { + WindowStartupLocation = (WindowStartupLocation)locationComboBox.SelectedIndex, + }; + + if (size.HasValue) + { + window.Width = size.Value.Width; + window.Height = size.Value.Height; + } + + sizeTextBox.Text = string.Empty; + + switch (modeComboBox.SelectedIndex) + { + case 0: + window.Show(); + break; + case 1: + window.Show(owner); + break; + case 2: + window.ShowDialog(owner); + break; + } + } + + private void SendToBack() + { + var lifetime = (ClassicDesktopStyleApplicationLifetime)Application.Current!.ApplicationLifetime!; + + foreach (var window in lifetime.Windows) + { + window.Activate(); + } + } + + private void RestoreAll() + { + var lifetime = (ClassicDesktopStyleApplicationLifetime)Application.Current!.ApplicationLifetime!; + + foreach (var window in lifetime.Windows) + { + if (window.WindowState == WindowState.Minimized) + window.WindowState = WindowState.Normal; + } + } + private void MenuClicked(object? sender, RoutedEventArgs e) { var clickedMenuItemTextBlock = this.FindControl("ClickedMenuItem"); @@ -64,6 +122,14 @@ namespace IntegrationTestApp this.FindControl("BasicListBox").SelectedIndex = -1; if (source?.Name == "MenuClickedMenuItemReset") this.FindControl("ClickedMenuItem").Text = "None"; + if (source?.Name == "ShowWindow") + ShowWindow(); + if (source?.Name == "SendToBack") + SendToBack(); + if (source?.Name == "ExitFullscreen") + WindowState = WindowState.Normal; + if (source?.Name == "RestoreAll") + RestoreAll(); } } } diff --git a/samples/IntegrationTestApp/ShowWindowTest.axaml b/samples/IntegrationTestApp/ShowWindowTest.axaml new file mode 100644 index 0000000000..40c1642e91 --- /dev/null +++ b/samples/IntegrationTestApp/ShowWindowTest.axaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + Normal + Minimized + Maximized + Fullscreen + + + diff --git a/samples/IntegrationTestApp/ShowWindowTest.axaml.cs b/samples/IntegrationTestApp/ShowWindowTest.axaml.cs new file mode 100644 index 0000000000..001f186761 --- /dev/null +++ b/samples/IntegrationTestApp/ShowWindowTest.axaml.cs @@ -0,0 +1,40 @@ +using System; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Interactivity; +using Avalonia.Markup.Xaml; +using Avalonia.Rendering; + +namespace IntegrationTestApp +{ + public class ShowWindowTest : Window + { + public ShowWindowTest() + { + InitializeComponent(); + DataContext = this; + PositionChanged += (s, e) => this.GetControl("Position").Text = $"{Position}"; + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + + protected override void OnOpened(EventArgs e) + { + base.OnOpened(e); + var scaling = PlatformImpl!.DesktopScaling; + this.GetControl("Position").Text = $"{Position}"; + this.GetControl("ScreenRect").Text = $"{Screens.ScreenFromVisual(this)?.WorkingArea}"; + this.GetControl("Scaling").Text = $"{scaling}"; + + if (Owner is not null) + { + var ownerRect = this.GetControl("OwnerRect"); + var owner = (Window)Owner; + ownerRect.Text = $"{owner.Position}, {PixelSize.FromSize(owner.FrameSize!.Value, scaling)}"; + } + } + } +} diff --git a/samples/RenderDemo/Pages/FormattedTextPage.axaml.cs b/samples/RenderDemo/Pages/FormattedTextPage.axaml.cs index 25e29c67a9..97a9320c95 100644 --- a/samples/RenderDemo/Pages/FormattedTextPage.axaml.cs +++ b/samples/RenderDemo/Pages/FormattedTextPage.axaml.cs @@ -55,6 +55,10 @@ namespace RenderDemo.Pages formattedText.SetFontStyle(FontStyle.Italic, 28, 28); context.DrawText(formattedText, new Point(10, 0)); + + var geometry = formattedText.BuildGeometry(new Point(10 + formattedText.Width + 10, 0)); + + context.DrawGeometry(gradient, null, geometry); } } } diff --git a/samples/RenderDemo/Pages/GlyphRunPage.xaml b/samples/RenderDemo/Pages/GlyphRunPage.xaml index c2914e8847..7db58e5286 100644 --- a/samples/RenderDemo/Pages/GlyphRunPage.xaml +++ b/samples/RenderDemo/Pages/GlyphRunPage.xaml @@ -2,13 +2,13 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + xmlns:local="clr-namespace:RenderDemo.Pages" mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" x:Class="RenderDemo.Pages.GlyphRunPage"> - - - - + + + diff --git a/samples/RenderDemo/Pages/GlyphRunPage.xaml.cs b/samples/RenderDemo/Pages/GlyphRunPage.xaml.cs index 7f85606957..674ed8e61f 100644 --- a/samples/RenderDemo/Pages/GlyphRunPage.xaml.cs +++ b/samples/RenderDemo/Pages/GlyphRunPage.xaml.cs @@ -9,14 +9,6 @@ namespace RenderDemo.Pages { public class GlyphRunPage : UserControl { - private Image _imageControl; - private GlyphTypeface _glyphTypeface = Typeface.Default.GlyphTypeface; - private readonly Random _rand = new Random(); - private ushort[] _glyphIndices = new ushort[1]; - private char[] _characters = new char[1]; - private float _fontSize = 20; - private int _direction = 10; - public GlyphRunPage() { this.InitializeComponent(); @@ -25,19 +17,43 @@ namespace RenderDemo.Pages private void InitializeComponent() { AvaloniaXamlLoader.Load(this); + } + } + + public class GlyphRunControl : Control + { + private GlyphTypeface _glyphTypeface = Typeface.Default.GlyphTypeface; + private readonly Random _rand = new Random(); + private ushort[] _glyphIndices = new ushort[1]; + private char[] _characters = new char[1]; + private float _fontSize = 20; + private int _direction = 10; - _imageControl = this.FindControl("imageControl"); - _imageControl.Source = new DrawingImage(); + private DispatcherTimer _timer; - DispatcherTimer.Run(() => + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + _timer = new DispatcherTimer + { + Interval = TimeSpan.FromSeconds(1) + }; + + _timer.Tick += (s,e) => { - UpdateGlyphRun(); + InvalidateVisual(); + }; + + _timer.Start(); + } + + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + _timer.Stop(); - return true; - }, TimeSpan.FromSeconds(1)); + _timer = null; } - private void UpdateGlyphRun() + public override void Render(DrawingContext context) { var c = (char)_rand.Next(65, 90); @@ -57,27 +73,70 @@ namespace RenderDemo.Pages _characters[0] = c; - var scale = (double)_fontSize / _glyphTypeface.DesignEmHeight; + var glyphRun = new GlyphRun(_glyphTypeface, _fontSize, _characters, _glyphIndices); - var drawingGroup = new DrawingGroup(); + context.DrawGlyphRun(Brushes.Black, glyphRun); + } + } - var glyphRunDrawing = new GlyphRunDrawing + public class GlyphRunGeometryControl : Control + { + private GlyphTypeface _glyphTypeface = Typeface.Default.GlyphTypeface; + private readonly Random _rand = new Random(); + private ushort[] _glyphIndices = new ushort[1]; + private char[] _characters = new char[1]; + private float _fontSize = 20; + private int _direction = 10; + + private DispatcherTimer _timer; + + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + _timer = new DispatcherTimer { - Foreground = Brushes.Black, - GlyphRun = new GlyphRun(_glyphTypeface, _fontSize, _characters, _glyphIndices) + Interval = TimeSpan.FromSeconds(1) }; - drawingGroup.Children.Add(glyphRunDrawing); - - var geometryDrawing = new GeometryDrawing + _timer.Tick += (s, e) => { - Pen = new Pen(Brushes.Black), - Geometry = new RectangleGeometry { Rect = new Rect(glyphRunDrawing.GlyphRun.Size) } + InvalidateVisual(); }; - drawingGroup.Children.Add(geometryDrawing); + _timer.Start(); + } + + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + _timer.Stop(); + + _timer = null; + } + + public override void Render(DrawingContext context) + { + var c = (char)_rand.Next(65, 90); + + if (_fontSize + _direction > 200) + { + _direction = -10; + } + + if (_fontSize + _direction < 20) + { + _direction = 10; + } + + _fontSize += _direction; + + _glyphIndices[0] = _glyphTypeface.GetGlyph(c); + + _characters[0] = c; + + var glyphRun = new GlyphRun(_glyphTypeface, _fontSize, _characters, _glyphIndices); + + var geometry = glyphRun.BuildGeometry(); - (_imageControl.Source as DrawingImage).Drawing = drawingGroup; + context.DrawGeometry(Brushes.Green, null, geometry); } } } diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index 61aa6ce946..0c72c389dc 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -1,10 +1,8 @@ using System; using Avalonia.Controls; -using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Android; using Avalonia.Android.Platform; using Avalonia.Android.Platform.Input; -using Avalonia.Controls.Platform; using Avalonia.Input; using Avalonia.Input.Platform; using Avalonia.OpenGL.Egl; @@ -55,14 +53,11 @@ namespace Avalonia.Android .Bind().ToSingleton() .Bind().ToConstant(Instance) .Bind().ToConstant(new AndroidThreadingInterface()) - .Bind().ToTransient() .Bind().ToSingleton() .Bind().ToConstant(new ChoreographerTimer()) .Bind().ToConstant(new RenderLoop()) .Bind().ToSingleton(); - SkiaPlatform.Initialize(); - if (options.UseGpu) { EglPlatformOpenGlInterface.TryInitialize(); diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs index f5d620a97a..4ee4bc1375 100644 --- a/src/Android/Avalonia.Android/AvaloniaActivity.cs +++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs @@ -4,10 +4,14 @@ using Android.Content.Res; using AndroidX.Lifecycle; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls; +using Android.Runtime; +using Android.App; +using Android.Content; +using System; namespace Avalonia.Android { - public abstract class AvaloniaActivity : AppCompatActivity where TApp : Application, new() + public abstract class AvaloniaActivity : AppCompatActivity { internal class SingleViewLifetime : ISingleViewApplicationLifetime { @@ -20,32 +24,32 @@ namespace Avalonia.Android } } + internal Action ActivityResult; internal AvaloniaView View; internal AvaloniaViewModel _viewModel; - protected virtual AppBuilder CustomizeAppBuilder(AppBuilder builder) => builder.UseAndroid(); + protected abstract AppBuilder CreateAppBuilder(); protected override void OnCreate(Bundle savedInstanceState) { - var builder = AppBuilder.Configure(); - - CustomizeAppBuilder(builder); + var builder = CreateAppBuilder(); - View = new AvaloniaView(this); - SetContentView(View); var lifetime = new SingleViewLifetime(); - lifetime.View = View; builder.AfterSetup(x => { _viewModel = new ViewModelProvider(this).Get(Java.Lang.Class.FromType(typeof(AvaloniaViewModel))) as AvaloniaViewModel; + View = new AvaloniaView(this); if (_viewModel.Content != null) { View.Content = _viewModel.Content; } + SetContentView(View); + lifetime.View = View; + View.Prepare(); }); @@ -78,5 +82,24 @@ namespace Avalonia.Android base.OnDestroy(); } + + protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data) + { + base.OnActivityResult(requestCode, resultCode, data); + + ActivityResult?.Invoke(requestCode, resultCode, data); + } + } + + public abstract class AvaloniaActivity : AvaloniaActivity where TApp : Application, new() + { + protected virtual AppBuilder CustomizeAppBuilder(AppBuilder builder) => builder.UseAndroid(); + + protected override AppBuilder CreateAppBuilder() + { + var builder = AppBuilder.Configure(); + + return CustomizeAppBuilder(builder); + } } } diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index 10f98609bf..fd97e293f9 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -7,6 +7,7 @@ using Android.Views.InputMethods; using Avalonia.Android.OpenGL; using Avalonia.Android.Platform.Specific; using Avalonia.Android.Platform.Specific.Helpers; +using Avalonia.Android.Platform.Storage; using Avalonia.Controls; using Avalonia.Controls.Platform; using Avalonia.Controls.Platform.Surfaces; @@ -16,11 +17,13 @@ using Avalonia.Input.TextInput; using Avalonia.OpenGL.Egl; using Avalonia.OpenGL.Surfaces; using Avalonia.Platform; +using Avalonia.Platform.Storage; using Avalonia.Rendering; namespace Avalonia.Android.Platform.SkiaPlatform { - class TopLevelImpl : IAndroidView, ITopLevelImpl, EglGlPlatformSurfaceBase.IEglWindowGlPlatformSurfaceInfo, ITopLevelImplWithTextInputMethod, ITopLevelImplWithNativeControlHost + class TopLevelImpl : IAndroidView, ITopLevelImpl, EglGlPlatformSurfaceBase.IEglWindowGlPlatformSurfaceInfo, + ITopLevelImplWithTextInputMethod, ITopLevelImplWithNativeControlHost, ITopLevelImplWithStorageProvider { private readonly IGlPlatformSurface _gl; private readonly IFramebufferPlatformSurface _framebuffer; @@ -46,6 +49,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform _view.Resources.DisplayMetrics.HeightPixels).ToSize(RenderScaling); NativeControlHost = new AndroidNativeControlHostImpl(avaloniaView); + StorageProvider = new AndroidStorageProvider((AvaloniaActivity)avaloniaView.Context); } public virtual Point GetAvaloniaPointFromEvent(MotionEvent e, int pointerIndex) => @@ -225,6 +229,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform public ITextInputMethodImpl TextInputMethod => _textInputMethod; public INativeControlHostImpl NativeControlHost { get; } + + public IStorageProvider StorageProvider { get; } public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel) { diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs new file mode 100644 index 0000000000..50581d47b1 --- /dev/null +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs @@ -0,0 +1,244 @@ +#nullable enable + +using System; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Android.Content; +using Android.Provider; +using Avalonia.Logging; +using Avalonia.Platform.Storage; +using Java.Lang; +using AndroidUri = Android.Net.Uri; +using Exception = System.Exception; +using JavaFile = Java.IO.File; + +namespace Avalonia.Android.Platform.Storage; + +internal abstract class AndroidStorageItem : IStorageBookmarkItem +{ + private Context? _context; + + protected AndroidStorageItem(Context context, AndroidUri uri) + { + _context = context; + Uri = uri; + } + + internal AndroidUri Uri { get; } + + protected Context Context => _context ?? throw new ObjectDisposedException(nameof(AndroidStorageItem)); + + public string Name => GetColumnValue(Context, Uri, MediaStore.IMediaColumns.DisplayName) + ?? Uri.PathSegments?.LastOrDefault() ?? string.Empty; + + public bool CanBookmark => true; + + public Task SaveBookmark() + { + Context.ContentResolver?.TakePersistableUriPermission(Uri, ActivityFlags.GrantWriteUriPermission | ActivityFlags.GrantReadUriPermission); + return Task.FromResult(Uri.ToString()); + } + + public Task ReleaseBookmark() + { + Context.ContentResolver?.ReleasePersistableUriPermission(Uri, ActivityFlags.GrantWriteUriPermission | ActivityFlags.GrantReadUriPermission); + return Task.CompletedTask; + } + + public bool TryGetUri([NotNullWhen(true)] out Uri? uri) + { + uri = new Uri(Uri.ToString()!); + return true; + } + + public abstract Task GetBasicPropertiesAsync(); + + protected string? GetColumnValue(Context context, AndroidUri contentUri, string column, string? selection = null, string[]? selectionArgs = null) + { + try + { + var projection = new[] { column }; + using var cursor = context.ContentResolver!.Query(contentUri, projection, selection, selectionArgs, null); + if (cursor?.MoveToFirst() == true) + { + var columnIndex = cursor.GetColumnIndex(column); + if (columnIndex != -1) + return cursor.GetString(columnIndex); + } + } + catch (Exception ex) + { + Logger.TryGet(LogEventLevel.Verbose, LogArea.AndroidPlatform)?.Log(this, "File metadata reader failed: '{Exception}'", ex); + } + + return null; + } + + public Task GetParentAsync() + { + using var javaFile = new JavaFile(Uri.Path!); + + // Java file represents files AND directories. Don't be confused. + if (javaFile.ParentFile is {} parentFile + && AndroidUri.FromFile(parentFile) is {} androidUri) + { + return Task.FromResult(new AndroidStorageFolder(Context, androidUri)); + } + + return Task.FromResult(null); + } + + public void Dispose() + { + _context = null; + } +} + +internal sealed class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder +{ + public AndroidStorageFolder(Context context, AndroidUri uri) : base(context, uri) + { + } + + public override Task GetBasicPropertiesAsync() + { + return Task.FromResult(new StorageItemProperties()); + } +} + +internal sealed class AndroidStorageFile : AndroidStorageItem, IStorageBookmarkFile +{ + public AndroidStorageFile(Context context, AndroidUri uri) : base(context, uri) + { + } + + public bool CanOpenRead => true; + + public bool CanOpenWrite => true; + + public Task OpenRead() => Task.FromResult(OpenContentStream(Context, Uri, false) + ?? throw new InvalidOperationException("Failed to open content stream")); + + public Task OpenWrite() => Task.FromResult(OpenContentStream(Context, Uri, true) + ?? throw new InvalidOperationException("Failed to open content stream")); + + private Stream? OpenContentStream(Context context, AndroidUri uri, bool isOutput) + { + var isVirtual = IsVirtualFile(context, uri); + if (isVirtual) + { + Logger.TryGet(LogEventLevel.Verbose, LogArea.AndroidPlatform)?.Log(this, "Content URI was virtual: '{Uri}'", uri); + return GetVirtualFileStream(context, uri, isOutput); + } + + return isOutput + ? context.ContentResolver?.OpenOutputStream(uri) + : context.ContentResolver?.OpenInputStream(uri); + } + + private bool IsVirtualFile(Context context, AndroidUri uri) + { + if (!DocumentsContract.IsDocumentUri(context, uri)) + return false; + + var value = GetColumnValue(context, uri, DocumentsContract.Document.ColumnFlags); + if (!string.IsNullOrEmpty(value) && int.TryParse(value, out var flagsInt)) + { + var flags = (DocumentContractFlags)flagsInt; + return flags.HasFlag(DocumentContractFlags.VirtualDocument); + } + + return false; + } + + private Stream? GetVirtualFileStream(Context context, AndroidUri uri, bool isOutput) + { + var mimeTypes = context.ContentResolver?.GetStreamTypes(uri, FilePickerFileTypes.All.MimeTypes![0]); + if (mimeTypes?.Length >= 1) + { + var mimeType = mimeTypes[0]; + var asset = context.ContentResolver! + .OpenTypedAssetFileDescriptor(uri, mimeType, null); + + var stream = isOutput + ? asset?.CreateOutputStream() + : asset?.CreateInputStream(); + + return stream; + } + + return null; + } + + public override Task GetBasicPropertiesAsync() + { + ulong? size = null; + DateTimeOffset? itemDate = null; + DateTimeOffset? dateModified = null; + + try + { + var projection = new[] + { + MediaStore.IMediaColumns.Size, MediaStore.IMediaColumns.DateAdded, + MediaStore.IMediaColumns.DateModified + }; + using var cursor = Context.ContentResolver!.Query(Uri, projection, null, null, null); + + if (cursor?.MoveToFirst() == true) + { + try + { + var columnIndex = cursor.GetColumnIndex(MediaStore.IMediaColumns.Size); + if (columnIndex != -1) + { + size = (ulong)cursor.GetLong(columnIndex); + } + } + catch (Exception ex) + { + Logger.TryGet(LogEventLevel.Verbose, LogArea.AndroidPlatform)? + .Log(this, "File Size metadata reader failed: '{Exception}'", ex); + } + + try + { + var columnIndex = cursor.GetColumnIndex(MediaStore.IMediaColumns.DateAdded); + if (columnIndex != -1) + { + var longValue = cursor.GetLong(columnIndex); + itemDate = longValue > 0 ? DateTimeOffset.FromUnixTimeMilliseconds(longValue) : null; + } + } + catch (Exception ex) + { + Logger.TryGet(LogEventLevel.Verbose, LogArea.AndroidPlatform)? + .Log(this, "File DateAdded metadata reader failed: '{Exception}'", ex); + } + + try + { + var columnIndex = cursor.GetColumnIndex(MediaStore.IMediaColumns.DateModified); + if (columnIndex != -1) + { + var longValue = cursor.GetLong(columnIndex); + dateModified = longValue > 0 ? DateTimeOffset.FromUnixTimeMilliseconds(longValue) : null; + } + } + catch (Exception ex) + { + Logger.TryGet(LogEventLevel.Verbose, LogArea.AndroidPlatform)? + .Log(this, "File DateAdded metadata reader failed: '{Exception}'", ex); + } + } + } + catch (UnsupportedOperationException) + { + // It's not possible to get parameters of some files/folders. + } + + return Task.FromResult(new StorageItemProperties(size, itemDate, dateModified)); + } +} diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs new file mode 100644 index 0000000000..653f450ec8 --- /dev/null +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageProvider.cs @@ -0,0 +1,177 @@ +#nullable enable + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Android.App; +using Android.Content; +using Android.Provider; +using Avalonia.Platform.Storage; +using AndroidUri = Android.Net.Uri; + +namespace Avalonia.Android.Platform.Storage; + +internal class AndroidStorageProvider : IStorageProvider +{ + private readonly AvaloniaActivity _activity; + private int _lastRequestCode = 20000; + + public AndroidStorageProvider(AvaloniaActivity activity) + { + _activity = activity; + } + + public bool CanOpen => OperatingSystem.IsAndroidVersionAtLeast(19); + + public bool CanSave => OperatingSystem.IsAndroidVersionAtLeast(19); + + public bool CanPickFolder => OperatingSystem.IsAndroidVersionAtLeast(21); + + public Task OpenFolderBookmarkAsync(string bookmark) + { + var uri = AndroidUri.Parse(bookmark) ?? throw new ArgumentException("Couldn't parse Bookmark value", nameof(bookmark)); + return Task.FromResult(new AndroidStorageFolder(_activity, uri)); + } + + public Task OpenFileBookmarkAsync(string bookmark) + { + var uri = AndroidUri.Parse(bookmark) ?? throw new ArgumentException("Couldn't parse Bookmark value", nameof(bookmark)); + return Task.FromResult(new AndroidStorageFile(_activity, uri)); + } + + public async Task> OpenFilePickerAsync(FilePickerOpenOptions options) + { + var mimeTypes = options.FileTypeFilter?.Where(t => t != FilePickerFileTypes.All) + .SelectMany(f => f.MimeTypes ?? Array.Empty()).Distinct().ToArray() ?? Array.Empty(); + + var intent = new Intent(Intent.ActionOpenDocument) + .AddCategory(Intent.CategoryOpenable) + .PutExtra(Intent.ExtraAllowMultiple, options.AllowMultiple) + .SetType(FilePickerFileTypes.All.MimeTypes![0]); + if (mimeTypes.Length > 0) + { + intent = intent.PutExtra(Intent.ExtraMimeTypes, mimeTypes); + } + + if (TryGetInitialUri(options.SuggestedStartLocation) is { } initialUri) + { + intent = intent.PutExtra(DocumentsContract.ExtraInitialUri, initialUri); + } + + var pickerIntent = Intent.CreateChooser(intent, options.Title ?? "Select file"); + + var uris = await StartActivity(pickerIntent, false); + return uris.Select(u => new AndroidStorageFile(_activity, u)).ToArray(); + } + + public async Task SaveFilePickerAsync(FilePickerSaveOptions options) + { + var mimeTypes = options.FileTypeChoices?.Where(t => t != FilePickerFileTypes.All) + .SelectMany(f => f.MimeTypes ?? Array.Empty()).Distinct().ToArray() ?? Array.Empty(); + + var intent = new Intent(Intent.ActionCreateDocument) + .AddCategory(Intent.CategoryOpenable) + .SetType(FilePickerFileTypes.All.MimeTypes![0]); + if (mimeTypes.Length > 0) + { + intent = intent.PutExtra(Intent.ExtraMimeTypes, mimeTypes); + } + + if (options.SuggestedFileName is { } fileName) + { + if (options.DefaultExtension is { } ext) + { + fileName += ext.StartsWith('.') ? ext : "." + ext; + } + intent = intent.PutExtra(Intent.ExtraTitle, fileName); + } + + if (TryGetInitialUri(options.SuggestedStartLocation) is { } initialUri) + { + intent = intent.PutExtra(DocumentsContract.ExtraInitialUri, initialUri); + } + + var pickerIntent = Intent.CreateChooser(intent, options.Title ?? "Save file"); + + var uris = await StartActivity(pickerIntent, true); + return uris.Select(u => new AndroidStorageFile(_activity, u)).FirstOrDefault(); + } + + public async Task> OpenFolderPickerAsync(FolderPickerOpenOptions options) + { + var intent = new Intent(Intent.ActionOpenDocumentTree) + .PutExtra(Intent.ExtraAllowMultiple, options.AllowMultiple); + if (TryGetInitialUri(options.SuggestedStartLocation) is { } initialUri) + { + intent = intent.PutExtra(DocumentsContract.ExtraInitialUri, initialUri); + } + + var pickerIntent = Intent.CreateChooser(intent, options.Title ?? "Select folder"); + + var uris = await StartActivity(pickerIntent, false); + return uris.Select(u => new AndroidStorageFolder(_activity, u)).ToArray(); + } + + private async Task> StartActivity(Intent? pickerIntent, bool singleResult) + { + var resultList = new List(1); + var tcs = new TaskCompletionSource(); + var currentRequestCode = _lastRequestCode++; + + _activity.ActivityResult += OnActivityResult; + _activity.StartActivityForResult(pickerIntent, currentRequestCode); + + var result = await tcs.Task; + + if (result != null) + { + // ClipData first to avoid issue with multiple files selection. + if (!singleResult && result.ClipData is { } clipData) + { + for (var i = 0; i < clipData.ItemCount; i++) + { + var uri = clipData.GetItemAt(i)?.Uri; + if (uri != null) + { + resultList.Add(uri); + } + } + } + else if (result.Data is { } uri) + { + resultList.Add(uri); + } + } + + if (result?.HasExtra("error") == true) + { + throw new Exception(result.GetStringExtra("error")); + } + + return resultList; + + void OnActivityResult(int requestCode, Result resultCode, Intent data) + { + if (currentRequestCode != requestCode) + { + return; + } + + _activity.ActivityResult -= OnActivityResult; + + _ = tcs.TrySetResult(resultCode == Result.Ok ? data : null); + } + } + + private static AndroidUri? TryGetInitialUri(IStorageFolder? folder) + { + if (OperatingSystem.IsAndroidVersionAtLeast(26) + && (folder as AndroidStorageItem)?.Uri is { } uri) + { + return uri; + } + + return null; + } +} diff --git a/src/Android/Avalonia.Android/SystemDialogImpl.cs b/src/Android/Avalonia.Android/SystemDialogImpl.cs deleted file mode 100644 index 1ed1f688b1..0000000000 --- a/src/Android/Avalonia.Android/SystemDialogImpl.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Threading.Tasks; -using Avalonia.Controls; -using Avalonia.Controls.Platform; - -namespace Avalonia.Android -{ - internal class SystemDialogImpl : ISystemDialogImpl - { - public Task ShowFileDialogAsync(FileDialog dialog, Window parent) - { - throw new NotImplementedException(); - } - - public Task ShowFolderDialogAsync(OpenFolderDialog dialog, Window parent) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/Avalonia.Base/Assets/BiDi.trie b/src/Avalonia.Base/Assets/BiDi.trie deleted file mode 100644 index 1c6122e2f1..0000000000 Binary files a/src/Avalonia.Base/Assets/BiDi.trie and /dev/null differ diff --git a/src/Avalonia.Base/Assets/GraphemeBreak.trie b/src/Avalonia.Base/Assets/GraphemeBreak.trie deleted file mode 100644 index 482bf9b44d..0000000000 Binary files a/src/Avalonia.Base/Assets/GraphemeBreak.trie and /dev/null differ diff --git a/src/Avalonia.Base/Assets/UnicodeData.trie b/src/Avalonia.Base/Assets/UnicodeData.trie deleted file mode 100644 index 46175ea644..0000000000 Binary files a/src/Avalonia.Base/Assets/UnicodeData.trie and /dev/null differ diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 1f14ddede4..6633eabb5d 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -935,7 +935,8 @@ namespace Avalonia public void Dispose() { - _subscription.Dispose(); + // _subscription can be null, if Subscribe failed with an exception. + _subscription?.Dispose(); _owner._directBindings!.Remove(this); } diff --git a/src/Avalonia.Base/Controls/ResourceDictionary.cs b/src/Avalonia.Base/Controls/ResourceDictionary.cs index 3af14daa83..77863e5101 100644 --- a/src/Avalonia.Base/Controls/ResourceDictionary.cs +++ b/src/Avalonia.Base/Controls/ResourceDictionary.cs @@ -1,38 +1,45 @@ using System; +using System.Collections; using System.Collections.Generic; -using System.Collections.Specialized; +using System.Linq; using Avalonia.Collections; -using Avalonia.Metadata; - -#nullable enable namespace Avalonia.Controls { /// /// An indexed dictionary of resources. /// - public class ResourceDictionary : AvaloniaDictionary, IResourceDictionary + public class ResourceDictionary : IResourceDictionary { + private Dictionary? _inner; private IResourceHost? _owner; private AvaloniaList? _mergedDictionaries; /// /// Initializes a new instance of the class. /// - public ResourceDictionary() - { - CollectionChanged += OnCollectionChanged; - } + public ResourceDictionary() { } /// /// Initializes a new instance of the class. /// - public ResourceDictionary(IResourceHost owner) - : this() + public ResourceDictionary(IResourceHost owner) => Owner = owner; + + public int Count => _inner?.Count ?? 0; + + public object? this[object key] { - Owner = owner; + get => _inner?[key]; + set + { + Inner[key] = value; + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + } } + public ICollection Keys => (ICollection?)_inner?.Keys ?? Array.Empty(); + public ICollection Values => (ICollection?)_inner?.Values ?? Array.Empty(); + public IResourceHost? Owner { get => _owner; @@ -80,7 +87,7 @@ namespace Avalonia.Controls { get { - if (Count > 0) + if (_inner?.Count > 0) { return true; } @@ -100,11 +107,43 @@ namespace Avalonia.Controls } } + bool ICollection>.IsReadOnly => false; + + private Dictionary Inner => _inner ??= new(); + public event EventHandler? OwnerChanged; + public void Add(object key, object? value) + { + Inner.Add(key, value); + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + } + + public void Clear() + { + if (_inner?.Count > 0) + { + _inner.Clear(); + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + } + } + + public bool ContainsKey(object key) => _inner?.ContainsKey(key) ?? false; + + public bool Remove(object key) + { + if (_inner?.Remove(key) == true) + { + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + return true; + } + + return false; + } + public bool TryGetResource(object key, out object? value) { - if (TryGetValue(key, out value)) + if (_inner is not null && _inner.TryGetValue(key, out value)) { return true; } @@ -120,9 +159,52 @@ namespace Avalonia.Controls } } + value = null; return false; } + public bool TryGetValue(object key, out object? value) + { + if (_inner is not null) + return _inner.TryGetValue(key, out value); + value = null; + return false; + } + + + void ICollection>.Add(KeyValuePair item) + { + Add(item.Key, item.Value); + } + + bool ICollection>.Contains(KeyValuePair item) + { + return (_inner as ICollection>)?.Contains(item) ?? false; + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + (_inner as ICollection>)?.CopyTo(array, arrayIndex); + } + + bool ICollection>.Remove(KeyValuePair item) + { + if ((_inner as ICollection>)?.Remove(item) == true) + { + Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + return true; + } + + return false; + } + + public IEnumerator> GetEnumerator() + { + return _inner?.GetEnumerator() ?? Enumerable.Empty>().GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + void IResourceProvider.AddOwner(IResourceHost owner) { owner = owner ?? throw new ArgumentNullException(nameof(owner)); @@ -134,7 +216,7 @@ namespace Avalonia.Controls Owner = owner; - var hasResources = Count > 0; + var hasResources = _inner?.Count > 0; if (_mergedDictionaries is object) { @@ -159,7 +241,7 @@ namespace Avalonia.Controls { Owner = null; - var hasResources = Count > 0; + var hasResources = _inner?.Count > 0; if (_mergedDictionaries is object) { @@ -176,10 +258,5 @@ namespace Avalonia.Controls } } } - - private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) - { - Owner?.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); - } } } diff --git a/src/Avalonia.Base/GeometryCollection.cs b/src/Avalonia.Base/GeometryCollection.cs deleted file mode 100644 index 0bd02d5438..0000000000 --- a/src/Avalonia.Base/GeometryCollection.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using Avalonia.Animation; - -#nullable enable - -namespace Avalonia.Media -{ - public class GeometryCollection : Animatable, IList, IReadOnlyList - { - private List _inner; - - public GeometryCollection() => _inner = new List(); - public GeometryCollection(IEnumerable collection) => _inner = new List(collection); - public GeometryCollection(int capacity) => _inner = new List(capacity); - - public Geometry this[int index] - { - get => _inner[index]; - set => _inner[index] = value; - } - - public int Count => _inner.Count; - public bool IsReadOnly => false; - - public void Add(Geometry item) => _inner.Add(item); - public void Clear() => _inner.Clear(); - public bool Contains(Geometry item) => _inner.Contains(item); - public void CopyTo(Geometry[] array, int arrayIndex) => _inner.CopyTo(array, arrayIndex); - public IEnumerator GetEnumerator() => _inner.GetEnumerator(); - public int IndexOf(Geometry item) => _inner.IndexOf(item); - public void Insert(int index, Geometry item) => _inner.Insert(index, item); - public bool Remove(Geometry item) => _inner.Remove(item); - public void RemoveAt(int index) => _inner.RemoveAt(index); - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - } -} diff --git a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs index f8cedb636f..889b7e3b82 100644 --- a/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs +++ b/src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs @@ -66,7 +66,8 @@ namespace Avalonia.Input.GestureRecognizers public void PointerPressed(PointerPressedEventArgs e) { - if (e.Pointer.IsPrimary && e.Pointer.Type == PointerType.Touch) + if (e.Pointer.IsPrimary && + (e.Pointer.Type == PointerType.Touch || e.Pointer.Type == PointerType.Pen)) { EndGesture(); _tracking = e.Pointer; @@ -101,7 +102,7 @@ namespace Avalonia.Input.GestureRecognizers if (_scrolling) { var vector = _trackedRootPoint - rootPoint; - var elapsed = _lastMoveTimestamp.HasValue ? + var elapsed = _lastMoveTimestamp.HasValue && _lastMoveTimestamp < e.Timestamp ? TimeSpan.FromMilliseconds(e.Timestamp - _lastMoveTimestamp.Value) : TimeSpan.Zero; diff --git a/src/Avalonia.Base/Input/IInputElement.cs b/src/Avalonia.Base/Input/IInputElement.cs index 78001143d7..43ac87d008 100644 --- a/src/Avalonia.Base/Input/IInputElement.cs +++ b/src/Avalonia.Base/Input/IInputElement.cs @@ -42,12 +42,12 @@ namespace Avalonia.Input /// /// Occurs when the pointer enters the control. /// - event EventHandler? PointerEnter; + event EventHandler? PointerEntered; /// /// Occurs when the pointer leaves the control. /// - event EventHandler? PointerLeave; + event EventHandler? PointerExited; /// /// Occurs when the pointer is pressed over the control. diff --git a/src/Avalonia.Base/Input/IKeyboardDevice.cs b/src/Avalonia.Base/Input/IKeyboardDevice.cs index c8db8bf16f..80aebc02bc 100644 --- a/src/Avalonia.Base/Input/IKeyboardDevice.cs +++ b/src/Avalonia.Base/Input/IKeyboardDevice.cs @@ -43,12 +43,17 @@ namespace Avalonia.Input Control = 2, Shift = 4, Meta = 8, + LeftMouseButton = 16, RightMouseButton = 32, MiddleMouseButton = 64, XButton1MouseButton = 128, XButton2MouseButton = 256, - KeyboardMask = Alt | Control | Shift | Meta + KeyboardMask = Alt | Control | Shift | Meta, + + PenInverted = 512, + PenEraser = 1024, + PenBarrelButton = 2048 } [NotClientImplementable] diff --git a/src/Avalonia.Base/Input/IPenDevice.cs b/src/Avalonia.Base/Input/IPenDevice.cs new file mode 100644 index 0000000000..1cc0fcf76d --- /dev/null +++ b/src/Avalonia.Base/Input/IPenDevice.cs @@ -0,0 +1,10 @@ +namespace Avalonia.Input +{ + /// + /// Represents a pen/stylus device. + /// + public interface IPenDevice : IPointerDevice + { + + } +} diff --git a/src/Avalonia.Base/Input/IPointer.cs b/src/Avalonia.Base/Input/IPointer.cs index 66aeacadc9..52605bb6ae 100644 --- a/src/Avalonia.Base/Input/IPointer.cs +++ b/src/Avalonia.Base/Input/IPointer.cs @@ -2,20 +2,59 @@ using Avalonia.Metadata; namespace Avalonia.Input { + /// + /// Identifies specific pointer generated by input device. + /// + /// + /// Some devices, for instance, touchscreen might generate a pointer on each physical contact. + /// [NotClientImplementable] public interface IPointer { + /// + /// Gets a unique identifier for the input pointer. + /// int Id { get; } + + /// + /// Captures pointer input to the specified control. + /// + /// The control. + /// + /// When an element captures the pointer, it receives pointer input whether the cursor is + /// within the control's bounds or not. The current pointer capture control is exposed + /// by the property. + /// void Capture(IInputElement? control); + + /// + /// Gets the control that is currently capturing by the pointer, if any. + /// + /// + /// When an element captures the pointer, it receives pointer input whether the cursor is + /// within the control's bounds or not. To set the pointer capture, call the + /// method. + /// IInputElement? Captured { get; } + + /// + /// Gets the pointer device type. + /// PointerType Type { get; } + + /// + /// Gets a value that indicates whether the input is from the primary pointer when multiple pointers are registered. + /// bool IsPrimary { get; } - } + /// + /// Enumerates pointer device types. + /// public enum PointerType { Mouse, - Touch + Touch, + Pen } } diff --git a/src/Avalonia.Base/Input/InputElement.cs b/src/Avalonia.Base/Input/InputElement.cs index f4e25ebada..d0130258c3 100644 --- a/src/Avalonia.Base/Input/InputElement.cs +++ b/src/Avalonia.Base/Input/InputElement.cs @@ -128,16 +128,20 @@ namespace Avalonia.Input RoutingStrategies.Tunnel | RoutingStrategies.Bubble); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerEnterEvent = - RoutedEvent.Register(nameof(PointerEnter), RoutingStrategies.Direct); + public static readonly RoutedEvent PointerEnteredEvent = + RoutedEvent.Register( + nameof(PointerEntered), + RoutingStrategies.Direct); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerLeaveEvent = - RoutedEvent.Register(nameof(PointerLeave), RoutingStrategies.Direct); + public static readonly RoutedEvent PointerExitedEvent = + RoutedEvent.Register( + nameof(PointerExited), + RoutingStrategies.Direct); /// /// Defines the event. @@ -208,8 +212,8 @@ namespace Avalonia.Input KeyDownEvent.AddClassHandler((x, e) => x.OnKeyDown(e)); KeyUpEvent.AddClassHandler((x, e) => x.OnKeyUp(e)); TextInputEvent.AddClassHandler((x, e) => x.OnTextInput(e)); - PointerEnterEvent.AddClassHandler((x, e) => x.OnPointerEnterCore(e)); - PointerLeaveEvent.AddClassHandler((x, e) => x.OnPointerLeaveCore(e)); + PointerEnteredEvent.AddClassHandler((x, e) => x.OnPointerEnteredCore(e)); + PointerExitedEvent.AddClassHandler((x, e) => x.OnPointerExitedCore(e)); PointerMovedEvent.AddClassHandler((x, e) => x.OnPointerMoved(e)); PointerPressedEvent.AddClassHandler((x, e) => x.OnPointerPressed(e)); PointerReleasedEvent.AddClassHandler((x, e) => x.OnPointerReleased(e)); @@ -279,19 +283,19 @@ namespace Avalonia.Input /// /// Occurs when the pointer enters the control. /// - public event EventHandler? PointerEnter + public event EventHandler? PointerEntered { - add { AddHandler(PointerEnterEvent, value); } - remove { RemoveHandler(PointerEnterEvent, value); } + add { AddHandler(PointerEnteredEvent, value); } + remove { RemoveHandler(PointerEnteredEvent, value); } } /// /// Occurs when the pointer leaves the control. /// - public event EventHandler? PointerLeave + public event EventHandler? PointerExited { - add { AddHandler(PointerLeaveEvent, value); } - remove { RemoveHandler(PointerLeaveEvent, value); } + add { AddHandler(PointerExitedEvent, value); } + remove { RemoveHandler(PointerExitedEvent, value); } } /// @@ -539,18 +543,18 @@ namespace Avalonia.Input } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - protected virtual void OnPointerEnter(PointerEventArgs e) + protected virtual void OnPointerEntered(PointerEventArgs e) { } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - protected virtual void OnPointerLeave(PointerEventArgs e) + protected virtual void OnPointerExited(PointerEventArgs e) { } @@ -561,7 +565,9 @@ namespace Avalonia.Input protected virtual void OnPointerMoved(PointerEventArgs e) { if (_gestureRecognizers?.HandlePointerMoved(e) == true) + { e.Handled = true; + } } /// @@ -571,7 +577,9 @@ namespace Avalonia.Input protected virtual void OnPointerPressed(PointerPressedEventArgs e) { if (_gestureRecognizers?.HandlePointerPressed(e) == true) + { e.Handled = true; + } } /// @@ -581,7 +589,9 @@ namespace Avalonia.Input protected virtual void OnPointerReleased(PointerReleasedEventArgs e) { if (_gestureRecognizers?.HandlePointerReleased(e) == true) + { e.Handled = true; + } } /// @@ -634,23 +644,23 @@ namespace Avalonia.Input } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - private void OnPointerEnterCore(PointerEventArgs e) + private void OnPointerEnteredCore(PointerEventArgs e) { IsPointerOver = true; - OnPointerEnter(e); + OnPointerEntered(e); } /// - /// Called before the event occurs. + /// Called before the event occurs. /// /// The event args. - private void OnPointerLeaveCore(PointerEventArgs e) + private void OnPointerExitedCore(PointerEventArgs e) { IsPointerOver = false; - OnPointerLeave(e); + OnPointerExited(e); } /// diff --git a/src/Avalonia.Base/Input/PenDevice.cs b/src/Avalonia.Base/Input/PenDevice.cs new file mode 100644 index 0000000000..d22b48562c --- /dev/null +++ b/src/Avalonia.Base/Input/PenDevice.cs @@ -0,0 +1,174 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reactive.Linq; +using Avalonia.Input.Raw; +using Avalonia.Platform; +using Avalonia.VisualTree; + +namespace Avalonia.Input +{ + /// + /// Represents a pen/stylus device. + /// + public class PenDevice : IPenDevice, IDisposable + { + private readonly Dictionary _pointers = new(); + private readonly Dictionary _lastPositions = new(); + private int _clickCount; + private Rect _lastClickRect; + private ulong _lastClickTime; + private MouseButton _lastMouseDownButton; + + private bool _disposed; + + public void ProcessRawEvent(RawInputEventArgs e) + { + if (!e.Handled && e is RawPointerEventArgs margs) + ProcessRawEvent(margs); + } + + private void ProcessRawEvent(RawPointerEventArgs e) + { + e = e ?? throw new ArgumentNullException(nameof(e)); + + if (!_pointers.TryGetValue(e.RawPointerId, out var pointer)) + { + if (e.Type == RawPointerEventType.LeftButtonUp + || e.Type == RawPointerEventType.TouchEnd) + return; + + _pointers[e.RawPointerId] = pointer = new Pointer(Pointer.GetNextFreeId(), + PointerType.Pen, _pointers.Count == 0); + } + + _lastPositions[e.RawPointerId] = e.Root.PointToScreen(e.Position); + + var props = new PointerPointProperties(e.InputModifiers, e.Type.ToUpdateKind(), + e.Point.Twist, e.Point.Pressure, e.Point.XTilt, e.Point.YTilt); + var keyModifiers = e.InputModifiers.ToKeyModifiers(); + + bool shouldReleasePointer = false; + switch (e.Type) + { + case RawPointerEventType.LeaveWindow: + shouldReleasePointer = true; + break; + case RawPointerEventType.LeftButtonDown: + e.Handled = PenDown(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); + break; + case RawPointerEventType.LeftButtonUp: + e.Handled = PenUp(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult); + break; + case RawPointerEventType.Move: + e.Handled = PenMove(pointer, e.Timestamp, e.Root, e.Position, props, keyModifiers, e.InputHitTestResult, e.IntermediatePoints); + break; + } + + if (shouldReleasePointer) + { + pointer.Dispose(); + _pointers.Remove(e.RawPointerId); + _lastPositions.Remove(e.RawPointerId); + } + } + + private bool PenDown(Pointer pointer, ulong timestamp, + IInputElement root, Point p, PointerPointProperties properties, + KeyModifiers inputModifiers, IInputElement? hitTest) + { + var source = pointer.Captured ?? hitTest; + + if (source != null) + { + pointer.Capture(source); + var settings = AvaloniaLocator.Current.GetService(); + var doubleClickTime = settings?.DoubleClickTime.TotalMilliseconds ?? 500; + var doubleClickSize = settings?.DoubleClickSize ?? new Size(4, 4); + + if (!_lastClickRect.Contains(p) || timestamp - _lastClickTime > doubleClickTime) + { + _clickCount = 0; + } + + ++_clickCount; + _lastClickTime = timestamp; + _lastClickRect = new Rect(p, new Size()) + .Inflate(new Thickness(doubleClickSize.Width / 2, doubleClickSize.Height / 2)); + _lastMouseDownButton = properties.PointerUpdateKind.GetMouseButton(); + var e = new PointerPressedEventArgs(source, pointer, root, p, timestamp, properties, inputModifiers, _clickCount); + source.RaiseEvent(e); + return e.Handled; + } + + return false; + } + + private bool PenMove(Pointer pointer, ulong timestamp, + IInputRoot root, Point p, PointerPointProperties properties, + KeyModifiers inputModifiers, IInputElement? hitTest, + Lazy?>? intermediatePoints) + { + var source = pointer.Captured ?? hitTest; + + if (source is not null) + { + var e = new PointerEventArgs(InputElement.PointerMovedEvent, source, pointer, root, + p, timestamp, properties, inputModifiers, intermediatePoints); + + source.RaiseEvent(e); + return e.Handled; + } + + return false; + } + + private bool PenUp(Pointer pointer, ulong timestamp, + IInputElement root, Point p, PointerPointProperties properties, + KeyModifiers inputModifiers, IInputElement? hitTest) + { + var source = pointer.Captured ?? hitTest; + + if (source is not null) + { + var e = new PointerReleasedEventArgs(source, pointer, root, p, timestamp, properties, inputModifiers, + _lastMouseDownButton); + + source?.RaiseEvent(e); + pointer.Capture(null); + return e.Handled; + } + + return false; + } + + public void Dispose() + { + if (_disposed) + return; + var values = _pointers.Values.ToList(); + _pointers.Clear(); + _disposed = true; + foreach (var p in values) + p.Dispose(); + } + + [Obsolete] + IInputElement? IPointerDevice.Captured => _pointers.Values + .FirstOrDefault(p => p.IsPrimary)?.Captured; + + [Obsolete] + void IPointerDevice.Capture(IInputElement? control) => _pointers.Values + .FirstOrDefault(p => p.IsPrimary)?.Capture(control); + + [Obsolete] + Point IPointerDevice.GetPosition(IVisual relativeTo) => new Point(-1, -1); + + public IPointer? TryGetPointer(RawPointerEventArgs ev) + { + return _pointers.TryGetValue(ev.RawPointerId, out var pointer) + ? pointer + : null; + } + } +} diff --git a/src/Avalonia.Base/Input/PointerEventArgs.cs b/src/Avalonia.Base/Input/PointerEventArgs.cs index 5495802920..058c2f9cc1 100644 --- a/src/Avalonia.Base/Input/PointerEventArgs.cs +++ b/src/Avalonia.Base/Input/PointerEventArgs.cs @@ -67,7 +67,14 @@ namespace Avalonia.Input public IPointer? TryGetPointer(RawPointerEventArgs ev) => _ev.Pointer; } + /// + /// Gets specific pointer generated by input device. + /// public IPointer Pointer { get; } + + /// + /// Gets the time when the input occurred. + /// public ulong Timestamp { get; } private IPointerDevice? _device; @@ -91,7 +98,10 @@ namespace Avalonia.Input return mods; } } - + + /// + /// Gets a value that indicates which key modifiers were active at the time that the pointer event was initiated. + /// public KeyModifiers KeyModifiers { get; } private Point GetPosition(Point pt, IVisual? relativeTo) @@ -102,7 +112,12 @@ namespace Avalonia.Input return pt; return pt * _rootVisual.TransformToVisual(relativeTo) ?? default; } - + + /// + /// Gets the pointer position relative to a control. + /// + /// The control. + /// The pointer position in the control's coordinates. public Point GetPosition(IVisual? relativeTo) => GetPosition(_rootVisualPosition, relativeTo); [Obsolete("Use GetCurrentPoint")] @@ -130,7 +145,8 @@ namespace Avalonia.Input for (var c = 0; c < previousPoints.Count; c++) { var pt = previousPoints[c]; - points[c] = new PointerPoint(Pointer, GetPosition(pt.Position, relativeTo), _properties); + var pointProperties = new PointerPointProperties(_properties, pt); + points[c] = new PointerPoint(Pointer, GetPosition(pt.Position, relativeTo), pointProperties); } points[points.Length - 1] = GetCurrentPoint(relativeTo); diff --git a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs index d22252893d..67d1eea7e3 100644 --- a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs +++ b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs @@ -97,7 +97,7 @@ namespace Avalonia.Input // Do not pass rootVisual, when we have unknown (negative) position, // so GetPosition won't return invalid values. var hasPosition = position.X >= 0 && position.Y >= 0; - var e = new PointerEventArgs(InputElement.PointerLeaveEvent, element, pointer, + var e = new PointerEventArgs(InputElement.PointerExitedEvent, element, pointer, hasPosition ? root : null, hasPosition ? position : default, timestamp, properties, inputModifiers); @@ -177,7 +177,7 @@ namespace Avalonia.Input el = root.PointerOverElement; - var e = new PointerEventArgs(InputElement.PointerLeaveEvent, el, pointer, root, position, + var e = new PointerEventArgs(InputElement.PointerExitedEvent, el, pointer, root, position, timestamp, properties, inputModifiers); if (el != null && branch != null && !el.IsAttachedToVisualTree) { @@ -195,7 +195,7 @@ namespace Avalonia.Input el = root.PointerOverElement = element; _lastPointer = (pointer, root.PointToScreen(position)); - e.RoutedEvent = InputElement.PointerEnterEvent; + e.RoutedEvent = InputElement.PointerEnteredEvent; while (el != null && el != branch) { diff --git a/src/Avalonia.Base/Input/PointerPoint.cs b/src/Avalonia.Base/Input/PointerPoint.cs index 9f8285a8e1..71145b5cb0 100644 --- a/src/Avalonia.Base/Input/PointerPoint.cs +++ b/src/Avalonia.Base/Input/PointerPoint.cs @@ -1,5 +1,10 @@ +using Avalonia.Input.Raw; + namespace Avalonia.Input { + /// + /// Provides basic properties for the input pointer associated with a single mouse, pen/stylus, or touch contact. + /// public sealed class PointerPoint { public PointerPoint(IPointer pointer, Point position, PointerPointProperties properties) @@ -8,25 +13,109 @@ namespace Avalonia.Input Position = position; Properties = properties; } + + /// + /// Gets specific pointer generated by input device. + /// public IPointer Pointer { get; } + + /// + /// Gets extended information about the input pointer. + /// public PointerPointProperties Properties { get; } + + /// + /// Gets the location of the pointer input in client coordinates. + /// public Point Position { get; } } + /// + /// Provides extended properties for a PointerPoint object. + /// public sealed class PointerPointProperties { + /// + /// Gets a value that indicates whether the pointer input was triggered by the primary action mode of an input device. + /// public bool IsLeftButtonPressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the tertiary action mode of an input device. + /// public bool IsMiddleButtonPressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the secondary action mode (if supported) of an input device. + /// public bool IsRightButtonPressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the first extended mouse button (XButton1). + /// public bool IsXButton1Pressed { get; } + + /// + /// Gets a value that indicates whether the pointer input was triggered by the second extended mouse button (XButton2). + /// public bool IsXButton2Pressed { get; } + /// + /// Gets a value that indicates whether the barrel button of the pen/stylus device is pressed. + /// + public bool IsBarrelButtonPressed { get; } + + /// + /// Gets a value that indicates whether the input is from a pen eraser. + /// + public bool IsEraser { get; } + + /// + /// Gets a value that indicates whether the digitizer pen is inverted. + /// + public bool IsInverted { get; } + + /// + /// Gets the clockwise rotation in degrees of a pen device around its own major axis (such as when the user spins the pen in their fingers). + /// + /// + /// A value between 0.0 and 359.0 in degrees of rotation. The default value is 0.0. + /// + public float Twist { get; } + + /// + /// Gets a value that indicates the force that the pointer device (typically a pen/stylus) exerts on the surface of the digitizer. + /// + /// + /// A value from 0 to 1.0. The default value is 0.5. + /// + public float Pressure { get; } = 0.5f; + + /// + /// Gets the plane angle between the Y-Z plane and the plane that contains the Y axis and the axis of the input device (typically a pen/stylus). + /// + /// + /// The value is 0.0 when the finger or pen is perpendicular to the digitizer surface, between 0.0 and 90.0 when tilted to the right of perpendicular, and between 0.0 and -90.0 when tilted to the left of perpendicular. The default value is 0.0. + /// + public float XTilt { get; } + + /// + /// Gets the plane angle between the X-Z plane and the plane that contains the X axis and the axis of the input device (typically a pen/stylus). + /// + /// + /// The value is 0.0 when the finger or pen is perpendicular to the digitizer surface, between 0.0 and 90.0 when tilted towards the user, and between 0.0 and -90.0 when tilted away from the user. The default value is 0.0. + /// + public float YTilt { get; } + + /// + /// Gets the kind of pointer state change. + /// public PointerUpdateKind PointerUpdateKind { get; } private PointerPointProperties() - { + { } - + public PointerPointProperties(RawInputModifiers modifiers, PointerUpdateKind kind) { PointerUpdateKind = kind; @@ -36,10 +125,13 @@ namespace Avalonia.Input IsRightButtonPressed = modifiers.HasAllFlags(RawInputModifiers.RightMouseButton); IsXButton1Pressed = modifiers.HasAllFlags(RawInputModifiers.XButton1MouseButton); IsXButton2Pressed = modifiers.HasAllFlags(RawInputModifiers.XButton2MouseButton); + IsInverted = modifiers.HasAllFlags(RawInputModifiers.PenInverted); + IsEraser = modifiers.HasAllFlags(RawInputModifiers.PenEraser); + IsBarrelButtonPressed = modifiers.HasAllFlags(RawInputModifiers.PenBarrelButton); // The underlying input source might be reporting the previous state, // so make sure that we reflect the current state - + if (kind == PointerUpdateKind.LeftButtonPressed) IsLeftButtonPressed = true; if (kind == PointerUpdateKind.LeftButtonReleased) @@ -62,6 +154,33 @@ namespace Avalonia.Input IsXButton2Pressed = false; } + public PointerPointProperties(RawInputModifiers modifiers, PointerUpdateKind kind, + float twist, float pressure, float xTilt, float yTilt + ) : this (modifiers, kind) + { + Twist = twist; + Pressure = pressure; + XTilt = xTilt; + YTilt = yTilt; + } + + internal PointerPointProperties(PointerPointProperties basedOn, RawPointerPoint rawPoint) + { + IsLeftButtonPressed = basedOn.IsLeftButtonPressed; + IsMiddleButtonPressed = basedOn.IsMiddleButtonPressed; + IsRightButtonPressed = basedOn.IsRightButtonPressed; + IsXButton1Pressed = basedOn.IsXButton1Pressed; + IsXButton2Pressed = basedOn.IsXButton2Pressed; + IsInverted = basedOn.IsInverted; + IsEraser = basedOn.IsEraser; + IsBarrelButtonPressed = basedOn.IsBarrelButtonPressed; + + Twist = rawPoint.Twist; + Pressure = rawPoint.Pressure; + XTilt = rawPoint.XTilt; + YTilt = rawPoint.YTilt; + } + public static PointerPointProperties None { get; } = new PointerPointProperties(); } diff --git a/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs b/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs index 8b9d7c161d..0e4e0ed3e2 100644 --- a/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs +++ b/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs @@ -56,11 +56,12 @@ namespace Avalonia.Input.Raw Contract.Requires(device != null); Contract.Requires(root != null); + Point = new RawPointerPoint(); Position = position; Type = type; InputModifiers = inputModifiers; } - + /// /// Initializes a new instance of the class. /// @@ -87,6 +88,11 @@ namespace Avalonia.Input.Raw InputModifiers = inputModifiers; } + /// + /// Gets the raw pointer identifier. + /// + public long RawPointerId { get; set; } + /// /// Gets the pointer properties and position, in client DIPs. /// @@ -130,10 +136,17 @@ namespace Avalonia.Input.Raw /// Pointer position, in client DIPs. /// public Point Position { get; set; } - + + public float Twist { get; set; } + public float Pressure { get; set; } + public float XTilt { get; set; } + public float YTilt { get; set; } + + public RawPointerPoint() { - Position = default; + this = default; + Pressure = 0.5f; } } } diff --git a/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs b/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs index 020b40e55b..6706a45f48 100644 --- a/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs +++ b/src/Avalonia.Base/Input/Raw/RawTouchEventArgs.cs @@ -1,15 +1,26 @@ +using System; + namespace Avalonia.Input.Raw { public class RawTouchEventArgs : RawPointerEventArgs { public RawTouchEventArgs(IInputDevice device, ulong timestamp, IInputRoot root, RawPointerEventType type, Point position, RawInputModifiers inputModifiers, - long touchPointId) + long rawPointerId) : base(device, timestamp, root, type, position, inputModifiers) { - TouchPointId = touchPointId; + RawPointerId = rawPointerId; + } + + public RawTouchEventArgs(IInputDevice device, ulong timestamp, IInputRoot root, + RawPointerEventType type, RawPointerPoint point, RawInputModifiers inputModifiers, + long rawPointerId) + : base(device, timestamp, root, type, point, inputModifiers) + { + RawPointerId = rawPointerId; } - public long TouchPointId { get; set; } + [Obsolete("Use RawPointerId")] + public long TouchPointId { get => RawPointerId; set => RawPointerId = value; } } } diff --git a/src/Avalonia.Base/Input/TouchDevice.cs b/src/Avalonia.Base/Input/TouchDevice.cs index 54dcc4051e..e914d860fd 100644 --- a/src/Avalonia.Base/Input/TouchDevice.cs +++ b/src/Avalonia.Base/Input/TouchDevice.cs @@ -40,14 +40,14 @@ namespace Avalonia.Input { if (ev.Handled || _disposed) return; - var args = (RawTouchEventArgs)ev; - if (!_pointers.TryGetValue(args.TouchPointId, out var pointer)) + var args = (RawPointerEventArgs)ev; + if (!_pointers.TryGetValue(args.RawPointerId, out var pointer)) { if (args.Type == RawPointerEventType.TouchEnd) return; var hit = args.InputHitTestResult; - _pointers[args.TouchPointId] = pointer = new Pointer(Pointer.GetNextFreeId(), + _pointers[args.RawPointerId] = pointer = new Pointer(Pointer.GetNextFreeId(), PointerType.Touch, _pointers.Count == 0); pointer.Capture(hit); } @@ -88,7 +88,7 @@ namespace Avalonia.Input if (args.Type == RawPointerEventType.TouchEnd) { - _pointers.Remove(args.TouchPointId); + _pointers.Remove(args.RawPointerId); using (pointer) { target.RaiseEvent(new PointerReleasedEventArgs(target, pointer, @@ -101,7 +101,7 @@ namespace Avalonia.Input if (args.Type == RawPointerEventType.TouchCancel) { - _pointers.Remove(args.TouchPointId); + _pointers.Remove(args.RawPointerId); using (pointer) pointer.Capture(null); _lastPointer = null; @@ -129,8 +129,7 @@ namespace Avalonia.Input public IPointer? TryGetPointer(RawPointerEventArgs ev) { - return ev is RawTouchEventArgs args - && _pointers.TryGetValue(args.TouchPointId, out var pointer) + return _pointers.TryGetValue(ev.RawPointerId, out var pointer) ? pointer : null; } diff --git a/src/Avalonia.Base/Layout/LayoutHelper.cs b/src/Avalonia.Base/Layout/LayoutHelper.cs index d24be57d2b..404d19906a 100644 --- a/src/Avalonia.Base/Layout/LayoutHelper.cs +++ b/src/Avalonia.Base/Layout/LayoutHelper.cs @@ -36,11 +36,28 @@ namespace Avalonia.Layout public static Size MeasureChild(ILayoutable? control, Size availableSize, Thickness padding, Thickness borderThickness) { - return MeasureChild(control, availableSize, padding + borderThickness); + if (IsParentLayoutRounded(control, out double scale)) + { + padding = RoundLayoutThickness(padding, scale, scale); + borderThickness = RoundLayoutThickness(borderThickness, scale, scale); + } + + if (control != null) + { + control.Measure(availableSize.Deflate(padding + borderThickness)); + return control.DesiredSize.Inflate(padding + borderThickness); + } + + return new Size().Inflate(padding + borderThickness); } public static Size MeasureChild(ILayoutable? control, Size availableSize, Thickness padding) { + if (IsParentLayoutRounded(control, out double scale)) + { + padding = RoundLayoutThickness(padding, scale, scale); + } + if (control != null) { control.Measure(availableSize.Deflate(padding)); @@ -137,7 +154,7 @@ namespace Avalonia.Layout /// /// Rounds a size to integer values for layout purposes, compensating for high DPI screen - /// coordinates. + /// coordinates by rounding the size up to the nearest pixel. /// /// Input size. /// DPI along x-dimension. @@ -149,9 +166,9 @@ namespace Avalonia.Layout /// 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) + public static Size RoundLayoutSizeUp(Size size, double dpiScaleX, double dpiScaleY) { - return new Size(RoundLayoutValue(size.Width, dpiScaleX), RoundLayoutValue(size.Height, dpiScaleY)); + return new Size(RoundLayoutValueUp(size.Width, dpiScaleX), RoundLayoutValueUp(size.Height, dpiScaleY)); } /// @@ -178,10 +195,9 @@ namespace Avalonia.Layout ); } - - /// - /// Calculates the value to be used for layout rounding at high DPI. + /// Calculates the value to be used for layout rounding at high DPI by rounding the value + /// up or down to the nearest pixel. /// /// Input value to be rounded. /// Ratio of screen's DPI to layout DPI @@ -217,7 +233,46 @@ namespace Avalonia.Layout return newValue; } - + + /// + /// Calculates the value to be used for layout rounding at high DPI by rounding the value up + /// to the nearest pixel. + /// + /// 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 RoundLayoutValueUp(double value, double dpiScale) + { + double newValue; + + // If DPI == 1, don't use DPI-aware rounding. + if (!MathUtilities.IsOne(dpiScale)) + { + newValue = Math.Ceiling(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.Ceiling(value); + } + + return newValue; + } + /// /// Calculates the min and max height for a control. Ported from WPF. /// diff --git a/src/Avalonia.Base/Layout/LayoutManager.cs b/src/Avalonia.Base/Layout/LayoutManager.cs index fc988a8d6c..446f135c83 100644 --- a/src/Avalonia.Base/Layout/LayoutManager.cs +++ b/src/Avalonia.Base/Layout/LayoutManager.cs @@ -28,7 +28,7 @@ namespace Avalonia.Layout public LayoutManager(ILayoutRoot owner) { _owner = owner ?? throw new ArgumentNullException(nameof(owner)); - _executeLayoutPass = ExecuteLayoutPass; + _executeLayoutPass = ExecuteQueuedLayoutPass; } public virtual event EventHandler? LayoutUpdated; @@ -94,6 +94,16 @@ namespace Avalonia.Layout QueueLayoutPass(); } + private void ExecuteQueuedLayoutPass() + { + if (!_queued) + { + return; + } + + ExecuteLayoutPass(); + } + /// public virtual void ExecuteLayoutPass() { @@ -319,8 +329,8 @@ namespace Avalonia.Layout { if (!_queued && !_running) { - Dispatcher.UIThread.Post(_executeLayoutPass, DispatcherPriority.Layout); _queued = true; + Dispatcher.UIThread.Post(_executeLayoutPass, DispatcherPriority.Layout); } } diff --git a/src/Avalonia.Base/Layout/Layoutable.cs b/src/Avalonia.Base/Layout/Layoutable.cs index f30925f489..101e867d56 100644 --- a/src/Avalonia.Base/Layout/Layoutable.cs +++ b/src/Avalonia.Base/Layout/Layoutable.cs @@ -548,6 +548,14 @@ namespace Avalonia.Layout if (IsVisible) { var margin = Margin; + var useLayoutRounding = UseLayoutRounding; + var scale = 1.0; + + if (useLayoutRounding) + { + scale = LayoutHelper.GetLayoutScale(this); + margin = LayoutHelper.RoundLayoutThickness(margin, scale, scale); + } ApplyStyling(); ApplyTemplate(); @@ -584,16 +592,14 @@ namespace Avalonia.Layout height = Math.Min(height, MaxHeight); height = Math.Max(height, MinHeight); - width = Math.Min(width, availableSize.Width); - height = Math.Min(height, availableSize.Height); - - if (UseLayoutRounding) + if (useLayoutRounding) { - var scale = LayoutHelper.GetLayoutScale(this); - width = LayoutHelper.RoundLayoutValue(width, scale); - height = LayoutHelper.RoundLayoutValue(height, scale); + (width, height) = LayoutHelper.RoundLayoutSizeUp(new Size(width, height), scale, scale); } + width = Math.Min(width, availableSize.Width); + height = Math.Min(height, availableSize.Height); + return NonNegative(new Size(width, height).Inflate(margin)); } else @@ -678,8 +684,8 @@ namespace Avalonia.Layout if (useLayoutRounding) { - size = LayoutHelper.RoundLayoutSize(size, scale, scale); - availableSizeMinusMargins = LayoutHelper.RoundLayoutSize(availableSizeMinusMargins, scale, scale); + size = LayoutHelper.RoundLayoutSizeUp(size, scale, scale); + availableSizeMinusMargins = LayoutHelper.RoundLayoutSizeUp(availableSizeMinusMargins, scale, scale); } size = ArrangeOverride(size).Constrain(size); diff --git a/src/Avalonia.Base/Logging/LogArea.cs b/src/Avalonia.Base/Logging/LogArea.cs index c049f9e763..98ef6d2530 100644 --- a/src/Avalonia.Base/Logging/LogArea.cs +++ b/src/Avalonia.Base/Logging/LogArea.cs @@ -44,5 +44,15 @@ namespace Avalonia.Logging /// The log event comes from X11Platform. /// public const string X11Platform = nameof(X11Platform); + + /// + /// The log event comes from AndroidPlatform. + /// + public const string AndroidPlatform = nameof(AndroidPlatform); + + /// + /// The log event comes from IOSPlatform. + /// + public const string IOSPlatform = nameof(IOSPlatform); } } diff --git a/src/Avalonia.Base/Media/DrawingCollection.cs b/src/Avalonia.Base/Media/DrawingCollection.cs new file mode 100644 index 0000000000..a76f7743cc --- /dev/null +++ b/src/Avalonia.Base/Media/DrawingCollection.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using Avalonia.Collections; + +namespace Avalonia.Media +{ + public sealed class DrawingCollection : AvaloniaList + { + public DrawingCollection() + { + ResetBehavior = ResetBehavior.Remove; + } + + public DrawingCollection(IEnumerable items) : base(items) + { + ResetBehavior = ResetBehavior.Remove; + } + } +} diff --git a/src/Avalonia.Base/Media/DrawingGroup.cs b/src/Avalonia.Base/Media/DrawingGroup.cs index eeb6318ebd..603bb1c1c1 100644 --- a/src/Avalonia.Base/Media/DrawingGroup.cs +++ b/src/Avalonia.Base/Media/DrawingGroup.cs @@ -1,6 +1,10 @@ -using Avalonia.Collections; +using System; +using System.Collections.Generic; +using Avalonia.Media.Imaging; using Avalonia.Metadata; using Avalonia.Platform; +using Avalonia.Rendering.SceneGraph; +using Avalonia.Utilities; namespace Avalonia.Media { @@ -18,6 +22,14 @@ namespace Avalonia.Media public static readonly StyledProperty OpacityMaskProperty = AvaloniaProperty.Register(nameof(OpacityMask)); + public static readonly DirectProperty ChildrenProperty = + AvaloniaProperty.RegisterDirect( + nameof(Children), + o => o.Children, + (o, v) => o.Children = v); + + private DrawingCollection _children = new DrawingCollection(); + public double Opacity { get => GetValue(OpacityProperty); @@ -42,8 +54,23 @@ namespace Avalonia.Media set => SetValue(OpacityMaskProperty, value); } + /// + /// Gets or sets the collection that contains the child geometries. + /// [Content] - public AvaloniaList Children { get; } = new AvaloniaList(); + public DrawingCollection Children + { + get => _children; + set + { + SetAndRaise(ChildrenProperty, ref _children, value); + } + } + + public DrawingContext Open() + { + return new DrawingContext(new DrawingGroupDrawingContext(this)); + } public override void Draw(DrawingContext context) { @@ -75,5 +102,394 @@ namespace Avalonia.Media return rect; } + + private class DrawingGroupDrawingContext : IDrawingContextImpl + { + private readonly DrawingGroup _drawingGroup; + private readonly IPlatformRenderInterface _platformRenderInterface = AvaloniaLocator.Current.GetRequiredService(); + + private Matrix _transform; + + private bool _disposed; + + // Root drawing created by this DrawingContext. + // + // If there is only a single child of the root DrawingGroup, _rootDrawing + // will reference the single child, and the root _currentDrawingGroup + // value will be null. Otherwise, _rootDrawing will reference the + // root DrawingGroup, and be the same value as the root _currentDrawingGroup. + // + // Either way, _rootDrawing always references the root drawing. + protected Drawing? _rootDrawing; + + // Current DrawingGroup that new children are added to + protected DrawingGroup? _currentDrawingGroup; + + // Previous values of _currentDrawingGroup + private Stack? _previousDrawingGroupStack; + + public DrawingGroupDrawingContext(DrawingGroup drawingGroup) + { + _drawingGroup = drawingGroup; + } + + public Matrix Transform + { + get => _transform; + set + { + _transform = value; + PushTransform(new MatrixTransform(value)); + } + } + + public void DrawEllipse(IBrush? brush, IPen? pen, Rect rect) + { + if ((brush == null) && (pen == null)) + { + return; + } + + // Instantiate the geometry + var geometry = _platformRenderInterface.CreateEllipseGeometry(rect); + + // Add Drawing to the Drawing graph + AddNewGeometryDrawing(brush, pen, new PlatformGeometry(geometry)); + } + + public void DrawGeometry(IBrush? brush, IPen? pen, IGeometryImpl geometry) + { + if (((brush == null) && (pen == null)) || (geometry == null)) + { + return; + } + + AddNewGeometryDrawing(brush, pen, new PlatformGeometry(geometry)); + } + + public void DrawGlyphRun(IBrush foreground, GlyphRun glyphRun) + { + if (foreground == null || glyphRun == null) + { + return; + } + + // Add a GlyphRunDrawing to the Drawing graph + GlyphRunDrawing glyphRunDrawing = new GlyphRunDrawing + { + Foreground = foreground, + GlyphRun = glyphRun, + }; + + // Add Drawing to the Drawing graph + AddDrawing(glyphRunDrawing); + } + + public void DrawLine(IPen pen, Point p1, Point p2) + { + if (pen == null) + { + return; + } + + // Instantiate the geometry + var geometry = _platformRenderInterface.CreateLineGeometry(p1, p2); + + // Add Drawing to the Drawing graph + AddNewGeometryDrawing(null, pen, new PlatformGeometry(geometry)); + } + + public void DrawRectangle(IBrush? brush, IPen? pen, RoundedRect rect, BoxShadows boxShadows = default) + { + if ((brush == null) && (pen == null)) + { + return; + } + + // Instantiate the geometry + var geometry = _platformRenderInterface.CreateRectangleGeometry(rect.Rect); + + // Add Drawing to the Drawing graph + AddNewGeometryDrawing(brush, pen, new PlatformGeometry(geometry)); + } + + public void Clear(Color color) + { + throw new NotImplementedException(); + } + + public IDrawingContextLayerImpl CreateLayer(Size size) + { + throw new NotImplementedException(); + } + + public void Custom(ICustomDrawOperation custom) + { + throw new NotImplementedException(); + } + + public void DrawBitmap(IRef source, double opacity, Rect sourceRect, Rect destRect, BitmapInterpolationMode bitmapInterpolationMode = BitmapInterpolationMode.Default) + { + throw new NotImplementedException(); + } + + public void DrawBitmap(IRef source, IBrush opacityMask, Rect opacityMaskRect, Rect destRect) + { + throw new NotImplementedException(); + } + + public void PopBitmapBlendMode() + { + throw new NotImplementedException(); + } + + public void PopClip() + { + throw new NotImplementedException(); + } + + public void PopGeometryClip() + { + throw new NotImplementedException(); + } + + public void PopOpacity() + { + throw new NotImplementedException(); + } + + public void PopOpacityMask() + { + throw new NotImplementedException(); + } + + public void PushBitmapBlendMode(BitmapBlendingMode blendingMode) + { + throw new NotImplementedException(); + } + + public void PushClip(Rect clip) + { + throw new NotImplementedException(); + } + + public void PushClip(RoundedRect clip) + { + throw new NotImplementedException(); + } + + public void PushGeometryClip(IGeometryImpl clip) + { + throw new NotImplementedException(); + } + + public void PushOpacity(double opacity) + { + throw new NotImplementedException(); + } + + public void PushOpacityMask(IBrush mask, Rect bounds) + { + throw new NotImplementedException(); + } + + public void Dispose() + { + // Dispose may be called multiple times without throwing + // an exception. + if (!_disposed) + { + // Match any outstanding Push calls with a Pop + if (_previousDrawingGroupStack != null) + { + int stackCount = _previousDrawingGroupStack.Count; + for (int i = 0; i < stackCount; i++) + { + Pop(); + } + } + + // Call CloseCore with the root DrawingGroup's children + DrawingCollection rootChildren; + + if (_currentDrawingGroup != null) + { + // If we created a root DrawingGroup because multiple elements + // exist at the root level, provide it's Children collection + // directly. + rootChildren = _currentDrawingGroup.Children; + } + else + { + // Create a new DrawingCollection if we didn't create a + // root DrawingGroup because the root level only contained + // a single child. + // + // This collection is needed by DrawingGroup.Open because + // Open always replaces it's Children collection. It isn't + // strictly needed for Append, but always using a collection + // simplifies the TransactionalAppend implementation (i.e., + // a seperate implemention isn't needed for a single element) + rootChildren = new DrawingCollection(); + + // + // We may need to opt-out of inheritance through the new Freezable. + // This is controlled by this.CanBeInheritanceContext. + // + if (_rootDrawing != null) + { + rootChildren.Add(_rootDrawing); + } + } + + // Inform our derived classes that Close was called + _drawingGroup.Children = rootChildren; + + _disposed = true; + } + } + + /// + /// Pop + /// + private void Pop() + { + // Verify that Pop hasn't been called too many times + if ((_previousDrawingGroupStack == null) || (_previousDrawingGroupStack.Count == 0)) + { + throw new InvalidOperationException("DrawingGroupStack count missmatch."); + } + + // Restore the previous value of the current drawing group + _currentDrawingGroup = _previousDrawingGroupStack.Pop(); + } + + /// + /// PushTransform - + /// Push a Transform which will apply to all drawing operations until the corresponding + /// Pop. + /// + /// The Transform to push. + private void PushTransform(Transform transform) + { + // Instantiate a new drawing group and set it as the _currentDrawingGroup + var drawingGroup = PushNewDrawingGroup(); + + // Set the transform on the new DrawingGroup + drawingGroup.Transform = transform; + } + + /// + /// Creates a new DrawingGroup for a Push* call by setting the + /// _currentDrawingGroup to a newly instantiated DrawingGroup, + /// and saving the previous _currentDrawingGroup value on the + /// _previousDrawingGroupStack. + /// + private DrawingGroup PushNewDrawingGroup() + { + // Instantiate a new drawing group + DrawingGroup drawingGroup = new DrawingGroup(); + + // Add it to the drawing graph, like any other Drawing + AddDrawing(drawingGroup); + + // Lazily allocate the stack when it is needed because many uses + // of DrawingDrawingContext will have a depth of one. + if (null == _previousDrawingGroupStack) + { + _previousDrawingGroupStack = new Stack(2); + } + + // Save the previous _currentDrawingGroup value. + // + // If this is the first call, the value of _currentDrawingGroup + // will be null because AddDrawing doesn't create a _currentDrawingGroup + // for the first drawing. Having null on the stack is valid, and simply + // denotes that this new DrawingGroup is the first child in the root + // DrawingGroup. It is also possible for the first value on the stack + // to be non-null, which means that the root DrawingGroup has other + // children. + _previousDrawingGroupStack.Push(_currentDrawingGroup); + + // Set this drawing group as the current one so that subsequent drawing's + // are added as it's children until Pop is called. + _currentDrawingGroup = drawingGroup; + + return drawingGroup; + } + + /// + /// Contains the functionality common to GeometryDrawing operations of + /// instantiating the GeometryDrawing, setting it's Freezable state, + /// and Adding it to the Drawing Graph. + /// + private void AddNewGeometryDrawing(IBrush? brush, IPen? pen, Geometry? geometry) + { + if (geometry == null) + { + throw new ArgumentNullException(nameof(geometry)); + } + + // Instantiate the GeometryDrawing + GeometryDrawing geometryDrawing = new GeometryDrawing + { + // We may need to opt-out of inheritance through the new Freezable. + // This is controlled by this.CanBeInheritanceContext. + Brush = brush, + Pen = pen, + Geometry = geometry + }; + + // Add it to the drawing graph + AddDrawing(geometryDrawing); + } + + /// + /// Adds a new Drawing to the DrawingGraph. + /// + /// This method avoids creating a DrawingGroup for the common case + /// where only a single child exists in the root DrawingGroup. + /// + private void AddDrawing(Drawing newDrawing) + { + if (newDrawing == null) + { + throw new ArgumentNullException(nameof(newDrawing)); + } + + if (_rootDrawing == null) + { + // When a DrawingGroup is set, it should be made the root if + // a root drawing didnt exist. + Contract.Requires(_currentDrawingGroup == null); + + // If this is the first Drawing being added, avoid creating a DrawingGroup + // and set this drawing as the root drawing. This optimizes the common + // case where only a single child exists in the root DrawingGroup. + _rootDrawing = newDrawing; + } + else if (_currentDrawingGroup == null) + { + // When the second drawing is added at the root level, set a + // DrawingGroup as the root and add both drawings to it. + + // Instantiate the DrawingGroup + _currentDrawingGroup = new DrawingGroup(); + + // Add both Children + _currentDrawingGroup.Children.Add(_rootDrawing); + _currentDrawingGroup.Children.Add(newDrawing); + + // Set the new DrawingGroup as the current + _rootDrawing = _currentDrawingGroup; + } + else + { + // If there already is a current drawing group, then simply add + // the new drawing too it. + _currentDrawingGroup.Children.Add(newDrawing); + } + } + } } } diff --git a/src/Avalonia.Base/Media/FormattedText.cs b/src/Avalonia.Base/Media/FormattedText.cs index 7bdf59def0..5480336f84 100644 --- a/src/Avalonia.Base/Media/FormattedText.cs +++ b/src/Avalonia.Base/Media/FormattedText.cs @@ -1223,7 +1223,7 @@ namespace Avalonia.Media public double OverhangTrailing { get - { + { return BlackBoxMetrics.OverhangTrailing; } } @@ -1252,6 +1252,46 @@ namespace Avalonia.Media } } + /// + /// Obtains geometry for the text, including underlines and strikethroughs. + /// + /// The left top origin of the resulting geometry. + /// The geometry returned contains the combined geometry + /// of all of the glyphs, underlines and strikeThroughs that represent the formatted text. + /// Overlapping contours are merged by performing a Boolean union operation. + public Geometry? BuildGeometry(Point origin) + { + GeometryGroup? accumulatedGeometry = null; + var lineOrigin = origin; + + DrawingGroup drawing = new DrawingGroup(); + + using (var ctx = drawing.Open()) + { + using (var enumerator = GetEnumerator()) + { + while (enumerator.MoveNext()) + { + var currentLine = enumerator.Current; + + if (currentLine != null) + { + currentLine.Draw(ctx, lineOrigin); + + AdvanceLineOrigin(ref lineOrigin, currentLine); + } + } + } + } + + Transform? transform = new TranslateTransform(origin.X, origin.Y); + + // recursively go down the DrawingGroup to build up the geometry + CombineGeometryRecursive(drawing, ref transform, ref accumulatedGeometry); + + return accumulatedGeometry; + } + /// /// Draws the text object /// @@ -1284,6 +1324,93 @@ namespace Avalonia.Media } } + private void CombineGeometryRecursive(Drawing drawing, ref Transform? transform, ref GeometryGroup? accumulatedGeometry) + { + if (drawing is DrawingGroup group) + { + transform = group.Transform; + + if (group.Children is DrawingCollection children) + { + // recursively go down for DrawingGroup + foreach (var child in children) + { + CombineGeometryRecursive(child, ref transform, ref accumulatedGeometry); + } + } + } + else + { + if (drawing is GlyphRunDrawing glyphRunDrawing) + { + // process glyph run + var glyphRun = glyphRunDrawing.GlyphRun; + + if (glyphRun != null) + { + var glyphRunGeometry = glyphRun.BuildGeometry(); + + glyphRunGeometry.Transform = transform; + + if (accumulatedGeometry == null) + { + accumulatedGeometry = new GeometryGroup + { + FillRule = FillRule.NonZero + }; + } + + accumulatedGeometry.Children.Add(glyphRunGeometry); + } + } + else + { + if (drawing is GeometryDrawing geometryDrawing) + { + // process geometry (i.e. TextDecoration on the line) + var geometry = geometryDrawing.Geometry; + + if (geometry != null) + { + geometry.Transform = transform; + + if (geometry is LineGeometry lineGeometry) + { + // For TextDecoration drawn by DrawLine(), the geometry is a LineGeometry which has no + // bounding area. So this line won't show up. Work aroud it by increase the Bounding rect + // to be Pen's thickness + + var bounds = lineGeometry.Bounds; + + if (bounds.Height == 0) + { + bounds = bounds.WithHeight(geometryDrawing.Pen?.Thickness ?? 0); + } + else if (bounds.Width == 0) + { + bounds = bounds.WithWidth(geometryDrawing.Pen?.Thickness ?? 0); + } + + // convert the line geometry into a rectangle geometry + // we lost line cap info here + geometry = new RectangleGeometry(bounds); + } + + if (accumulatedGeometry == null) + { + accumulatedGeometry = new GeometryGroup + { + FillRule = FillRule.NonZero + }; + } + + accumulatedGeometry.Children.Add(geometry); + } + } + } + } + } + private CachedMetrics DrawAndCalculateMetrics(DrawingContext? drawingContext, Point drawingOffset, bool getBlackBoxMetrics) { var metrics = new CachedMetrics(); diff --git a/src/Avalonia.Base/Media/GeometryCollection.cs b/src/Avalonia.Base/Media/GeometryCollection.cs new file mode 100644 index 0000000000..2afa191dcf --- /dev/null +++ b/src/Avalonia.Base/Media/GeometryCollection.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using Avalonia.Collections; + +#nullable enable + +namespace Avalonia.Media +{ + public sealed class GeometryCollection : AvaloniaList + { + public GeometryCollection() + { + ResetBehavior = ResetBehavior.Remove; + + this.ForEachItem( + x => + { + Parent?.Invalidate(); + }, + x => + { + Parent?.Invalidate(); + }, + () => throw new NotSupportedException()); + } + + public GeometryCollection(IEnumerable items) : base(items) + { + ResetBehavior = ResetBehavior.Remove; + + this.ForEachItem( + x => + { + Parent?.Invalidate(); + }, + x => + { + Parent?.Invalidate(); + }, + () => throw new NotSupportedException()); + } + + public GeometryGroup? Parent { get; set; } + } +} diff --git a/src/Avalonia.Base/Media/GeometryDrawing.cs b/src/Avalonia.Base/Media/GeometryDrawing.cs index 08e62df2cc..7df7d25954 100644 --- a/src/Avalonia.Base/Media/GeometryDrawing.cs +++ b/src/Avalonia.Base/Media/GeometryDrawing.cs @@ -21,14 +21,14 @@ namespace Avalonia.Media /// /// Defines the property. /// - public static readonly StyledProperty BrushProperty = - AvaloniaProperty.Register(nameof(Brush), Brushes.Transparent); + public static readonly StyledProperty BrushProperty = + AvaloniaProperty.Register(nameof(Brush), Brushes.Transparent); /// /// Defines the property. /// - public static readonly StyledProperty PenProperty = - AvaloniaProperty.Register(nameof(Pen)); + public static readonly StyledProperty PenProperty = + AvaloniaProperty.Register(nameof(Pen)); /// /// Gets or sets the that describes the shape of this . @@ -43,7 +43,7 @@ namespace Avalonia.Media /// /// Gets or sets the used to fill the interior of the shape described by this . /// - public IBrush Brush + public IBrush? Brush { get => GetValue(BrushProperty); set => SetValue(BrushProperty, value); @@ -52,7 +52,7 @@ namespace Avalonia.Media /// /// Gets or sets the used to stroke this . /// - public IPen Pen + public IPen? Pen { get => GetValue(PenProperty); set => SetValue(PenProperty, value); diff --git a/src/Avalonia.Base/GeometryGroup.cs b/src/Avalonia.Base/Media/GeometryGroup.cs similarity index 64% rename from src/Avalonia.Base/GeometryGroup.cs rename to src/Avalonia.Base/Media/GeometryGroup.cs index b90c9c6d8a..0326e606f4 100644 --- a/src/Avalonia.Base/GeometryGroup.cs +++ b/src/Avalonia.Base/Media/GeometryGroup.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Avalonia.Metadata; +using Avalonia.Metadata; using Avalonia.Platform; #nullable enable @@ -13,29 +10,36 @@ namespace Avalonia.Media /// public class GeometryGroup : Geometry { - public static readonly DirectProperty ChildrenProperty = - AvaloniaProperty.RegisterDirect ( + public static readonly DirectProperty ChildrenProperty = + AvaloniaProperty.RegisterDirect ( nameof(Children), o => o.Children, - (o, v) => o.Children = v); + (o, v)=> o.Children = v); public static readonly StyledProperty FillRuleProperty = AvaloniaProperty.Register(nameof(FillRule)); - private GeometryCollection? _children; - private bool _childrenSet; + private GeometryCollection _children; + + public GeometryGroup() + { + _children = new GeometryCollection + { + Parent = this + }; + } /// /// Gets or sets the collection that contains the child geometries. /// [Content] - public GeometryCollection? Children + public GeometryCollection Children { - get => _children ??= (!_childrenSet ? new GeometryCollection() : null); + get => _children; set { - SetAndRaise(ChildrenProperty, ref _children, value); - _childrenSet = true; + OnChildrenChanged(_children, value); + SetAndRaise(ChildrenProperty, ref _children, value); } } @@ -52,16 +56,28 @@ namespace Avalonia.Media public override Geometry Clone() { var result = new GeometryGroup { FillRule = FillRule, Transform = Transform }; - if (_children?.Count > 0) + + if (_children.Count > 0) + { result.Children = new GeometryCollection(_children); + } + return result; } + protected void OnChildrenChanged(GeometryCollection oldChildren, GeometryCollection newChildren) + { + oldChildren.Parent = null; + + newChildren.Parent = this; + } + protected override IGeometryImpl? CreateDefiningGeometry() { - if (_children?.Count > 0) + if (_children.Count > 0) { var factory = AvaloniaLocator.Current.GetRequiredService(); + return factory.CreateGeometryGroup(FillRule, _children); } @@ -72,10 +88,18 @@ namespace Avalonia.Media { base.OnPropertyChanged(change); - if (change.Property == ChildrenProperty || change.Property == FillRuleProperty) + switch (change.Property.Name) { - InvalidateGeometry(); + case nameof(FillRule): + case nameof(Children): + InvalidateGeometry(); + break; } } + + internal void Invalidate() + { + InvalidateGeometry(); + } } } diff --git a/src/Avalonia.Base/Media/GlyphRun.cs b/src/Avalonia.Base/Media/GlyphRun.cs index 22be8d8865..ac87d521a5 100644 --- a/src/Avalonia.Base/Media/GlyphRun.cs +++ b/src/Avalonia.Base/Media/GlyphRun.cs @@ -194,6 +194,19 @@ namespace Avalonia.Media } } + /// + /// Obtains geometry for the glyph run. + /// + /// The geometry returned contains the combined geometry of all glyphs in the glyph run. + public Geometry BuildGeometry() + { + var platformRenderInterface = AvaloniaLocator.Current.GetRequiredService(); + + var geometryImpl = platformRenderInterface.BuildGlyphRunGeometry(this); + + return new PlatformGeometry(geometryImpl); + } + /// /// Retrieves the offset from the leading edge of the /// to the leading or trailing edge of a caret stop containing the specified character hit. @@ -721,10 +734,9 @@ namespace Avalonia.Media private void Set(ref T field, T value) { - if (_glyphRunImpl != null) - { - throw new InvalidOperationException("GlyphRun can't be changed after it has been initialized.'"); - } + _glyphRunImpl?.Dispose(); + + _glyphRunImpl = null; _glyphRunMetrics = null; diff --git a/src/Avalonia.Base/Media/PlatformGeometry.cs b/src/Avalonia.Base/Media/PlatformGeometry.cs new file mode 100644 index 0000000000..f25a14540f --- /dev/null +++ b/src/Avalonia.Base/Media/PlatformGeometry.cs @@ -0,0 +1,24 @@ +using Avalonia.Platform; + +namespace Avalonia.Media +{ + internal class PlatformGeometry : Geometry + { + private readonly IGeometryImpl _geometryImpl; + + public PlatformGeometry(IGeometryImpl geometryImpl) + { + _geometryImpl = geometryImpl; + } + + public override Geometry Clone() + { + return new PlatformGeometry(_geometryImpl); + } + + protected override IGeometryImpl? CreateDefiningGeometry() + { + return _geometryImpl; + } + } +} diff --git a/src/Avalonia.Base/Media/TextAlignment.cs b/src/Avalonia.Base/Media/TextAlignment.cs index b1a394e157..94416ccde2 100644 --- a/src/Avalonia.Base/Media/TextAlignment.cs +++ b/src/Avalonia.Base/Media/TextAlignment.cs @@ -19,5 +19,28 @@ namespace Avalonia.Media /// The text is right-aligned. /// Right, + + /// + /// The beginning of the text is aligned to the edge of the available space. + /// + Start, + + /// + /// The end of the text is aligned to the edge of the available space. + /// + End, + + /// + /// Text alignment is inferred from the text content. + /// + /// + /// When the TextAlignment property is set to DetectFromContent, alignment is inferred from the text content of the control. For example, English text is left aligned, and Arabic text is right aligned. + /// + DetectFromContent, + + /// + /// Text is justified within the available space. + /// + Justify } } diff --git a/src/Avalonia.Base/Media/TextFormatting/InterWordJustification.cs b/src/Avalonia.Base/Media/TextFormatting/InterWordJustification.cs new file mode 100644 index 0000000000..df83ada34a --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/InterWordJustification.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using Avalonia.Media.TextFormatting.Unicode; + +namespace Avalonia.Media.TextFormatting +{ + internal class InterWordJustification : JustificationProperties + { + public InterWordJustification(double width) + { + Width = width; + } + + public override double Width { get; } + + public override void Justify(TextLine textLine) + { + var paragraphWidth = Width; + + if (double.IsInfinity(paragraphWidth)) + { + return; + } + + if (textLine.NewLineLength > 0) + { + return; + } + + var textLineBreak = textLine.TextLineBreak; + + if (textLineBreak is not null && textLineBreak.TextEndOfLine is not null) + { + if (textLineBreak.RemainingRuns is null || textLineBreak.RemainingRuns.Count == 0) + { + return; + } + } + + var breakOportunities = new Queue(); + + foreach (var textRun in textLine.TextRuns) + { + var text = textRun.Text; + + if (text.IsEmpty) + { + continue; + } + + var start = text.Start; + + var lineBreakEnumerator = new LineBreakEnumerator(text); + + while (lineBreakEnumerator.MoveNext()) + { + var currentBreak = lineBreakEnumerator.Current; + + if (!currentBreak.Required && currentBreak.PositionWrap != text.Length) + { + breakOportunities.Enqueue(start + currentBreak.PositionMeasure); + } + } + } + + if (breakOportunities.Count == 0) + { + return; + } + + var remainingSpace = Math.Max(0, paragraphWidth - textLine.WidthIncludingTrailingWhitespace); + var spacing = remainingSpace / breakOportunities.Count; + + foreach (var textRun in textLine.TextRuns) + { + var text = textRun.Text; + + if (text.IsEmpty) + { + continue; + } + + if (textRun is ShapedTextCharacters shapedText) + { + var glyphRun = shapedText.GlyphRun; + var shapedBuffer = shapedText.ShapedBuffer; + var currentPosition = text.Start; + + while (breakOportunities.Count > 0) + { + var characterIndex = breakOportunities.Dequeue(); + + if (characterIndex < currentPosition) + { + continue; + } + + var glyphIndex = glyphRun.FindGlyphIndex(characterIndex); + var glyphInfo = shapedBuffer.GlyphInfos[glyphIndex]; + + shapedBuffer.GlyphInfos[glyphIndex] = new GlyphInfo(glyphInfo.GlyphIndex, glyphInfo.GlyphCluster, glyphInfo.GlyphAdvance + spacing); + } + + glyphRun.GlyphAdvances = shapedBuffer.GlyphAdvances; + } + } + } + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/JustificationProperties.cs b/src/Avalonia.Base/Media/TextFormatting/JustificationProperties.cs new file mode 100644 index 0000000000..620ad17189 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/JustificationProperties.cs @@ -0,0 +1,16 @@ +namespace Avalonia.Media.TextFormatting +{ + public abstract class JustificationProperties + { + /// + /// Gets the width in which the range is justified. + /// + public abstract double Width { get; } + + /// + /// Justifies given text line. + /// + /// Text line to collapse. + public abstract void Justify(TextLine textLine); + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs index 4205268bc6..73dd3366aa 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextFormatterImpl.cs @@ -15,7 +15,7 @@ namespace Avalonia.Media.TextFormatting TextParagraphProperties paragraphProperties, TextLineBreak? previousLineBreak = null) { var textWrapping = paragraphProperties.TextWrapping; - FlowDirection flowDirection; + FlowDirection resolvedFlowDirection; TextLineBreak? nextLineBreak = null; List drawableTextRuns; @@ -24,17 +24,17 @@ namespace Avalonia.Media.TextFormatting if (previousLineBreak?.RemainingRuns != null) { - flowDirection = previousLineBreak.FlowDirection; + resolvedFlowDirection = previousLineBreak.FlowDirection; drawableTextRuns = previousLineBreak.RemainingRuns.ToList(); nextLineBreak = previousLineBreak; } else { - drawableTextRuns = ShapeTextRuns(textRuns, paragraphProperties, out flowDirection); + drawableTextRuns = ShapeTextRuns(textRuns, paragraphProperties, out resolvedFlowDirection); if (nextLineBreak == null && textEndOfLine != null) { - nextLineBreak = new TextLineBreak(textEndOfLine, flowDirection); + nextLineBreak = new TextLineBreak(textEndOfLine, resolvedFlowDirection); } } @@ -45,7 +45,7 @@ namespace Avalonia.Media.TextFormatting case TextWrapping.NoWrap: { textLine = new TextLineImpl(drawableTextRuns, firstTextSourceIndex, textSourceLength, - paragraphWidth, paragraphProperties, flowDirection, nextLineBreak); + paragraphWidth, paragraphProperties, resolvedFlowDirection, nextLineBreak); textLine.FinalizeLine(); @@ -55,7 +55,7 @@ namespace Avalonia.Media.TextFormatting case TextWrapping.Wrap: { textLine = PerformTextWrapping(drawableTextRuns, firstTextSourceIndex, paragraphWidth, paragraphProperties, - flowDirection, nextLineBreak); + resolvedFlowDirection, nextLineBreak); break; } default: @@ -159,7 +159,6 @@ namespace Avalonia.Media.TextFormatting { var flowDirection = paragraphProperties.FlowDirection; var drawableTextRuns = new List(); - var biDiData = new BidiData((sbyte)flowDirection); foreach (var textRun in textRuns) @@ -174,10 +173,9 @@ namespace Avalonia.Media.TextFormatting { biDiData.Append(textRun.Text); } - } - var biDi = BidiAlgorithm.Instance.Value!; + var biDi = new BidiAlgorithm(); biDi.Process(biDiData); @@ -290,9 +288,7 @@ namespace Avalonia.Media.TextFormatting /// The text characters to form from. /// The bidi levels. /// - private static IEnumerable> CoalesceLevels( - IReadOnlyList textCharacters, - ReadOnlySlice levels) + private static IEnumerable> CoalesceLevels(IReadOnlyList textCharacters, ArraySlice levels) { if (levels.Length == 0) { @@ -404,9 +400,9 @@ namespace Avalonia.Media.TextFormatting { endOfLine = textEndOfLine; - textRuns.Add(textRun); + textSourceLength += textEndOfLine.TextSourceLength; - textSourceLength += textRun.TextSourceLength; + textRuns.Add(textRun); break; } @@ -431,9 +427,9 @@ namespace Avalonia.Media.TextFormatting break; } - case DrawableTextRun drawableTextRun: + default: { - textRuns.Add(drawableTextRun); + textRuns.Add(textRun); break; } } @@ -552,11 +548,11 @@ namespace Avalonia.Media.TextFormatting /// The first text source index. /// The paragraph width. /// The text paragraph properties. - /// + /// /// The current line break if the line was explicitly broken. /// The wrapped text line. private static TextLineImpl PerformTextWrapping(List textRuns, int firstTextSourceIndex, - double paragraphWidth, TextParagraphProperties paragraphProperties, FlowDirection flowDirection, + double paragraphWidth, TextParagraphProperties paragraphProperties, FlowDirection resolvedFlowDirection, TextLineBreak? currentLineBreak) { if(textRuns.Count == 0) @@ -684,16 +680,16 @@ namespace Avalonia.Media.TextFormatting var remainingCharacters = splitResult.Second; var lineBreak = remainingCharacters?.Count > 0 ? - new TextLineBreak(currentLineBreak?.TextEndOfLine, flowDirection, remainingCharacters) : + new TextLineBreak(currentLineBreak?.TextEndOfLine, resolvedFlowDirection, remainingCharacters) : null; if (lineBreak is null && currentLineBreak?.TextEndOfLine != null) { - lineBreak = new TextLineBreak(currentLineBreak.TextEndOfLine, flowDirection); + lineBreak = new TextLineBreak(currentLineBreak.TextEndOfLine, resolvedFlowDirection); } var textLine = new TextLineImpl(splitResult.First, firstTextSourceIndex, measuredLength, - paragraphWidth, paragraphProperties, flowDirection, + paragraphWidth, paragraphProperties, resolvedFlowDirection, lineBreak); return textLine.FinalizeLine(); diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs b/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs index 4f7c43a6d1..f3af240c58 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLayout.cs @@ -439,7 +439,7 @@ namespace Avalonia.Media.TextFormatting var textLine = TextFormatter.Current.FormatLine(_textSource, _textSourceLength, MaxWidth, _paragraphProperties, previousLine?.TextLineBreak); - if(textLine == null || textLine.Length == 0) + if(textLine == null || textLine.Length == 0 || textLine.TextRuns.Count == 0 && textLine.TextLineBreak?.TextEndOfLine is TextEndOfParagraph) { if(previousLine != null && previousLine.NewLineLength > 0) { @@ -501,6 +501,35 @@ namespace Avalonia.Media.TextFormatting Bounds = new Rect(left, 0, width, height); + if(_paragraphProperties.TextAlignment == TextAlignment.Justify) + { + var whitespaceWidth = 0d; + + foreach (var line in textLines) + { + var lineWhitespaceWidth = line.Width - line.WidthIncludingTrailingWhitespace; + + if(lineWhitespaceWidth > whitespaceWidth) + { + whitespaceWidth = lineWhitespaceWidth; + } + } + + var justificationWidth = width - whitespaceWidth; + + if(justificationWidth > 0) + { + var justificationProperties = new InterWordJustification(justificationWidth); + + for (var i = 0; i < textLines.Count - 1; i++) + { + var line = textLines[i]; + + line.Justify(justificationProperties); + } + } + } + return textLines; } diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLine.cs b/src/Avalonia.Base/Media/TextFormatting/TextLine.cs index 1f69c15acc..c8a23097db 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLine.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLine.cs @@ -15,9 +15,15 @@ namespace Avalonia.Media.TextFormatting /// The contained text runs. /// public abstract IReadOnlyList TextRuns { get; } - + + /// + /// Gets the first TextSource position of the current line. + /// public abstract int FirstTextSourceIndex { get; } + /// + /// Gets the total number of TextSource positions of the current line. + /// public abstract int Length { get; } /// @@ -56,7 +62,7 @@ namespace Avalonia.Media.TextFormatting /// Gets a value that indicates whether content of the line overflows the specified paragraph width. /// /// - /// true, it the line overflows the specified paragraph width; otherwise, false. + /// true, the line overflows the specified paragraph width; otherwise, false. /// public abstract bool HasOverflowed { get; } @@ -75,7 +81,7 @@ namespace Avalonia.Media.TextFormatting /// The number of newline characters. /// public abstract int NewLineLength { get; } - + /// /// Gets the distance that black pixels extend beyond the bottom alignment edge of a line. /// @@ -149,6 +155,15 @@ namespace Avalonia.Media.TextFormatting /// public abstract TextLine Collapse(params TextCollapsingProperties[] collapsingPropertiesList); + /// + /// Create a justified line based on justification text properties. + /// + /// An object that represent the justification text properties. + /// + /// A value that represents a justified line that can be displayed. + /// + public abstract void Justify(JustificationProperties justificationProperties); + /// /// Gets the character hit corresponding to the specified distance from the beginning of the line. /// @@ -192,50 +207,5 @@ namespace Avalonia.Media.TextFormatting /// number of characters of the specified range /// an array of bounding rectangles. public abstract IReadOnlyList GetTextBounds(int firstTextSourceCharacterIndex, int textLength); - - /// - /// Gets the text line offset x. - /// - /// The line width. - /// The paragraph width including whitespace. - /// The paragraph width. - /// The text alignment. - /// The flow direction of the line. - /// The paragraph offset. - internal static double GetParagraphOffsetX(double width, double widthIncludingTrailingWhitespace, - double paragraphWidth, TextAlignment textAlignment, FlowDirection flowDirection) - { - if (double.IsPositiveInfinity(paragraphWidth)) - { - return 0; - } - - if (flowDirection == FlowDirection.LeftToRight) - { - switch (textAlignment) - { - case TextAlignment.Center: - return Math.Max(0, (paragraphWidth - width) / 2); - - case TextAlignment.Right: - return Math.Max(0, paragraphWidth - widthIncludingTrailingWhitespace); - - default: - return 0; - } - } - - switch (textAlignment) - { - case TextAlignment.Center: - return Math.Max(0, (paragraphWidth - width) / 2); - - case TextAlignment.Right: - return 0; - - default: - return Math.Max(0, paragraphWidth - widthIncludingTrailingWhitespace); - } - } } } diff --git a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs index 8b5e2cc2ce..7c686358e2 100644 --- a/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs +++ b/src/Avalonia.Base/Media/TextFormatting/TextLineImpl.cs @@ -10,10 +10,10 @@ namespace Avalonia.Media.TextFormatting private readonly double _paragraphWidth; private readonly TextParagraphProperties _paragraphProperties; private TextLineMetrics _textLineMetrics; - private readonly FlowDirection _flowDirection; + private readonly FlowDirection _resolvedFlowDirection; public TextLineImpl(List textRuns, int firstTextSourceIndex, int length, double paragraphWidth, - TextParagraphProperties paragraphProperties, FlowDirection flowDirection = FlowDirection.LeftToRight, + TextParagraphProperties paragraphProperties, FlowDirection resolvedFlowDirection = FlowDirection.LeftToRight, TextLineBreak? lineBreak = null, bool hasCollapsed = false) { FirstTextSourceIndex = firstTextSourceIndex; @@ -25,7 +25,7 @@ namespace Avalonia.Media.TextFormatting _paragraphWidth = paragraphWidth; _paragraphProperties = paragraphProperties; - _flowDirection = flowDirection; + _resolvedFlowDirection = resolvedFlowDirection; } /// @@ -136,7 +136,7 @@ namespace Avalonia.Media.TextFormatting } var collapsedLine = new TextLineImpl(collapsedRuns, FirstTextSourceIndex, Length, _paragraphWidth, _paragraphProperties, - _flowDirection, TextLineBreak, true); + _resolvedFlowDirection, TextLineBreak, true); if (collapsedRuns.Count > 0) { @@ -144,7 +144,14 @@ namespace Avalonia.Media.TextFormatting } return collapsedLine; + } + /// + public override void Justify(JustificationProperties justificationProperties) + { + justificationProperties.Justify(this); + + _textLineMetrics = CreateLineMetrics(); } /// @@ -167,7 +174,7 @@ namespace Avalonia.Media.TextFormatting return shapedTextCharacters.GlyphRun.GetCharacterHitFromDistance(distance, out _); } - return _flowDirection == FlowDirection.LeftToRight ? + return _resolvedFlowDirection == FlowDirection.LeftToRight ? new CharacterHit(FirstTextSourceIndex) : new CharacterHit(FirstTextSourceIndex + Length); } @@ -260,7 +267,7 @@ namespace Avalonia.Media.TextFormatting //Look at the left and right edge of the current run if (currentRun.IsLeftToRight) { - if (_flowDirection == FlowDirection.LeftToRight && (lastRun == null || lastRun.IsLeftToRight)) + if (_resolvedFlowDirection == FlowDirection.LeftToRight && (lastRun == null || lastRun.IsLeftToRight)) { if (characterIndex <= currentPosition) { @@ -735,7 +742,7 @@ namespace Avalonia.Media.TextFormatting // Build up the collection of ordered runs. var run = _textRuns[0]; - OrderedBidiRun orderedRun = new(run, GetRunBidiLevel(run, _flowDirection)); + OrderedBidiRun orderedRun = new(run, GetRunBidiLevel(run, _resolvedFlowDirection)); var current = orderedRun; @@ -743,7 +750,7 @@ namespace Avalonia.Media.TextFormatting { run = _textRuns[i]; - current.Next = new OrderedBidiRun(run, GetRunBidiLevel(run, _flowDirection)); + current.Next = new OrderedBidiRun(run, GetRunBidiLevel(run, _resolvedFlowDirection)); current = current.Next; } @@ -762,7 +769,7 @@ namespace Avalonia.Media.TextFormatting { var currentRun = _textRuns[i]; - var level = GetRunBidiLevel(currentRun, _flowDirection); + var level = GetRunBidiLevel(currentRun, _resolvedFlowDirection); if (level > max) { @@ -1242,8 +1249,7 @@ namespace Avalonia.Media.TextFormatting } } - var start = GetParagraphOffsetX(width, widthIncludingWhitespace, _paragraphWidth, - _paragraphProperties.TextAlignment, _paragraphProperties.FlowDirection); + var start = GetParagraphOffsetX(width, widthIncludingWhitespace); if (!double.IsNaN(lineHeight) && !MathUtilities.IsZero(lineHeight)) { @@ -1257,6 +1263,55 @@ namespace Avalonia.Media.TextFormatting -ascent, trailingWhitespaceLength, width, widthIncludingWhitespace); } + /// + /// Gets the text line offset x. + /// + /// The line width. + /// The paragraph width including whitespace. + + /// The paragraph offset. + private double GetParagraphOffsetX(double width, double widthIncludingTrailingWhitespace) + { + if (double.IsPositiveInfinity(_paragraphWidth)) + { + return 0; + } + + var textAlignment = _paragraphProperties.TextAlignment; + var paragraphFlowDirection = _paragraphProperties.FlowDirection; + + switch (textAlignment) + { + case TextAlignment.Start: + { + textAlignment = paragraphFlowDirection == FlowDirection.LeftToRight ? TextAlignment.Left : TextAlignment.Right; + break; + } + case TextAlignment.End: + { + textAlignment = paragraphFlowDirection == FlowDirection.RightToLeft ? TextAlignment.Left : TextAlignment.Right; + break; + } + case TextAlignment.DetectFromContent: + { + textAlignment = _resolvedFlowDirection == FlowDirection.LeftToRight ? TextAlignment.Left : TextAlignment.Right; + break; + } + } + + switch (textAlignment) + { + case TextAlignment.Center: + return Math.Max(0, (_paragraphWidth - width) / 2); + + case TextAlignment.Right: + return Math.Max(0, _paragraphWidth - widthIncludingTrailingWhitespace); + + default: + return 0; + } + } + private sealed class OrderedBidiRun { public OrderedBidiRun(DrawableTextRun run, sbyte level) diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs new file mode 100644 index 0000000000..d489ad4106 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDi.trie.cs @@ -0,0 +1,472 @@ +using System; +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class BidiTrie + { + public static ReadOnlySpan Data => new byte[] + { + 0, 0, 16, 0, 0, 0, 0, 0, 64, 180, 0, 0, 116, 3, 0, 0, 124, 3, 0, 0, 132, 3, 0, 0, 140, 3, 0, 0, 164, 3, 0, 0, 172, 3, 0, 0, 180, 3, 0, 0, 188, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 194, 3, 0, 0, 202, 3, 0, 0, + 210, 3, 0, 0, 218, 3, 0, 0, 226, 3, 0, 0, 234, 3, 0, 0, 230, 3, 0, 0, 238, 3, 0, 0, 246, 3, 0, 0, 254, 3, 0, 0, 249, 3, 0, 0, 1, 4, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 9, 4, 0, 0, 17, 4, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 148, 3, 0, 0, 156, 3, 0, 0, 23, 4, 0, 0, 31, 4, 0, 0, 39, 4, 0, 0, + 47, 4, 0, 0, 55, 4, 0, 0, 63, 4, 0, 0, 69, 4, 0, 0, 77, 4, 0, 0, 82, 4, 0, 0, 90, 4, 0, 0, 93, 4, 0, 0, 101, 4, 0, 0, 108, 4, 0, 0, 116, 4, 0, 0, 122, 4, 0, 0, 130, 4, 0, 0, 129, 4, 0, 0, 137, 4, 0, 0, 145, 4, 0, 0, 153, 4, 0, 0, 24, 9, 0, 0, 31, 9, 0, 0, 35, 9, 0, 0, 62, 4, 0, 0, 199, 9, 0, 0, 62, 4, 0, 0, 22, 11, 0, 0, 207, 9, 0, 0, + 161, 4, 0, 0, 163, 4, 0, 0, 171, 4, 0, 0, 179, 4, 0, 0, 187, 4, 0, 0, 188, 4, 0, 0, 196, 4, 0, 0, 204, 4, 0, 0, 212, 4, 0, 0, 188, 4, 0, 0, 220, 4, 0, 0, 225, 4, 0, 0, 212, 4, 0, 0, 188, 4, 0, 0, 233, 4, 0, 0, 241, 4, 0, 0, 187, 4, 0, 0, 249, 4, 0, 0, 1, 5, 0, 0, 179, 4, 0, 0, 9, 5, 0, 0, 148, 3, 0, 0, 17, 5, 0, 0, 21, 5, 0, 0, 29, 5, 0, 0, + 31, 5, 0, 0, 39, 5, 0, 0, 47, 5, 0, 0, 187, 4, 0, 0, 188, 4, 0, 0, 55, 5, 0, 0, 179, 4, 0, 0, 11, 4, 0, 0, 59, 5, 0, 0, 196, 4, 0, 0, 179, 4, 0, 0, 187, 4, 0, 0, 148, 3, 0, 0, 67, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 73, 5, 0, 0, 81, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 85, 5, 0, 0, 93, 5, 0, 0, 148, 3, 0, 0, 97, 5, 0, 0, 104, 5, 0, 0, + 148, 3, 0, 0, 112, 5, 0, 0, 120, 5, 0, 0, 127, 5, 0, 0, 8, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 135, 5, 0, 0, 143, 5, 0, 0, 151, 5, 0, 0, 159, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 167, 5, 0, 0, 148, 3, 0, 0, 175, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 183, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 191, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 199, 5, 0, 0, 200, 4, 0, 0, 200, 4, 0, 0, 200, 4, 0, 0, 148, 3, 0, 0, 205, 5, 0, 0, 213, 5, 0, 0, 175, 5, 0, 0, 221, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 228, 5, 0, 0, + 185, 4, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 236, 5, 0, 0, 244, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 246, 5, 0, 0, 231, 9, 0, 0, 254, 5, 0, 0, 148, 3, 0, 0, 5, 6, 0, 0, 13, 6, 0, 0, 148, 3, 0, 0, 21, 6, 0, 0, 27, 11, 0, 0, 148, 3, 0, 0, 248, 4, 0, 0, 29, 6, 0, 0, 9, 5, 0, 0, 37, 6, 0, 0, 11, 4, 0, 0, 45, 6, 0, 0, + 148, 3, 0, 0, 52, 6, 0, 0, 148, 3, 0, 0, 57, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 63, 6, 0, 0, 71, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 78, 6, 0, 0, 86, 6, 0, 0, 90, 6, 0, 0, 98, 6, 0, 0, 163, 9, 0, 0, 223, 9, 0, 0, 106, 6, 0, 0, 114, 6, 0, 0, 171, 9, 0, 0, 175, 9, 0, 0, 130, 5, 0, 0, 122, 6, 0, 0, 130, 6, 0, 0, 138, 6, 0, 0, 148, 3, 0, 0, 146, 6, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, + 147, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 237, 9, 0, 0, 152, 6, 0, 0, 148, 3, 0, 0, 158, 6, 0, 0, 165, 6, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 11, 7, 0, 0, 243, 9, 0, 0, 231, 9, 0, 0, 171, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 178, 6, 0, 0, 231, 9, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 183, 6, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 251, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 2, 10, 0, 0, 9, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 17, 10, 0, 0, 231, 9, 0, 0, 24, 10, 0, 0, 31, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, + 39, 10, 0, 0, 45, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 191, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 199, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 231, 9, 0, 0, 53, 10, 0, 0, 56, 10, 0, 0, 148, 3, 0, 0, + 64, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 79, 10, 0, 0, 85, 10, 0, 0, 207, 6, 0, 0, 215, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 223, 6, 0, 0, 183, 5, 0, 0, 148, 3, 0, 0, 187, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 231, 9, 0, 0, 198, 6, 0, 0, 201, 3, 0, 0, 148, 3, 0, 0, 231, 6, 0, 0, 239, 6, 0, 0, 148, 3, 0, 0, 247, 6, 0, 0, 255, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 3, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 246, 5, 0, 0, 186, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 6, 0, 0, 231, 9, 0, 0, 11, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 16, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 21, 7, 0, 0, 29, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 99, 5, 0, 0, 231, 9, 0, 0, 245, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 37, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 45, 7, 0, 0, 52, 7, 0, 0, 148, 3, 0, 0, + 59, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 57, 5, 0, 0, 67, 7, 0, 0, 148, 3, 0, 0, 75, 7, 0, 0, 82, 7, 0, 0, 148, 3, 0, 0, 161, 4, 0, 0, 87, 7, 0, 0, 148, 3, 0, 0, 186, 4, 0, 0, 148, 3, 0, 0, 95, 7, 0, 0, 103, 7, 0, 0, 188, 4, 0, 0, 148, 3, 0, 0, 107, 7, 0, 0, 187, 4, 0, 0, 115, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 251, 5, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 122, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 126, 7, 0, 0, 42, 9, 0, 0, 46, 9, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, + 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 93, 10, 0, 0, 101, 10, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 106, 10, 0, 0, 110, 10, 0, 0, 118, 10, 0, 0, 179, 9, 0, 0, 183, 9, 0, 0, 155, 9, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 246, 10, 0, 0, 115, 9, 0, 0, 134, 7, 0, 0, 142, 7, 0, 0, 150, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 191, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 144, 14, 0, 0, 208, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 8, 15, 0, 0, 72, 15, 0, 0, 136, 15, 0, 0, 152, 15, 0, 0, 216, 15, 0, 0, 228, 15, 0, 0, 80, 14, 0, 0, + 80, 14, 0, 0, 36, 16, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 80, 14, 0, 0, 92, 16, 0, 0, 156, 16, 0, 0, 220, 16, 0, 0, 20, 17, 0, 0, 72, 17, 0, 0, 116, 17, 0, 0, 176, 17, 0, 0, 232, 17, 0, 0, 4, 18, 0, 0, 68, 18, 0, 0, 32, 10, 0, 0, 192, 12, 0, 0, 96, 10, 0, 0, 159, 10, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 223, 10, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 31, 11, 0, 0, 160, 1, 0, 0, 69, 11, 0, 0, 128, 11, 0, 0, 192, 11, 0, 0, 0, 12, 0, 0, 253, 12, 0, 0, 64, 12, 0, 0, 61, 13, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 125, 13, 0, 0, 141, 13, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 128, 12, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 158, 7, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 166, 7, 0, 0, 183, 5, 0, 0, 148, 3, 0, 0, 180, 4, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 123, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 174, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 187, 4, 0, 0, 181, 7, 0, 0, 188, 7, 0, 0, 195, 7, 0, 0, 11, 4, 0, 0, 203, 7, 0, 0, 9, 5, 0, 0, 148, 3, 0, 0, 161, 4, 0, 0, 210, 7, 0, 0, 148, 3, 0, 0, 216, 7, 0, 0, 11, 4, 0, 0, 221, 7, 0, 0, 229, 7, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 234, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 199, 6, 0, 0, 242, 7, 0, 0, 11, 4, 0, 0, 59, 5, 0, 0, 30, 5, 0, 0, 249, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 181, 7, 0, 0, 1, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 9, 8, 0, 0, 17, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 21, 8, 0, 0, 29, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 37, 8, 0, 0, 30, 5, 0, 0, 170, 7, 0, 0, 148, 3, 0, 0, 45, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 167, 5, 0, 0, 53, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 58, 8, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 65, 8, 0, 0, 73, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 76, 8, 0, 0, 30, 5, 0, 0, 84, 8, 0, 0, 88, 8, 0, 0, 96, 8, 0, 0, 148, 3, 0, 0, 103, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 110, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 118, 8, 0, 0, 124, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 130, 8, 0, 0, 138, 8, 0, 0, 148, 3, 0, 0, 142, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 61, 5, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 8, 0, 0, 156, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 161, 8, 0, 0, 148, 3, 0, 0, 167, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 217, 7, 0, 0, 148, 3, 0, 0, 173, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 181, 8, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 213, 4, 0, 0, 254, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 35, 11, 0, 0, 189, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 196, 8, 0, 0, 204, 8, 0, 0, 210, 8, 0, 0, 148, 3, 0, 0, 216, 8, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 126, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 240, 9, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 187, 3, 0, 0, 148, 3, 0, 0, 153, 7, 0, 0, 148, 3, 0, 0, 182, 3, 0, 0, 148, 3, 0, 0, 156, 7, 0, 0, 148, 3, 0, 0, 224, 8, 0, 0, 131, 9, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 226, 3, 0, 0, 232, 8, 0, 0, 226, 3, 0, 0, 239, 8, 0, 0, 246, 8, 0, 0, 43, 11, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 51, 11, 0, 0, 59, 11, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 167, 8, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 5, 8, 0, 0, 148, 3, 0, 0, 254, 8, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 142, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 147, 10, 0, 0, 151, 10, 0, 0, 79, 10, 0, 0, 6, 9, 0, 0, 182, 3, 0, 0, 148, 3, 0, 0, + 12, 9, 0, 0, 148, 3, 0, 0, 155, 7, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 156, 6, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 156, 10, 0, 0, 166, 7, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 231, 9, 0, 0, + 231, 9, 0, 0, 164, 10, 0, 0, 172, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 16, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 54, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 62, 9, 0, 0, 66, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 74, 9, 0, 0, 41, 4, 0, 0, 76, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 62, 4, 0, 0, 215, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 84, 9, 0, 0, 41, 4, 0, 0, 92, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 46, 9, 0, 0, + 137, 4, 0, 0, 50, 9, 0, 0, 100, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 104, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 107, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 46, 9, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 50, 9, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, + 41, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 62, 4, 0, 0, 134, 10, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 41, 4, 0, 0, 142, 10, 0, 0, 231, 9, 0, 0, 180, 10, 0, 0, 231, 9, 0, 0, 188, 10, 0, 0, 193, 10, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 71, 10, 0, 0, 201, 10, 0, 0, 209, 10, 0, 0, 214, 10, 0, 0, 222, 10, 0, 0, 230, 10, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 231, 9, 0, 0, 238, 10, 0, 0, 231, 9, 0, 0, 243, 9, 0, 0, 139, 9, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, + 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 148, 3, 0, 0, 16, 9, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 226, 3, 0, 0, 14, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, + 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, + 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, + 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 6, 11, 0, 0, 115, 3, 1, 0, 115, 3, 1, 0, 115, 3, 1, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 84, 0, 0, 0, 12, 0, + 0, 0, 84, 0, 0, 0, 88, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 12, 0, 0, 0, 84, 0, 0, 0, 88, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, + 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 41, 0, 58, 0, 40, 0, 57, 0, 0, 0, 56, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 58, 0, 0, 0, 56, 0, 91, 0, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 0, 58, 0, 0, 0, 56, 0, 123, 0, 57, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 20, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 8, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 59, 15, 58, 0, 58, 15, 57, 0, 61, 15, 58, 0, 60, 15, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 156, 22, 58, 0, 155, 22, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 16, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, 0, 0, 88, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 44, 0, 0, 0, 76, 0, 0, 0, 36, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 56, 0, + 126, 32, 58, 0, 125, 32, 57, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 56, 0, 142, 32, 58, 0, 141, 32, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 42, 35, 58, 0, 41, 35, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 88, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 48, 58, 0, 8, 48, 57, 0, 11, 48, 58, 0, 10, 48, 57, 0, 13, 48, 58, 0, 12, 48, 57, 0, 15, 48, 58, 0, 14, 48, 57, 0, 17, 48, 58, 0, 16, 48, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 21, 48, 58, 0, 20, 48, 57, 0, 23, 48, 58, 0, 22, 48, 57, 0, 25, 48, 58, 0, + 24, 48, 57, 0, 27, 48, 58, 0, 26, 48, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 255, 58, 0, 0, 0, 56, 0, 59, 255, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 255, 58, 0, 0, 0, 56, 0, 91, 255, 57, 0, 0, 0, 56, 0, 96, 255, 58, 0, 95, 255, 57, 0, 0, 0, 56, 0, 99, 255, 58, 0, 98, 255, 57, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 28, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, + 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 9, 255, 58, 0, 8, 255, 57, 0, 0, 0, 56, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 28, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, 0, 0, 24, 0, + 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 28, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 28, 0, 0, 0, 28, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 88, 0, 0, 0, 12, 0, 0, 0, 40, 0, 0, 0, 72, 0, 0, 0, 60, 0, 0, 0, 48, 0, 0, 0, 80, 0, 0, 0, 20, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, + 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 20, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 90, 254, 58, 0, 89, 254, 57, 0, 92, 254, 58, 0, 91, 254, 57, 0, 94, 254, 58, 0, 93, 254, 57, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 32, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 8, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, + 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 20, 0, 70, 32, 58, 0, 69, 32, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 88, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 9, 35, 58, 0, 8, 35, 57, 0, 11, 35, 58, 0, 10, 35, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 105, 39, 58, 0, 104, 39, 57, 0, 107, 39, 58, 0, 106, 39, 57, 0, 109, 39, 58, 0, 108, 39, 57, 0, 111, 39, 58, 0, 110, 39, 57, 0, 113, 39, 58, 0, 112, 39, 57, 0, 115, 39, 58, 0, 114, 39, 57, 0, 117, 39, 58, 0, 116, 39, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 198, 39, 58, 0, 197, 39, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 231, 39, 58, 0, 230, 39, 57, 0, 233, 39, 58, 0, 232, 39, 57, 0, 235, 39, 58, 0, 234, 39, 57, 0, 237, 39, 58, 0, 236, 39, 57, 0, 239, 39, 58, 0, 238, 39, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 132, 41, 58, 0, 131, 41, 57, 0, 134, 41, 58, 0, 133, 41, 57, 0, 136, 41, 58, 0, 135, 41, 57, 0, 138, 41, 58, 0, 137, 41, 57, 0, 140, 41, 58, 0, 139, 41, 57, 0, 144, 41, 58, 0, + 143, 41, 57, 0, 142, 41, 58, 0, 141, 41, 57, 0, 146, 41, 58, 0, 145, 41, 57, 0, 148, 41, 58, 0, 147, 41, 57, 0, 150, 41, 58, 0, 149, 41, 57, 0, 152, 41, 58, 0, 151, 41, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 217, 41, 58, 0, 216, 41, 57, 0, 219, 41, 58, 0, 218, 41, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 253, 41, 58, 0, 252, 41, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 35, 46, 58, 0, 34, 46, 57, 0, 37, 46, 58, 0, 36, 46, 57, 0, 39, 46, 58, 0, 38, 46, 57, 0, 41, 46, 58, 0, 40, 46, 57, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 86, 46, 58, 0, 85, 46, 57, 0, 88, 46, 58, 0, 87, 46, 57, 0, 90, 46, 58, 0, 89, 46, 57, 0, 92, 46, 58, 0, 91, 46, 57, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 56, 0, + 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, + 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, + 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, + 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs index 2511807d9c..17ec9b1df2 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiAlgorithm.cs @@ -66,7 +66,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The forward mapping maps the start index to the end index. /// The reverse mapping maps the end index to the start index. /// - private readonly Dictionary _isolatePairs = new Dictionary(); + private readonly BidiDictionary _isolatePairs = new BidiDictionary(); /// /// The working BiDi classes @@ -188,12 +188,6 @@ namespace Avalonia.Media.TextFormatting.Unicode { } - /// - /// Gets a per-thread instance that can be re-used as often - /// as necessary. - /// - public static ThreadLocal Instance { get; } = new ThreadLocal(() => new BidiAlgorithm()); - /// /// Gets the resolved levels. /// @@ -1414,35 +1408,37 @@ namespace Avalonia.Media.TextFormatting.Unicode /// Sets the direction of a bracket pair, including setting the direction of /// NSM's inside the brackets and following. /// - /// The paired brackets + /// The paired brackets /// The resolved direction for the bracket pair - private void SetPairedBracketDirection(in BracketPair bracketPair, BidiClass direction) + private void SetPairedBracketDirection(in BracketPair pairedBracket, BidiClass direction) { // Set the direction of the brackets - _runResolvedClasses[bracketPair.OpeningIndex] = direction; - _runResolvedClasses[bracketPair.ClosingIndex] = direction; + _runResolvedClasses[pairedBracket.OpeningIndex] = direction; + _runResolvedClasses[pairedBracket.ClosingIndex] = direction; // Set the directionality of NSM's inside the brackets - for (var i = bracketPair.OpeningIndex + 1; i < bracketPair.ClosingIndex; i++) + // BN characters (such as ZWJ or ZWSP) that appear between the base bracket character + // and the nonspacing mark should be ignored. + for (int i = pairedBracket.OpeningIndex + 1; i < pairedBracket.ClosingIndex; i++) { if (_runOriginalClasses[i] == BidiClass.NonspacingMark) { _runOriginalClasses[i] = direction; } - else + else if (_runOriginalClasses[i] != BidiClass.BoundaryNeutral) { break; } } // Set the directionality of NSM's following the brackets - for (var i = bracketPair.ClosingIndex + 1; i < _runLength; i++) + for (int i = pairedBracket.ClosingIndex + 1; i < _runLength; i++) { if (_runOriginalClasses[i] == BidiClass.NonspacingMark) { - _runResolvedClasses[i] = direction; + _runOriginalClasses[i] = direction; } - else + else if (_runOriginalClasses[i] != BidiClass.BoundaryNeutral) { break; } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs index 9d76d56376..65c348e928 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/BiDiData.cs @@ -18,17 +18,12 @@ namespace Avalonia.Media.TextFormatting.Unicode private ArrayBuilder _savedClasses; private ArrayBuilder _savedPairedBracketTypes; private ArrayBuilder _tempLevelBuffer; - - public BidiData(sbyte paragraphEmbeddingLevel = 0) + + public BidiData(sbyte paragraphEmbeddingLevel) { ParagraphEmbeddingLevel = paragraphEmbeddingLevel; } - public BidiData(ReadOnlySlice text, sbyte paragraphEmbeddingLevel = 0) : this(paragraphEmbeddingLevel) - { - Append(text); - } - public sbyte ParagraphEmbeddingLevel { get; private set; } public bool HasBrackets { get; private set; } @@ -64,13 +59,23 @@ namespace Avalonia.Media.TextFormatting.Unicode /// public ArraySlice PairedBracketValues { get; private set; } + /// + /// Appends text to the bidi data. + /// + /// The text to process. public void Append(ReadOnlySlice text) { _classes.Add(text.Length); _pairedBracketTypes.Add(text.Length); _pairedBracketValues.Add(text.Length); - var i = Length; + // Resolve the BidiCharacterType, paired bracket type and paired + // bracket values for all code points + HasBrackets = false; + HasEmbeddings = false; + HasIsolates = false; + + int i = Length; var codePointEnumerator = new CodepointEnumerator(text); @@ -115,13 +120,13 @@ namespace Avalonia.Media.TextFormatting.Unicode // Opening bracket types can never have a null pairing. codepoint.TryGetPairedBracket(out var paired); - _pairedBracketValues[i] = Codepoint.GetCanonicalType(paired).Value; + _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(paired).Value; HasBrackets = true; } else if (pbt == BidiPairedBracketType.Close) { - _pairedBracketValues[i] = Codepoint.GetCanonicalType(codepoint).Value; + _pairedBracketValues[i] = (int)Codepoint.GetCanonicalType(codepoint).Value; HasBrackets = true; } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs index 39440f6fcf..56a90f31ea 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/Codepoint.cs @@ -5,50 +5,52 @@ namespace Avalonia.Media.TextFormatting.Unicode { public readonly struct Codepoint { + private readonly uint _value; + /// /// The replacement codepoint that is used for non supported values. /// public static readonly Codepoint ReplacementCodepoint = new Codepoint('\uFFFD'); - public Codepoint(int value) + public Codepoint(uint value) { - Value = value; + _value = value; } /// /// Get the codepoint's value. /// - public int Value { get; } + public uint Value => _value; /// /// Gets the . /// - public GeneralCategory GeneralCategory => UnicodeData.GetGeneralCategory(Value); + public GeneralCategory GeneralCategory => UnicodeData.GetGeneralCategory(_value); /// /// Gets the . /// - public Script Script => UnicodeData.GetScript(Value); + public Script Script => UnicodeData.GetScript(_value); /// /// Gets the . /// - public BidiClass BiDiClass => UnicodeData.GetBiDiClass(Value); + public BidiClass BiDiClass => UnicodeData.GetBiDiClass(_value); /// /// Gets the . /// - public BidiPairedBracketType PairedBracketType => UnicodeData.GetBiDiPairedBracketType(Value); + public BidiPairedBracketType PairedBracketType => UnicodeData.GetBiDiPairedBracketType(_value); /// /// Gets the . /// - public LineBreakClass LineBreakClass => UnicodeData.GetLineBreakClass(Value); + public LineBreakClass LineBreakClass => UnicodeData.GetLineBreakClass(_value); /// /// Gets the . /// - public GraphemeBreakClass GraphemeBreakClass => UnicodeData.GetGraphemeClusterBreak(Value); + public GraphemeBreakClass GraphemeBreakClass => UnicodeData.GetGraphemeClusterBreak(_value); /// /// Determines whether this is a break char. @@ -60,7 +62,7 @@ namespace Avalonia.Media.TextFormatting.Unicode { get { - switch (Value) + switch (_value) { case '\u000A': case '\u000B': @@ -109,12 +111,12 @@ namespace Avalonia.Media.TextFormatting.Unicode [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Codepoint GetCanonicalType(Codepoint codePoint) { - if (codePoint.Value == 0x3008) + if (codePoint._value == 0x3008) { return new Codepoint(0x2329); } - if (codePoint.Value == 0x3009) + if (codePoint._value == 0x3009) { return new Codepoint(0x232A); } @@ -141,19 +143,19 @@ namespace Avalonia.Media.TextFormatting.Unicode return false; } - codepoint = UnicodeData.GetBiDiPairedBracket(Value); + codepoint = UnicodeData.GetBiDiPairedBracket(_value); return true; } public static implicit operator int(Codepoint codepoint) { - return codepoint.Value; + return (int)codepoint._value; } public static implicit operator uint(Codepoint codepoint) { - return (uint)codepoint.Value; + return codepoint._value; } /// @@ -191,7 +193,7 @@ namespace Avalonia.Media.TextFormatting.Unicode if (0xDC00 <= low && low <= 0xDFFF) { count = 2; - return new Codepoint((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000); + return new Codepoint((uint)((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000)); } return ReplacementCodepoint; @@ -212,7 +214,7 @@ namespace Avalonia.Media.TextFormatting.Unicode if (0xD800 <= hi && hi <= 0xDBFF) { count = 2; - return new Codepoint((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000); + return new Codepoint((uint)((hi - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000)); } return ReplacementCodepoint; @@ -220,5 +222,13 @@ namespace Avalonia.Media.TextFormatting.Unicode return new Codepoint(code); } + + /// + /// Returns if is between + /// and , inclusive. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsInRangeInclusive(Codepoint cp, uint lowerBound, uint upperBound) + => (cp._value - lowerBound) <= (upperBound - lowerBound); } } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.cs new file mode 100644 index 0000000000..6986b908a1 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.cs @@ -0,0 +1,7 @@ +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class GraphemeBreak + { + public static byte[] Data => new byte[0]; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.trie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.trie.cs new file mode 100644 index 0000000000..05b7d55ad3 --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/GraphemeBreak.trie.cs @@ -0,0 +1,409 @@ +using System; +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class GraphemeBreakTrie + { + public static ReadOnlySpan Data => new byte[] + { + 0, 16, 14, 0, 0, 0, 0, 0, 144, 155, 0, 0, 89, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 113, 3, 0, 0, 137, 3, 0, 0, 145, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, + 97, 3, 0, 0, 105, 3, 0, 0, 153, 3, 0, 0, 161, 3, 0, 0, 157, 3, 0, 0, 165, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 173, 3, 0, 0, 181, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 185, 3, 0, 0, 193, 3, 0, 0, 201, 3, 0, 0, + 209, 3, 0, 0, 217, 3, 0, 0, 225, 3, 0, 0, 231, 3, 0, 0, 239, 3, 0, 0, 97, 3, 0, 0, 105, 3, 0, 0, 244, 3, 0, 0, 252, 3, 0, 0, 1, 4, 0, 0, 9, 4, 0, 0, 15, 4, 0, 0, 23, 4, 0, 0, 22, 4, 0, 0, 30, 4, 0, 0, 35, 4, 0, 0, 43, 4, 0, 0, 176, 4, 0, 0, 183, 4, 0, 0, 187, 4, 0, 0, 97, 3, 0, 0, 51, 4, 0, 0, 97, 3, 0, 0, 194, 4, 0, 0, 59, 4, 0, 0, + 202, 4, 0, 0, 204, 4, 0, 0, 212, 4, 0, 0, 220, 4, 0, 0, 228, 4, 0, 0, 229, 4, 0, 0, 237, 4, 0, 0, 245, 4, 0, 0, 253, 4, 0, 0, 254, 4, 0, 0, 6, 5, 0, 0, 11, 5, 0, 0, 253, 4, 0, 0, 254, 4, 0, 0, 19, 5, 0, 0, 27, 5, 0, 0, 228, 4, 0, 0, 35, 5, 0, 0, 43, 5, 0, 0, 220, 4, 0, 0, 51, 5, 0, 0, 203, 4, 0, 0, 59, 5, 0, 0, 97, 3, 0, 0, 67, 5, 0, 0, + 35, 5, 0, 0, 75, 5, 0, 0, 220, 4, 0, 0, 228, 4, 0, 0, 81, 5, 0, 0, 89, 5, 0, 0, 220, 4, 0, 0, 97, 5, 0, 0, 99, 5, 0, 0, 67, 4, 0, 0, 220, 4, 0, 0, 228, 4, 0, 0, 97, 3, 0, 0, 107, 5, 0, 0, 88, 8, 0, 0, 97, 3, 0, 0, 115, 5, 0, 0, 122, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 126, 5, 0, 0, 134, 5, 0, 0, 97, 3, 0, 0, 138, 5, 0, 0, 145, 5, 0, 0, + 97, 3, 0, 0, 153, 5, 0, 0, 161, 5, 0, 0, 168, 5, 0, 0, 50, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 176, 5, 0, 0, 184, 5, 0, 0, 192, 5, 0, 0, 200, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 124, 8, 0, 0, 124, 8, 0, 0, 124, 8, 0, 0, 133, 8, 0, 0, 133, 8, 0, 0, 139, 8, 0, 0, 157, 8, 0, 0, 157, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 182, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 208, 5, 0, 0, 214, 5, 0, 0, 23, 5, 0, 0, 23, 5, 0, 0, 97, 3, 0, 0, 220, 5, 0, 0, 228, 5, 0, 0, 97, 3, 0, 0, 127, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 79, 5, 0, 0, + 233, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 241, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 248, 5, 0, 0, 97, 3, 0, 0, 255, 5, 0, 0, 7, 6, 0, 0, 97, 3, 0, 0, 149, 3, 0, 0, 14, 4, 0, 0, 97, 3, 0, 0, 15, 6, 0, 0, 18, 6, 0, 0, 26, 6, 0, 0, 32, 6, 0, 0, 40, 6, 0, 0, 48, 6, 0, 0, + 97, 3, 0, 0, 55, 6, 0, 0, 97, 3, 0, 0, 62, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 68, 6, 0, 0, 76, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 133, 4, 0, 0, 139, 4, 0, 0, 94, 6, 0, 0, 93, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 149, 3, 0, 0, 171, 5, 0, 0, 97, 3, 0, 0, 180, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 187, 8, 0, 0, 194, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 197, 8, 0, 0, 204, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 204, 8, 0, 0, 97, 3, 0, 0, 209, 8, 0, 0, 215, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 223, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 229, 8, 0, 0, 237, 8, 0, 0, 239, 8, 0, 0, 247, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 3, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 10, 9, 0, 0, 17, 9, 0, 0, 24, 9, 0, 0, 32, 9, 0, 0, 35, 9, 0, 0, 43, 9, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 51, 9, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 58, 9, 0, 0, 97, 3, 0, 0, 66, 9, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 83, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 226, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 89, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 72, 9, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 104, 6, 0, 0, 24, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 140, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 112, 6, 0, 0, 120, 6, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 237, 7, 0, 0, 93, 8, 0, 0, 128, 6, 0, 0, 136, 6, 0, 0, 97, 3, 0, 0, 144, 6, 0, 0, 151, 6, 0, 0, 125, 8, 0, 0, 202, 4, 0, 0, 156, 6, 0, 0, 101, 8, 0, 0, 164, 6, 0, 0, 97, 3, 0, 0, 170, 6, 0, 0, 178, 6, 0, 0, 182, 6, 0, 0, 97, 3, 0, 0, 190, 6, 0, 0, 5, 4, 0, 0, 198, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 206, 6, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, + 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, + 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, + 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, + 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, + 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, + 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, + 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, + 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, + 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, + 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, + 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, + 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, + 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 172, 8, 0, 0, 166, 8, 0, 0, 167, 8, 0, 0, 168, 8, 0, 0, + 169, 8, 0, 0, 170, 8, 0, 0, 171, 8, 0, 0, 147, 8, 0, 0, 154, 8, 0, 0, 158, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 210, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 165, 3, 0, 0, 165, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 113, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 24, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 147, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 228, 13, 0, 0, 228, 13, 0, 0, 36, 14, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 100, 14, 0, 0, 116, 14, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, + 132, 13, 0, 0, 180, 14, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 132, 13, 0, 0, 228, 14, 0, 0, 36, 15, 0, 0, 100, 15, 0, 0, 156, 15, 0, 0, 132, 13, 0, 0, 208, 15, 0, 0, 4, 16, 0, 0, 60, 16, 0, 0, 88, 16, 0, 0, 140, 16, 0, 0, 64, 11, 0, 0, 112, 11, 0, 0, 226, 9, 0, 0, 33, 10, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 89, 10, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 173, 11, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 123, 10, 0, 0, 149, 1, 0, 0, 237, 11, 0, 0, 176, 10, 0, 0, 40, 12, 0, 0, 104, 12, 0, 0, 162, 12, 0, 0, 226, 12, 0, 0, 34, 13, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, + 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 149, 1, 0, 0, 240, 10, 0, 0, 0, 11, 0, 0, 6, 7, 0, 0, 7, 4, 0, 0, 16, 4, 0, 0, 10, 7, 0, 0, 40, 6, 0, 0, 73, 4, 0, 0, 81, 4, 0, 0, 97, 3, 0, 0, 17, 4, 0, 0, 16, 7, 0, 0, 108, 8, 0, 0, 22, 7, 0, 0, 40, 6, 0, 0, 27, 7, 0, 0, 89, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 35, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 226, 3, 0, 0, 43, 7, 0, 0, 97, 5, 0, 0, 99, 5, 0, 0, 51, 7, 0, 0, 59, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 65, 7, 0, 0, 73, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 81, 7, 0, 0, 89, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 94, 7, 0, 0, 102, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 110, 7, 0, 0, 34, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 118, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 182, 3, 0, 0, 126, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 131, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 93, 4, 0, 0, 101, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 138, 7, 0, 0, 146, 7, 0, 0, 154, 7, 0, 0, 105, 4, 0, 0, 161, 7, 0, 0, 97, 3, 0, 0, 113, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 168, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 176, 7, 0, 0, 182, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 188, 7, 0, 0, 121, 4, 0, 0, 97, 3, 0, 0, 196, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 202, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 154, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 238, 7, 0, 0, 96, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 161, 4, 0, 0, 254, 7, 0, 0, 252, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 6, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 137, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 153, 3, 0, 0, 168, 4, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, + 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, + 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, + 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 137, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 218, 6, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 34, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 226, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 234, 6, 0, 0, 238, 6, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 79, 5, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 236, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 246, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 30, 4, 0, 0, 97, 3, 0, 0, 254, 6, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 208, 7, 0, 0, 97, 3, 0, 0, 214, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 220, 7, 0, 0, 116, 8, 0, 0, 226, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 233, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 246, 7, 0, 0, 16, 4, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 153, 3, 0, 0, 14, 8, 0, 0, 153, 3, 0, 0, 21, 8, 0, 0, 28, 8, 0, 0, 36, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 44, 8, 0, 0, 52, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 214, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 214, 6, 0, 0, 97, 3, 0, 0, 57, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 214, 7, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 64, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, + 97, 3, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 79, 9, 0, 0, 209, 8, 0, 0, 97, 3, 0, 0, 84, 9, 0, 0, 92, 9, 0, 0, 99, 9, 0, 0, 252, 8, 0, 0, 80, 8, 0, 0, 107, 9, 0, 0, 114, 9, 0, 0, 122, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 72, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 253, 8, 0, 0, 130, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 134, 9, 0, 0, 97, 3, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 67, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 138, 9, 0, 0, 252, 8, 0, 0, 146, 9, 0, 0, 97, 3, 0, 0, 152, 9, 0, 0, 97, 3, 0, 0, 160, 9, 0, 0, 165, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 69, 8, 0, 0, 169, 9, 0, 0, + 176, 9, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 97, 3, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, + 252, 8, 0, 0, 252, 8, 0, 0, 252, 8, 0, 0, 253, 8, 0, 0, 88, 3, 1, 0, 88, 3, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, + 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, + 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, + 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, + 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, + 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, + 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, + 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, + 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, + 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, + 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs index 8b2e3f41e3..bd77c398bd 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakClass.cs @@ -35,7 +35,6 @@ namespace Avalonia.Media.TextFormatting.Unicode EModifier, //EM ZWJ, //ZWJ ContingentBreak, //CB - Unknown, //XX Ambiguous, //AI MandatoryBreak, //BK diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs index 0f6b81975a..e12a7c06f1 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/LineBreakEnumerator.cs @@ -450,6 +450,20 @@ namespace Avalonia.Media.TextFormatting.Unicode _lb30a = 0; } + // Rule LB30b + if (_nextClass == LineBreakClass.EModifier && _lastPosition > 0) + { + // Mahjong Tiles (Unicode block) are extended pictographics but have a class of ID + // Unassigned codepoints with Line_Break=ID in some blocks are also assigned the Extended_Pictographic property. + // Those blocks are intended for future allocation of emoji characters. + var cp = Codepoint.ReadAt(_text, _lastPosition - 1, out int _); + + if (Codepoint.IsInRangeInclusive(cp, 0x1F000, 0x1F02F)) + { + shouldBreak = false; + } + } + _currentClass = _nextClass; return shouldBreak; diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs index 2593a77848..bc14c2563c 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/Script.cs @@ -30,6 +30,7 @@ namespace Avalonia.Media.TextFormatting.Unicode Cherokee, //Cher Chorasmian, //Chrs Coptic, //Copt + CyproMinoan, //Cpmn Cypriot, //Cprt Cyrillic, //Cyrl Devanagari, //Deva @@ -109,6 +110,7 @@ namespace Avalonia.Media.TextFormatting.Unicode Oriya, //Orya Osage, //Osge Osmanya, //Osma + OldUyghur, //Ougr Palmyrene, //Palm PauCinHau, //Pauc OldPermic, //Perm @@ -151,8 +153,11 @@ namespace Avalonia.Media.TextFormatting.Unicode Thai, //Thai Tibetan, //Tibt Tirhuta, //Tirh + Tangsa, //Tnsa + Toto, //Toto Ugaritic, //Ugar Vai, //Vaii + Vithkuqi, //Vith WarangCiti, //Wara Wancho, //Wcho OldPersian, //Xpeo diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs index 471cb52bea..0142a20790 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.cs @@ -1,4 +1,5 @@ -using System.Runtime.CompilerServices; +using System.IO; +using System.Runtime.CompilerServices; namespace Avalonia.Media.TextFormatting.Unicode { @@ -17,14 +18,14 @@ namespace Avalonia.Media.TextFormatting.Unicode internal const int SCRIPT_SHIFT = CATEGORY_BITS; internal const int LINEBREAK_SHIFT = CATEGORY_BITS + SCRIPT_BITS; - + internal const int BIDIPAIREDBRACKEDTYPE_SHIFT = BIDIPAIREDBRACKED_BITS; internal const int BIDICLASS_SHIFT = BIDIPAIREDBRACKED_BITS + BIDIPAIREDBRACKEDTYPE_BITS; - + internal const int CATEGORY_MASK = (1 << CATEGORY_BITS) - 1; internal const int SCRIPT_MASK = (1 << SCRIPT_BITS) - 1; internal const int LINEBREAK_MASK = (1 << LINEBREAK_BITS) - 1; - + internal const int BIDIPAIREDBRACKED_MASK = (1 << BIDIPAIREDBRACKED_BITS) - 1; internal const int BIDIPAIREDBRACKEDTYPE_MASK = (1 << BIDIPAIREDBRACKEDTYPE_BITS) - 1; internal const int BIDICLASS_MASK = (1 << BIDICLASS_BITS) - 1; @@ -35,9 +36,9 @@ namespace Avalonia.Media.TextFormatting.Unicode static UnicodeData() { - s_unicodeDataTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.UnicodeData.trie")!); - s_graphemeBreakTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.GraphemeBreak.trie")!); - s_biDiTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.BiDi.trie")!); + s_unicodeDataTrie = new UnicodeTrie(UnicodeDataTrie.Data); + s_graphemeBreakTrie = new UnicodeTrie(GraphemeBreakTrie.Data); + s_biDiTrie = new UnicodeTrie(BidiTrie.Data); } /// @@ -46,7 +47,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's general category. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static GeneralCategory GetGeneralCategory(int codepoint) + public static GeneralCategory GetGeneralCategory(uint codepoint) { return (GeneralCategory)(s_unicodeDataTrie.Get(codepoint) & CATEGORY_MASK); } @@ -57,7 +58,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's script. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Script GetScript(int codepoint) + public static Script GetScript(uint codepoint) { return (Script)((s_unicodeDataTrie.Get(codepoint) >> SCRIPT_SHIFT) & SCRIPT_MASK); } @@ -68,31 +69,31 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's biDi class. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static BidiClass GetBiDiClass(int codepoint) + public static BidiClass GetBiDiClass(uint codepoint) { return (BidiClass)((s_biDiTrie.Get(codepoint) >> BIDICLASS_SHIFT) & BIDICLASS_MASK); } - + /// /// Gets the for a Unicode codepoint. /// /// The codepoint in question. /// The code point's paired bracket type. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static BidiPairedBracketType GetBiDiPairedBracketType(int codepoint) + public static BidiPairedBracketType GetBiDiPairedBracketType(uint codepoint) { return (BidiPairedBracketType)((s_biDiTrie.Get(codepoint) >> BIDIPAIREDBRACKEDTYPE_SHIFT) & BIDIPAIREDBRACKEDTYPE_MASK); } - + /// /// Gets the paired bracket for a Unicode codepoint. /// /// The codepoint in question. /// The code point's paired bracket. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Codepoint GetBiDiPairedBracket(int codepoint) + public static Codepoint GetBiDiPairedBracket(uint codepoint) { - return new Codepoint((int)(s_biDiTrie.Get(codepoint) & BIDIPAIREDBRACKED_MASK)); + return new Codepoint((s_biDiTrie.Get(codepoint) & BIDIPAIREDBRACKED_MASK)); } /// @@ -101,7 +102,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's line break class. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static LineBreakClass GetLineBreakClass(int codepoint) + public static LineBreakClass GetLineBreakClass(uint codepoint) { return (LineBreakClass)((s_unicodeDataTrie.Get(codepoint) >> LINEBREAK_SHIFT) & LINEBREAK_MASK); } @@ -112,7 +113,7 @@ namespace Avalonia.Media.TextFormatting.Unicode /// The codepoint in question. /// The code point's grapheme break type. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static GraphemeBreakClass GetGraphemeClusterBreak(int codepoint) + public static GraphemeBreakClass GetGraphemeClusterBreak(uint codepoint) { return (GraphemeBreakClass)s_graphemeBreakTrie.Get(codepoint); } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs new file mode 100644 index 0000000000..6ef41e3a0b --- /dev/null +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeData.trie.cs @@ -0,0 +1,1086 @@ +using System; +namespace Avalonia.Media.TextFormatting.Unicode +{ + internal static class UnicodeDataTrie + { + public static ReadOnlySpan Data => new byte[] + { + 0, 0, 16, 0, 0, 0, 0, 0, 0, 164, 1, 0, 108, 4, 0, 0, 116, 4, 0, 0, 124, 4, 0, 0, 132, 4, 0, 0, 156, 4, 0, 0, 164, 4, 0, 0, 172, 4, 0, 0, 180, 4, 0, 0, 188, 4, 0, 0, 196, 4, 0, 0, 202, 4, 0, 0, 210, 4, 0, 0, 218, 4, 0, 0, 226, 4, 0, 0, 234, 4, 0, 0, 242, 4, 0, 0, 248, 4, 0, 0, 0, 5, 0, 0, 8, 5, 0, 0, 16, 5, 0, 0, 19, 5, 0, 0, 27, 5, 0, 0, + 35, 5, 0, 0, 43, 5, 0, 0, 51, 5, 0, 0, 59, 5, 0, 0, 64, 5, 0, 0, 72, 5, 0, 0, 80, 5, 0, 0, 88, 5, 0, 0, 93, 5, 0, 0, 101, 5, 0, 0, 109, 5, 0, 0, 117, 5, 0, 0, 121, 5, 0, 0, 129, 5, 0, 0, 137, 5, 0, 0, 145, 5, 0, 0, 153, 5, 0, 0, 161, 5, 0, 0, 157, 5, 0, 0, 165, 5, 0, 0, 170, 5, 0, 0, 178, 5, 0, 0, 184, 5, 0, 0, 192, 5, 0, 0, 200, 5, 0, 0, + 208, 5, 0, 0, 216, 5, 0, 0, 224, 5, 0, 0, 232, 5, 0, 0, 240, 5, 0, 0, 245, 5, 0, 0, 253, 5, 0, 0, 0, 6, 0, 0, 8, 6, 0, 0, 16, 6, 0, 0, 24, 6, 0, 0, 30, 6, 0, 0, 38, 6, 0, 0, 46, 6, 0, 0, 54, 6, 0, 0, 62, 6, 0, 0, 70, 6, 0, 0, 22, 19, 0, 0, 78, 6, 0, 0, 86, 6, 0, 0, 94, 6, 0, 0, 100, 6, 0, 0, 224, 5, 0, 0, 30, 19, 0, 0, 252, 22, 0, 0, + 163, 19, 0, 0, 165, 19, 0, 0, 173, 19, 0, 0, 38, 19, 0, 0, 108, 6, 0, 0, 114, 6, 0, 0, 122, 6, 0, 0, 130, 6, 0, 0, 138, 6, 0, 0, 144, 6, 0, 0, 152, 6, 0, 0, 160, 6, 0, 0, 168, 6, 0, 0, 174, 6, 0, 0, 182, 6, 0, 0, 190, 6, 0, 0, 198, 6, 0, 0, 204, 6, 0, 0, 212, 6, 0, 0, 220, 6, 0, 0, 228, 6, 0, 0, 236, 6, 0, 0, 244, 6, 0, 0, 251, 6, 0, 0, 3, 7, 0, 0, + 9, 7, 0, 0, 17, 7, 0, 0, 25, 7, 0, 0, 33, 7, 0, 0, 39, 7, 0, 0, 47, 7, 0, 0, 55, 7, 0, 0, 63, 7, 0, 0, 181, 19, 0, 0, 71, 7, 0, 0, 79, 7, 0, 0, 87, 7, 0, 0, 94, 7, 0, 0, 102, 7, 0, 0, 110, 7, 0, 0, 118, 7, 0, 0, 122, 7, 0, 0, 130, 7, 0, 0, 137, 7, 0, 0, 145, 7, 0, 0, 152, 7, 0, 0, 160, 7, 0, 0, 137, 7, 0, 0, 189, 19, 0, 0, 4, 23, 0, 0, + 168, 7, 0, 0, 173, 7, 0, 0, 181, 7, 0, 0, 188, 7, 0, 0, 196, 7, 0, 0, 137, 7, 0, 0, 197, 19, 0, 0, 203, 19, 0, 0, 211, 19, 0, 0, 219, 19, 0, 0, 227, 19, 0, 0, 175, 17, 0, 0, 204, 7, 0, 0, 167, 18, 0, 0, 235, 19, 0, 0, 235, 19, 0, 0, 235, 19, 0, 0, 243, 19, 0, 0, 243, 19, 0, 0, 249, 19, 0, 0, 251, 19, 0, 0, 251, 19, 0, 0, 3, 20, 0, 0, 3, 20, 0, 0, 212, 7, 0, 0, + 3, 20, 0, 0, 220, 7, 0, 0, 224, 7, 0, 0, 232, 7, 0, 0, 3, 20, 0, 0, 238, 7, 0, 0, 3, 20, 0, 0, 244, 7, 0, 0, 252, 7, 0, 0, 4, 8, 0, 0, 183, 17, 0, 0, 183, 17, 0, 0, 12, 8, 0, 0, 11, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, + 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 12, 20, 0, 0, 17, 20, 0, 0, 20, 8, 0, 0, 25, 20, 0, 0, 25, 20, 0, 0, 28, 8, 0, 0, 36, 8, 0, 0, 44, 8, 0, 0, 52, 8, 0, 0, 60, 8, 0, 0, 33, 20, 0, 0, 36, 20, 0, 0, 68, 8, 0, 0, 76, 8, 0, 0, 84, 8, 0, 0, 44, 20, 0, 0, 46, 19, 0, 0, 92, 8, 0, 0, 51, 20, 0, 0, + 100, 8, 0, 0, 12, 20, 0, 0, 104, 8, 0, 0, 112, 8, 0, 0, 120, 8, 0, 0, 128, 8, 0, 0, 133, 8, 0, 0, 59, 20, 0, 0, 141, 8, 0, 0, 147, 8, 0, 0, 226, 24, 0, 0, 155, 8, 0, 0, 67, 20, 0, 0, 163, 8, 0, 0, 171, 8, 0, 0, 179, 8, 0, 0, 187, 8, 0, 0, 195, 8, 0, 0, 137, 7, 0, 0, 75, 20, 0, 0, 78, 20, 0, 0, 203, 8, 0, 0, 211, 8, 0, 0, 86, 20, 0, 0, 94, 20, 0, 0, + 102, 20, 0, 0, 219, 8, 0, 0, 110, 20, 0, 0, 227, 8, 0, 0, 235, 8, 0, 0, 54, 19, 0, 0, 243, 8, 0, 0, 247, 8, 0, 0, 255, 8, 0, 0, 7, 9, 0, 0, 12, 5, 0, 0, 175, 18, 0, 0, 62, 19, 0, 0, 183, 18, 0, 0, 190, 18, 0, 0, 70, 19, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, 191, 17, 0, 0, 188, 4, 0, 0, 188, 4, 0, 0, + 188, 4, 0, 0, 15, 9, 0, 0, 199, 17, 0, 0, 19, 9, 0, 0, 27, 9, 0, 0, 198, 18, 0, 0, 35, 9, 0, 0, 43, 9, 0, 0, 51, 9, 0, 0, 195, 23, 0, 0, 203, 23, 0, 0, 211, 23, 0, 0, 59, 9, 0, 0, 67, 9, 0, 0, 210, 24, 0, 0, 75, 9, 0, 0, 83, 9, 0, 0, 207, 17, 0, 0, 215, 17, 0, 0, 223, 17, 0, 0, 84, 23, 0, 0, 91, 9, 0, 0, 48, 24, 0, 0, 53, 24, 0, 0, 59, 24, 0, 0, + 67, 24, 0, 0, 75, 24, 0, 0, 83, 24, 0, 0, 91, 24, 0, 0, 99, 24, 0, 0, 106, 24, 0, 0, 114, 24, 0, 0, 119, 24, 0, 0, 251, 23, 0, 0, 3, 24, 0, 0, 234, 24, 0, 0, 127, 24, 0, 0, 135, 24, 0, 0, 142, 24, 0, 0, 147, 24, 0, 0, 155, 24, 0, 0, 234, 24, 0, 0, 98, 9, 0, 0, 106, 9, 0, 0, 111, 23, 0, 0, 112, 23, 0, 0, 242, 24, 0, 0, 242, 24, 0, 0, 119, 23, 0, 0, 242, 24, 0, 0, + 242, 24, 0, 0, 247, 24, 0, 0, 251, 24, 0, 0, 3, 25, 0, 0, 163, 24, 0, 0, 171, 24, 0, 0, 179, 24, 0, 0, 11, 25, 0, 0, 19, 25, 0, 0, 27, 25, 0, 0, 187, 24, 0, 0, 28, 25, 0, 0, 36, 25, 0, 0, 44, 25, 0, 0, 52, 25, 0, 0, 60, 25, 0, 0, 234, 24, 0, 0, 64, 25, 0, 0, 127, 23, 0, 0, 133, 23, 0, 0, 234, 24, 0, 0, 11, 24, 0, 0, 18, 24, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, + 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 72, 25, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 26, 24, 0, 0, 114, 24, 0, 0, 33, 24, 0, 0, 40, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 114, 24, 0, 0, 234, 24, 0, 0, 195, 24, 0, 0, 202, 24, 0, 0, + 114, 9, 0, 0, 120, 9, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 231, 17, 0, 0, 235, 17, 0, 0, 206, 18, 0, 0, 243, 17, 0, 0, 251, 17, 0, 0, 251, 17, 0, 0, 251, 17, 0, 0, 128, 9, 0, 0, 214, 18, 0, 0, 136, 9, 0, 0, 118, 20, 0, 0, 142, 9, 0, 0, 150, 9, 0, 0, 158, 9, 0, 0, 158, 9, 0, 0, 12, 23, 0, 0, 243, 23, 0, 0, 78, 19, 0, 0, 166, 9, 0, 0, 137, 7, 0, 0, + 174, 9, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 181, 9, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 80, 25, 0, 0, 189, 9, 0, 0, 195, 9, 0, 0, 86, 19, 0, 0, 94, 19, 0, 0, 203, 9, 0, 0, 126, 20, 0, 0, 211, 9, 0, 0, 134, 20, 0, 0, 142, 20, 0, 0, 102, 19, 0, 0, 219, 9, 0, 0, 223, 9, 0, 0, 150, 20, 0, 0, 150, 20, 0, 0, 228, 9, 0, 0, + 158, 20, 0, 0, 88, 25, 0, 0, 235, 9, 0, 0, 243, 9, 0, 0, 141, 23, 0, 0, 147, 23, 0, 0, 96, 25, 0, 0, 141, 23, 0, 0, 155, 23, 0, 0, 104, 25, 0, 0, 108, 25, 0, 0, 116, 25, 0, 0, 116, 25, 0, 0, 118, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 234, 24, 0, 0, 234, 24, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 110, 19, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, + 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 174, 20, 0, 0, 251, 9, 0, 0, 126, 25, 0, 0, 2, 10, 0, 0, 118, 19, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, + 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 182, 20, 0, 0, 126, 19, 0, 0, 10, 10, 0, 0, 129, 5, 0, 0, 3, 18, 0, 0, 11, 18, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 18, 10, 0, 0, 134, 19, 0, 0, 19, 18, 0, 0, 188, 4, 0, 0, 24, 18, 0, 0, 32, 18, 0, 0, 38, 18, 0, 0, 26, 10, 0, 0, 33, 10, 0, 0, 198, 20, 0, 0, 41, 10, 0, 0, 206, 20, 0, 0, + 49, 10, 0, 0, 214, 20, 0, 0, 217, 20, 0, 0, 57, 10, 0, 0, 225, 20, 0, 0, 233, 20, 0, 0, 240, 20, 0, 0, 65, 10, 0, 0, 73, 10, 0, 0, 248, 20, 0, 0, 252, 20, 0, 0, 81, 10, 0, 0, 89, 10, 0, 0, 4, 21, 0, 0, 97, 10, 0, 0, 105, 10, 0, 0, 142, 19, 0, 0, 12, 21, 0, 0, 16, 21, 0, 0, 113, 10, 0, 0, 121, 10, 0, 0, 129, 10, 0, 0, 137, 10, 0, 0, 222, 18, 0, 0, 144, 10, 0, 0, + 230, 18, 0, 0, 230, 18, 0, 0, 24, 21, 0, 0, 152, 10, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, + 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, + 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, + 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, + 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, + 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, + 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, + 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, + 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, + 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, + 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, + 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, + 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, + 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 38, 21, 0, 0, 32, 21, 0, 0, 33, 21, 0, 0, 34, 21, 0, 0, + 35, 21, 0, 0, 36, 21, 0, 0, 37, 21, 0, 0, 160, 10, 0, 0, 167, 10, 0, 0, 170, 10, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, + 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 178, 10, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 182, 10, 0, 0, 189, 10, 0, 0, 197, 10, 0, 0, 205, 10, 0, 0, 213, 10, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 46, 21, 0, 0, 221, 10, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, + 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 54, 21, 0, 0, 62, 21, 0, 0, 224, 5, 0, 0, 226, 10, 0, 0, 224, 5, 0, 0, 232, 10, 0, 0, 236, 10, 0, 0, 244, 10, 0, 0, 20, 23, 0, 0, 252, 10, 0, 0, 4, 11, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 224, 5, 0, 0, 10, 11, 0, 0, 18, 11, 0, 0, 46, 18, 0, 0, 238, 18, 0, 0, 150, 19, 0, 0, 155, 19, 0, 0, 26, 11, 0, 0, 34, 11, 0, 0, + 42, 11, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, + 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 235, 23, 0, 0, 48, 18, 0, 0, 48, 18, 0, 0, 112, 18, 0, 0, 176, 18, 0, 0, 240, 18, 0, 0, 40, 19, 0, 0, 104, 19, 0, 0, 168, 19, 0, 0, 224, 19, 0, 0, 32, 20, 0, 0, 76, 20, 0, 0, 140, 20, 0, 0, 204, 20, 0, 0, 0, 21, 0, 0, 64, 21, 0, 0, 116, 21, 0, 0, 180, 21, 0, 0, + 228, 21, 0, 0, 36, 22, 0, 0, 100, 22, 0, 0, 116, 22, 0, 0, 168, 22, 0, 0, 224, 22, 0, 0, 32, 23, 0, 0, 96, 23, 0, 0, 160, 23, 0, 0, 212, 23, 0, 0, 0, 24, 0, 0, 64, 24, 0, 0, 120, 24, 0, 0, 184, 24, 0, 0, 248, 24, 0, 0, 96, 10, 0, 0, 160, 10, 0, 0, 224, 10, 0, 0, 32, 11, 0, 0, 96, 11, 0, 0, 139, 11, 0, 0, 203, 11, 0, 0, 237, 11, 0, 0, 13, 12, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 77, 12, 0, 0, 112, 17, 0, 0, 112, 17, 0, 0, 141, 12, 0, 0, 205, 12, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 246, 12, 0, 0, 54, 13, 0, 0, 86, 13, 0, 0, 237, 11, 0, 0, 124, 13, 0, 0, 188, 13, 0, 0, 252, 13, 0, 0, 60, 14, 0, 0, 124, 14, 0, 0, 188, 14, 0, 0, 252, 14, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 60, 15, 0, 0, 160, 1, 0, 0, 116, 15, 0, 0, 180, 15, 0, 0, 160, 1, 0, 0, 191, 15, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, + 160, 1, 0, 0, 245, 15, 0, 0, 21, 16, 0, 0, 85, 16, 0, 0, 160, 1, 0, 0, 160, 1, 0, 0, 149, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, + 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 21, 16, 0, 0, 176, 16, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 240, 16, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, + 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 237, 11, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, + 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 0, 7, 0, 0, 48, 17, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, + 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 140, 4, 0, 0, 50, 11, 0, 0, 57, 11, 0, 0, 65, 11, 0, 0, 137, 7, 0, 0, 70, 21, 0, 0, 70, 21, 0, 0, 70, 21, 0, 0, 73, 11, 0, 0, 81, 11, 0, 0, 84, 11, 0, 0, 92, 23, 0, 0, 95, 23, 0, 0, 92, 11, 0, 0, 100, 11, 0, 0, 110, 9, 0, 0, 108, 11, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 116, 11, 0, 0, 78, 21, 0, 0, 124, 11, 0, 0, 132, 11, 0, 0, 86, 21, 0, 0, 140, 11, 0, 0, 148, 11, 0, 0, 152, 11, 0, 0, 160, 11, 0, 0, 94, 21, 0, 0, 168, 11, 0, 0, 137, 7, 0, 0, 54, 18, 0, 0, 60, 18, 0, 0, 246, 18, 0, 0, 102, 21, 0, 0, 176, 11, 0, 0, 184, 11, 0, 0, 188, 11, 0, 0, 194, 11, 0, 0, 110, 21, 0, 0, + 202, 11, 0, 0, 118, 21, 0, 0, 209, 11, 0, 0, 213, 11, 0, 0, 221, 11, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 126, 21, 0, 0, 229, 11, 0, 0, 237, 11, 0, 0, 245, 11, 0, 0, 253, 11, 0, 0, 1, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 9, 12, 0, 0, 12, 12, 0, 0, + 20, 12, 0, 0, 134, 21, 0, 0, 28, 12, 0, 0, 36, 12, 0, 0, 137, 7, 0, 0, 44, 12, 0, 0, 52, 12, 0, 0, 60, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 142, 21, 0, 0, 68, 12, 0, 0, 76, 12, 0, 0, 163, 23, 0, 0, 84, 12, 0, 0, 91, 12, 0, 0, 99, 12, 0, 0, 150, 21, 0, 0, 158, 21, 0, 0, 137, 7, 0, 0, 166, 21, 0, 0, 107, 12, 0, 0, 174, 21, 0, 0, 115, 12, 0, 0, 123, 12, 0, 0, + 131, 12, 0, 0, 139, 12, 0, 0, 147, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 182, 21, 0, 0, 182, 21, 0, 0, 155, 12, 0, 0, 137, 7, 0, 0, 68, 18, 0, 0, 163, 12, 0, 0, 254, 18, 0, 0, 171, 12, 0, 0, 190, 21, 0, 0, 179, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 187, 12, 0, 0, + 198, 21, 0, 0, 195, 12, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 206, 21, 0, 0, 203, 12, 0, 0, 210, 12, 0, 0, 217, 12, 0, 0, 225, 12, 0, 0, 229, 12, 0, 0, 236, 12, 0, 0, 244, 12, 0, 0, 214, 21, 0, 0, 216, 21, 0, 0, 252, 12, 0, 0, 3, 13, 0, 0, 224, 21, 0, 0, 228, 21, 0, 0, 11, 13, 0, 0, 17, 13, 0, 0, 236, 21, 0, 0, 25, 13, 0, 0, 33, 13, 0, 0, 37, 13, 0, 0, 244, 21, 0, 0, + 248, 21, 0, 0, 0, 22, 0, 0, 45, 13, 0, 0, 53, 13, 0, 0, 58, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 66, 13, 0, 0, 74, 13, 0, 0, 8, 22, 0, 0, 82, 13, 0, 0, 90, 13, 0, 0, 96, 13, 0, 0, 104, 13, 0, 0, 112, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 16, 22, 0, 0, 19, 22, 0, 0, 120, 13, 0, 0, 128, 13, 0, 0, 27, 22, 0, 0, 31, 22, 0, 0, + 136, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 39, 22, 0, 0, 144, 13, 0, 0, 152, 13, 0, 0, 137, 7, 0, 0, 47, 22, 0, 0, 51, 22, 0, 0, 160, 13, 0, 0, 168, 13, 0, 0, 59, 22, 0, 0, 176, 13, 0, 0, 184, 13, 0, 0, 137, 7, 0, 0, 192, 13, 0, 0, 200, 13, 0, 0, 208, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 67, 22, 0, 0, 216, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 76, 18, 0, 0, 6, 19, 0, 0, 224, 13, 0, 0, 232, 13, 0, 0, 238, 13, 0, 0, 246, 13, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 254, 13, 0, 0, 2, 14, 0, 0, 10, 14, 0, 0, 75, 22, 0, 0, 79, 22, 0, 0, 18, 14, 0, 0, 87, 22, 0, 0, 93, 22, 0, 0, 26, 14, 0, 0, 101, 22, 0, 0, 34, 14, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 42, 14, 0, 0, 47, 14, 0, 0, 55, 14, 0, 0, 62, 14, 0, 0, 67, 14, 0, 0, 73, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 81, 14, 0, 0, 85, 14, 0, 0, 93, 14, 0, 0, 101, 14, 0, 0, 107, 14, 0, 0, 115, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 123, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 130, 14, 0, 0, 171, 23, 0, 0, 138, 14, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, + 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 146, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 103, 23, 0, 0, 103, 23, 0, 0, 103, 23, 0, 0, + 154, 14, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 109, 22, 0, 0, 162, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 166, 14, 0, 0, 117, 22, 0, 0, 117, 22, 0, 0, 170, 14, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, + 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 127, 22, 0, 0, 125, 22, 0, 0, 135, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 138, 22, 0, 0, + 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 125, 22, 0, 0, 178, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, + 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 151, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 146, 22, 0, 0, 186, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 190, 20, 0, 0, 194, 14, 0, 0, 202, 14, 0, 0, 210, 14, 0, 0, 159, 22, 0, 0, 214, 14, 0, 0, 222, 14, 0, 0, + 227, 14, 0, 0, 167, 22, 0, 0, 171, 22, 0, 0, 235, 14, 0, 0, 243, 14, 0, 0, 251, 14, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 84, 18, 0, 0, 14, 19, 0, 0, 3, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 179, 22, 0, 0, 179, 22, 0, 0, 11, 15, 0, 0, 68, 23, 0, 0, 17, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 25, 15, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 33, 15, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 195, 22, 0, 0, 41, 15, 0, 0, 137, 7, 0, 0, 49, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 53, 15, 0, 0, 203, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 204, 22, 0, 0, 61, 15, 0, 0, 65, 15, 0, 0, 72, 15, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, + 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 212, 22, 0, 0, 76, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 220, 22, 0, 0, + 220, 22, 0, 0, 220, 22, 0, 0, 84, 15, 0, 0, 89, 15, 0, 0, 97, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 51, 5, 0, 0, 105, 15, 0, 0, 112, 15, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 119, 15, 0, 0, 137, 7, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, + 234, 24, 0, 0, 127, 15, 0, 0, 234, 24, 0, 0, 135, 15, 0, 0, 234, 24, 0, 0, 28, 23, 0, 0, 36, 23, 0, 0, 42, 23, 0, 0, 234, 24, 0, 0, 106, 9, 0, 0, 134, 25, 0, 0, 134, 25, 0, 0, 143, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 151, 15, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 159, 15, 0, 0, 167, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 92, 18, 0, 0, 99, 18, 0, 0, 175, 15, 0, 0, 102, 18, 0, 0, 183, 15, 0, 0, 191, 15, 0, 0, 199, 15, 0, 0, 96, 18, 0, 0, 207, 15, 0, 0, 215, 15, 0, 0, 223, 15, 0, 0, 101, 18, 0, 0, 109, 18, 0, 0, 92, 18, 0, 0, 99, 18, 0, 0, 95, 18, 0, 0, 102, 18, 0, 0, 110, 18, 0, 0, 93, 18, 0, 0, 100, 18, 0, 0, 96, 18, 0, 0, 230, 15, 0, 0, 118, 18, 0, 0, 126, 18, 0, 0, + 133, 18, 0, 0, 140, 18, 0, 0, 121, 18, 0, 0, 129, 18, 0, 0, 136, 18, 0, 0, 143, 18, 0, 0, 238, 15, 0, 0, 76, 23, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 142, 25, 0, 0, 50, 23, 0, 0, + 53, 23, 0, 0, 50, 23, 0, 0, 60, 23, 0, 0, 246, 15, 0, 0, 254, 15, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 6, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 14, 16, 0, 0, 22, 16, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 228, 22, 0, 0, 30, 16, 0, 0, 38, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 42, 16, 0, 0, 47, 16, 0, 0, 236, 22, 0, 0, 55, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 63, 16, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 244, 22, 0, 0, 71, 16, 0, 0, 137, 7, 0, 0, 151, 18, 0, 0, 159, 18, 0, 0, 79, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 87, 16, 0, 0, 179, 23, 0, 0, 92, 16, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 100, 16, 0, 0, 105, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 113, 16, 0, 0, 121, 16, 0, 0, 129, 16, 0, 0, 137, 16, 0, 0, 145, 16, 0, 0, 153, 16, 0, 0, 137, 7, 0, 0, 160, 16, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 88, 25, 0, 0, 168, 16, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 172, 16, 0, 0, 180, 16, 0, 0, 184, 16, 0, 0, 189, 16, 0, 0, 187, 23, 0, 0, 150, 25, 0, 0, 242, 24, 0, 0, 156, 25, 0, 0, 242, 24, 0, 0, 197, 16, 0, 0, 189, 10, 0, 0, 204, 16, 0, 0, 212, 16, 0, 0, 216, 16, 0, 0, 224, 16, 0, 0, 232, 16, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 88, 25, 0, 0, + 88, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 164, 25, 0, 0, 172, 25, 0, 0, 180, 25, 0, 0, 218, 24, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 188, 25, 0, 0, 195, 25, 0, 0, 203, 25, 0, 0, 211, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, 219, 25, 0, 0, 226, 25, 0, 0, 232, 25, 0, 0, 235, 25, 0, 0, 242, 25, 0, 0, 88, 25, 0, 0, 248, 25, 0, 0, 255, 25, 0, 0, 88, 25, 0, 0, 88, 25, 0, 0, + 6, 26, 0, 0, 10, 26, 0, 0, 88, 25, 0, 0, 18, 26, 0, 0, 240, 16, 0, 0, 248, 16, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 0, 17, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 8, 17, 0, 0, 16, 17, 0, 0, 24, 17, 0, 0, 234, 24, 0, 0, 30, 17, 0, 0, 234, 24, 0, 0, 38, 17, 0, 0, 43, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 26, 26, 0, 0, 34, 26, 0, 0, 88, 25, 0, 0, + 42, 26, 0, 0, 88, 25, 0, 0, 48, 26, 0, 0, 55, 26, 0, 0, 88, 25, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 0, 17, 0, 0, 51, 17, 0, 0, 59, 17, 0, 0, 64, 17, 0, 0, 72, 17, 0, 0, 80, 17, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 234, 24, 0, 0, 88, 17, 0, 0, 234, 24, 0, 0, 106, 9, 0, 0, 96, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 104, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 189, 10, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 112, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 120, 17, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 127, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 135, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 120, 17, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 104, 17, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, + 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 166, 20, 0, 0, 143, 17, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, + 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 189, 10, 0, 0, 104, 17, 0, 0, 151, 17, 0, 0, 219, 23, 0, 0, 219, 23, 0, 0, 219, 23, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, + 51, 5, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 51, 5, 0, 0, 159, 17, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, + 137, 7, 0, 0, 137, 7, 0, 0, 137, 7, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, + 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 227, 23, 0, 0, 167, 17, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, + 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 187, 22, 0, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 4, 0, 65, 128, 9, 0, 65, 192, 8, 0, 65, 192, 8, 0, 65, 64, 9, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, + 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 101, 128, 10, 0, 91, 128, 1, 0, 91, 192, 0, 0, 91, 0, 3, 0, 94, 64, 2, 0, 91, 128, 2, 0, 91, 0, 3, 0, 91, 192, 0, 0, 92, 0, 0, 0, 88, 128, 0, 0, 91, 0, 3, 0, 96, 64, 2, 0, + 91, 0, 2, 0, 87, 0, 4, 0, 91, 0, 2, 0, 91, 192, 1, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 91, 0, 2, 0, 91, 0, 2, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 91, 128, 1, 0, 91, 0, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 92, 0, 0, 0, 91, 64, 2, 0, 88, 128, 0, 0, + 95, 0, 3, 0, 86, 0, 3, 0, 95, 0, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 92, 0, 0, 0, 96, 64, 4, 0, 88, 64, 0, 0, 96, 0, 3, 0, 65, 64, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 64, 5, 0, 65, 64, 5, 0, + 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 192, 9, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, + 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 65, 64, 5, 0, 101, 0, 1, 0, 91, 0, 0, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 97, 0, 3, 0, 91, 128, 8, 0, 95, 128, 8, 0, 97, 0, 3, 0, 10, 146, 8, 0, 90, 192, 0, 0, 96, 0, 3, 0, 66, 64, 4, 0, 97, 0, 3, 0, 95, 0, 3, 0, 97, 128, 2, 0, 96, 64, 2, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 95, 128, 4, 0, 72, 0, 3, 0, 91, 128, 8, 0, 91, 128, 8, 0, 95, 128, 8, 0, 84, 128, 8, 0, 10, 146, 8, 0, 89, 192, 0, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 91, 0, 0, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 96, 128, 8, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 96, 128, 8, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 11, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 73, 0, 3, 0, 73, 128, 8, 0, 73, 128, 4, 0, 73, 128, 8, 0, 73, 128, 8, 0, 73, 128, 8, 0, + 73, 128, 4, 0, 73, 128, 8, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 128, 8, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 128, 8, 0, 95, 128, 8, 0, 95, 128, 8, 0, 95, 128, 8, 0, 95, 0, 3, 0, 95, 128, 8, 0, 95, 0, 3, 0, 95, 128, 4, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 31, 4, 3, 0, 31, 4, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, + 95, 0, 3, 0, 95, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 0, 1, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 0, 1, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 73, 0, 3, 0, 159, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 137, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 91, 0, 2, 0, 140, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 159, 11, 3, 0, 95, 0, 3, 0, 140, 11, 3, 0, + 91, 0, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, + 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, + 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 160, 11, 3, 0, + 140, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, + 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, + 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, + 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 161, 7, 3, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 71, 5, 0, 143, 71, 5, 0, 143, 71, 5, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, + 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, + 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 3, 0, 0, 0, + 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, 12, 2, 3, 0, + 12, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 27, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, + 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 27, 2, 2, 0, 23, 66, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 33, 2, 3, 0, 33, 2, 3, 0, 30, 66, 2, 0, + 3, 0, 0, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, + 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 80, 77, 5, 0, 87, 77, 4, 0, 80, 77, 5, 0, 91, 13, 3, 0, 80, 77, 5, 0, + 80, 77, 5, 0, 91, 13, 3, 0, 80, 77, 5, 0, 80, 77, 5, 0, 91, 141, 1, 0, 80, 77, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, + 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 91, 13, 3, 0, + 91, 13, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 130, 1, 3, 0, 130, 1, 3, 0, 130, 1, 3, 0, 130, 1, 3, 0, 130, 1, 3, 0, 66, 0, 3, 0, 160, 1, 3, 0, 160, 1, 3, 0, 160, 1, 3, 0, 155, 129, 2, 0, 155, 129, 2, 0, 158, 129, 2, 0, 91, 0, 2, 0, + 155, 1, 2, 0, 161, 1, 3, 0, 161, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 91, 128, 1, 0, 130, 65, 5, 0, 155, 129, 1, 0, 155, 129, 1, 0, 91, 128, 1, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 73, 0, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 155, 129, 2, 0, 155, 193, 2, 0, 155, 193, 2, 0, 155, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 144, 64, 5, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 155, 129, 1, 0, 138, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 66, 0, 3, 0, 161, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 137, 1, 3, 0, 137, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 161, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 138, 1, 3, 0, 138, 1, 3, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, + 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 146, 193, 2, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 138, 1, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, 27, 34, 3, 0, + 3, 0, 0, 0, 2, 34, 3, 0, 10, 34, 3, 0, 16, 98, 5, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, + 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, + 16, 98, 5, 0, 16, 98, 5, 0, 16, 98, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, + 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 202, 36, 3, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, + 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 208, 100, 5, 0, 202, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, + 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 18, 217, 2, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, + 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 10, 25, 3, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 16, 89, 5, 0, 9, 25, 3, 0, 9, 25, 3, 0, 33, 25, 3, 0, + 27, 25, 3, 0, 27, 25, 2, 0, 27, 153, 1, 0, 9, 25, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 89, 5, 0, 30, 89, 2, 0, 30, 89, 2, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 73, 30, 3, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 73, 30, 3, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 91, 30, 3, 0, 3, 0, 0, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, + 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 138, 20, 3, 0, 144, 84, 5, 0, 144, 84, 5, 0, 144, 84, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 20, 3, 0, 3, 0, 0, 0, 10, 34, 3, 0, 10, 34, 3, 0, + 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 10, 34, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 159, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 130, 1, 3, 0, 130, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 138, 3, 3, 0, 144, 67, 5, 0, 142, 67, 5, 0, 142, 67, 5, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, + 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 67, 5, 0, 138, 3, 3, 0, 142, 67, 5, 0, 142, 67, 5, 0, 142, 67, 5, 0, 144, 67, 5, 0, 144, 67, 5, 0, 144, 67, 5, 0, 144, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 67, 5, 0, 142, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 67, 5, 0, 142, 67, 5, 0, 144, 67, 5, 0, 138, 3, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 3, 0, 0, 0, 138, 3, 3, 0, 138, 3, 3, 0, 138, 3, 3, 0, 144, 67, 5, 0, 144, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 195, 2, 0, 146, 195, 2, 0, + 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 146, 195, 2, 0, 138, 3, 3, 0, 138, 3, 3, 0, 158, 131, 2, 0, 158, 131, 2, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 3, 3, 0, 148, 131, 2, 0, 161, 3, 3, 0, 158, 67, 2, 0, 138, 3, 3, 0, 155, 3, 3, 0, 144, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 16, 76, 5, 0, 16, 76, 5, 0, 14, 76, 5, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, + 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 16, 76, 5, 0, 3, 0, 0, 0, 14, 76, 5, 0, 14, 76, 5, 0, 14, 76, 5, 0, 16, 76, 5, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 76, 5, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 76, 5, 0, 16, 76, 5, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 3, 0, 0, 0, 10, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, + 18, 204, 2, 0, 18, 204, 2, 0, 18, 204, 2, 0, 16, 76, 5, 0, 16, 76, 5, 0, 10, 12, 3, 0, 10, 12, 3, 0, 10, 12, 3, 0, 16, 76, 5, 0, 27, 12, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 208, 75, 5, 0, 208, 75, 5, 0, 206, 75, 5, 0, 3, 0, 0, 0, 202, 11, 3, 0, + 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, + 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 202, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 208, 75, 5, 0, 202, 11, 3, 0, 206, 75, 5, 0, 206, 75, 5, 0, + 206, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 208, 75, 5, 0, 208, 75, 5, 0, 206, 75, 5, 0, 3, 0, 0, 0, 206, 75, 5, 0, 206, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 11, 3, 0, 202, 11, 3, 0, 208, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 210, 203, 2, 0, 219, 11, 3, 0, 222, 75, 2, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 11, 3, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 208, 75, 5, 0, 3, 0, 0, 0, 80, 90, 5, 0, 78, 90, 5, 0, 78, 90, 5, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, + 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, + 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 90, 5, 0, 74, 26, 3, 0, 78, 90, 5, 0, 80, 90, 5, 0, 78, 90, 5, 0, 80, 90, 5, 0, 80, 90, 5, 0, 80, 90, 5, 0, 80, 90, 5, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 78, 90, 5, 0, 78, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 90, 5, 0, 78, 90, 5, 0, 80, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 90, 5, 0, 80, 90, 5, 0, 78, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, + 3, 0, 0, 0, 74, 26, 3, 0, 74, 26, 3, 0, 74, 26, 3, 0, 80, 90, 5, 0, 80, 90, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 82, 218, 2, 0, 97, 26, 3, 0, 74, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, 84, 26, 3, 0, + 84, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 99, 5, 0, 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, + 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, + 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 99, 5, 0, 78, 99, 5, 0, 80, 99, 5, 0, 78, 99, 5, 0, + 78, 99, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 99, 5, 0, 78, 99, 5, 0, 78, 99, 5, 0, 3, 0, 0, 0, 78, 99, 5, 0, 78, 99, 5, 0, 78, 99, 5, 0, 80, 99, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 99, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 82, 227, 2, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, + 97, 35, 3, 0, 94, 99, 2, 0, 97, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 16, 100, 5, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, + 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, + 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 100, 5, 0, 10, 36, 3, 0, 16, 100, 5, 0, 16, 100, 5, 0, 16, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 14, 100, 5, 0, 3, 0, 0, 0, 16, 100, 5, 0, 16, 100, 5, 0, 16, 100, 5, 0, 3, 0, 0, 0, 16, 100, 5, 0, + 16, 100, 5, 0, 16, 100, 5, 0, 16, 100, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 100, 5, 0, 16, 100, 5, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 10, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 36, 3, 0, 10, 36, 3, 0, 16, 100, 5, 0, 16, 100, 5, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 18, 228, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 164, 4, 0, 20, 36, 3, 0, 20, 36, 3, 0, 20, 36, 3, 0, 20, 36, 3, 0, 20, 36, 3, 0, + 20, 36, 3, 0, 20, 36, 3, 0, 33, 36, 3, 0, 10, 17, 3, 0, 16, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 27, 145, 4, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, + 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, + 10, 17, 3, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 81, 5, 0, 10, 17, 3, 0, 14, 81, 5, 0, 16, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 3, 0, 0, 0, 16, 81, 5, 0, 14, 81, 5, 0, 14, 81, 5, 0, 3, 0, 0, 0, 14, 81, 5, 0, 14, 81, 5, 0, 16, 81, 5, 0, 16, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 14, 81, 5, 0, 14, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 16, 81, 5, 0, 16, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, + 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 18, 209, 2, 0, 3, 0, 0, 0, 10, 17, 3, 0, 10, 17, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 86, 5, 0, 80, 86, 5, 0, + 78, 86, 5, 0, 78, 86, 5, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 3, 0, 0, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 3, 0, 0, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, + 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 78, 86, 5, 0, 80, 86, 5, 0, 80, 86, 5, 0, 80, 86, 5, 0, 80, 86, 5, 0, 3, 0, 0, 0, 78, 86, 5, 0, 78, 86, 5, 0, 78, 86, 5, 0, 3, 0, 0, 0, 78, 86, 5, 0, 78, 86, 5, 0, 78, 86, 5, 0, 80, 86, 5, 0, 74, 22, 3, 0, 97, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 78, 86, 5, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 80, 86, 5, 0, 80, 86, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, + 82, 214, 2, 0, 82, 214, 2, 0, 82, 214, 2, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 84, 22, 3, 0, 97, 150, 2, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 3, 0, 0, 0, 80, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 3, 0, 0, 0, 74, 32, 3, 0, + 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, + 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 3, 0, 0, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, + 3, 0, 0, 0, 74, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 74, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 96, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 80, 96, 5, 0, 80, 96, 5, 0, 80, 96, 5, 0, + 3, 0, 0, 0, 80, 96, 5, 0, 3, 0, 0, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 78, 96, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, 82, 224, 2, 0, + 82, 224, 2, 0, 82, 224, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 96, 5, 0, 78, 96, 5, 0, 91, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, + 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, + 10, 37, 10, 0, 16, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 64, 2, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 10, 37, 10, 0, 9, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, + 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 16, 37, 10, 0, 27, 37, 3, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 18, 229, 2, 0, 27, 101, 4, 0, 27, 101, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, + 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 208, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 208, 17, 10, 0, + 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 3, 0, 0, 0, 201, 17, 10, 0, 3, 0, 0, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, 208, 17, 10, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 210, 209, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 202, 17, 10, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, + 74, 37, 3, 0, 3, 0, 0, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, + 74, 37, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 78, 101, 4, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, + 91, 101, 4, 0, 80, 101, 5, 0, 80, 101, 5, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 74, 37, 3, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 3, 0, 0, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, + 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, 80, 101, 5, 0, + 80, 101, 5, 0, 80, 101, 5, 0, 3, 0, 0, 0, 97, 101, 4, 0, 97, 101, 4, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 80, 101, 5, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 3, 0, 0, 0, 97, 37, 3, 0, 97, 37, 3, 0, 91, 165, 4, 0, 91, 165, 4, 0, 91, 101, 4, 0, 91, 165, 4, 0, + 91, 37, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 91, 37, 1, 0, 91, 37, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 3, 0, 0, 0, 12, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 12, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 208, 73, 5, 0, 208, 73, 5, 0, 208, 73, 5, 0, 219, 9, 3, 0, 219, 73, 4, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 219, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, + 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 212, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 225, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, + 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 165, 89, 4, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, 138, 25, 3, 0, + 138, 25, 3, 0, 138, 25, 3, 0, 156, 25, 0, 0, 152, 89, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 19, 30, 3, 0, 19, 30, 3, 0, 19, 30, 3, 0, 10, 30, 3, 0, + 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, + 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 138, 36, 3, 0, 144, 100, 5, 0, 144, 100, 5, 0, 144, 100, 5, 0, 142, 100, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 36, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, + 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 202, 12, 3, 0, 208, 76, 5, 0, 208, 76, 5, 0, 206, 76, 5, 0, 91, 64, 4, 0, 91, 64, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 10, 5, 3, 0, 16, 69, 5, 0, 16, 69, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 74, 34, 3, 0, 3, 0, 0, 0, 74, 34, 3, 0, + 74, 34, 3, 0, 74, 34, 3, 0, 3, 0, 0, 0, 80, 98, 5, 0, 80, 98, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 80, 16, 10, 0, 78, 16, 10, 0, + 78, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 91, 80, 4, 0, 91, 80, 4, 0, 91, 80, 1, 0, 73, 16, 10, 0, 91, 80, 4, 0, 91, 16, 3, 0, 91, 80, 4, 0, 94, 80, 2, 0, 74, 16, 10, 0, 80, 16, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 208, 2, 0, + 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 82, 208, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, 84, 16, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 22, 3, 0, 219, 22, 3, 0, 91, 128, 1, 0, 91, 128, 1, 0, 219, 86, 4, 0, 91, 64, 4, 0, 215, 150, 4, 0, 219, 22, 3, 0, 219, 150, 1, 0, 219, 150, 1, 0, 219, 22, 3, 0, 208, 86, 5, 0, 208, 86, 5, 0, 208, 86, 5, 0, 194, 22, 1, 0, 208, 86, 5, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, + 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 210, 214, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 208, 86, 5, 0, 202, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, + 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 138, 18, 3, 0, 3, 0, 0, 0, + 144, 82, 5, 0, 144, 82, 5, 0, 144, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 144, 82, 5, 0, 144, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 82, 5, 0, 142, 82, 5, 0, 144, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, 142, 82, 5, 0, + 144, 82, 5, 0, 144, 82, 5, 0, 144, 82, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 146, 1, 0, 155, 146, 1, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 146, 210, 2, 0, 202, 34, 10, 0, 202, 34, 10, 0, + 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 202, 34, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 227, 2, 0, + 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 18, 227, 2, 0, 20, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 33, 35, 10, 0, 33, 35, 10, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, + 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 202, 4, 3, 0, 208, 68, 5, 0, 208, 68, 5, 0, 206, 68, 5, 0, 206, 68, 5, 0, 208, 68, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 4, 3, 0, 219, 4, 3, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, + 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, + 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 3, 0, 0, 0, 144, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 142, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, + 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 144, 17, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 81, 5, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 146, 209, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, + 137, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 155, 17, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 143, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 66, 5, 0, 142, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, 142, 66, 5, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 194, 2, 0, 146, 194, 2, 0, + 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 146, 194, 2, 0, 155, 66, 4, 0, 155, 66, 4, 0, 155, 2, 3, 0, 155, 66, 4, 0, 155, 66, 4, 0, 155, 66, 4, 0, 155, 66, 4, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, + 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 161, 2, 3, 0, 155, 66, 4, 0, 155, 66, 4, 0, 3, 0, 0, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, + 74, 3, 3, 0, 74, 3, 3, 0, 80, 67, 5, 0, 78, 67, 5, 0, 80, 67, 5, 0, 80, 67, 5, 0, 78, 67, 5, 0, 78, 67, 5, 0, 78, 67, 5, 0, 80, 67, 5, 0, 78, 67, 5, 0, 80, 67, 5, 0, 80, 67, 5, 0, 80, 67, 5, 0, 78, 67, 5, 0, 78, 67, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 3, 3, 0, + 91, 3, 3, 0, 91, 3, 3, 0, 91, 3, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 80, 82, 5, 0, 78, 82, 5, 0, 78, 82, 5, 0, + 80, 82, 5, 0, 80, 82, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 82, 4, 0, 91, 82, 4, 0, 91, 82, 4, 0, 91, 82, 4, 0, 91, 82, 4, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 82, 210, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 18, 3, 0, 74, 18, 3, 0, + 74, 18, 3, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 210, 217, 2, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, 136, 7, 3, 0, + 136, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, + 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 155, 33, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 91, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 78, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 144, 64, 5, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 144, 64, 5, 0, 74, 0, 3, 0, 74, 0, 3, 0, 78, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 74, 0, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, 3, 0, 0, 0, 140, 11, 3, 0, + 3, 0, 0, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 139, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, + 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 139, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 3, 0, 0, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 159, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 3, 0, 0, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, + 140, 11, 3, 0, 139, 11, 3, 0, 159, 139, 4, 0, 159, 11, 3, 0, 3, 0, 0, 0, 66, 128, 5, 0, 66, 0, 3, 0, 66, 0, 3, 0, 66, 0, 3, 0, 66, 0, 3, 0, 3, 0, 0, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 84, 0, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 84, 128, 8, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 9, 146, 8, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 128, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, + 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 3, 64, 2, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 143, 64, 5, 0, 143, 64, 5, 0, + 143, 64, 5, 0, 143, 64, 5, 0, 144, 64, 5, 0, 143, 64, 5, 0, 143, 64, 5, 0, 143, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 84, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 200, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 225, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 208, 70, 5, 0, 208, 70, 5, 0, 208, 70, 5, 0, 204, 6, 3, 0, + 200, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 134, 1, 0, 219, 70, 4, 0, 219, 70, 4, 0, 219, 70, 4, 0, 212, 6, 3, 0, 219, 134, 1, 0, 219, 70, 4, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 3, 0, 0, 0, 8, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 8, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 73, 36, 3, 0, 91, 100, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 100, 5, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 87, 64, 4, 0, 91, 64, 4, 0, 92, 0, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 91, 0, 3, 0, 91, 128, 1, 0, 91, 128, 1, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 87, 64, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 3, 0, 0, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 13, 9, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 95, 64, 1, 0, 95, 64, 1, 0, 137, 77, 1, 0, 137, 77, 1, 0, 138, 141, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, + 10, 132, 3, 0, 10, 132, 3, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 84, 128, 3, 0, + 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, + 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 3, 0, 0, 0, 74, 168, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, + 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, + 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 146, 230, 2, 0, 138, 38, 3, 0, 138, 38, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, + 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 211, 2, 3, 0, 208, 66, 5, 0, 208, 66, 5, 0, 219, 2, 3, 0, 219, 66, 4, 0, 219, 66, 4, 0, 219, 66, 4, 0, 219, 66, 4, 0, 219, 66, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 8, 18, 3, 0, 3, 0, 0, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 10, 18, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 206, 97, 5, 0, 206, 97, 5, 0, 208, 97, 5, 0, 208, 97, 5, 0, 206, 97, 5, 0, 225, 33, 3, 0, 225, 33, 3, 0, 225, 33, 3, 0, 225, 33, 3, 0, 208, 97, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 94, 128, 2, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, + 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 27, 156, 4, 0, 27, 156, 4, 0, 27, 156, 1, 0, 27, 156, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, + 208, 94, 5, 0, 208, 94, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 94, 4, 0, 219, 94, 4, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 210, 222, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 144, 93, 5, 0, 142, 93, 5, 0, 142, 93, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 29, 3, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, + 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 79, 5, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 79, 4, 0, + 91, 79, 4, 0, 91, 79, 4, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 91, 15, 3, 0, 3, 0, 0, 0, 73, 0, 3, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 82, 207, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 15, 3, 0, 91, 15, 3, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 201, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 3, 0, 0, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 14, 70, 5, 0, 14, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, + 14, 70, 5, 0, 14, 70, 5, 0, 16, 70, 5, 0, 16, 70, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 16, 70, 5, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, + 16, 70, 5, 0, 14, 70, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 18, 198, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 6, 3, 0, 27, 70, 4, 0, 27, 70, 4, 0, 27, 70, 4, 0, 202, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 35, 10, 0, 202, 35, 10, 0, 201, 35, 10, 0, + 219, 35, 10, 0, 219, 35, 10, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 78, 87, 5, 0, 80, 87, 5, 0, 80, 87, 5, 0, 78, 87, 5, 0, 78, 87, 5, 0, 91, 87, 4, 0, 91, 87, 4, 0, 74, 23, 3, 0, 73, 23, 3, 0, 73, 23, 3, 0, 78, 87, 5, 0, 80, 87, 5, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 136, 11, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, + 72, 6, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 78, 87, 5, 0, 78, 87, 5, 0, 80, 87, 5, 0, 78, 87, 5, 0, 78, 87, 5, 0, 80, 87, 5, 0, 78, 87, 5, 0, 78, 87, 5, 0, 91, 87, 4, 0, 78, 87, 5, 0, 80, 87, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, 82, 215, 2, 0, + 82, 215, 2, 0, 82, 215, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 6, 0, + 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, + 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, + 74, 204, 6, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 8, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 77, 3, 0, 80, 77, 5, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 96, 13, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, + 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, + 3, 0, 0, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 74, 77, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 158, 129, 2, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 91, 0, 2, 0, 91, 64, 0, 0, 91, 64, 0, 0, 91, 0, 2, 0, 91, 0, 2, 0, 91, 128, 1, 0, 91, 128, 1, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 192, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, 91, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, 91, 128, 3, 0, 91, 128, 3, 0, 91, 128, 3, 0, 86, 128, 3, 0, 86, 128, 3, 0, 86, 128, 3, 0, 91, 64, 0, 0, 91, 128, 3, 0, 91, 64, 0, 0, 3, 0, 0, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 128, 1, 0, 91, 128, 1, 0, + 87, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, 91, 128, 3, 0, 91, 128, 3, 0, 96, 128, 3, 0, 87, 128, 3, 0, 96, 128, 3, 0, 96, 128, 3, 0, 96, 128, 3, 0, 3, 0, 0, 0, 91, 128, 3, 0, 94, 64, 2, 0, 91, 128, 2, 0, 91, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 66, 128, 5, 0, 3, 0, 0, 0, 91, 128, 1, 0, 91, 128, 3, 0, 91, 128, 3, 0, 94, 64, 2, 0, 91, 128, 2, 0, 91, 128, 3, 0, 91, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 128, 3, 0, + 96, 128, 3, 0, 91, 64, 0, 0, 87, 128, 3, 0, 91, 64, 0, 0, 91, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 82, 128, 3, 0, 91, 64, 1, 0, 91, 64, 1, 0, 96, 128, 3, 0, 96, 128, 3, 0, 96, 128, 3, 0, 91, 128, 1, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 128, 2, 0, 94, 64, 2, 0, 96, 128, 3, 0, 95, 128, 3, 0, 97, 128, 3, 0, 94, 64, 2, 0, 94, 64, 2, 0, 3, 0, 0, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 97, 0, 8, 0, 97, 128, 8, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, + 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 161, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, + 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 138, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, + 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 20, 15, 3, 0, 20, 15, 3, 0, 20, 15, 3, 0, 20, 15, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, + 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 19, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 10, 11, 3, 0, 19, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 202, 27, 3, 0, 208, 91, 5, 0, 208, 91, 5, 0, 208, 91, 5, 0, + 208, 91, 5, 0, 208, 91, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, + 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 74, 38, 3, 0, 3, 0, 0, 0, 91, 102, 4, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, + 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 155, 103, 4, 0, 147, 39, 3, 0, 147, 39, 3, 0, 147, 39, 3, 0, 147, 39, 3, 0, 147, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, + 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, 202, 26, 3, 0, + 202, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 210, 218, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, + 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 140, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, + 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 136, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, + 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 1, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, + 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 3, 0, 0, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 204, 38, 3, 0, 3, 0, 0, 0, 204, 38, 3, 0, 204, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, + 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, 200, 38, 3, 0, + 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 200, 38, 3, 0, 200, 38, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 3, 0, 0, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, + 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 74, 7, 3, 0, 3, 0, 0, 0, 74, 7, 3, 0, 74, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 7, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, + 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 202, 1, 3, 0, 3, 0, 0, 0, 219, 65, 4, 0, 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, + 212, 1, 3, 0, 212, 1, 3, 0, 212, 1, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, + 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 138, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, 148, 24, 3, 0, + 148, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, + 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 10, 13, 3, 0, 3, 0, 0, 0, 10, 13, 3, 0, 10, 13, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 20, 13, 3, 0, 20, 13, 3, 0, 20, 13, 3, 0, 20, 13, 3, 0, 20, 13, 3, 0, 202, 28, 3, 0, + 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 202, 28, 3, 0, 212, 28, 3, 0, 212, 28, 3, 0, 212, 28, 3, 0, 212, 28, 3, 0, + 212, 28, 3, 0, 212, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 92, 4, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, + 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 202, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 19, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, + 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 21, 3, 0, 212, 21, 3, 0, 202, 21, 3, 0, 202, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, + 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, + 212, 21, 3, 0, 212, 21, 3, 0, 10, 16, 3, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 3, 0, 0, 0, 16, 80, 5, 0, 16, 80, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 3, 0, 0, 0, 10, 16, 3, 0, 10, 16, 3, 0, + 10, 16, 3, 0, 3, 0, 0, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, 10, 16, 3, 0, + 10, 16, 3, 0, 10, 16, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 80, 5, 0, 16, 80, 5, 0, 16, 80, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 80, 5, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 20, 16, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 80, 4, 0, 27, 16, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 208, 84, 5, 0, + 208, 84, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 20, 3, 0, 212, 20, 3, 0, 212, 20, 3, 0, 212, 20, 3, 0, 212, 20, 3, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 84, 4, 0, 219, 212, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 91, 66, 4, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, + 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 74, 29, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 84, 29, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, + 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 74, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 84, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, + 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 138, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 28, 3, 0, 155, 28, 3, 0, 155, 28, 3, 0, + 155, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 148, 28, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, + 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 212, 14, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 208, 93, 5, 0, 208, 93, 5, 0, 208, 93, 5, 0, 208, 93, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 221, 2, 0, 210, 221, 2, 0, + 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 210, 221, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, + 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 148, 1, 3, 0, 3, 0, 0, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, + 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 3, 0, 0, 0, 16, 104, 5, 0, 16, 104, 5, 0, 23, 104, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 40, 3, 0, 10, 40, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 202, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, + 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 138, 32, 3, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 144, 96, 5, 0, 148, 32, 3, 0, 148, 32, 3, 0, + 148, 32, 3, 0, 148, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 155, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 10, 27, 3, 0, 16, 91, 5, 0, 16, 91, 5, 0, 16, 91, 5, 0, 16, 91, 5, 0, 27, 27, 3, 0, 27, 27, 3, 0, 27, 27, 3, 0, + 27, 27, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 6, 3, 0, 138, 6, 3, 0, + 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 138, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 148, 6, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, + 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 138, 9, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 68, 5, 0, + 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 91, 68, 4, 0, 91, 68, 4, 0, 91, 4, 3, 0, 91, 4, 3, 0, 91, 4, 3, 0, 91, 4, 3, 0, 91, 4, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, + 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 84, 4, 3, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 82, 196, 2, 0, 80, 68, 5, 0, 74, 4, 3, 0, 74, 4, 3, 0, 80, 68, 5, 0, 80, 68, 5, 0, 74, 4, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 68, 5, 0, 91, 81, 4, 0, 91, 81, 4, 0, 80, 81, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 66, 17, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 10, 33, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 225, 2, 0, + 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 18, 225, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, + 80, 69, 5, 0, 80, 69, 5, 0, 78, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 3, 0, 0, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 82, 197, 2, 0, 91, 69, 4, 0, 91, 69, 4, 0, 91, 69, 4, 0, + 91, 69, 4, 0, 74, 5, 3, 0, 78, 69, 5, 0, 78, 69, 5, 0, 74, 5, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, + 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 10, 20, 3, 0, 16, 84, 5, 0, 27, 20, 3, 0, 27, 148, 4, 0, 10, 20, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, + 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 84, 32, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 3, 0, 0, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, + 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 138, 16, 3, 0, 142, 80, 5, 0, 142, 80, 5, 0, 142, 80, 5, 0, 144, 80, 5, 0, 144, 80, 5, 0, 144, 80, 5, 0, 142, 80, 5, 0, 142, 80, 5, 0, 144, 80, 5, 0, 142, 80, 5, 0, 144, 80, 5, 0, 144, 80, 5, 0, 155, 80, 4, 0, 155, 80, 4, 0, 155, 16, 3, 0, 155, 80, 4, 0, + 155, 80, 4, 0, 155, 16, 3, 0, 144, 80, 5, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, + 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 3, 0, 0, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 138, 23, 3, 0, 155, 87, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 14, 96, 5, 0, 14, 96, 5, 0, 14, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, + 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 16, 96, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 18, 224, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 80, 75, 5, 0, 80, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, + 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, + 3, 0, 0, 0, 144, 64, 5, 0, 80, 75, 5, 0, 74, 11, 3, 0, 78, 75, 5, 0, 78, 75, 5, 0, 80, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 75, 5, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 74, 11, 3, 0, 78, 75, 5, 0, 78, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, + 80, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 80, 75, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 206, 88, 5, 0, 206, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, + 206, 88, 5, 0, 208, 88, 5, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 219, 88, 4, 0, 219, 88, 4, 0, 219, 88, 4, 0, 219, 88, 4, 0, 219, 24, 3, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 210, 216, 2, 0, 219, 88, 4, 0, 219, 88, 4, 0, 3, 0, 0, 0, 219, 24, 3, 0, + 208, 88, 5, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 138, 37, 3, 0, 138, 37, 3, 0, 155, 37, 3, 0, 138, 37, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 146, 229, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, + 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 206, 95, 5, 0, 206, 95, 5, 0, 206, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 206, 95, 5, 0, 206, 95, 5, 0, 206, 95, 5, 0, 206, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 206, 95, 5, 0, 208, 95, 5, 0, 208, 95, 5, 0, 219, 159, 4, 0, + 219, 95, 4, 0, 219, 95, 4, 0, 219, 159, 1, 0, 219, 159, 1, 0, 219, 31, 3, 0, 219, 31, 3, 0, 219, 31, 3, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 219, 95, 4, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, + 202, 31, 3, 0, 208, 95, 5, 0, 208, 95, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 86, 5, 0, 155, 86, 4, 0, 155, 86, 4, 0, 155, 22, 3, 0, 138, 22, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, + 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 146, 214, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, 219, 150, 4, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, + 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 144, 98, 5, 0, 142, 98, 5, 0, 144, 98, 5, 0, 142, 98, 5, 0, 142, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 144, 98, 5, 0, 142, 98, 5, 0, 144, 98, 5, 0, 138, 34, 3, 0, 155, 34, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 146, 226, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, + 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 78, 1, 10, 0, 78, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 78, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, 80, 1, 10, 0, + 80, 1, 10, 0, 80, 1, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 82, 193, 2, 0, 84, 1, 10, 0, 84, 1, 10, 0, 91, 65, 4, 0, 91, 65, 4, 0, 91, 65, 4, 0, 97, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, + 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 74, 1, 10, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 78, 72, 5, 0, 78, 72, 5, 0, 78, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, + 80, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 78, 72, 5, 0, 80, 72, 5, 0, 80, 72, 5, 0, 91, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 18, 231, 2, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, + 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 20, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 39, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 10, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 3, 0, 0, 0, 10, 8, 3, 0, 10, 8, 3, 0, 3, 0, 0, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, + 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 10, 8, 3, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 14, 72, 5, 0, 3, 0, 0, 0, 14, 72, 5, 0, 14, 72, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 72, 5, 0, 16, 72, 5, 0, 14, 72, 5, 0, 16, 72, 5, 0, 10, 8, 3, 0, 14, 72, 5, 0, + 10, 8, 3, 0, 14, 72, 5, 0, 16, 72, 5, 0, 27, 72, 4, 0, 27, 72, 4, 0, 27, 72, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, 18, 200, 2, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, + 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 10, 24, 3, 0, 14, 88, 5, 0, 14, 88, 5, 0, 14, 88, 5, 0, 16, 88, 5, 0, 16, 88, 5, 0, 16, 88, 5, 0, 16, 88, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 88, 5, 0, 16, 88, 5, 0, + 14, 88, 5, 0, 14, 88, 5, 0, 14, 88, 5, 0, 14, 88, 5, 0, 16, 88, 5, 0, 10, 24, 3, 0, 27, 152, 4, 0, 10, 24, 3, 0, 14, 88, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 155, 40, 3, 0, 155, 104, 4, 0, 155, 104, 4, 0, 155, 104, 4, 0, 155, 104, 4, 0, 155, 168, 4, 0, 155, 40, 3, 0, 144, 104, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 74, 33, 3, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 78, 97, 5, 0, 78, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 91, 161, 4, 0, 91, 97, 4, 0, 91, 97, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 3, 0, 0, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, + 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 202, 3, 3, 0, 206, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, + 3, 0, 0, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 208, 67, 5, 0, 206, 67, 5, 0, 208, 67, 5, 0, 202, 3, 3, 0, 219, 67, 4, 0, 219, 67, 4, 0, 219, 67, 4, 0, 219, 67, 4, 0, 219, 67, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 210, 195, 2, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, 212, 3, 3, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 149, 4, 0, 27, 149, 1, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 10, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 3, 0, 0, 0, 14, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 14, 85, 5, 0, 16, 85, 5, 0, + 16, 85, 5, 0, 14, 85, 5, 0, 16, 85, 5, 0, 16, 85, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 3, 0, 0, 0, 202, 10, 3, 0, 202, 10, 3, 0, 3, 0, 0, 0, 202, 10, 3, 0, + 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 202, 10, 3, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, + 208, 74, 5, 0, 208, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 208, 74, 5, 0, 3, 0, 0, 0, 208, 74, 5, 0, 208, 74, 5, 0, 3, 0, 0, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 208, 74, 5, 0, 202, 10, 3, 0, 208, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 210, 202, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 3, 0, 0, 0, + 138, 10, 3, 0, 138, 10, 3, 0, 3, 0, 0, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, 138, 10, 3, 0, + 138, 10, 3, 0, 138, 10, 3, 0, 142, 74, 5, 0, 142, 74, 5, 0, 142, 74, 5, 0, 142, 74, 5, 0, 142, 74, 5, 0, 3, 0, 0, 0, 144, 74, 5, 0, 144, 74, 5, 0, 3, 0, 0, 0, 142, 74, 5, 0, 142, 74, 5, 0, 144, 74, 5, 0, 142, 74, 5, 0, 144, 74, 5, 0, 138, 10, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 146, 202, 2, 0, + 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 146, 202, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, 74, 20, 3, 0, + 80, 84, 5, 0, 80, 84, 5, 0, 78, 84, 5, 0, 78, 84, 5, 0, 91, 20, 3, 0, 91, 20, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 74, 19, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 163, 2, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, + 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 91, 99, 4, 0, 202, 39, 3, 0, 202, 39, 3, 0, + 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 3, 0, 0, 0, 219, 103, 4, 0, 219, 103, 4, 0, 219, 103, 4, 0, 219, 103, 4, 0, + 219, 103, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, + 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 27, 7, 3, 0, 27, 7, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 3, 0, 0, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 1, 0, 2, 9, 0, 0, + 2, 73, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, + 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, + 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, + 10, 23, 3, 0, 10, 23, 3, 0, 10, 23, 3, 0, 3, 0, 0, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 18, 215, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 27, 87, 4, 0, 27, 87, 4, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, + 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, + 202, 37, 3, 0, 3, 0, 0, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 210, 229, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, + 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 10, 3, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 67, 5, 0, 16, 67, 5, 0, 16, 67, 5, 0, 16, 67, 5, 0, 16, 67, 5, 0, 27, 67, 4, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 9, 14, 3, 0, 9, 14, 3, 0, 9, 14, 3, 0, 9, 14, 3, 0, 27, 78, 4, 0, 33, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, + 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 18, 206, 2, 0, 3, 0, 0, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 20, 14, 3, 0, 3, 0, 0, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 84, 21, 3, 0, 91, 85, 4, 0, 91, 85, 4, 0, + 91, 21, 3, 0, 91, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 93, 5, 0, 10, 29, 3, 0, 14, 93, 5, 0, + 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 93, 5, 0, 16, 93, 5, 0, 16, 93, 5, 0, 16, 93, 5, 0, + 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 9, 29, 3, 0, 137, 99, 1, 0, 73, 89, 1, 0, 155, 76, 1, 0, 137, 76, 1, 0, 208, 16, 1, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 142, 76, 5, 0, 142, 76, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, + 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 3, 0, 0, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, + 201, 15, 3, 0, 201, 15, 3, 0, 201, 15, 3, 0, 3, 0, 0, 0, 201, 15, 3, 0, 201, 15, 3, 0, 3, 0, 0, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 13, 9, 0, 138, 13, 9, 0, 138, 13, 9, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, + 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 8, 3, 0, + 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, + 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 225, 8, 3, 0, 208, 72, 5, 0, 208, 72, 5, 0, + 219, 72, 4, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 144, 75, 5, 0, 144, 75, 5, 0, 144, 75, 5, 0, 161, 11, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 76, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 3, 0, 0, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 76, 0, 3, 0, 72, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 27, 95, 4, 0, 27, 95, 4, 0, 27, 95, 4, 0, 27, 95, 4, 0, 27, 31, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 16, 95, 5, 0, + 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 3, 0, 0, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, + 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, + 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 80, 74, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 80, 78, 5, 0, 80, 78, 5, 0, + 80, 78, 5, 0, 80, 78, 5, 0, 80, 78, 5, 0, 80, 78, 5, 0, 80, 78, 5, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 73, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 82, 206, 2, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 14, 3, 0, 97, 14, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, + 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 10, 38, 3, 0, 16, 102, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 80, 103, 5, 0, 80, 103, 5, 0, 80, 103, 5, 0, 80, 103, 5, 0, 82, 231, 2, 0, 82, 231, 2, 0, + 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 82, 231, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 94, 103, 2, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 3, 0, 0, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, + 138, 21, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 148, 21, 3, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 144, 85, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 208, 64, 5, 0, 201, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, + 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 210, 192, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 219, 0, 0, 0, 219, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 97, 128, 2, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 94, 128, 2, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 97, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, + 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 160, 1, 3, 0, 160, 1, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, + 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 97, 0, 7, 0, 161, 141, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 0, 0, 0, 3, 0, 0, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, + 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 128, 3, 0, 3, 0, 0, 0, 66, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, + 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, + 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 3, 0, 0, 0, 3, 0, 0, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, + 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 12, 10, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, + 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, 76, 6, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 140, 11, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 128, 2, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 97, 128, 2, 0, 72, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 128, 8, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 64, 2, 0, 97, 0, 3, 0, 96, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, + 76, 0, 3, 0, 97, 0, 3, 0, 140, 11, 3, 0, 97, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 12, 18, 3, 0, 12, 146, 8, 0, 76, 0, 3, 0, 76, 0, 3, 0, 97, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 12, 18, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 74, 0, 3, 0, 72, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 8, 18, 3, 0, 97, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 0, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, + 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 76, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, + 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, + 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 204, 6, 3, 0, 200, 6, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 138, 7, 3, 0, 144, 71, 5, 0, 143, 71, 5, 0, 143, 71, 5, 0, 143, 71, 5, 0, 155, 7, 3, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 144, 71, 5, 0, 155, 7, 3, 0, 137, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, + 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 140, 7, 3, 0, 136, 7, 3, 0, 137, 7, 3, 0, 137, 7, 3, 0, 144, 71, 5, 0, 144, 71, 5, 0, 95, 0, 3, 0, 95, 0, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, + 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 73, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 12, 18, 3, 0, + 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 10, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, + 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 12, 18, 3, 0, 8, 18, 3, 0, 91, 128, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, + 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 12, 146, 3, 0, 92, 0, 0, 0, 91, 128, 3, 0, 88, 64, 0, 0, 95, 128, 3, 0, + 86, 128, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, + 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 140, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, + 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, + 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 204, 14, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, + 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 12, 39, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, + 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, + 76, 21, 3, 0, 76, 21, 3, 0, 76, 21, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, + 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 76, 0, 3, 0, 96, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, + 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 72, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, + 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 204, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, + 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, + 200, 0, 3, 0, 200, 0, 3, 0, 200, 0, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, + 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 91, 0, 3, 0, 9, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 7, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, + 137, 11, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 137, 7, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, 136, 11, 3, 0, + 136, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 139, 11, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, + 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 72, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, + 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 10, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, 8, 18, 3, 0, + 95, 0, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, + 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 72, 6, 3, 0, 95, 128, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, + 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 8, 146, 3, 0, 92, 0, 0, 0, 96, 128, 3, 0, 88, 64, 0, 0, 96, 128, 3, 0, 92, 0, 0, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, + 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 136, 8, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, + 74, 31, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, + 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 200, 14, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, + 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 8, 39, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, + 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 72, 21, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, + 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 74, 30, 3, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 73, 30, 3, 0, 80, 94, 5, 0, + 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 80, 94, 5, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 137, 1, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 202, 7, 3, 0, 202, 7, 3, 0, 208, 71, 5, 0, 208, 71, 5, 0, 91, 64, 4, 0, 91, 64, 4, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, 210, 199, 2, 0, + 210, 199, 2, 0, 210, 199, 2, 0, 219, 7, 3, 0, 201, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 201, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 202, 25, 3, 0, 201, 25, 3, 0, + 201, 25, 3, 0, 201, 25, 3, 0, 201, 25, 3, 0, 201, 25, 3, 0, 201, 25, 3, 0, 219, 89, 4, 0, 219, 89, 4, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 137, 11, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, + 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 9, 18, 3, 0, 137, 11, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 128, 1, 0, 73, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 87, 192, 4, 0, 87, 192, 4, 0, 91, 64, 4, 0, + 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 101, 64, 4, 0, 91, 64, 0, 0, 91, 64, 0, 0, 91, 128, 3, 0, 97, 128, 3, 0, 137, 76, 1, 0, 74, 128, 3, 0, 147, 140, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 97, 128, 3, 0, 97, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 87, 64, 1, 0, 92, 0, 0, 0, 88, 64, 0, 0, 88, 64, 0, 0, 97, 128, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 78, 76, 5, 0, + 78, 76, 5, 0, 87, 128, 3, 0, 73, 128, 3, 0, 73, 128, 3, 0, 73, 128, 3, 0, 73, 128, 3, 0, 73, 64, 5, 0, 97, 128, 3, 0, 97, 128, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 147, 140, 3, 0, 137, 76, 1, 0, 74, 64, 1, 0, 91, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 91, 64, 1, 0, 73, 0, 9, 0, 201, 79, 1, 0, 201, 79, 1, 0, 202, 143, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 73, 104, 1, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, + 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 74, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 73, 19, 3, 0, 91, 83, 4, 0, 91, 83, 4, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, + 137, 38, 3, 0, 155, 102, 4, 0, 155, 166, 1, 0, 155, 102, 4, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, + 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 95, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, 73, 0, 3, 0, + 73, 0, 3, 0, 73, 0, 3, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 201, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 225, 23, 10, 0, 225, 23, 10, 0, 225, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 88, 64, 0, 0, 91, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 64, 0, 0, 91, 64, 1, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, 202, 15, 9, 0, + 73, 0, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 73, 64, 1, 0, 73, 64, 1, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 206, 71, 5, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, + 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 208, 71, 5, 0, 206, 71, 5, 0, 208, 71, 5, 0, 202, 7, 3, 0, 206, 71, 5, 0, + 206, 71, 5, 0, 206, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 208, 71, 5, 0, 206, 71, 5, 0, 206, 71, 5, 0, 202, 7, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, + 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, + 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 74, 22, 3, 0, 80, 86, 5, 0, 80, 86, 5, 0, 74, 22, 3, 0, 78, 86, 5, 0, 78, 86, 5, 0, 74, 37, 3, 0, 97, 165, 4, 0, 97, 165, 4, 0, 97, 165, 4, 0, 91, 165, 4, 0, 91, 37, 3, 0, 91, 165, 4, 0, 91, 165, 4, 0, 91, 37, 1, 0, 91, 165, 4, 0, + 91, 165, 4, 0, 91, 101, 4, 0, 91, 37, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 165, 1, 0, 91, 37, 1, 0, 97, 37, 3, 0, 91, 165, 1, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 80, 101, 5, 0, 80, 101, 5, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 97, 37, 3, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, + 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 219, 87, 4, 0, 219, 87, 4, 0, 219, 23, 3, 0, 219, 23, 3, 0, 219, 23, 3, 0, 219, 23, 3, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, + 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 202, 23, 10, 0, + 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 202, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 208, 23, 10, 0, 206, 23, 10, 0, + 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 202, 23, 10, 0, 206, 23, 10, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 210, 215, 2, 0, 206, 23, 10, 0, 206, 23, 10, 0, 206, 23, 10, 0, 208, 23, 10, 0, 225, 23, 10, 0, 225, 23, 10, 0, 74, 76, 6, 0, + 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, + 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 76, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, + 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 140, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, + 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 74, 204, 6, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, 202, 9, 3, 0, + 202, 9, 3, 0, 202, 9, 3, 0, 151, 69, 4, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 161, 5, 3, 0, 155, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, + 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 138, 5, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, + 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 10, 30, 3, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, + 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 74, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 78, 16, 10, 0, + 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 80, 16, 10, 0, 78, 16, 10, 0, 78, 16, 10, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 208, 86, 5, 0, 208, 86, 5, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, + 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 202, 22, 3, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, + 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, 10, 35, 10, 0, + 10, 35, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, + 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 138, 17, 10, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, + 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 138, 2, 3, 0, 144, 66, 5, 0, 142, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, 144, 66, 5, 0, 142, 66, 5, 0, + 142, 66, 5, 0, 142, 66, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 142, 97, 5, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, + 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 142, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 142, 97, 5, 0, 142, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 142, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 144, 97, 5, 0, 138, 33, 3, 0, 138, 33, 3, 0, + 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 146, 225, 2, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 138, 33, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, + 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 3, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, + 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, + 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 18, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, + 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 74, 36, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 13, 9, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 87, 64, 1, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, + 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 15, 9, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, + 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 202, 143, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, + 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 74, 140, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, + 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 10, 132, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, + 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 138, 140, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, + 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 74, 168, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, + 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 138, 38, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, + 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, 202, 2, 3, 0, + 202, 33, 3, 0, 202, 33, 3, 0, 208, 97, 5, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 208, 97, 5, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 208, 97, 5, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, + 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 202, 33, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, + 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 10, 28, 3, 0, 206, 94, 5, 0, 206, 94, 5, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, + 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 202, 30, 3, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, + 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 206, 94, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, 208, 71, 5, 0, + 208, 71, 5, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 202, 7, 3, 0, 219, 7, 3, 0, 219, 7, 3, 0, 219, 7, 3, 0, 202, 7, 3, 0, 219, 135, 4, 0, 202, 7, 3, 0, 202, 7, 3, 0, 208, 71, 5, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, 146, 207, 2, 0, + 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 138, 15, 3, 0, 144, 79, 5, 0, + 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 144, 79, 5, 0, 91, 64, 4, 0, 155, 79, 4, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, 138, 29, 3, 0, + 80, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 78, 79, 5, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, + 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 74, 15, 3, 0, 80, 79, 5, 0, 78, 79, 5, 0, 78, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 78, 79, 5, 0, 78, 79, 5, 0, 80, 79, 5, 0, 80, 79, 5, 0, 78, 79, 5, 0, 78, 79, 5, 0, 10, 6, 3, 0, 10, 6, 3, 0, + 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, + 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 10, 6, 3, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, + 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, 202, 35, 10, 0, + 202, 35, 10, 0, 208, 35, 10, 0, 208, 35, 10, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, + 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 23, 3, 0, 74, 204, 5, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, + 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 204, 5, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, + 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 74, 12, 6, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 159, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 88, 64, 0, 0, 92, 0, 0, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 161, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, + 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 138, 1, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, + 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 10, 19, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, + 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, 202, 5, 3, 0, + 202, 5, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, + 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 10, 15, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, + 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 138, 39, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, + 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 31, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, + 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, + 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 74, 9, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, + 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 10, 1, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, + 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 202, 18, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, + 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 74, 27, 3, 0, 97, 27, 3, 0, 97, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, 84, 27, 3, 0, + 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, + 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 10, 22, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, + 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 138, 30, 3, 0, 148, 30, 3, 0, 148, 30, 3, 0, 155, 30, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, + 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 74, 24, 3, 0, 84, 24, 3, 0, 84, 24, 3, 0, 84, 24, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, + 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 225, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, + 202, 20, 3, 0, 202, 20, 3, 0, 202, 20, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, + 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 74, 2, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, + 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 10, 26, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, + 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 202, 29, 3, 0, 10, 40, 3, 0, + 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, + 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 10, 40, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, + 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 202, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 212, 32, 3, 0, 78, 68, 5, 0, 80, 68, 5, 0, 78, 68, 5, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, + 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 74, 4, 3, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, + 80, 68, 5, 0, 80, 68, 5, 0, 80, 68, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 78, 81, 5, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, + 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 74, 17, 3, 0, 78, 81, 5, 0, 78, 81, 5, 0, 78, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 78, 81, 5, 0, 78, 81, 5, 0, 80, 81, 5, 0, 80, 81, 5, 0, 91, 17, 3, 0, 91, 17, 3, 0, 66, 17, 3, 0, 91, 81, 4, 0, + 91, 81, 4, 0, 80, 69, 5, 0, 80, 69, 5, 0, 80, 69, 5, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, + 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 74, 5, 3, 0, 144, 95, 5, 0, 144, 95, 5, 0, 142, 95, 5, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, + 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 142, 95, 5, 0, 142, 95, 5, 0, 142, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, + 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 142, 95, 5, 0, 142, 95, 5, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 138, 31, 3, 0, 155, 95, 4, 0, 155, 95, 4, 0, 155, 31, 3, 0, 155, 95, 4, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 144, 95, 5, 0, 155, 31, 3, 0, 142, 95, 5, 0, 144, 95, 5, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, + 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 146, 223, 2, 0, 138, 31, 3, 0, 155, 159, 4, 0, 138, 31, 3, 0, 155, 95, 4, 0, 155, 95, 4, 0, 155, 95, 4, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, + 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 10, 32, 3, 0, 16, 96, 5, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, + 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, + 202, 24, 3, 0, 202, 24, 3, 0, 202, 24, 3, 0, 206, 88, 5, 0, 206, 88, 5, 0, 206, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 208, 88, 5, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, + 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 138, 37, 3, 0, 142, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, + 144, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 144, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 142, 101, 5, 0, 144, 101, 5, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, + 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 202, 31, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, + 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, 138, 22, 3, 0, + 138, 22, 3, 0, 142, 86, 5, 0, 142, 86, 5, 0, 142, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 144, 86, 5, 0, 142, 86, 5, 0, 142, 86, 5, 0, 144, 86, 5, 0, 142, 86, 5, 0, 144, 86, 5, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, + 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 138, 34, 3, 0, 74, 8, 3, 0, + 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, + 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 74, 8, 3, 0, 138, 40, 3, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, + 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 138, 40, 3, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 142, 104, 5, 0, 138, 40, 3, 0, 144, 104, 5, 0, + 144, 104, 5, 0, 144, 104, 5, 0, 144, 104, 5, 0, 155, 168, 4, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, + 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 74, 33, 3, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, + 80, 97, 5, 0, 78, 97, 5, 0, 80, 97, 5, 0, 80, 97, 5, 0, 91, 97, 4, 0, 91, 97, 4, 0, 91, 97, 4, 0, 74, 33, 3, 0, 91, 161, 4, 0, 91, 161, 4, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, + 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 138, 27, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, + 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 202, 39, 3, 0, 10, 7, 3, 0, + 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, + 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 7, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, + 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 0, 0, 10, 9, 0, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 73, 0, 0, 10, 73, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 73, 0, 0, 10, 9, 3, 0, + 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, + 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 0, 0, 10, 73, 0, 0, 10, 73, 0, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 10, 9, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, + 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 0, 0, + 202, 77, 0, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 13, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, + 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 202, 37, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, + 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 10, 14, 3, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 16, 78, 5, 0, 27, 78, 4, 0, 27, 78, 4, 0, 27, 78, 4, 0, 27, 14, 3, 0, 27, 14, 3, 0, 33, 14, 3, 0, 33, 14, 3, 0, 33, 14, 3, 0, 33, 14, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, + 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, + 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 10, 29, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, + 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 138, 163, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, + 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 16, 3, 0, 202, 143, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, + 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 138, 141, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, + 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 74, 153, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, + 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 202, 8, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, + 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, 74, 14, 3, 0, + 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, + 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 74, 39, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, + 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 138, 21, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 66, 0, 3, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, + 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 144, 65, 5, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, + 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 82, 229, 2, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 84, 37, 3, 0, 97, 101, 4, 0, 80, 101, 5, 0, 97, 37, 3, 0, 80, 101, 5, 0, 97, 37, 3, 0, 80, 101, 5, 0, 92, 37, 0, 0, 88, 101, 0, 0, 92, 37, 0, 0, + 88, 101, 0, 0, 78, 101, 5, 0, 78, 101, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 71, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 71, 5, 0, + 144, 71, 5, 0, 91, 128, 3, 0, 87, 128, 3, 0, 87, 128, 3, 0, 86, 128, 3, 0, 86, 128, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 78, 64, 5, 0, 78, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 78, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, + 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 144, 64, 5, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, + 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, + 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 16, 95, 5, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 33, 31, 3, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, + 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 14, 93, 5, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, + 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 82, 192, 2, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, + 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 146, 8, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 19, 18, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, + 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, + 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 147, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 148, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, + 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 211, 39, 3, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 0, 3, 0, 97, 192, 0, 0, 97, 0, 3, 0, 97, 128, 1, 0, 97, 128, 1, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, + 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, + 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, + 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 84, 128, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, + 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 212, 21, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, + 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 84, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 97, 35, 3, 0, 94, 163, 2, 0, 94, 163, 2, 0, 94, 163, 2, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, + 84, 0, 3, 0, 84, 0, 3, 0, 84, 0, 3, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 84, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 0, 1, 0, 101, 64, 4, 0, 101, 64, 4, 0, 101, 64, 4, 0, 66, 0, 5, 0, 130, 64, 5, 0, 130, 192, 7, 0, 66, 64, 5, 0, + 66, 64, 5, 0, 87, 64, 4, 0, 87, 0, 1, 0, 87, 64, 4, 0, 87, 64, 4, 0, 87, 192, 4, 0, 87, 128, 8, 0, 91, 128, 8, 0, 91, 0, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 92, 0, 0, 0, 90, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 92, 0, 0, 0, 90, 192, 0, 0, 91, 128, 8, 0, 91, 128, 8, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 192, 3, 0, 91, 192, 3, 0, 91, 192, 3, 0, 91, 64, 4, 0, + 99, 192, 8, 0, 100, 192, 8, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 101, 0, 1, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 128, 2, 0, 91, 0, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 128, 8, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 0, 3, 0, 86, 0, 3, 0, 86, 0, 3, 0, + 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 96, 0, 2, 0, 92, 0, 0, 0, 88, 64, 0, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 64, 1, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 91, 0, 3, 0, 96, 0, 3, 0, 91, 0, 3, 0, 86, 0, 3, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, + 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, 91, 64, 4, 0, 91, 64, 4, 0, 101, 64, 4, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, + 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 66, 64, 5, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, + 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 4, 64, 8, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, + 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, 5, 64, 10, 0, + 5, 64, 10, 0, 5, 64, 10, 0, 91, 192, 0, 0, 91, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 192, 0, 0, 91, 192, 0, 0, 91, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 192, 0, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 64, 4, 0, 91, 0, 3, 0, + 87, 64, 4, 0, 91, 0, 0, 0, 91, 64, 4, 0, 87, 0, 3, 0, 91, 0, 3, 0, 90, 192, 0, 0, 89, 192, 0, 0, 91, 0, 3, 0, 91, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, + 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 92, 0, 0, 0, 88, 64, 0, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 128, 8, 0, 97, 0, 3, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 64, 2, 0, 96, 64, 2, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 128, 8, 0, + 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 128, 8, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 192, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 96, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, 96, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, + 94, 64, 2, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 128, 2, 0, 94, 64, 2, 0, 94, 64, 2, 0, 94, 128, 2, 0, + 94, 64, 2, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 95, 128, 7, 0, 95, 128, 7, 0, 95, 128, 7, 0, 95, 128, 7, 0, 95, 128, 7, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, + 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 16, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, + 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 4, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, + 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 161, 140, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, + 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 140, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, + 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 97, 128, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, + 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 225, 143, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, + 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 97, 168, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, + 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 161, 11, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, + 33, 31, 3, 0, 33, 31, 3, 0, 33, 31, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, + 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 8, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, + 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, + 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 192, 0, 0, 97, 64, 1, 0, 97, 64, 1, 0, 97, 64, 1, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 0, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, + 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, 97, 64, 7, 0, + 97, 64, 7, 0, 97, 64, 7, 0, 97, 128, 3, 0, 97, 128, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + } +} diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs index 08b019ed33..cf03ed7cd3 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrie.cs @@ -15,92 +15,119 @@ // Ported from: https://github.com/foliojs/unicode-trie // Copied from: https://github.com/toptensoftware/RichTextKit +using System; using System.IO; -using System.IO.Compression; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Text; namespace Avalonia.Media.TextFormatting.Unicode { internal class UnicodeTrie { - private readonly int[] _data; + private readonly uint[] _data; private readonly int _highStart; private readonly uint _errorValue; + /// + /// Initializes a new instance of the class. + /// + /// The uncompressed trie data. + public UnicodeTrie(ReadOnlySpan rawData) + { + var header = UnicodeTrieHeader.Parse(rawData); + int length = header.DataLength; + uint[] data = new uint[length / sizeof(uint)]; + + MemoryMarshal.Cast(rawData.Slice(rawData.Length - length)) + .CopyTo(data); + + _highStart = header.HighStart; + _errorValue = header.ErrorValue; + _data = data; + } + + /// + /// Initializes a new instance of the class. + /// + /// The stream containing the data. public UnicodeTrie(Stream stream) { - int dataLength; - using (var bw = new BinaryReader(stream, Encoding.UTF8, true)) + // Read the header info + using (var br = new BinaryReader(stream, Encoding.UTF8, true)) { - _highStart = bw.ReadInt32BE(); - _errorValue = bw.ReadUInt32BE(); - dataLength = bw.ReadInt32BE() / 4; + _highStart = br.ReadInt32(); + _errorValue = br.ReadUInt32(); + _data = new uint[br.ReadInt32() / sizeof(uint)]; } - using (var infl1 = new DeflateStream(stream, CompressionMode.Decompress, true)) - using (var infl2 = new DeflateStream(infl1, CompressionMode.Decompress, true)) - using (var bw = new BinaryReader(infl2, Encoding.UTF8, true)) + // Read the data in compressed format. + using (var br = new BinaryReader(stream, Encoding.UTF8, true)) { - _data = new int[dataLength]; for (int i = 0; i < _data.Length; i++) { - _data[i] = bw.ReadInt32(); + _data[i] = br.ReadUInt32(); } } } - public UnicodeTrie(byte[] buf) : this(new MemoryStream(buf)) - { - } - - internal UnicodeTrie(int[] data, int highStart, uint errorValue) + /// + /// Initializes a new instance of the class. + /// + /// The uncompressed trie data. + /// The start of the last range which ends at U+10ffff. + /// The value for out-of-range code points and illegal UTF-8. + public UnicodeTrie(uint[] data, int highStart, uint errorValue) { _data = data; _highStart = highStart; _errorValue = errorValue; } + /// + /// Saves the to the stream in a compressed format. + /// + /// The output stream. internal void Save(Stream stream) { // Write the header info using (var bw = new BinaryWriter(stream, Encoding.UTF8, true)) { - bw.WriteBE(_highStart); - bw.WriteBE(_errorValue); - bw.WriteBE(_data.Length * 4); + bw.Write(_highStart); + bw.Write(_errorValue); + bw.Write(_data.Length * sizeof(uint)); } - // Double compress the data - using (var def1 = new DeflateStream(stream, CompressionLevel.Optimal, true)) - using (var def2 = new DeflateStream(def1, CompressionLevel.Optimal, true)) - using (var bw = new BinaryWriter(def2, Encoding.UTF8, true)) + // Write the data. + using (var bw = new BinaryWriter(stream, Encoding.UTF8, true)) { - foreach (var v in _data) + for (int i = 0; i < _data.Length; i++) { - bw.Write(v); + bw.Write(_data[i]); } - bw.Flush(); - def2.Flush(); - def1.Flush(); } } - public uint Get(int codePoint) + /// + /// Get the value for a code point as stored in the trie. + /// + /// The code point. + /// The value. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public uint Get(uint codePoint) { - int index; - if ((codePoint < 0) || (codePoint > 0x10ffff)) - { - return _errorValue; - } + uint index; + ref uint dataBase = ref MemoryMarshal.GetReference(_data.AsSpan()); - if ((codePoint < 0xd800) || ((codePoint > 0xdbff) && (codePoint <= 0xffff))) + if (codePoint is < 0x0d800 or (> 0x0dbff and <= 0x0ffff)) { // Ordinary BMP code point, excluding leading surrogates. - // BMP uses a single level lookup. BMP index starts at offset 0 in the index. - // data is stored in the index array itself. - index = (_data[codePoint >> UnicodeTrieBuilder.SHIFT_2] << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); - return (uint)_data[index]; + // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. + // 16 bit data is stored in the index array itself. + index = _data[codePoint >> UnicodeTrieBuilder.SHIFT_2]; + index = (index << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); + return Unsafe.Add(ref dataBase, (nint)index); } if (codePoint <= 0xffff) @@ -109,20 +136,57 @@ namespace Avalonia.Media.TextFormatting.Unicode // lead surrogate code units and code points. // The main index has the code unit data. // For this function, we need the code point data. - index = (_data[UnicodeTrieBuilder.LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UnicodeTrieBuilder.SHIFT_2)] << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); - return (uint)_data[index]; + // Note: this expression could be refactored for slightly improved efficiency, but + // surrogate code points will be so rare in practice that it's not worth it. + index = _data[UnicodeTrieBuilder.LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UnicodeTrieBuilder.SHIFT_2)]; + index = (index << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); + return Unsafe.Add(ref dataBase, (nint)index); } if (codePoint < _highStart) { // Supplemental code point, use two-level lookup. - index = _data[(UnicodeTrieBuilder.INDEX_1_OFFSET - UnicodeTrieBuilder.OMITTED_BMP_INDEX_1_LENGTH) + (codePoint >> UnicodeTrieBuilder.SHIFT_1)]; - index = _data[index + ((codePoint >> UnicodeTrieBuilder.SHIFT_2) & UnicodeTrieBuilder.INDEX_2_MASK)]; + index = UnicodeTrieBuilder.INDEX_1_OFFSET - UnicodeTrieBuilder.OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UnicodeTrieBuilder.SHIFT_1); + index = _data[index]; + index += (codePoint >> UnicodeTrieBuilder.SHIFT_2) & UnicodeTrieBuilder.INDEX_2_MASK; + index = _data[index]; index = (index << UnicodeTrieBuilder.INDEX_SHIFT) + (codePoint & UnicodeTrieBuilder.DATA_MASK); - return (uint)_data[index]; + return Unsafe.Add(ref dataBase, (nint)index); + } + + if (codePoint <= 0x10ffff) + { + return Unsafe.Add(ref dataBase, (nint)(_data.Length - UnicodeTrieBuilder.DATA_GRANULARITY)); + } + + // Fall through. The code point is outside of the legal range of 0..0x10ffff. + return _errorValue; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + private struct UnicodeTrieHeader + { + public int HighStart + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; + } + + public uint ErrorValue + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; + } + + public int DataLength + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; } - return (uint)_data[_data.Length - UnicodeTrieBuilder.DATA_GRANULARITY]; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static UnicodeTrieHeader Parse(ReadOnlySpan data) + => MemoryMarshal.Cast(data)[0]; } } } diff --git a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs index a60bac4ce4..87f96984c5 100644 --- a/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs +++ b/src/Avalonia.Base/Media/TextFormatting/Unicode/UnicodeTrieBuilder.cs @@ -368,24 +368,24 @@ namespace Avalonia.Media.TextFormatting.Unicode // calculate the sizes of, and allocate, the index and data arrays var indexLength = allIndexesLength + _dataLength; - var data = new int[indexLength]; + var data = new uint[indexLength]; // write the index-2 array values shifted right by INDEX_SHIFT, after adding dataMove var destIdx = 0; for (i = 0; i < INDEX_2_BMP_LENGTH; i++) { - data[destIdx++] = ((_index2[i] + dataMove) >> INDEX_SHIFT); + data[destIdx++] = (uint)((_index2[i] + dataMove) >> INDEX_SHIFT); } // write UTF-8 2-byte index-2 values, not right-shifted for (i = 0; i < 0xc2 - 0xc0; i++) { // C0..C1 - data[destIdx++] = (dataMove + BAD_UTF8_DATA_OFFSET); + data[destIdx++] = (uint)(dataMove + BAD_UTF8_DATA_OFFSET); } for (; i < 0xe0 - 0xc0; i++) { // C2..DF - data[destIdx++] = (dataMove + _index2[i << (6 - SHIFT_2)]); + data[destIdx++] = (uint)(dataMove + _index2[i << (6 - SHIFT_2)]); } if (_highStart > 0x10000) @@ -396,21 +396,21 @@ namespace Avalonia.Media.TextFormatting.Unicode // write 16-bit index-1 values for supplementary code points for (i = 0; i < index1Length; i++) { - data[destIdx++] = (INDEX_2_OFFSET + _index1[i + OMITTED_BMP_INDEX_1_LENGTH]); + data[destIdx++] = (uint)(INDEX_2_OFFSET + _index1[i + OMITTED_BMP_INDEX_1_LENGTH]); } // write the index-2 array values for supplementary code points, // shifted right by INDEX_SHIFT, after adding dataMove for (i = 0; i < _index2Length - index2Offset; i++) { - data[destIdx++] = ((dataMove + _index2[index2Offset + i]) >> INDEX_SHIFT); + data[destIdx++] = (uint)((dataMove + _index2[index2Offset + i]) >> INDEX_SHIFT); } } // write 16-bit data values for (i = 0; i < _dataLength; i++) { - data[destIdx++] = (int)_data[i]; + data[destIdx++] = _data[i]; } return new UnicodeTrie(data, _highStart, _errorValue); diff --git a/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs b/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs index 0eeefddf0b..e39a4e23df 100644 --- a/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs +++ b/src/Avalonia.Base/Platform/IPlatformRenderInterface.cs @@ -58,6 +58,13 @@ namespace Avalonia.Platform /// A combined geometry. IGeometryImpl CreateCombinedGeometry(GeometryCombineMode combineMode, Geometry g1, Geometry g2); + /// + /// Created a geometry implementation for the glyph run. + /// + /// The glyph run to build a geometry from. + /// The geometry returned contains the combined geometry of all glyphs in the glyph run. + IGeometryImpl BuildGlyphRunGeometry(GlyphRun glyphRun); + /// /// Creates a renderer. /// diff --git a/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageFile.cs b/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageFile.cs new file mode 100644 index 0000000000..5af02219ce --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageFile.cs @@ -0,0 +1,107 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Security; +using System.Threading.Tasks; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage.FileIO; + +[Unstable] +public class BclStorageFile : IStorageBookmarkFile +{ + private readonly FileInfo _fileInfo; + + public BclStorageFile(FileInfo fileInfo) + { + _fileInfo = fileInfo ?? throw new ArgumentNullException(nameof(fileInfo)); + } + + public bool CanOpenRead => true; + + public bool CanOpenWrite => true; + + public string Name => _fileInfo.Name; + + public virtual bool CanBookmark => true; + + public Task GetBasicPropertiesAsync() + { + var props = new StorageItemProperties(); + if (_fileInfo.Exists) + { + props = new StorageItemProperties( + (ulong)_fileInfo.Length, + _fileInfo.CreationTimeUtc, + _fileInfo.LastAccessTimeUtc); + } + return Task.FromResult(props); + } + + public Task GetParentAsync() + { + if (_fileInfo.Directory is { } directory) + { + return Task.FromResult(new BclStorageFolder(directory)); + } + return Task.FromResult(null); + } + + public Task OpenRead() + { + return Task.FromResult(_fileInfo.OpenRead()); + } + + public Task OpenWrite() + { + return Task.FromResult(_fileInfo.OpenWrite()); + } + + public virtual Task SaveBookmark() + { + return Task.FromResult(_fileInfo.FullName); + } + + public Task ReleaseBookmark() + { + // No-op + return Task.CompletedTask; + } + + public bool TryGetUri([NotNullWhen(true)] out Uri? uri) + { + try + { + if (_fileInfo.Directory is not null) + { + uri = Path.IsPathRooted(_fileInfo.FullName) ? + new Uri(new Uri("file://"), _fileInfo.FullName) : + new Uri(_fileInfo.FullName, UriKind.Relative); + return true; + } + + uri = null; + return false; + } + catch (SecurityException) + { + uri = null; + return false; + } + } + + protected virtual void Dispose(bool disposing) + { + } + + ~BclStorageFile() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } +} diff --git a/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageFolder.cs b/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageFolder.cs new file mode 100644 index 0000000000..7267017eaf --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageFolder.cs @@ -0,0 +1,88 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Security; +using System.Threading.Tasks; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage.FileIO; + +[Unstable] +public class BclStorageFolder : IStorageBookmarkFolder +{ + private readonly DirectoryInfo _directoryInfo; + + public BclStorageFolder(DirectoryInfo directoryInfo) + { + _directoryInfo = directoryInfo ?? throw new ArgumentNullException(nameof(directoryInfo)); + if (!_directoryInfo.Exists) + { + throw new ArgumentException("Directory must exist", nameof(directoryInfo)); + } + } + + public string Name => _directoryInfo.Name; + + public bool CanBookmark => true; + + public Task GetBasicPropertiesAsync() + { + var props = new StorageItemProperties( + null, + _directoryInfo.CreationTimeUtc, + _directoryInfo.LastAccessTimeUtc); + return Task.FromResult(props); + } + + public Task GetParentAsync() + { + if (_directoryInfo.Parent is { } directory) + { + return Task.FromResult(new BclStorageFolder(directory)); + } + return Task.FromResult(null); + } + + public virtual Task SaveBookmark() + { + return Task.FromResult(_directoryInfo.FullName); + } + + public Task ReleaseBookmark() + { + // No-op + return Task.CompletedTask; + } + + public bool TryGetUri([NotNullWhen(true)] out Uri? uri) + { + try + { + uri = Path.IsPathRooted(_directoryInfo.FullName) ? + new Uri(new Uri("file://"), _directoryInfo.FullName) : + new Uri(_directoryInfo.FullName, UriKind.Relative); + + return true; + } + catch (SecurityException) + { + uri = null; + return false; + } + } + + protected virtual void Dispose(bool disposing) + { + } + + ~BclStorageFolder() + { + Dispose(disposing: false); + } + + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } +} diff --git a/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageProvider.cs b/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageProvider.cs new file mode 100644 index 0000000000..469388021e --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FileIO/BclStorageProvider.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage.FileIO; + +[Unstable] +public abstract class BclStorageProvider : IStorageProvider +{ + public abstract bool CanOpen { get; } + public abstract Task> OpenFilePickerAsync(FilePickerOpenOptions options); + + public abstract bool CanSave { get; } + public abstract Task SaveFilePickerAsync(FilePickerSaveOptions options); + + public abstract bool CanPickFolder { get; } + public abstract Task> OpenFolderPickerAsync(FolderPickerOpenOptions options); + + public virtual Task OpenFileBookmarkAsync(string bookmark) + { + var file = new FileInfo(bookmark); + return file.Exists + ? Task.FromResult(new BclStorageFile(file)) + : Task.FromResult(null); + } + + public virtual Task OpenFolderBookmarkAsync(string bookmark) + { + var folder = new DirectoryInfo(bookmark); + return folder.Exists + ? Task.FromResult(new BclStorageFolder(folder)) + : Task.FromResult(null); + } +} diff --git a/src/Avalonia.Base/Platform/Storage/FileIO/StorageProviderHelpers.cs b/src/Avalonia.Base/Platform/Storage/FileIO/StorageProviderHelpers.cs new file mode 100644 index 0000000000..f90d0a5a2f --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FileIO/StorageProviderHelpers.cs @@ -0,0 +1,40 @@ +using System; +using System.IO; +using System.Linq; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage.FileIO; + +[Unstable] +public static class StorageProviderHelpers +{ + public static string NameWithExtension(string path, string? defaultExtension, FilePickerFileType? filter) + { + var name = Path.GetFileName(path); + if (name != null && !Path.HasExtension(name)) + { + if (filter?.Patterns?.Count > 0) + { + if (defaultExtension != null + && filter.Patterns.Contains(defaultExtension)) + { + return Path.ChangeExtension(path, defaultExtension.TrimStart('.')); + } + + var ext = filter.Patterns.FirstOrDefault(x => x != "*.*"); + ext = ext?.Split(new[] { "*." }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); + if (ext != null) + { + return Path.ChangeExtension(path, ext); + } + } + + if (defaultExtension != null) + { + return Path.ChangeExtension(path, defaultExtension); + } + } + + return path; + } +} diff --git a/src/Avalonia.Base/Platform/Storage/FilePickerFileType.cs b/src/Avalonia.Base/Platform/Storage/FilePickerFileType.cs new file mode 100644 index 0000000000..75076e2bb8 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FilePickerFileType.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace Avalonia.Platform.Storage; + +/// +/// Represents a name mapped to the associated file types (extensions). +/// +public sealed class FilePickerFileType +{ + public FilePickerFileType(string name) + { + Name = name; + } + + /// + /// File type name. + /// + public string Name { get; } + + /// + /// List of extensions in GLOB format. I.e. "*.png" or "*.*". + /// + /// + /// Used on Windows and Linux systems. + /// + public IReadOnlyList? Patterns { get; set; } + + /// + /// List of extensions in MIME format. + /// + /// + /// Used on Android, Browser and Linux systems. + /// + public IReadOnlyList? MimeTypes { get; set; } + + /// + /// List of extensions in Apple uniform format. + /// + /// + /// Used only on Apple devices. + /// See https://developer.apple.com/documentation/uniformtypeidentifiers/system_declared_uniform_type_identifiers. + /// + public IReadOnlyList? AppleUniformTypeIdentifiers { get; set; } +} diff --git a/src/Avalonia.Base/Platform/Storage/FilePickerFileTypes.cs b/src/Avalonia.Base/Platform/Storage/FilePickerFileTypes.cs new file mode 100644 index 0000000000..5da037999a --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FilePickerFileTypes.cs @@ -0,0 +1,48 @@ +namespace Avalonia.Platform.Storage; + +/// +/// Dictionary of well known file types. +/// +public static class FilePickerFileTypes +{ + public static FilePickerFileType All { get; } = new("All") + { + Patterns = new[] { "*.*" }, + MimeTypes = new[] { "*/*" } + }; + + public static FilePickerFileType TextPlain { get; } = new("Plain Text") + { + Patterns = new[] { "*.txt" }, + AppleUniformTypeIdentifiers = new[] { "public.plain-text" }, + MimeTypes = new[] { "text/plain" } + }; + + public static FilePickerFileType ImageAll { get; } = new("All Images") + { + Patterns = new[] { "*.png", "*.jpg", "*.jpeg", "*.gif", "*.bmp" }, + AppleUniformTypeIdentifiers = new[] { "public.image" }, + MimeTypes = new[] { "image/*" } + }; + + public static FilePickerFileType ImageJpg { get; } = new("JPEG image") + { + Patterns = new[] { "*.jpg", "*.jpeg" }, + AppleUniformTypeIdentifiers = new[] { "public.jpeg" }, + MimeTypes = new[] { "image/jpeg" } + }; + + public static FilePickerFileType ImagePng { get; } = new("PNG image") + { + Patterns = new[] { "*.png" }, + AppleUniformTypeIdentifiers = new[] { "public.png" }, + MimeTypes = new[] { "image/png" } + }; + + public static FilePickerFileType Pdf { get; } = new("PDF document") + { + Patterns = new[] { "*.pdf" }, + AppleUniformTypeIdentifiers = new[] { "com.adobe.pdf" }, + MimeTypes = new[] { "application/pdf" } + }; +} diff --git a/src/Avalonia.Base/Platform/Storage/FilePickerOpenOptions.cs b/src/Avalonia.Base/Platform/Storage/FilePickerOpenOptions.cs new file mode 100644 index 0000000000..1674ec11c8 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FilePickerOpenOptions.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace Avalonia.Platform.Storage; + +/// +/// Options class for method. +/// +public class FilePickerOpenOptions : PickerOptions +{ + /// + /// Gets or sets an option indicating whether open picker allows users to select multiple files. + /// + public bool AllowMultiple { get; set; } + + /// + /// Gets or sets the collection of file types that the file open picker displays. + /// + public IReadOnlyList? FileTypeFilter { get; set; } +} diff --git a/src/Avalonia.Base/Platform/Storage/FilePickerSaveOptions.cs b/src/Avalonia.Base/Platform/Storage/FilePickerSaveOptions.cs new file mode 100644 index 0000000000..fa4fccd47a --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FilePickerSaveOptions.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace Avalonia.Platform.Storage; + +/// +/// Options class for method. +/// +public class FilePickerSaveOptions : PickerOptions +{ + /// + /// Gets or sets the file name that the file save picker suggests to the user. + /// + public string? SuggestedFileName { get; set; } + + /// + /// Gets or sets the default extension to be used to save the file. + /// + public string? DefaultExtension { get; set; } + + /// + /// Gets or sets the collection of valid file types that the user can choose to assign to a file. + /// + public IReadOnlyList? FileTypeChoices { get; set; } + + /// + /// Gets or sets a value indicating whether file open picker displays a warning if the user specifies the name of a file that already exists. + /// + public bool? ShowOverwritePrompt { get; set; } +} diff --git a/src/Avalonia.Base/Platform/Storage/FolderPickerOpenOptions.cs b/src/Avalonia.Base/Platform/Storage/FolderPickerOpenOptions.cs new file mode 100644 index 0000000000..df9fa8fd35 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/FolderPickerOpenOptions.cs @@ -0,0 +1,12 @@ +namespace Avalonia.Platform.Storage; + +/// +/// Options class for method. +/// +public class FolderPickerOpenOptions : PickerOptions +{ + /// + /// Gets or sets an option indicating whether open picker allows users to select multiple folders. + /// + public bool AllowMultiple { get; set; } +} diff --git a/src/Avalonia.Base/Platform/Storage/IStorageBookmarkItem.cs b/src/Avalonia.Base/Platform/Storage/IStorageBookmarkItem.cs new file mode 100644 index 0000000000..d21c950862 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/IStorageBookmarkItem.cs @@ -0,0 +1,20 @@ +using System.Threading.Tasks; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage; + +[NotClientImplementable] +public interface IStorageBookmarkItem : IStorageItem +{ + Task ReleaseBookmark(); +} + +[NotClientImplementable] +public interface IStorageBookmarkFile : IStorageFile, IStorageBookmarkItem +{ +} + +[NotClientImplementable] +public interface IStorageBookmarkFolder : IStorageFolder, IStorageBookmarkItem +{ +} diff --git a/src/Avalonia.Base/Platform/Storage/IStorageFile.cs b/src/Avalonia.Base/Platform/Storage/IStorageFile.cs new file mode 100644 index 0000000000..965caf8216 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/IStorageFile.cs @@ -0,0 +1,32 @@ +using System.IO; +using System.Threading.Tasks; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage; + +/// +/// Represents a file. Provides information about the file and its contents, and ways to manipulate them. +/// +[NotClientImplementable] +public interface IStorageFile : IStorageItem +{ + /// + /// Returns true, if file is readable. + /// + bool CanOpenRead { get; } + + /// + /// Opens a stream for read access. + /// + Task OpenRead(); + + /// + /// Returns true, if file is writeable. + /// + bool CanOpenWrite { get; } + + /// + /// Opens stream for writing to the file. + /// + Task OpenWrite(); +} diff --git a/src/Avalonia.Base/Platform/Storage/IStorageFolder.cs b/src/Avalonia.Base/Platform/Storage/IStorageFolder.cs new file mode 100644 index 0000000000..25b9f01a92 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/IStorageFolder.cs @@ -0,0 +1,11 @@ +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage; + +/// +/// Manipulates folders and their contents, and provides information about them. +/// +[NotClientImplementable] +public interface IStorageFolder : IStorageItem +{ +} diff --git a/src/Avalonia.Base/Platform/Storage/IStorageItem.cs b/src/Avalonia.Base/Platform/Storage/IStorageItem.cs new file mode 100644 index 0000000000..8513ebc7d9 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/IStorageItem.cs @@ -0,0 +1,53 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage; + +/// +/// Manipulates storage items (files and folders) and their contents, and provides information about them +/// +/// +/// This interface inherits . It's recommended to dispose when it's not used anymore. +/// +[NotClientImplementable] +public interface IStorageItem : IDisposable +{ + /// + /// Gets the name of the item including the file name extension if there is one. + /// + string Name { get; } + + /// + /// Gets the full file-system path of the item, if the item has a path. + /// + /// + /// Android backend might return file path with "content:" scheme. + /// Browser and iOS backends might return relative uris. + /// + bool TryGetUri([NotNullWhen(true)] out Uri? uri); + + /// + /// Gets the basic properties of the current item. + /// + Task GetBasicPropertiesAsync(); + + /// + /// Returns true is item can be bookmarked and reused later. + /// + bool CanBookmark { get; } + + /// + /// Saves items to a bookmark. + /// + /// + /// Returns identifier of a bookmark. Can be null if OS denied request. + /// + Task SaveBookmark(); + + /// + /// Gets the parent folder of the current storage item. + /// + Task GetParentAsync(); +} diff --git a/src/Avalonia.Base/Platform/Storage/IStorageProvider.cs b/src/Avalonia.Base/Platform/Storage/IStorageProvider.cs new file mode 100644 index 0000000000..0f5cf931d9 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/IStorageProvider.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Avalonia.Metadata; + +namespace Avalonia.Platform.Storage; + +[NotClientImplementable] +public interface IStorageProvider +{ + /// + /// Returns true if it's possible to open file picker on the current platform. + /// + bool CanOpen { get; } + + /// + /// Opens file picker dialog. + /// + /// Array of selected or empty collection if user canceled the dialog. + Task> OpenFilePickerAsync(FilePickerOpenOptions options); + + /// + /// Returns true if it's possible to open save file picker on the current platform. + /// + bool CanSave { get; } + + /// + /// Opens save file picker dialog. + /// + /// Saved or null if user canceled the dialog. + Task SaveFilePickerAsync(FilePickerSaveOptions options); + + /// + /// Returns true if it's possible to open folder picker on the current platform. + /// + bool CanPickFolder { get; } + + /// + /// Opens folder picker dialog. + /// + /// Array of selected or empty collection if user canceled the dialog. + Task> OpenFolderPickerAsync(FolderPickerOpenOptions options); + + /// + /// Open from the bookmark ID. + /// + /// Bookmark ID. + /// Bookmarked file or null if OS denied request. + Task OpenFileBookmarkAsync(string bookmark); + + /// + /// Open from the bookmark ID. + /// + /// Bookmark ID. + /// Bookmarked folder or null if OS denied request. + Task OpenFolderBookmarkAsync(string bookmark); +} diff --git a/src/Avalonia.Base/Platform/Storage/PickerOptions.cs b/src/Avalonia.Base/Platform/Storage/PickerOptions.cs new file mode 100644 index 0000000000..6f97916a26 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/PickerOptions.cs @@ -0,0 +1,17 @@ +namespace Avalonia.Platform.Storage; + +/// +/// Common options for , and methods. +/// +public class PickerOptions +{ + /// + /// Gets or sets the text that appears in the title bar of a folder dialog. + /// + public string? Title { get; set; } + + /// + /// Gets or sets the initial location where the file open picker looks for files to present to the user. + /// + public IStorageFolder? SuggestedStartLocation { get; set; } +} diff --git a/src/Avalonia.Base/Platform/Storage/StorageItemProperties.cs b/src/Avalonia.Base/Platform/Storage/StorageItemProperties.cs new file mode 100644 index 0000000000..a63973ccf8 --- /dev/null +++ b/src/Avalonia.Base/Platform/Storage/StorageItemProperties.cs @@ -0,0 +1,43 @@ +using System; + +namespace Avalonia.Platform.Storage; + +/// +/// Provides access to the content-related properties of an item (like a file or folder). +/// +public class StorageItemProperties +{ + public StorageItemProperties( + ulong? size = null, + DateTimeOffset? dateCreated = null, + DateTimeOffset? dateModified = null) + { + Size = size; + DateCreated = dateCreated; + DateModified = dateModified; + } + + /// + /// Gets the size of the file in bytes. + /// + /// + /// Can be null if property is not available. + /// + public ulong? Size { get; } + + /// + /// Gets the date and time that the current folder was created. + /// + /// + /// Can be null if property is not available. + /// + public DateTimeOffset? DateCreated { get; } + + /// + /// Gets the date and time of the last time the file was modified. + /// + /// + /// Can be null if property is not available. + /// + public DateTimeOffset? DateModified { get; } +} diff --git a/src/Avalonia.Base/Point.cs b/src/Avalonia.Base/Point.cs index fbdf0db800..0c789ff20f 100644 --- a/src/Avalonia.Base/Point.cs +++ b/src/Avalonia.Base/Point.cs @@ -188,7 +188,7 @@ namespace Avalonia } /// - /// Returns a boolean indicating whether the point is equal to the other given point. + /// Returns a boolean indicating whether the point is equal to the other given point (bitwise). /// /// The other point to test equality against. /// True if this point is equal to other; False otherwise. @@ -200,6 +200,18 @@ namespace Avalonia // ReSharper enable CompareOfFloatsByEqualityOperator } + /// + /// Returns a boolean indicating whether the point is equal to the other given point + /// (numerically). + /// + /// The other point to test equality against. + /// True if this point is equal to other; False otherwise. + public bool NearlyEquals(Point other) + { + return MathUtilities.AreClose(_x, other._x) && + MathUtilities.AreClose(_y, other._y); + } + /// /// Checks for equality between a point and an object. /// diff --git a/src/Avalonia.Base/PropertyStore/PriorityValue.cs b/src/Avalonia.Base/PropertyStore/PriorityValue.cs index 112cf6619f..182b2638c4 100644 --- a/src/Avalonia.Base/PropertyStore/PriorityValue.cs +++ b/src/Avalonia.Base/PropertyStore/PriorityValue.cs @@ -121,6 +121,7 @@ namespace Avalonia.PropertyStore public void ClearLocalValue() { + _localValue = default; UpdateEffectiveValue(new AvaloniaPropertyChangedEventArgs( _owner, Property, diff --git a/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs index 5dc426ab06..e4d5a1ca68 100644 --- a/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs +++ b/src/Avalonia.Base/Rendering/SceneGraph/SceneBuilder.cs @@ -158,6 +158,7 @@ namespace Avalonia.Rendering.SceneGraph if (result != null && result.Parent != parent) { Deindex(scene, result); + ((VisualNode?)result.Parent)?.RemoveChild(result); result = null; } diff --git a/src/Avalonia.Base/StyledElement.cs b/src/Avalonia.Base/StyledElement.cs index f98d2cdbcc..ecf5d95ffc 100644 --- a/src/Avalonia.Base/StyledElement.cs +++ b/src/Avalonia.Base/StyledElement.cs @@ -12,8 +12,6 @@ using Avalonia.Logging; using Avalonia.LogicalTree; using Avalonia.Styling; -#nullable enable - namespace Avalonia { /// @@ -55,7 +53,14 @@ namespace Avalonia nameof(TemplatedParent), o => o.TemplatedParent, (o ,v) => o.TemplatedParent = v); + + /// + /// Defines the property. + /// + public static readonly StyledProperty ThemeProperty = + AvaloniaProperty.Register(nameof(Theme)); + private static readonly ControlTheme s_invalidTheme = new ControlTheme(); private int _initCount; private string? _name; private readonly Classes _classes = new Classes(); @@ -67,6 +72,8 @@ namespace Avalonia private List? _appliedStyles; private ITemplatedControl? _templatedParent; private bool _dataContextUpdating; + private bool _hasPromotedTheme; + private ControlTheme? _implicitTheme; /// /// Initializes static members of the class. @@ -230,6 +237,15 @@ namespace Avalonia internal set => SetAndRaise(TemplatedParentProperty, ref _templatedParent, value); } + /// + /// Gets or sets the theme to be applied to the element. + /// + public ControlTheme? Theme + { + get => GetValue(ThemeProperty); + set => SetValue(ThemeProperty, value); + } + /// /// Gets the styled element's logical children. /// @@ -302,6 +318,7 @@ namespace Avalonia /// IStyleHost? IStyleHost.StylingParent => (IStyleHost?)InheritanceParent; + /// public virtual void BeginInit() { @@ -341,10 +358,15 @@ namespace Avalonia } finally { + _styled = true; EndBatchUpdate(); } - _styled = true; + if (_hasPromotedTheme) + { + _hasPromotedTheme = false; + ClearValue(ThemeProperty); + } } return _styled; @@ -475,6 +497,31 @@ namespace Avalonia }; } + ControlTheme? IStyleable.GetEffectiveTheme() + { + var theme = Theme; + + // Explitly set Theme property takes precedence. + if (theme is not null) + return theme; + + // If the Theme property is not set, try to find a ControlTheme resource with our StyleKey. + if (_implicitTheme is null) + { + var key = ((IStyleable)this).StyleKey; + + if (this.TryFindResource(key, out var value) && value is ControlTheme t) + _implicitTheme = t; + else + _implicitTheme = s_invalidTheme; + } + + if (_implicitTheme != s_invalidTheme) + return _implicitTheme; + + return null; + } + void IStyleable.StyleApplied(IStyleInstance instance) { instance = instance ?? throw new ArgumentNullException(nameof(instance)); @@ -590,6 +637,30 @@ namespace Avalonia { } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + if (change.Property == ThemeProperty) + { + // Changing the theme detaches all styles, meaning that if the theme property was + // set via a style, it will get cleared! To work around this, if the value was + // applied at less than local value priority then promote the value to local value + // priority until styling is re-applied. + if (change.Priority > BindingPriority.LocalValue) + { + Theme = change.GetNewValue(); + _hasPromotedTheme = true; + } + else if (_hasPromotedTheme && change.Priority == BindingPriority.LocalValue) + { + _hasPromotedTheme = false; + } + + InvalidateStyles(); + } + } + private static void DataContextNotifying(IAvaloniaObject o, bool updateStarted) { if (o is StyledElement element) @@ -696,6 +767,7 @@ namespace Avalonia if (_logicalRoot != null) { _logicalRoot = null; + _implicitTheme = null; DetachStyles(); OnDetachedFromLogicalTree(e); DetachedFromLogicalTree?.Invoke(this, e); @@ -760,7 +832,7 @@ namespace Avalonia private void DetachStyles() { - if (_appliedStyles is object) + if (_appliedStyles?.Count > 0) { BeginBatchUpdate(); diff --git a/src/Avalonia.Base/Styling/ChildSelector.cs b/src/Avalonia.Base/Styling/ChildSelector.cs index 34f3a76b61..9512dc34df 100644 --- a/src/Avalonia.Base/Styling/ChildSelector.cs +++ b/src/Avalonia.Base/Styling/ChildSelector.cs @@ -65,6 +65,6 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => null; - internal override bool HasValidNestingSelector() => _parent.HasValidNestingSelector(); + protected override Selector? MovePreviousOrParent() => _parent; } } diff --git a/src/Avalonia.Base/Styling/ControlTheme.cs b/src/Avalonia.Base/Styling/ControlTheme.cs new file mode 100644 index 0000000000..644e8b32d4 --- /dev/null +++ b/src/Avalonia.Base/Styling/ControlTheme.cs @@ -0,0 +1,67 @@ +using System; + +namespace Avalonia.Styling +{ + /// + /// Defines a switchable theme for a control. + /// + public class ControlTheme : StyleBase + { + /// + /// Initializes a new instance of the class. + /// + public ControlTheme() { } + + /// + /// Initializes a new instance of the class. + /// + /// The value for . + public ControlTheme(Type targetType) => TargetType = targetType; + + /// + /// Gets or sets the type for which this control theme is intended. + /// + public Type? TargetType { get; set; } + + /// + /// Gets or sets a control theme that is the basis of the current theme. + /// + public ControlTheme? BasedOn { get; set; } + + public override SelectorMatchResult TryAttach(IStyleable target, object? host) + { + _ = target ?? throw new ArgumentNullException(nameof(target)); + + if (TargetType is null) + throw new InvalidOperationException("ControlTheme has no TargetType."); + + var result = BasedOn?.TryAttach(target, host) ?? SelectorMatchResult.NeverThisType; + + if (HasSettersOrAnimations && TargetType.IsAssignableFrom(target.StyleKey)) + { + Attach(target, null); + result = SelectorMatchResult.AlwaysThisType; + } + + var childResult = TryAttachChildren(target, host); + + if (childResult > result) + result = childResult; + + return result; + } + + public override string ToString() + { + if (TargetType is not null) + return "ControlTheme: " + TargetType.Name; + else + return "ControlTheme"; + } + + internal override void SetParent(StyleBase? parent) + { + throw new InvalidOperationException("ControlThemes cannot be added as a nested style."); + } + } +} diff --git a/src/Avalonia.Base/Styling/DescendentSelector.cs b/src/Avalonia.Base/Styling/DescendentSelector.cs index 4ffaff6861..677a924189 100644 --- a/src/Avalonia.Base/Styling/DescendentSelector.cs +++ b/src/Avalonia.Base/Styling/DescendentSelector.cs @@ -70,6 +70,6 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => null; - internal override bool HasValidNestingSelector() => _parent.HasValidNestingSelector(); + protected override Selector? MovePreviousOrParent() => _parent; } } diff --git a/src/Avalonia.Base/Styling/IStyle.cs b/src/Avalonia.Base/Styling/IStyle.cs index e9faf82c07..417739fb28 100644 --- a/src/Avalonia.Base/Styling/IStyle.cs +++ b/src/Avalonia.Base/Styling/IStyle.cs @@ -23,6 +23,6 @@ namespace Avalonia.Styling /// /// A describing how the style matches the control. /// - SelectorMatchResult TryAttach(IStyleable target, IStyleHost? host); + SelectorMatchResult TryAttach(IStyleable target, object? host); } } diff --git a/src/Avalonia.Base/Styling/IStyleable.cs b/src/Avalonia.Base/Styling/IStyleable.cs index 5bc972e7ab..254da4d85c 100644 --- a/src/Avalonia.Base/Styling/IStyleable.cs +++ b/src/Avalonia.Base/Styling/IStyleable.cs @@ -3,8 +3,6 @@ using System.Collections.Generic; using Avalonia.Collections; using Avalonia.Metadata; -#nullable enable - namespace Avalonia.Styling { /// @@ -28,6 +26,11 @@ namespace Avalonia.Styling /// ITemplatedControl? TemplatedParent { get; } + /// + /// Gets the effective theme for the control as used by the syling system. + /// + ControlTheme? GetEffectiveTheme(); + /// /// Notifies the element that a style has been applied. /// diff --git a/src/Avalonia.Base/Styling/NestingSelector.cs b/src/Avalonia.Base/Styling/NestingSelector.cs index 481a937867..77c5b719c6 100644 --- a/src/Avalonia.Base/Styling/NestingSelector.cs +++ b/src/Avalonia.Base/Styling/NestingSelector.cs @@ -15,9 +15,17 @@ namespace Avalonia.Styling protected override SelectorMatch Evaluate(IStyleable control, IStyle? parent, bool subscribe) { - if (parent is Style s && s.Selector is Selector selector) + if (parent is Style s && s.Selector is not null) { - return selector.Match(control, (parent as Style)?.Parent, subscribe); + return s.Selector.Match(control, s.Parent, subscribe); + } + else if (parent is ControlTheme theme) + { + if (theme.TargetType is null) + throw new InvalidOperationException("ControlTheme has no TargetType."); + return theme.TargetType.IsAssignableFrom(control.StyleKey) ? + SelectorMatch.AlwaysThisType : + SelectorMatch.NeverThisType; } throw new InvalidOperationException( @@ -25,6 +33,6 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => null; - internal override bool HasValidNestingSelector() => true; + protected override Selector? MovePreviousOrParent() => null; } } diff --git a/src/Avalonia.Base/Styling/NotSelector.cs b/src/Avalonia.Base/Styling/NotSelector.cs index cdc3254d38..c7727bb6b8 100644 --- a/src/Avalonia.Base/Styling/NotSelector.cs +++ b/src/Avalonia.Base/Styling/NotSelector.cs @@ -67,6 +67,6 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => _previous; - internal override bool HasValidNestingSelector() => _argument.HasValidNestingSelector(); + protected override Selector? MovePreviousOrParent() => _previous; } } diff --git a/src/Avalonia.Base/Styling/NthChildSelector.cs b/src/Avalonia.Base/Styling/NthChildSelector.cs index 047bf434da..f473791664 100644 --- a/src/Avalonia.Base/Styling/NthChildSelector.cs +++ b/src/Avalonia.Base/Styling/NthChildSelector.cs @@ -105,7 +105,7 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => _previous; - internal override bool HasValidNestingSelector() => _previous?.HasValidNestingSelector() ?? false; + protected override Selector? MovePreviousOrParent() => _previous; public override string ToString() { diff --git a/src/Avalonia.Base/Styling/OrSelector.cs b/src/Avalonia.Base/Styling/OrSelector.cs index 913c27bf0c..af9249864f 100644 --- a/src/Avalonia.Base/Styling/OrSelector.cs +++ b/src/Avalonia.Base/Styling/OrSelector.cs @@ -103,18 +103,12 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => null; + protected override Selector? MovePreviousOrParent() => null; - internal override bool HasValidNestingSelector() + internal override void ValidateNestingSelector(bool inControlTheme) { foreach (var selector in _selectors) - { - if (!selector.HasValidNestingSelector()) - { - return false; - } - } - - return true; + selector.ValidateNestingSelector(inControlTheme); } private Type? EvaluateTargetType() diff --git a/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs b/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs index 7a37daf087..48136ba2de 100644 --- a/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs +++ b/src/Avalonia.Base/Styling/PropertyEqualsSelector.cs @@ -90,7 +90,7 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => _previous; - internal override bool HasValidNestingSelector() => _previous?.HasValidNestingSelector() ?? false; + protected override Selector? MovePreviousOrParent() => _previous; internal static bool Compare(Type propertyType, object? propertyValue, object? value) { diff --git a/src/Avalonia.Base/Styling/PropertySetterInstance.cs b/src/Avalonia.Base/Styling/PropertySetterInstance.cs index c4e8f47e67..9028224cc1 100644 --- a/src/Avalonia.Base/Styling/PropertySetterInstance.cs +++ b/src/Avalonia.Base/Styling/PropertySetterInstance.cs @@ -18,7 +18,7 @@ namespace Avalonia.Styling private readonly DirectPropertyBase? _directProperty; private readonly T _value; private IDisposable? _subscription; - private bool _isActive; + private State _state; public PropertySetterInstance( IStyleable target, @@ -40,6 +40,8 @@ namespace Avalonia.Styling _value = value; } + private bool IsActive => _state == State.Active; + public void Start(bool hasActivator) { if (hasActivator) @@ -70,31 +72,35 @@ namespace Avalonia.Styling public void Activate() { - if (!_isActive) + if (!IsActive) { - _isActive = true; + _state = State.Active; PublishNext(); } } public void Deactivate() { - if (_isActive) + if (IsActive) { - _isActive = false; + _state = State.Inactive; PublishNext(); } } public override void Dispose() { + if (_state == State.Disposed) + return; + _state = State.Disposed; + if (_subscription is object) { var sub = _subscription; _subscription = null; sub.Dispose(); } - else if (_isActive) + else if (IsActive) { if (_styledProperty is object) { @@ -114,7 +120,14 @@ namespace Avalonia.Styling private void PublishNext() { - PublishNext(_isActive ? new BindingValue(_value) : default); + PublishNext(IsActive ? new BindingValue(_value) : default); + } + + private enum State + { + Inactive, + Active, + Disposed, } } } diff --git a/src/Avalonia.Base/Styling/Selector.cs b/src/Avalonia.Base/Styling/Selector.cs index 1e06f3d375..7ce17518dd 100644 --- a/src/Avalonia.Base/Styling/Selector.cs +++ b/src/Avalonia.Base/Styling/Selector.cs @@ -86,7 +86,36 @@ namespace Avalonia.Styling /// protected abstract Selector? MovePrevious(); - internal abstract bool HasValidNestingSelector(); + /// + /// Moves to the previous selector or the parent selector. + /// + protected abstract Selector? MovePreviousOrParent(); + + internal virtual void ValidateNestingSelector(bool inControlTheme) + { + var s = this; + var templateCount = 0; + + do + { + if (inControlTheme) + { + if (!s.InTemplate && s.IsCombinator) + throw new InvalidOperationException( + "ControlTheme style may not directly contain a child or descendent selector."); + if (s is TemplateSelector && templateCount++ > 0) + throw new InvalidOperationException( + "ControlTemplate styles cannot contain multiple template selectors."); + } + + var previous = s.MovePreviousOrParent(); + + if (previous is null && s is not NestingSelector) + throw new InvalidOperationException("Child styles must have a nesting selector."); + + s = previous; + } while (s is not null); + } private static SelectorMatch MatchUntilCombinator( IStyleable control, diff --git a/src/Avalonia.Base/Styling/Style.cs b/src/Avalonia.Base/Styling/Style.cs index 000e588bad..c61b08b2a1 100644 --- a/src/Avalonia.Base/Styling/Style.cs +++ b/src/Avalonia.Base/Styling/Style.cs @@ -1,22 +1,13 @@ using System; -using System.Collections.Generic; -using Avalonia.Animation; -using Avalonia.Controls; -using Avalonia.Metadata; namespace Avalonia.Styling { /// /// Defines a style. /// - public class Style : AvaloniaObject, IStyle, IResourceProvider + public class Style : StyleBase { - private IResourceHost? _owner; - private StyleChildren? _children; - private IResourceDictionary? _resources; - private List? _setters; - private List? _animations; - private StyleCache? _childCache; + private Selector? _selector; /// /// Initializes a new instance of the class. @@ -35,113 +26,41 @@ namespace Avalonia.Styling } /// - /// Gets the children of the style. - /// - public IList Children => _children ??= new(this); - - /// - /// Gets the or Application that hosts the style. + /// Gets or sets the style's selector. /// - public IResourceHost? Owner + public Selector? Selector { - get => _owner; - private set - { - if (_owner != value) - { - _owner = value; - OwnerChanged?.Invoke(this, EventArgs.Empty); - } - } + get => _selector; + set => _selector = ValidateSelector(value); } - /// - /// Gets the parent style if this style is hosted in a collection. - /// - public Style? Parent { get; private set; } - - /// - /// Gets or sets a dictionary of style resources. - /// - public IResourceDictionary Resources + public override SelectorMatchResult TryAttach(IStyleable target, object? host) { - get => _resources ?? (Resources = new ResourceDictionary()); - set - { - value = value ?? throw new ArgumentNullException(nameof(value)); - - var hadResources = _resources?.HasResources ?? false; - - _resources = value; - - if (Owner is object) - { - _resources.AddOwner(Owner); - - if (hadResources || _resources.HasResources) - { - Owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); - } - } - } - } - - /// - /// Gets or sets the style's selector. - /// - public Selector? Selector { get; set; } - - /// - /// Gets the style's setters. - /// - public IList Setters => _setters ??= new List(); - - /// - /// Gets the style's animations. - /// - public IList Animations => _animations ??= new List(); - - bool IResourceNode.HasResources => _resources?.Count > 0; - IReadOnlyList IStyle.Children => (IReadOnlyList?)_children ?? Array.Empty(); + _ = target ?? throw new ArgumentNullException(nameof(target)); - public event EventHandler? OwnerChanged; + var result = SelectorMatchResult.NeverThisType; - public void Add(ISetter setter) => Setters.Add(setter); - public void Add(IStyle style) => Children.Add(style); - - public SelectorMatchResult TryAttach(IStyleable target, IStyleHost? host) - { - target = target ?? throw new ArgumentNullException(nameof(target)); + if (HasSettersOrAnimations) + { + var match = Selector?.Match(target, Parent, true) ?? + (target == host ? + SelectorMatch.AlwaysThisInstance : + SelectorMatch.NeverThisInstance); - var match = Selector is object ? Selector.Match(target, Parent) : - target == host ? SelectorMatch.AlwaysThisInstance : SelectorMatch.NeverThisInstance; + if (match.IsMatch) + Attach(target, match.Activator); - if (match.IsMatch && (_setters is object || _animations is object)) - { - var instance = new StyleInstance(this, target, _setters, _animations, match.Activator); - target.StyleApplied(instance); - instance.Start(); + result = match.Result; } - var result = match.Result; + var childResult = TryAttachChildren(target, host); - if (_children is not null) - { - _childCache ??= new StyleCache(); - var childResult = _childCache.TryAttach(_children, target, host); - if (childResult > result) - result = childResult; - } + if (childResult > result) + result = childResult; return result; } - public bool TryGetResource(object key, out object? result) - { - result = null; - return _resources?.TryGetResource(key, out result) ?? false; - } - /// /// Returns a string representation of the style. /// @@ -158,41 +77,30 @@ namespace Avalonia.Styling } } - void IResourceProvider.AddOwner(IResourceHost owner) + internal override void SetParent(StyleBase? parent) { - owner = owner ?? throw new ArgumentNullException(nameof(owner)); - - if (Owner != null) + if (parent is Style parentStyle && parentStyle.Selector is not null) { - throw new InvalidOperationException("The Style already has a parent."); - } - - Owner = owner; - _resources?.AddOwner(owner); - } - - void IResourceProvider.RemoveOwner(IResourceHost owner) - { - owner = owner ?? throw new ArgumentNullException(nameof(owner)); - - if (Owner == owner) - { - Owner = null; - _resources?.RemoveOwner(owner); + if (Selector is null) + throw new InvalidOperationException("Child styles must have a selector."); + Selector.ValidateNestingSelector(false); } - } - - internal void SetParent(Style? parent) - { - if (parent?.Selector is not null) + else if (parent is ControlTheme) { if (Selector is null) throw new InvalidOperationException("Child styles must have a selector."); - if (!Selector.HasValidNestingSelector()) - throw new InvalidOperationException("Child styles must have a nesting selector."); + Selector.ValidateNestingSelector(true); } - Parent = parent; + base.SetParent(parent); + } + + private static Selector? ValidateSelector(Selector? selector) + { + if (selector is TemplateSelector) + throw new InvalidOperationException( + "Invalid selector: Template selector must be followed by control selector."); + return selector; } } } diff --git a/src/Avalonia.Base/Styling/StyleBase.cs b/src/Avalonia.Base/Styling/StyleBase.cs new file mode 100644 index 0000000000..306a4cf010 --- /dev/null +++ b/src/Avalonia.Base/Styling/StyleBase.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using Avalonia.Animation; +using Avalonia.Controls; +using Avalonia.Metadata; +using Avalonia.Styling.Activators; + +namespace Avalonia.Styling +{ + /// + /// Base class for and . + /// + public abstract class StyleBase : AvaloniaObject, IStyle, IResourceProvider + { + private IResourceHost? _owner; + private StyleChildren? _children; + private IResourceDictionary? _resources; + private List? _setters; + private List? _animations; + private StyleCache? _childCache; + + public IList Children => _children ??= new(this); + + public IResourceHost? Owner + { + get => _owner; + private set + { + if (_owner != value) + { + _owner = value; + OwnerChanged?.Invoke(this, EventArgs.Empty); + } + } + } + + public IStyle? Parent { get; private set; } + + public IResourceDictionary Resources + { + get => _resources ?? (Resources = new ResourceDictionary()); + set + { + value = value ?? throw new ArgumentNullException(nameof(value)); + + var hadResources = _resources?.HasResources ?? false; + + _resources = value; + + if (Owner is object) + { + _resources.AddOwner(Owner); + + if (hadResources || _resources.HasResources) + { + Owner.NotifyHostedResourcesChanged(ResourcesChangedEventArgs.Empty); + } + } + } + } + + public IList Setters => _setters ??= new List(); + public IList Animations => _animations ??= new List(); + + bool IResourceNode.HasResources => _resources?.Count > 0; + IReadOnlyList IStyle.Children => (IReadOnlyList?)_children ?? Array.Empty(); + + internal bool HasSettersOrAnimations => _setters?.Count > 0 || _animations?.Count > 0; + + public void Add(ISetter setter) => Setters.Add(setter); + public void Add(IStyle style) => Children.Add(style); + + public event EventHandler? OwnerChanged; + + public abstract SelectorMatchResult TryAttach(IStyleable target, object? host); + + public bool TryGetResource(object key, out object? result) + { + result = null; + return _resources?.TryGetResource(key, out result) ?? false; + } + + internal void Attach(IStyleable target, IStyleActivator? activator) + { + var instance = new StyleInstance(this, target, _setters, _animations, activator); + target.StyleApplied(instance); + instance.Start(); + } + + internal SelectorMatchResult TryAttachChildren(IStyleable target, object? host) + { + if (_children is null || _children.Count == 0) + return SelectorMatchResult.NeverThisType; + _childCache ??= new StyleCache(); + return _childCache.TryAttach(_children, target, host); + } + + internal virtual void SetParent(StyleBase? parent) => Parent = parent; + + void IResourceProvider.AddOwner(IResourceHost owner) + { + owner = owner ?? throw new ArgumentNullException(nameof(owner)); + + if (Owner != null) + { + throw new InvalidOperationException("The Style already has a parent."); + } + + Owner = owner; + _resources?.AddOwner(owner); + } + + void IResourceProvider.RemoveOwner(IResourceHost owner) + { + owner = owner ?? throw new ArgumentNullException(nameof(owner)); + + if (Owner == owner) + { + Owner = null; + _resources?.RemoveOwner(owner); + } + } + } +} diff --git a/src/Avalonia.Base/Styling/StyleCache.cs b/src/Avalonia.Base/Styling/StyleCache.cs index 3285476880..81196f6a27 100644 --- a/src/Avalonia.Base/Styling/StyleCache.cs +++ b/src/Avalonia.Base/Styling/StyleCache.cs @@ -12,7 +12,7 @@ namespace Avalonia.Styling /// internal class StyleCache : Dictionary?> { - public SelectorMatchResult TryAttach(IList styles, IStyleable target, IStyleHost? host) + public SelectorMatchResult TryAttach(IList styles, IStyleable target, object? host) { if (TryGetValue(target.StyleKey, out var cached)) { diff --git a/src/Avalonia.Base/Styling/StyleChildren.cs b/src/Avalonia.Base/Styling/StyleChildren.cs index 5f8635f155..42b0a331ee 100644 --- a/src/Avalonia.Base/Styling/StyleChildren.cs +++ b/src/Avalonia.Base/Styling/StyleChildren.cs @@ -5,20 +5,20 @@ namespace Avalonia.Styling { internal class StyleChildren : Collection { - private readonly Style _owner; + private readonly StyleBase _owner; - public StyleChildren(Style owner) => _owner = owner; + public StyleChildren(StyleBase owner) => _owner = owner; protected override void InsertItem(int index, IStyle item) { - (item as Style)?.SetParent(_owner); + (item as StyleBase)?.SetParent(_owner); base.InsertItem(index, item); } protected override void RemoveItem(int index) { var item = Items[index]; - (item as Style)?.SetParent(null); + (item as StyleBase)?.SetParent(null); if (_owner.Owner is IResourceHost host) (item as IResourceProvider)?.RemoveOwner(host); base.RemoveItem(index); @@ -26,7 +26,7 @@ namespace Avalonia.Styling protected override void SetItem(int index, IStyle item) { - (item as Style)?.SetParent(_owner); + (item as StyleBase)?.SetParent(_owner); base.SetItem(index, item); if (_owner.Owner is IResourceHost host) (item as IResourceProvider)?.AddOwner(host); diff --git a/src/Avalonia.Base/Styling/Styler.cs b/src/Avalonia.Base/Styling/Styler.cs index 74cf77ea40..ad5c1cd102 100644 --- a/src/Avalonia.Base/Styling/Styler.cs +++ b/src/Avalonia.Base/Styling/Styler.cs @@ -1,19 +1,24 @@ using System; -#nullable enable - namespace Avalonia.Styling { public class Styler : IStyler { public void ApplyStyles(IStyleable target) { - target = target ?? throw new ArgumentNullException(nameof(target)); + _ = target ?? throw new ArgumentNullException(nameof(target)); + + // Apply the control theme. + target.GetEffectiveTheme()?.TryAttach(target, target); + + // If the control has a themed templated parent then apply the styles from the + // templated parent theme. + if (target.TemplatedParent is IStyleable styleableParent) + styleableParent.GetEffectiveTheme()?.TryAttach(target, styleableParent); + // Apply styles from the rest of the tree. if (target is IStyleHost styleHost) - { ApplyStyles(target, styleHost); - } } private void ApplyStyles(IStyleable target, IStyleHost host) @@ -21,14 +26,10 @@ namespace Avalonia.Styling var parent = host.StylingParent; if (parent != null) - { ApplyStyles(target, parent); - } if (host.IsStylesInitialized) - { host.Styles.TryAttach(target, host); - } } } } diff --git a/src/Avalonia.Base/Styling/Styles.cs b/src/Avalonia.Base/Styling/Styles.cs index 7c0bc4ad7f..c213475bb7 100644 --- a/src/Avalonia.Base/Styling/Styles.cs +++ b/src/Avalonia.Base/Styling/Styles.cs @@ -17,7 +17,7 @@ namespace Avalonia.Styling IStyle, IResourceProvider { - private readonly AvaloniaList _styles = new AvaloniaList(); + private readonly AvaloniaList _styles = new(); private IResourceHost? _owner; private IResourceDictionary? _resources; private StyleCache? _cache; @@ -26,6 +26,11 @@ namespace Avalonia.Styling { _styles.ResetBehavior = ResetBehavior.Remove; _styles.CollectionChanged += OnCollectionChanged; + _styles.Validate = i => + { + if (i is ControlTheme) + throw new InvalidOperationException("ControlThemes cannot be added to a Styles collection."); + }; } public Styles(IResourceHost owner) @@ -62,16 +67,18 @@ namespace Avalonia.Styling { value = value ?? throw new ArgumentNullException(nameof(Resources)); - if (Owner is object) + var currentOwner = Owner; + + if (currentOwner is not null) { - _resources?.RemoveOwner(Owner); + _resources?.RemoveOwner(currentOwner); } _resources = value; - if (Owner is object) + if (currentOwner is not null) { - _resources.AddOwner(Owner); + _resources.AddOwner(currentOwner); } } } @@ -89,7 +96,7 @@ namespace Avalonia.Styling foreach (var i in this) { - if (i is IResourceProvider p && p.HasResources) + if (i is IResourceProvider { HasResources: true }) { return true; } @@ -109,7 +116,7 @@ namespace Avalonia.Styling set => _styles[index] = value; } - public SelectorMatchResult TryAttach(IStyleable target, IStyleHost? host) + public SelectorMatchResult TryAttach(IStyleable target, object? host) { _cache ??= new StyleCache(); return _cache.TryAttach(this, target, host); @@ -190,7 +197,7 @@ namespace Avalonia.Styling { owner = owner ?? throw new ArgumentNullException(nameof(owner)); - if (Owner != null) + if (Owner is not null) { throw new InvalidOperationException("The Styles already has a owner."); } @@ -227,70 +234,81 @@ namespace Avalonia.Styling } } - private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + private static IReadOnlyList ToReadOnlyList(ICollection list) { - static IReadOnlyList ToReadOnlyList(IList list) + if (list is IReadOnlyList readOnlyList) { - if (list is IReadOnlyList) - { - return (IReadOnlyList)list; - } - else - { - var result = new T[list.Count]; - list.CopyTo(result, 0); - return result; - } + return readOnlyList; } - void Add(IList items) + var result = new T[list.Count]; + list.CopyTo(result, 0); + return result; + } + + private static void InternalAdd(IList items, IResourceHost? owner, ref StyleCache? cache) + { + if (owner is not null) { for (var i = 0; i < items.Count; ++i) { - var style = (IStyle)items[i]!; - - if (Owner is object && style is IResourceProvider resourceProvider) + if (items[i] is IResourceProvider provider) { - resourceProvider.AddOwner(Owner); + provider.AddOwner(owner); } - - _cache = null; } - (Owner as IStyleHost)?.StylesAdded(ToReadOnlyList(items)); + (owner as IStyleHost)?.StylesAdded(ToReadOnlyList(items)); } - void Remove(IList items) + if (items.Count > 0) + { + cache = null; + } + } + + private static void InternalRemove(IList items, IResourceHost? owner, ref StyleCache? cache) + { + if (owner is not null) { for (var i = 0; i < items.Count; ++i) { - var style = (IStyle)items[i]!; - - if (Owner is object && style is IResourceProvider resourceProvider) + if (items[i] is IResourceProvider provider) { - resourceProvider.RemoveOwner(Owner); + provider.RemoveOwner(owner); } - - _cache = null; } - (Owner as IStyleHost)?.StylesRemoved(ToReadOnlyList(items)); + (owner as IStyleHost)?.StylesRemoved(ToReadOnlyList(items)); + } + + if (items.Count > 0) + { + cache = null; + } + } + + private void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) + { + if (e.Action == NotifyCollectionChangedAction.Reset) + { + throw new InvalidOperationException("Reset should not be called on Styles."); } + var currentOwner = Owner; + switch (e.Action) { case NotifyCollectionChangedAction.Add: - Add(e.NewItems!); + InternalAdd(e.NewItems!, currentOwner, ref _cache); break; case NotifyCollectionChangedAction.Remove: - Remove(e.OldItems!); + InternalRemove(e.OldItems!, currentOwner, ref _cache); break; case NotifyCollectionChangedAction.Replace: - Remove(e.OldItems!); - Add(e.NewItems!); + InternalRemove(e.OldItems!, currentOwner, ref _cache); + InternalAdd(e.NewItems!, currentOwner, ref _cache); break; - case NotifyCollectionChangedAction.Reset: - throw new InvalidOperationException("Reset should not be called on Styles."); } CollectionChanged?.Invoke(this, e); diff --git a/src/Avalonia.Base/Styling/TemplateSelector.cs b/src/Avalonia.Base/Styling/TemplateSelector.cs index b0a2dae8d6..278e24a203 100644 --- a/src/Avalonia.Base/Styling/TemplateSelector.cs +++ b/src/Avalonia.Base/Styling/TemplateSelector.cs @@ -49,6 +49,6 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => null; - internal override bool HasValidNestingSelector() => _parent?.HasValidNestingSelector() ?? false; + protected override Selector? MovePreviousOrParent() => _parent; } } diff --git a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs index 24d5d6bbbf..6681a7da36 100644 --- a/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs +++ b/src/Avalonia.Base/Styling/TypeNameAndClassSelector.cs @@ -140,7 +140,7 @@ namespace Avalonia.Styling } protected override Selector? MovePrevious() => _previous; - internal override bool HasValidNestingSelector() => _previous?.HasValidNestingSelector() ?? false; + protected override Selector? MovePreviousOrParent() => _previous; private string BuildSelectorString() { diff --git a/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs b/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs index 21649306cb..2cade55f32 100644 --- a/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs +++ b/src/Avalonia.Base/Threading/AvaloniaSynchronizationContext.cs @@ -30,7 +30,7 @@ namespace Avalonia.Threading /// public override void Post(SendOrPostCallback d, object? state) { - Dispatcher.UIThread.Post(() => d(state), DispatcherPriority.Background); + Dispatcher.UIThread.Post(d, state, DispatcherPriority.Background); } /// diff --git a/src/Avalonia.Base/Threading/Dispatcher.cs b/src/Avalonia.Base/Threading/Dispatcher.cs index 2eb2e7c01f..571f782813 100644 --- a/src/Avalonia.Base/Threading/Dispatcher.cs +++ b/src/Avalonia.Base/Threading/Dispatcher.cs @@ -118,7 +118,7 @@ namespace Avalonia.Threading } /// - public void Post(Action action, T arg, DispatcherPriority priority = default) + public void Post(SendOrPostCallback action, object? arg, DispatcherPriority priority = default) { _ = action ?? throw new ArgumentNullException(nameof(action)); _jobRunner.Post(action, arg, priority); diff --git a/src/Avalonia.Base/Threading/IDispatcher.cs b/src/Avalonia.Base/Threading/IDispatcher.cs index 713a7ac4d7..1c700132b7 100644 --- a/src/Avalonia.Base/Threading/IDispatcher.cs +++ b/src/Avalonia.Base/Threading/IDispatcher.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; namespace Avalonia.Threading @@ -26,6 +27,14 @@ namespace Avalonia.Threading /// The priority with which to invoke the method. void Post(Action action, DispatcherPriority priority = default); + /// + /// Posts an action that will be invoked on the dispatcher thread. + /// + /// The method. + /// The argument of method to call. + /// The priority with which to invoke the method. + void Post(SendOrPostCallback action, object? arg, DispatcherPriority priority = default); + /// /// Invokes a action on the dispatcher thread. /// diff --git a/src/Avalonia.Base/Threading/JobRunner.cs b/src/Avalonia.Base/Threading/JobRunner.cs index 4b304d44f6..ced3423c27 100644 --- a/src/Avalonia.Base/Threading/JobRunner.cs +++ b/src/Avalonia.Base/Threading/JobRunner.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Avalonia.Platform; @@ -81,9 +82,9 @@ namespace Avalonia.Threading /// The method to call. /// The parameter of method to call. /// The priority with which to invoke the method. - internal void Post(Action action, T parameter, DispatcherPriority priority) + internal void Post(SendOrPostCallback action, object? parameter, DispatcherPriority priority) { - AddJob(new Job(action, parameter, priority, true)); + AddJob(new JobWithArg(action, parameter, priority, true)); } /// @@ -207,11 +208,10 @@ namespace Avalonia.Threading /// /// A typed job to run. /// - /// Type of job parameter - private sealed class Job : IJob + private sealed class JobWithArg : IJob { - private readonly Action _action; - private readonly T _parameter; + private readonly SendOrPostCallback _action; + private readonly object? _parameter; private readonly TaskCompletionSource? _taskCompletionSource; /// @@ -222,7 +222,7 @@ namespace Avalonia.Threading /// The job priority. /// Do not wrap exception in TaskCompletionSource - public Job(Action action, T parameter, DispatcherPriority priority, bool throwOnUiThread) + public JobWithArg(SendOrPostCallback action, object? parameter, DispatcherPriority priority, bool throwOnUiThread) { _action = action; _parameter = parameter; diff --git a/src/Avalonia.Base/Utilities/ArrayBuilder.cs b/src/Avalonia.Base/Utilities/ArrayBuilder.cs index 7048659431..60bf2c7586 100644 --- a/src/Avalonia.Base/Utilities/ArrayBuilder.cs +++ b/src/Avalonia.Base/Utilities/ArrayBuilder.cs @@ -101,7 +101,7 @@ namespace Avalonia.Utilities /// /// The array slice. /// The . - public ArraySlice Add(in ReadOnlySlice value) + public ArraySlice Add(in ArraySlice value) { var position = _size; diff --git a/src/Avalonia.Base/Utilities/ArraySlice.cs b/src/Avalonia.Base/Utilities/ArraySlice.cs index f5a9d3a98d..482f807fe0 100644 --- a/src/Avalonia.Base/Utilities/ArraySlice.cs +++ b/src/Avalonia.Base/Utilities/ArraySlice.cs @@ -116,7 +116,7 @@ namespace Avalonia.Utilities /// public static implicit operator ReadOnlySlice(ArraySlice slice) { - return new ReadOnlySlice(slice._data).AsSlice(slice.Start, slice.Length); + return new ReadOnlySlice(slice._data, 0, slice.Length, slice.Start); } /// diff --git a/src/Avalonia.Base/Utilities/BidiDictionary.cs b/src/Avalonia.Base/Utilities/BidiDictionary.cs new file mode 100644 index 0000000000..654fbc9807 --- /dev/null +++ b/src/Avalonia.Base/Utilities/BidiDictionary.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; + +namespace Avalonia.Utilities +{ + /// + /// A simple bi-directional dictionary. + /// + /// Key type + /// Value type + internal sealed class BidiDictionary where T1 : notnull where T2 : notnull + { + public Dictionary Forward { get; } = new Dictionary(); + + public Dictionary Reverse { get; } = new Dictionary(); + + public void Clear() + { + Forward.Clear(); + Reverse.Clear(); + } + + public void Add(T1 key, T2 value) + { + Forward.Add(key, value); + Reverse.Add(value, key); + } + +#pragma warning disable CS8601 + public bool TryGetValue(T1 key, out T2 value) => Forward.TryGetValue(key, out value); +#pragma warning restore CS8601 + +#pragma warning disable CS8601 + public bool TryGetKey(T2 value, out T1 key) => Reverse.TryGetValue(value, out key); +#pragma warning restore CS8601 + + public bool ContainsKey(T1 key) => Forward.ContainsKey(key); + + public bool ContainsValue(T2 value) => Reverse.ContainsKey(value); + } +} diff --git a/src/Avalonia.Base/ValueStore.cs b/src/Avalonia.Base/ValueStore.cs index 69c644dff9..bf29e0b0ac 100644 --- a/src/Avalonia.Base/ValueStore.cs +++ b/src/Avalonia.Base/ValueStore.cs @@ -462,10 +462,6 @@ namespace Avalonia values.Remove(entry.property); } } - else - { - throw new AvaloniaInternalException("Value could not be found at the end of batch update."); - } // If a new batch update was started while ending this one, abort. if (_batchUpdateCount > 0) diff --git a/src/Avalonia.Base/Visual.cs b/src/Avalonia.Base/Visual.cs index 4fd21f02f9..bdf8723b81 100644 --- a/src/Avalonia.Base/Visual.cs +++ b/src/Avalonia.Base/Visual.cs @@ -376,7 +376,9 @@ namespace Avalonia if (e.OldValue is IAffectsRender oldValue) { if (sender._affectsRenderWeakSubscriber != null) + { InvalidatedWeakEvent.Unsubscribe(oldValue, sender._affectsRenderWeakSubscriber); + } } if (e.NewValue is IAffectsRender newValue) diff --git a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs index e97d97cc49..39a83c00c4 100644 --- a/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs +++ b/src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs @@ -49,9 +49,9 @@ namespace Avalonia.Build.Tasks string projectDirectory, string output, bool verifyIl, MessageImportance logImportance, string strongNameKey, bool patchCom, bool skipXamlCompilation, bool debuggerLaunch) { - var typeSystem = new CecilTypeSystem(references - .Where(r => !r.ToLowerInvariant().EndsWith("avalonia.build.tasks.dll")) - .Concat(new[] { input }), input); + var typeSystem = new CecilTypeSystem( + references.Where(r => !r.ToLowerInvariant().EndsWith("avalonia.build.tasks.dll")), + input); var asm = typeSystem.TargetAssemblyDefinition; diff --git a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs index 245592207e..7e6b70a146 100644 --- a/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs +++ b/src/Avalonia.Controls.ColorPicker/ColorSpectrum/ColorSpectrum.cs @@ -128,8 +128,8 @@ namespace Avalonia.Controls.Primitives if (_inputTarget != null) { - _inputTarget.PointerEnter += InputTarget_PointerEnter; - _inputTarget.PointerLeave += InputTarget_PointerLeave; + _inputTarget.PointerEntered += InputTarget_PointerEntered; + _inputTarget.PointerExited += InputTarget_PointerExited; _inputTarget.PointerPressed += InputTarget_PointerPressed; _inputTarget.PointerMoved += InputTarget_PointerMoved; _inputTarget.PointerReleased += InputTarget_PointerReleased; @@ -194,8 +194,8 @@ namespace Avalonia.Controls.Primitives if (_inputTarget != null) { - _inputTarget.PointerEnter -= InputTarget_PointerEnter; - _inputTarget.PointerLeave -= InputTarget_PointerLeave; + _inputTarget.PointerEntered -= InputTarget_PointerEntered; + _inputTarget.PointerExited -= InputTarget_PointerExited; _inputTarget.PointerPressed -= InputTarget_PointerPressed; _inputTarget.PointerMoved -= InputTarget_PointerMoved; _inputTarget.PointerReleased -= InputTarget_PointerReleased; @@ -362,7 +362,7 @@ namespace Avalonia.Controls.Primitives } /// - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { // We only want to bother with the color name tool tip if we can provide color names. if (_selectionEllipsePanel != null && @@ -373,7 +373,7 @@ namespace Avalonia.Controls.Primitives UpdatePseudoClasses(); - base.OnPointerLeave(e); + base.OnPointerExited(e); } /// @@ -848,16 +848,16 @@ namespace Avalonia.Controls.Primitives UpdatePseudoClasses(); } - /// - private void InputTarget_PointerEnter(object? sender, PointerEventArgs args) + /// + private void InputTarget_PointerEntered(object? sender, PointerEventArgs args) { _isPointerOver = true; UpdatePseudoClasses(); args.Handled = true; } - /// - private void InputTarget_PointerLeave(object? sender, PointerEventArgs args) + /// + private void InputTarget_PointerExited(object? sender, PointerEventArgs args) { _isPointerOver = false; UpdatePseudoClasses(); diff --git a/src/Avalonia.Controls.DataGrid/DataGridCell.cs b/src/Avalonia.Controls.DataGrid/DataGridCell.cs index 67183781d3..f9685b3682 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridCell.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridCell.cs @@ -139,18 +139,18 @@ namespace Avalonia.Controls } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); if (OwningRow != null) { IsMouseOver = true; } } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { - base.OnPointerLeave(e); + base.OnPointerExited(e); if (OwningRow != null) { @@ -178,9 +178,9 @@ namespace Avalonia.Controls { var handled = OwningGrid.UpdateStateOnMouseLeftButtonDown(e, ColumnIndex, OwningRow.Slot, !e.Handled); - // Do not handle PointerPressed with touch, + // Do not handle PointerPressed with touch or pen, // so we can start scroll gesture on the same event. - if (e.Pointer.Type != PointerType.Touch) + if (e.Pointer.Type != PointerType.Touch && e.Pointer.Type != PointerType.Pen) { e.Handled = handled; } diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs index f3ea48ff80..c415f477d4 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridColumn.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridColumn.cs @@ -855,7 +855,7 @@ namespace Avalonia.Controls if (OwningGrid != null && OwningGrid.UseLayoutRounding) { var scale = LayoutHelper.GetLayoutScale(HeaderCell); - var roundSize = LayoutHelper.RoundLayoutSize(new Size(leftEdge + ActualWidth, 1), scale, scale); + var roundSize = LayoutHelper.RoundLayoutSizeUp(new Size(leftEdge + ActualWidth, 1), scale, scale); LayoutRoundedWidth = roundSize.Width - leftEdge; } else diff --git a/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs index 915b36687c..d3bd968d62 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs @@ -83,9 +83,9 @@ namespace Avalonia.Controls { PointerPressed += DataGridColumnHeader_PointerPressed; PointerReleased += DataGridColumnHeader_PointerReleased; - PointerMoved += DataGridColumnHeader_PointerMove; - PointerEnter += DataGridColumnHeader_PointerEnter; - PointerLeave += DataGridColumnHeader_PointerLeave; + PointerMoved += DataGridColumnHeader_PointerMoved; + PointerEntered += DataGridColumnHeader_PointerEntered; + PointerExited += DataGridColumnHeader_PointerExited; } private void OnAreSeparatorsVisibleChanged(AvaloniaPropertyChangedEventArgs e) @@ -452,7 +452,7 @@ namespace Avalonia.Controls SetDragCursor(mousePosition); } - private void DataGridColumnHeader_PointerEnter(object sender, PointerEventArgs e) + private void DataGridColumnHeader_PointerEntered(object sender, PointerEventArgs e) { if (!IsEnabled) { @@ -464,7 +464,7 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - private void DataGridColumnHeader_PointerLeave(object sender, PointerEventArgs e) + private void DataGridColumnHeader_PointerExited(object sender, PointerEventArgs e) { if (!IsEnabled) { @@ -506,7 +506,7 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - private void DataGridColumnHeader_PointerMove(object sender, PointerEventArgs e) + private void DataGridColumnHeader_PointerMoved(object sender, PointerEventArgs e) { if (OwningGrid == null || !IsEnabled) { diff --git a/src/Avalonia.Controls.DataGrid/DataGridRow.cs b/src/Avalonia.Controls.DataGrid/DataGridRow.cs index b062a14e39..1559763a1b 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRow.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRow.cs @@ -607,15 +607,15 @@ namespace Avalonia.Controls } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); IsMouseOver = true; } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { IsMouseOver = false; - base.OnPointerLeave(e); + base.OnPointerExited(e); } internal void ApplyCellsState() diff --git a/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs index a3dfa44fc9..9f37e8a6aa 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRowGroupHeader.cs @@ -375,7 +375,7 @@ namespace Avalonia.Controls ApplyHeaderStatus(); } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { if (IsEnabled) { @@ -383,10 +383,10 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - base.OnPointerEnter(e); + base.OnPointerEntered(e); } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { if (IsEnabled) { @@ -394,7 +394,7 @@ namespace Avalonia.Controls UpdatePseudoClasses(); } - base.OnPointerLeave(e); + base.OnPointerExited(e); } private void SetIsCheckedNoCallBack(bool value) diff --git a/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs b/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs index 03299bbf35..fe3ba0abf6 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridRowHeader.cs @@ -158,23 +158,23 @@ namespace Avalonia.Controls.Primitives } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { if (OwningRow != null) { OwningRow.IsMouseOver = true; } - base.OnPointerEnter(e); + base.OnPointerEntered(e); } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { if (OwningRow != null) { OwningRow.IsMouseOver = false; } - base.OnPointerLeave(e); + base.OnPointerExited(e); } //TODO TabStop diff --git a/src/Avalonia.Controls/Calendar/CalendarItem.cs b/src/Avalonia.Controls/Calendar/CalendarItem.cs index bcac6324ba..4c958c83b7 100644 --- a/src/Avalonia.Controls/Calendar/CalendarItem.cs +++ b/src/Avalonia.Controls/Calendar/CalendarItem.cs @@ -189,7 +189,7 @@ namespace Avalonia.Controls.Primitives EventHandler cellMouseLeftButtonDown = Cell_MouseLeftButtonDown; EventHandler cellMouseLeftButtonUp = Cell_MouseLeftButtonUp; - EventHandler cellMouseEnter = Cell_MouseEnter; + EventHandler cellMouseEntered = Cell_MouseEntered; EventHandler cellClick = Cell_Click; for (int i = 1; i < Calendar.RowsPerMonth; i++) @@ -206,7 +206,7 @@ namespace Avalonia.Controls.Primitives cell.SetValue(Grid.ColumnProperty, j); cell.CalendarDayButtonMouseDown += cellMouseLeftButtonDown; cell.CalendarDayButtonMouseUp += cellMouseLeftButtonUp; - cell.PointerEnter += cellMouseEnter; + cell.PointerEntered += cellMouseEntered; cell.Click += cellClick; children.Add(cell); } @@ -222,7 +222,7 @@ namespace Avalonia.Controls.Primitives EventHandler monthCalendarButtonMouseDown = Month_CalendarButtonMouseDown; EventHandler monthCalendarButtonMouseUp = Month_CalendarButtonMouseUp; - EventHandler monthMouseEnter = Month_MouseEnter; + EventHandler monthMouseEntered = Month_MouseEntered; for (int i = 0; i < Calendar.RowsPerYear; i++) { @@ -238,7 +238,7 @@ namespace Avalonia.Controls.Primitives month.SetValue(Grid.ColumnProperty, j); month.CalendarLeftMouseButtonDown += monthCalendarButtonMouseDown; month.CalendarLeftMouseButtonUp += monthCalendarButtonMouseUp; - month.PointerEnter += monthMouseEnter; + month.PointerEntered += monthMouseEntered; children.Add(month); } } @@ -876,7 +876,7 @@ namespace Avalonia.Controls.Primitives } } - internal void Cell_MouseEnter(object? sender, PointerEventArgs e) + internal void Cell_MouseEntered(object? sender, PointerEventArgs e) { if (Owner != null) { @@ -1162,7 +1162,7 @@ namespace Avalonia.Controls.Primitives } } - private void Month_MouseEnter(object? sender, PointerEventArgs e) + private void Month_MouseEntered(object? sender, PointerEventArgs e) { if (_isMouseLeftButtonDownYearView) { diff --git a/src/Avalonia.Controls/ComboBox.cs b/src/Avalonia.Controls/ComboBox.cs index cbf9b35a05..05be5ad00d 100644 --- a/src/Avalonia.Controls/ComboBox.cs +++ b/src/Avalonia.Controls/ComboBox.cs @@ -181,26 +181,13 @@ namespace Avalonia.Controls protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTree(e); - this.UpdateSelectionBoxItem(SelectedItem); + UpdateSelectionBoxItem(SelectedItem); } - // Because the SelectedItem isn't connected to the visual tree public override void InvalidateMirrorTransform() { base.InvalidateMirrorTransform(); - - if (SelectedItem is Control selectedControl) - { - selectedControl.InvalidateMirrorTransform(); - - foreach (var visual in selectedControl.GetVisualDescendants()) - { - if (visual is Control childControl) - { - childControl.InvalidateMirrorTransform(); - } - } - } + UpdateFlowDirection(); } /// @@ -365,6 +352,8 @@ namespace Avalonia.Controls { parent.GetObservable(IsVisibleProperty).Subscribe(IsVisibleChanged).DisposeWith(_subscriptionsOnOpen); } + + UpdateFlowDirection(); } private void IsVisibleChanged(bool isVisible) @@ -432,6 +421,8 @@ namespace Avalonia.Controls } }; } + + UpdateFlowDirection(); } else { @@ -439,6 +430,19 @@ namespace Avalonia.Controls } } + private void UpdateFlowDirection() + { + if (SelectionBoxItem is Rectangle rectangle) + { + if ((rectangle.Fill as VisualBrush)?.Visual is Control content) + { + var flowDirection = (((IVisual)content!).VisualParent as Control)?.FlowDirection ?? + FlowDirection.LeftToRight; + rectangle.FlowDirection = flowDirection; + } + } + } + private void SelectFocusedItem() { foreach (ItemContainerInfo dropdownItem in ItemContainerGenerator.Containers) diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index d6a5fa0727..083182a370 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.ComponentModel; using Avalonia.Automation.Peers; using Avalonia.Controls.Documents; @@ -10,6 +11,7 @@ using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.Rendering; using Avalonia.Styling; +using Avalonia.Threading; using Avalonia.VisualTree; namespace Avalonia.Controls @@ -53,21 +55,57 @@ namespace Avalonia.Controls /// Event raised when an element wishes to be scrolled into view. /// public static readonly RoutedEvent RequestBringIntoViewEvent = - RoutedEvent.Register("RequestBringIntoView", RoutingStrategies.Bubble); + RoutedEvent.Register( + "RequestBringIntoView", + RoutingStrategies.Bubble); /// /// Provides event data for the event. /// public static readonly RoutedEvent ContextRequestedEvent = - RoutedEvent.Register(nameof(ContextRequested), + RoutedEvent.Register( + nameof(ContextRequested), RoutingStrategies.Tunnel | RoutingStrategies.Bubble); + /// + /// Defines the event. + /// + public static readonly RoutedEvent LoadedEvent = + RoutedEvent.Register( + nameof(Loaded), + RoutingStrategies.Direct); + + /// + /// Defines the event. + /// + public static readonly RoutedEvent UnloadedEvent = + RoutedEvent.Register( + nameof(Unloaded), + RoutingStrategies.Direct); + /// /// Defines the property. /// public static readonly AttachedProperty FlowDirectionProperty = - AvaloniaProperty.RegisterAttached(nameof(FlowDirection), inherits: true); - + AvaloniaProperty.RegisterAttached( + nameof(FlowDirection), + inherits: true); + + // Note the following: + // _loadedQueue : + // Is the queue where any control will be added to indicate that its loaded + // event should be scheduled and called later. + // _loadedProcessingQueue : + // Contains a copied snapshot of the _loadedQueue at the time when processing + // starts and individual events are being fired. This was needed to avoid + // exceptions if new controls were added in the Loaded event itself. + + private static bool _isLoadedProcessing = false; + private static readonly HashSet _loadedQueue = new HashSet(); + private static readonly HashSet _loadedProcessingQueue = new HashSet(); + + private bool _isAttachedToVisualTree = false; + private bool _isLoaded = false; private DataTemplates? _dataTemplates; private IControl? _focusAdorner; private AutomationPeer? _automationPeer; @@ -108,6 +146,15 @@ namespace Avalonia.Controls set => SetValue(ContextFlyoutProperty, value); } + /// + /// Gets a value indicating whether the control is fully constructed in the visual tree + /// and both layout and render are complete. + /// + /// + /// This is set to true while raising the event. + /// + public bool IsLoaded => _isLoaded; + /// /// Gets or sets a user-defined object attached to the control. /// @@ -135,6 +182,35 @@ namespace Avalonia.Controls remove => RemoveHandler(ContextRequestedEvent, value); } + /// + /// Occurs when the control has been fully constructed in the visual tree and both + /// layout and render are complete. + /// + /// + /// This event is guaranteed to occur after the control template is applied and references + /// to objects created after the template is applied are available. This makes it different + /// from OnAttachedToVisualTree which doesn't have these references. This event occurs at the + /// latest possible time in the control creation life-cycle. + /// + public event EventHandler? Loaded + { + add => AddHandler(LoadedEvent, value); + remove => RemoveHandler(LoadedEvent, value); + } + + /// + /// Occurs when the control is removed from the visual tree. + /// + /// + /// This is API symmetrical with and exists for compatibility with other + /// XAML frameworks; however, it behaves the same as OnDetachedFromVisualTree. + /// + public event EventHandler? Unloaded + { + add => AddHandler(UnloadedEvent, value); + remove => RemoveHandler(UnloadedEvent, value); + } + public new IControl? Parent => (IControl?)base.Parent; /// @@ -215,18 +291,124 @@ namespace Avalonia.Controls /// The control that receives the focus adorner. protected virtual IControl? GetTemplateFocusTarget() => this; + private static Action loadedProcessingAction = () => + { + // Copy the loaded queue for processing + // There was a possibility of the "Collection was modified; enumeration operation may not execute." + // exception when only a single hash set was used. This could happen when new controls are added + // within the Loaded callback/event itself. To fix this, two hash sets are used and while one is + // being processed the other accepts adding new controls to process next. + _loadedProcessingQueue.Clear(); + foreach (Control control in _loadedQueue) + { + _loadedProcessingQueue.Add(control); + } + _loadedQueue.Clear(); + + foreach (Control control in _loadedProcessingQueue) + { + control.OnLoadedCore(); + } + + _loadedProcessingQueue.Clear(); + _isLoadedProcessing = false; + + // Restart if any controls were added to the queue while processing + if (_loadedQueue.Count > 0) + { + _isLoadedProcessing = true; + Dispatcher.UIThread.Post(loadedProcessingAction!, DispatcherPriority.Loaded); + } + }; + + /// + /// Schedules to be called for this control. + /// For performance, it will be queued with other controls. + /// + internal void ScheduleOnLoadedCore() + { + if (_isLoaded == false) + { + bool isAdded = _loadedQueue.Add(this); + + if (isAdded && + _isLoadedProcessing == false) + { + _isLoadedProcessing = true; + Dispatcher.UIThread.Post(loadedProcessingAction!, DispatcherPriority.Loaded); + } + } + } + + /// + /// Invoked as the first step of marking the control as loaded and raising the + /// event. + /// + internal void OnLoadedCore() + { + if (_isLoaded == false && + _isAttachedToVisualTree) + { + _isLoaded = true; + OnLoaded(); + } + } + + /// + /// Invoked as the first step of marking the control as unloaded and raising the + /// event. + /// + internal void OnUnloadedCore() + { + if (_isLoaded) + { + // Remove from the loaded event queue here as a failsafe in case the control + // is detached before the dispatcher runs the Loaded jobs. + _loadedQueue.Remove(this); + + _isLoaded = false; + OnUnloaded(); + } + } + + /// + /// Invoked just before the event. + /// + protected virtual void OnLoaded() + { + var eventArgs = new RoutedEventArgs(LoadedEvent); + eventArgs.Source = null; + RaiseEvent(eventArgs); + } + + /// + /// Invoked just before the event. + /// + protected virtual void OnUnloaded() + { + var eventArgs = new RoutedEventArgs(UnloadedEvent); + eventArgs.Source = null; + RaiseEvent(eventArgs); + } + /// protected sealed override void OnAttachedToVisualTreeCore(VisualTreeAttachmentEventArgs e) { base.OnAttachedToVisualTreeCore(e); + _isAttachedToVisualTree = true; InitializeIfNeeded(); + + ScheduleOnLoadedCore(); } /// protected sealed override void OnDetachedFromVisualTreeCore(VisualTreeAttachmentEventArgs e) { base.OnDetachedFromVisualTreeCore(e); + _isAttachedToVisualTree = false; + + OnUnloadedCore(); } /// @@ -324,7 +506,9 @@ namespace Avalonia.Controls var keymap = AvaloniaLocator.Current.GetService()?.OpenContextMenu; if (keymap is null) + { return; + } var matches = false; @@ -378,17 +562,12 @@ namespace Avalonia.Controls bool bypassFlowDirectionPolicies = BypassFlowDirectionPolicies; bool parentBypassFlowDirectionPolicies = false; - var parent = this.FindAncestorOfType(); + var parent = ((IVisual)this).VisualParent as Control; if (parent != null) { parentFlowDirection = parent.FlowDirection; parentBypassFlowDirectionPolicies = parent.BypassFlowDirectionPolicies; } - else if (Parent is Control logicalParent) - { - parentFlowDirection = logicalParent.FlowDirection; - parentBypassFlowDirectionPolicies = logicalParent.BypassFlowDirectionPolicies; - } bool thisShouldBeMirrored = flowDirection == FlowDirection.RightToLeft && !bypassFlowDirectionPolicies; bool parentShouldBeMirrored = parentFlowDirection == FlowDirection.RightToLeft && !parentBypassFlowDirectionPolicies; diff --git a/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs b/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs index 6ab2f4c517..9d859a753a 100644 --- a/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs +++ b/src/Avalonia.Controls/Converters/MenuScrollingVisibilityConverter.cs @@ -26,7 +26,7 @@ namespace Avalonia.Controls.Converters if (visibility == ScrollBarVisibility.Auto) { - if (extent == viewport) + if (MathUtilities.AreClose(extent, viewport)) { return false; } diff --git a/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs b/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs index 7f2abb7e98..46c5eaeaaa 100644 --- a/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs +++ b/src/Avalonia.Controls/DateTimePickers/TimePickerPresenter.cs @@ -194,7 +194,7 @@ namespace Avalonia.Controls if (ClockIdentifier == "12HourClock") { - hr = per == 1 ? hr + 12 : per == 0 && hr == 12 ? 0 : hr; + hr = per == 1 ? (hr == 12) ? 12 : hr + 12 : per == 0 && hr == 12 ? 0 : hr; } Time = new TimeSpan(hr, min, 0); diff --git a/src/Avalonia.Controls/Design.cs b/src/Avalonia.Controls/Design.cs index 07d2918a88..80600b2276 100644 --- a/src/Avalonia.Controls/Design.cs +++ b/src/Avalonia.Controls/Design.cs @@ -1,4 +1,5 @@ +using System.Collections.Generic; using System.Runtime.CompilerServices; using Avalonia.Styling; @@ -6,6 +7,8 @@ namespace Avalonia.Controls { public static class Design { + private static Dictionary? _previewWith; + public static bool IsDesignMode { get; internal set; } public static readonly AttachedProperty HeightProperty = AvaloniaProperty @@ -47,19 +50,30 @@ namespace Avalonia.Controls return control.GetValue(DataContextProperty); } - public static readonly AttachedProperty PreviewWithProperty = AvaloniaProperty - .RegisterAttached("PreviewWith", typeof (Design)); + public static readonly AttachedProperty PreviewWithProperty = AvaloniaProperty + .RegisterAttached("PreviewWith", typeof (Design)); - public static void SetPreviewWith(AvaloniaObject target, Control control) + public static void SetPreviewWith(AvaloniaObject target, Control? control) { target.SetValue(PreviewWithProperty, control); } - public static Control GetPreviewWith(AvaloniaObject target) + public static void SetPreviewWith(ResourceDictionary target, Control? control) + { + _previewWith ??= new(); + _previewWith[target] = control; + } + + public static Control? GetPreviewWith(AvaloniaObject target) { return target.GetValue(PreviewWithProperty); } + public static Control? GetPreviewWith(ResourceDictionary target) + { + return _previewWith?[target]; + } + public static readonly AttachedProperty DesignStyleProperty = AvaloniaProperty .RegisterAttached("DesignStyle", typeof(Design)); diff --git a/src/Avalonia.Controls/Documents/InlineCollection.cs b/src/Avalonia.Controls/Documents/InlineCollection.cs index a76222385e..dc688fc359 100644 --- a/src/Avalonia.Controls/Documents/InlineCollection.cs +++ b/src/Avalonia.Controls/Documents/InlineCollection.cs @@ -12,39 +12,55 @@ namespace Avalonia.Controls.Documents [WhitespaceSignificantCollection] public class InlineCollection : AvaloniaList { - private readonly IInlineHost? _host; + private ILogical? _parent; + private IInlineHost? _inlineHost; private string? _text = string.Empty; /// /// Initializes a new instance of the class. /// - public InlineCollection(ILogical parent) : this(parent, null) { } - - /// - /// Initializes a new instance of the class. - /// - internal InlineCollection(ILogical parent, IInlineHost? host = null) : base(0) + public InlineCollection() { - _host = host; - ResetBehavior = ResetBehavior.Remove; this.ForEachItem( x => { - ((ISetLogicalParent)x).SetParent(parent); - x.InlineHost = host; - host?.Invalidate(); + ((ISetLogicalParent)x).SetParent(Parent); + x.InlineHost = InlineHost; + Invalidate(); }, x => { ((ISetLogicalParent)x).SetParent(null); - x.InlineHost = host; - host?.Invalidate(); + x.InlineHost = InlineHost; + Invalidate(); }, () => throw new NotSupportedException()); } + internal ILogical? Parent + { + get => _parent; + set + { + _parent = value; + + OnParentChanged(value); + } + } + + internal IInlineHost? InlineHost + { + get => _inlineHost; + set + { + _inlineHost = value; + + OnInlineHostChanged(value); + } + } + public bool HasComplexContent => Count > 0; /// @@ -61,10 +77,10 @@ namespace Avalonia.Controls.Documents { return _text; } - + var builder = new StringBuilder(); - foreach(var inline in this) + foreach (var inline in this) { inline.AppendText(builder); } @@ -100,7 +116,7 @@ namespace Avalonia.Controls.Documents } else { - _text += text; + _text = text; } } @@ -120,7 +136,7 @@ namespace Avalonia.Controls.Documents base.Add(new Run(_text)); } - _text = string.Empty; + _text = null; } base.Add(item); @@ -136,14 +152,28 @@ namespace Avalonia.Controls.Documents /// protected void Invalidate() { - if(_host != null) + if(InlineHost != null) { - _host.Invalidate(); + InlineHost.Invalidate(); } Invalidated?.Invoke(this, EventArgs.Empty); } - private void Invalidate(object? sender, EventArgs e) => Invalidate(); + private void OnParentChanged(ILogical? parent) + { + foreach(var child in this) + { + ((ISetLogicalParent)child).SetParent(parent); + } + } + + private void OnInlineHostChanged(IInlineHost? inlineHost) + { + foreach (var child in this) + { + child.InlineHost = inlineHost; + } + } } } diff --git a/src/Avalonia.Controls/Documents/Span.cs b/src/Avalonia.Controls/Documents/Span.cs index bd1b4fc5e1..c7289dbc3f 100644 --- a/src/Avalonia.Controls/Documents/Span.cs +++ b/src/Avalonia.Controls/Documents/Span.cs @@ -14,25 +14,27 @@ namespace Avalonia.Controls.Documents /// /// Defines the property. /// - public static readonly DirectProperty InlinesProperty = - AvaloniaProperty.RegisterDirect( - nameof(Inlines), - o => o.Inlines); + public static readonly StyledProperty InlinesProperty = + AvaloniaProperty.Register( + nameof(Inlines)); - /// - /// Initializes a new instance of a Span element. - /// public Span() { - Inlines = new InlineCollection(this); - Inlines.Invalidated += (s, e) => InlineHost?.Invalidate(); + Inlines = new InlineCollection + { + Parent = this + }; } /// /// Gets or sets the inlines. /// [Content] - public InlineCollection Inlines { get; } + public InlineCollection Inlines + { + get => GetValue(InlinesProperty); + set => SetValue(InlinesProperty, value); + } internal override void BuildTextRun(IList textRuns) { @@ -52,7 +54,7 @@ namespace Avalonia.Controls.Documents var textCharacters = new TextCharacters(text.AsMemory(), textRunProperties); textRuns.Add(textCharacters); - } + } } } @@ -65,10 +67,52 @@ namespace Avalonia.Controls.Documents inline.AppendText(stringBuilder); } } + else + { + if (Inlines.Text is string text) + { + stringBuilder.Append(text); + } + } + } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + switch (change.Property.Name) + { + case nameof(InlinesProperty): + OnInlinesChanged(change.OldValue as InlineCollection, change.NewValue as InlineCollection); + InlineHost?.Invalidate(); + break; + } + } + + internal override void OnInlineHostChanged(IInlineHost? oldValue, IInlineHost? newValue) + { + base.OnInlineHostChanged(oldValue, newValue); + + if(Inlines is not null) + { + Inlines.InlineHost = newValue; + } + } + + private void OnInlinesChanged(InlineCollection? oldValue, InlineCollection? newValue) + { + if (oldValue is not null) + { + oldValue.Parent = null; + oldValue.InlineHost = null; + oldValue.Invalidated -= (s, e) => InlineHost?.Invalidate(); + } - if (Inlines.Text is string text) + if (newValue is not null) { - stringBuilder.Append(text); + newValue.Parent = this; + newValue.InlineHost = InlineHost; + newValue.Invalidated += (s, e) => InlineHost?.Invalidate(); } } } diff --git a/src/Avalonia.Controls/Documents/TextElement.cs b/src/Avalonia.Controls/Documents/TextElement.cs index f228519e60..5bac3642ed 100644 --- a/src/Avalonia.Controls/Documents/TextElement.cs +++ b/src/Avalonia.Controls/Documents/TextElement.cs @@ -67,6 +67,8 @@ namespace Avalonia.Controls.Documents Brushes.Black, inherits: true); + private IInlineHost? _inlineHost; + /// /// Gets or sets a brush used to paint the control's background. /// @@ -250,7 +252,21 @@ namespace Avalonia.Controls.Documents control.SetValue(ForegroundProperty, value); } - internal IInlineHost? InlineHost { get; set; } + internal IInlineHost? InlineHost + { + get => _inlineHost; + set + { + var oldValue = _inlineHost; + _inlineHost = value; + OnInlineHostChanged(oldValue, value); + } + } + + internal virtual void OnInlineHostChanged(IInlineHost? oldValue, IInlineHost? newValue) + { + + } protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) { diff --git a/src/Avalonia.Controls/Flyouts/FlyoutBase.cs b/src/Avalonia.Controls/Flyouts/FlyoutBase.cs index 4801fa69f0..1504d2b25f 100644 --- a/src/Avalonia.Controls/Flyouts/FlyoutBase.cs +++ b/src/Avalonia.Controls/Flyouts/FlyoutBase.cs @@ -223,6 +223,7 @@ namespace Avalonia.Controls.Primitives { Popup.PlacementTarget = Target = placementTarget; ((ISetLogicalParent)Popup).SetParent(placementTarget); + Popup.SetValue(StyledElement.TemplatedParentProperty, placementTarget.TemplatedParent); } if (Popup.Child == null) diff --git a/src/Avalonia.Controls/GridSplitter.cs b/src/Avalonia.Controls/GridSplitter.cs index 216e43e1f0..85dad894fd 100644 --- a/src/Avalonia.Controls/GridSplitter.cs +++ b/src/Avalonia.Controls/GridSplitter.cs @@ -221,7 +221,8 @@ namespace Avalonia.Controls ShowsPreview = showsPreview, ResizeDirection = resizeDirection, SplitterLength = Math.Min(Bounds.Width, Bounds.Height), - ResizeBehavior = GetEffectiveResizeBehavior(resizeDirection) + ResizeBehavior = GetEffectiveResizeBehavior(resizeDirection), + Scaling = (VisualRoot as ILayoutRoot)?.LayoutScaling ?? 1, }; // Store the rows and columns to resize on drag events. @@ -348,9 +349,9 @@ namespace Avalonia.Controls } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); GridResizeDirection direction = GetEffectiveResizeDirection(); @@ -630,13 +631,17 @@ namespace Avalonia.Controls { double actualLength1 = GetActualLength(definition1); double actualLength2 = GetActualLength(definition2); + double pixelLength = 1 / _resizeData.Scaling; + double epsilon = pixelLength + LayoutHelper.LayoutEpsilon; // When splitting, Check to see if the total pixels spanned by the definitions - // is the same as before starting resize. If not cancel the drag. + // is the same as before starting resize. If not cancel the drag. We need to account for + // layout rounding here, so ignore differences of less than a device pixel to avoid problems + // that WPF has, such as https://stackoverflow.com/questions/28464843. if (_resizeData.SplitBehavior == SplitBehavior.Split && !MathUtilities.AreClose( actualLength1 + actualLength2, - _resizeData.OriginalDefinition1ActualLength + _resizeData.OriginalDefinition2ActualLength, LayoutHelper.LayoutEpsilon)) + _resizeData.OriginalDefinition1ActualLength + _resizeData.OriginalDefinition2ActualLength, epsilon)) { CancelResize(); @@ -798,6 +803,9 @@ namespace Avalonia.Controls // The minimum of Width/Height of Splitter. Used to ensure splitter // isn't hidden by resizing a row/column smaller than the splitter. public double SplitterLength; + + // The current layout scaling factor. + public double Scaling; } } diff --git a/src/Avalonia.Controls/MenuItem.cs b/src/Avalonia.Controls/MenuItem.cs index 58229a1772..11c42f2ef3 100644 --- a/src/Avalonia.Controls/MenuItem.cs +++ b/src/Avalonia.Controls/MenuItem.cs @@ -79,25 +79,33 @@ namespace Avalonia.Controls /// Defines the event. /// public static readonly RoutedEvent ClickEvent = - RoutedEvent.Register(nameof(Click), RoutingStrategies.Bubble); + RoutedEvent.Register( + nameof(Click), + RoutingStrategies.Bubble); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerEnterItemEvent = - RoutedEvent.Register(nameof(PointerEnterItem), RoutingStrategies.Bubble); + public static readonly RoutedEvent PointerEnteredItemEvent = + RoutedEvent.Register( + nameof(PointerEnteredItem), + RoutingStrategies.Bubble); /// - /// Defines the event. + /// Defines the event. /// - public static readonly RoutedEvent PointerLeaveItemEvent = - RoutedEvent.Register(nameof(PointerLeaveItem), RoutingStrategies.Bubble); + public static readonly RoutedEvent PointerExitedItemEvent = + RoutedEvent.Register( + nameof(PointerExitedItem), + RoutingStrategies.Bubble); /// /// Defines the event. /// public static readonly RoutedEvent SubmenuOpenedEvent = - RoutedEvent.Register(nameof(SubmenuOpened), RoutingStrategies.Bubble); + RoutedEvent.Register( + nameof(SubmenuOpened), + RoutingStrategies.Bubble); /// /// The default value for the property. @@ -174,24 +182,24 @@ namespace Avalonia.Controls /// Occurs when the pointer enters a menu item. /// /// - /// A bubbling version of the event for menu items. + /// A bubbling version of the event for menu items. /// - public event EventHandler? PointerEnterItem + public event EventHandler? PointerEnteredItem { - add { AddHandler(PointerEnterItemEvent, value); } - remove { RemoveHandler(PointerEnterItemEvent, value); } + add { AddHandler(PointerEnteredItemEvent, value); } + remove { RemoveHandler(PointerEnteredItemEvent, value); } } /// /// Raised when the pointer leaves a menu item. /// /// - /// A bubbling version of the event for menu items. + /// A bubbling version of the event for menu items. /// - public event EventHandler? PointerLeaveItem + public event EventHandler? PointerExitedItem { - add { AddHandler(PointerLeaveItemEvent, value); } - remove { RemoveHandler(PointerLeaveItemEvent, value); } + add { AddHandler(PointerExitedItemEvent, value); } + remove { RemoveHandler(PointerExitedItemEvent, value); } } /// @@ -437,22 +445,22 @@ namespace Avalonia.Controls } /// - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); var point = e.GetCurrentPoint(null); - RaiseEvent(new PointerEventArgs(PointerEnterItemEvent, this, e.Pointer, this.VisualRoot, point.Position, + RaiseEvent(new PointerEventArgs(PointerEnteredItemEvent, this, e.Pointer, this.VisualRoot, point.Position, e.Timestamp, point.Properties, e.KeyModifiers)); } /// - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { - base.OnPointerLeave(e); + base.OnPointerExited(e); var point = e.GetCurrentPoint(null); - RaiseEvent(new PointerEventArgs(PointerLeaveItemEvent, this, e.Pointer, this.VisualRoot, point.Position, + RaiseEvent(new PointerEventArgs(PointerExitedItemEvent, this, e.Pointer, this.VisualRoot, point.Position, e.Timestamp, point.Properties, e.KeyModifiers)); } diff --git a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs index 3a6d06f150..868cce879a 100644 --- a/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs +++ b/src/Avalonia.Controls/Platform/DefaultMenuInteractionHandler.cs @@ -53,9 +53,9 @@ namespace Avalonia.Controls.Platform Menu.PointerPressed += PointerPressed; Menu.PointerReleased += PointerReleased; Menu.AddHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed); - Menu.AddHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened); - Menu.AddHandler(MenuItem.PointerEnterItemEvent, PointerEnter); - Menu.AddHandler(MenuItem.PointerLeaveItemEvent, PointerLeave); + Menu.AddHandler(Avalonia.Controls.Menu.MenuOpenedEvent, MenuOpened); + Menu.AddHandler(MenuItem.PointerEnteredItemEvent, PointerEntered); + Menu.AddHandler(MenuItem.PointerExitedItemEvent, PointerExited); Menu.AddHandler(InputElement.PointerMovedEvent, PointerMoved); _root = Menu.VisualRoot; @@ -89,9 +89,9 @@ namespace Avalonia.Controls.Platform Menu.PointerPressed -= PointerPressed; Menu.PointerReleased -= PointerReleased; Menu.RemoveHandler(AccessKeyHandler.AccessKeyPressedEvent, AccessKeyPressed); - Menu.RemoveHandler(Avalonia.Controls.Menu.MenuOpenedEvent, this.MenuOpened); - Menu.RemoveHandler(MenuItem.PointerEnterItemEvent, PointerEnter); - Menu.RemoveHandler(MenuItem.PointerLeaveItemEvent, PointerLeave); + Menu.RemoveHandler(Avalonia.Controls.Menu.MenuOpenedEvent, MenuOpened); + Menu.RemoveHandler(MenuItem.PointerEnteredItemEvent, PointerEntered); + Menu.RemoveHandler(MenuItem.PointerExitedItemEvent, PointerExited); Menu.RemoveHandler(InputElement.PointerMovedEvent, PointerMoved); if (_root is InputElement inputRoot) @@ -297,7 +297,7 @@ namespace Avalonia.Controls.Platform e.Handled = true; } - protected internal virtual void PointerEnter(object? sender, PointerEventArgs e) + protected internal virtual void PointerEntered(object? sender, PointerEventArgs e) { var item = GetMenuItem(e.Source as IControl); @@ -358,7 +358,7 @@ namespace Avalonia.Controls.Platform } } - protected internal virtual void PointerLeave(object? sender, PointerEventArgs e) + protected internal virtual void PointerExited(object? sender, PointerEventArgs e) { var item = GetMenuItem(e.Source as IControl); diff --git a/src/Avalonia.Controls/Platform/Dialogs/IStorageProviderFactory.cs b/src/Avalonia.Controls/Platform/Dialogs/IStorageProviderFactory.cs new file mode 100644 index 0000000000..3eee8e848e --- /dev/null +++ b/src/Avalonia.Controls/Platform/Dialogs/IStorageProviderFactory.cs @@ -0,0 +1,12 @@ +#nullable enable +using Avalonia.Platform.Storage; + +namespace Avalonia.Controls.Platform; + +/// +/// Factory allows to register custom storage provider instead of native implementation. +/// +public interface IStorageProviderFactory +{ + IStorageProvider CreateProvider(TopLevel topLevel); +} diff --git a/src/Avalonia.Controls/Platform/ISystemDialogImpl.cs b/src/Avalonia.Controls/Platform/Dialogs/ISystemDialogImpl.cs similarity index 88% rename from src/Avalonia.Controls/Platform/ISystemDialogImpl.cs rename to src/Avalonia.Controls/Platform/Dialogs/ISystemDialogImpl.cs index 715eda5cfa..996fff6775 100644 --- a/src/Avalonia.Controls/Platform/ISystemDialogImpl.cs +++ b/src/Avalonia.Controls/Platform/Dialogs/ISystemDialogImpl.cs @@ -1,3 +1,4 @@ +using System; using System.Threading.Tasks; using Avalonia.Metadata; @@ -6,6 +7,7 @@ namespace Avalonia.Controls.Platform /// /// Defines a platform-specific system dialog implementation. /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] [Unstable] public interface ISystemDialogImpl { diff --git a/src/Avalonia.Controls/Platform/Dialogs/SystemDialogImpl.cs b/src/Avalonia.Controls/Platform/Dialogs/SystemDialogImpl.cs new file mode 100644 index 0000000000..2775c53803 --- /dev/null +++ b/src/Avalonia.Controls/Platform/Dialogs/SystemDialogImpl.cs @@ -0,0 +1,74 @@ +using System; +using System.Linq; +using System.Threading.Tasks; + +#nullable enable + +namespace Avalonia.Controls.Platform +{ + /// + /// Defines a platform-specific system dialog implementation. + /// + [Obsolete] + internal class SystemDialogImpl : ISystemDialogImpl + { + public async Task ShowFileDialogAsync(FileDialog dialog, Window parent) + { + if (dialog is OpenFileDialog openDialog) + { + var filePicker = parent.StorageProvider; + if (!filePicker.CanOpen) + { + return null; + } + + var options = openDialog.ToFilePickerOpenOptions(); + + var files = await filePicker.OpenFilePickerAsync(options); + return files + .Select(file => file.TryGetUri(out var fullPath) + ? fullPath.LocalPath + : file.Name) + .ToArray(); + } + else if (dialog is SaveFileDialog saveDialog) + { + var filePicker = parent.StorageProvider; + if (!filePicker.CanSave) + { + return null; + } + + var options = saveDialog.ToFilePickerSaveOptions(); + + var file = await filePicker.SaveFilePickerAsync(options); + if (file is null) + { + return null; + } + + var filePath = file.TryGetUri(out var fullPath) + ? fullPath.LocalPath + : file.Name; + return new[] { filePath }; + } + return null; + } + + public async Task ShowFolderDialogAsync(OpenFolderDialog dialog, Window parent) + { + var filePicker = parent.StorageProvider; + if (!filePicker.CanPickFolder) + { + return null; + } + + var options = dialog.ToFolderPickerOpenOptions(); + + var folders = await filePicker.OpenFolderPickerAsync(options); + return folders + .Select(f => f.TryGetUri(out var uri) ? uri.LocalPath : null) + .FirstOrDefault(u => u is not null); + } + } +} diff --git a/src/Avalonia.Controls/Platform/ITopLevelImplWithStorageProvider.cs b/src/Avalonia.Controls/Platform/ITopLevelImplWithStorageProvider.cs new file mode 100644 index 0000000000..b42040f3c3 --- /dev/null +++ b/src/Avalonia.Controls/Platform/ITopLevelImplWithStorageProvider.cs @@ -0,0 +1,11 @@ +using Avalonia.Metadata; +using Avalonia.Platform; +using Avalonia.Platform.Storage; + +namespace Avalonia.Controls.Platform; + +[Unstable] +public interface ITopLevelImplWithStorageProvider : ITopLevelImpl +{ + public IStorageProvider StorageProvider { get; } +} diff --git a/src/Avalonia.Controls/Presenters/ContentPresenter.cs b/src/Avalonia.Controls/Presenters/ContentPresenter.cs index 12a8dd747d..39888c1239 100644 --- a/src/Avalonia.Controls/Presenters/ContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ContentPresenter.cs @@ -635,8 +635,8 @@ namespace Avalonia.Controls.Presenters if (useLayoutRounding) { - sizeForChild = LayoutHelper.RoundLayoutSize(sizeForChild, scale, scale); - availableSize = LayoutHelper.RoundLayoutSize(availableSize, scale, scale); + sizeForChild = LayoutHelper.RoundLayoutSizeUp(sizeForChild, scale, scale); + availableSize = LayoutHelper.RoundLayoutSizeUp(availableSize, scale, scale); } switch (horizontalContentAlignment) diff --git a/src/Avalonia.Controls/Presenters/TextPresenter.cs b/src/Avalonia.Controls/Presenters/TextPresenter.cs index 3523cd5214..e463bc5731 100644 --- a/src/Avalonia.Controls/Presenters/TextPresenter.cs +++ b/src/Avalonia.Controls/Presenters/TextPresenter.cs @@ -543,9 +543,11 @@ namespace Avalonia.Controls.Presenters protected override Size ArrangeOverride(Size finalSize) { - if (finalSize.Width < TextLayout.Bounds.Width) + var textWidth = Math.Ceiling(TextLayout.Bounds.Width); + + if (finalSize.Width < textWidth) { - finalSize = finalSize.WithWidth(TextLayout.Bounds.Width); + finalSize = finalSize.WithWidth(textWidth); } if (MathUtilities.AreClose(_constraint.Width, finalSize.Width)) @@ -553,7 +555,7 @@ namespace Avalonia.Controls.Presenters return finalSize; } - _constraint = new Size(finalSize.Width, double.PositiveInfinity); + _constraint = new Size(Math.Ceiling(finalSize.Width), double.PositiveInfinity); _textLayout = null; diff --git a/src/Avalonia.Controls/Primitives/AccessText.cs b/src/Avalonia.Controls/Primitives/AccessText.cs index 87cf660cad..7e5b34acd9 100644 --- a/src/Avalonia.Controls/Primitives/AccessText.cs +++ b/src/Avalonia.Controls/Primitives/AccessText.cs @@ -79,9 +79,9 @@ namespace Avalonia.Controls.Primitives } /// - protected override TextLayout CreateTextLayout(Size constraint, string? text) + protected override TextLayout CreateTextLayout(string? text) { - return base.CreateTextLayout(constraint, RemoveAccessKeyMarker(text)); + return base.CreateTextLayout(RemoveAccessKeyMarker(text)); } /// diff --git a/src/Avalonia.Controls/Primitives/Popup.cs b/src/Avalonia.Controls/Primitives/Popup.cs index 95e5e25c42..1501d97470 100644 --- a/src/Avalonia.Controls/Primitives/Popup.cs +++ b/src/Avalonia.Controls/Primitives/Popup.cs @@ -860,22 +860,7 @@ namespace Avalonia.Controls.Primitives { if (control != null) { - var templatedParent = TemplatedParent; - - if (control.TemplatedParent == null) - { - control.SetValue(TemplatedParentProperty, templatedParent); - } - - control.ApplyTemplate(); - - if (!(control is IPresenter) && control.TemplatedParent == templatedParent) - { - foreach (IControl child in control.VisualChildren) - { - SetTemplatedParentAndApplyChildTemplates(child); - } - } + TemplatedControl.ApplyTemplatedParent(control, TemplatedParent); } } diff --git a/src/Avalonia.Controls/Primitives/ScrollBar.cs b/src/Avalonia.Controls/Primitives/ScrollBar.cs index e5c3392faf..e524db5444 100644 --- a/src/Avalonia.Controls/Primitives/ScrollBar.cs +++ b/src/Avalonia.Controls/Primitives/ScrollBar.cs @@ -218,9 +218,9 @@ namespace Avalonia.Controls.Primitives } } - protected override void OnPointerEnter(PointerEventArgs e) + protected override void OnPointerEntered(PointerEventArgs e) { - base.OnPointerEnter(e); + base.OnPointerEntered(e); if (AllowAutoHide) { @@ -228,9 +228,9 @@ namespace Avalonia.Controls.Primitives } } - protected override void OnPointerLeave(PointerEventArgs e) + protected override void OnPointerExited(PointerEventArgs e) { - base.OnPointerLeave(e); + base.OnPointerExited(e); if (AllowAutoHide) { diff --git a/src/Avalonia.Controls/Primitives/TemplatedControl.cs b/src/Avalonia.Controls/Primitives/TemplatedControl.cs index db029d38c0..6349d1baeb 100644 --- a/src/Avalonia.Controls/Primitives/TemplatedControl.cs +++ b/src/Avalonia.Controls/Primitives/TemplatedControl.cs @@ -285,7 +285,7 @@ namespace Avalonia.Controls.Primitives Logger.TryGet(LogEventLevel.Verbose, LogArea.Control)?.Log(this, "Creating control template"); var (child, nameScope) = template.Build(this); - ApplyTemplatedParent(child); + ApplyTemplatedParent(child, this); ((ISetLogicalParent)child).SetParent(this); VisualChildren.Add(child); @@ -365,6 +365,17 @@ namespace Avalonia.Controls.Primitives { } + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + if (change.Property == ThemeProperty) + { + foreach (var child in this.GetTemplateChildren()) + child.InvalidateStyles(); + } + } + /// /// Called when the control's template is applied. /// @@ -387,18 +398,18 @@ namespace Avalonia.Controls.Primitives /// Sets the TemplatedParent property for the created template children. /// /// The control. - private void ApplyTemplatedParent(IControl control) + internal static void ApplyTemplatedParent(IStyledElement control, ITemplatedControl? templatedParent) { - control.SetValue(TemplatedParentProperty, this); + control.SetValue(TemplatedParentProperty, templatedParent); var children = control.LogicalChildren; var count = children.Count; for (var i = 0; i < count; i++) { - if (children[i] is IControl child) + if (children[i] is IStyledElement child) { - ApplyTemplatedParent(child); + ApplyTemplatedParent(child, templatedParent); } } } diff --git a/src/Avalonia.Controls/RichTextBlock.cs b/src/Avalonia.Controls/RichTextBlock.cs new file mode 100644 index 0000000000..2b84113497 --- /dev/null +++ b/src/Avalonia.Controls/RichTextBlock.cs @@ -0,0 +1,574 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Avalonia.Controls.Documents; +using Avalonia.Controls.Utils; +using Avalonia.Input; +using Avalonia.Input.Platform; +using Avalonia.Interactivity; +using Avalonia.Media; +using Avalonia.Media.TextFormatting; +using Avalonia.Metadata; +using Avalonia.Utilities; + +namespace Avalonia.Controls +{ + /// + /// A control that displays a block of formatted text. + /// + public class RichTextBlock : TextBlock, IInlineHost + { + public static readonly StyledProperty IsTextSelectionEnabledProperty = + AvaloniaProperty.Register(nameof(IsTextSelectionEnabled), false); + + public static readonly DirectProperty SelectionStartProperty = + AvaloniaProperty.RegisterDirect( + nameof(SelectionStart), + o => o.SelectionStart, + (o, v) => o.SelectionStart = v); + + public static readonly DirectProperty SelectionEndProperty = + AvaloniaProperty.RegisterDirect( + nameof(SelectionEnd), + o => o.SelectionEnd, + (o, v) => o.SelectionEnd = v); + + public static readonly DirectProperty SelectedTextProperty = + AvaloniaProperty.RegisterDirect( + nameof(SelectedText), + o => o.SelectedText); + + public static readonly StyledProperty SelectionBrushProperty = + AvaloniaProperty.Register(nameof(SelectionBrush), Brushes.Blue); + + public static readonly StyledProperty SelectionForegroundBrushProperty = + AvaloniaProperty.Register(nameof(SelectionForegroundBrush)); + + /// + /// Defines the property. + /// + public static readonly StyledProperty InlinesProperty = + AvaloniaProperty.Register( + nameof(Inlines)); + + public static readonly DirectProperty CanCopyProperty = + AvaloniaProperty.RegisterDirect( + nameof(CanCopy), + o => o.CanCopy); + + public static readonly RoutedEvent CopyingToClipboardEvent = + RoutedEvent.Register( + nameof(CopyingToClipboard), RoutingStrategies.Bubble); + + private bool _canCopy; + private int _selectionStart; + private int _selectionEnd; + + static RichTextBlock() + { + FocusableProperty.OverrideDefaultValue(typeof(RichTextBlock), true); + + AffectsRender(SelectionStartProperty, SelectionEndProperty, SelectionForegroundBrushProperty, SelectionBrushProperty); + } + + public RichTextBlock() + { + Inlines = new InlineCollection + { + Parent = this, + InlineHost = this + }; + } + + /// + /// Gets or sets the brush that highlights selected text. + /// + public IBrush? SelectionBrush + { + get => GetValue(SelectionBrushProperty); + set => SetValue(SelectionBrushProperty, value); + } + + /// + /// Gets or sets a value that defines the brush used for selected text. + /// + public IBrush? SelectionForegroundBrush + { + get => GetValue(SelectionForegroundBrushProperty); + set => SetValue(SelectionForegroundBrushProperty, value); + } + + /// + /// Gets or sets a character index for the beginning of the current selection. + /// + public int SelectionStart + { + get => _selectionStart; + set + { + if (SetAndRaise(SelectionStartProperty, ref _selectionStart, value)) + { + RaisePropertyChanged(SelectedTextProperty, "", ""); + } + } + } + + /// + /// Gets or sets a character index for the end of the current selection. + /// + public int SelectionEnd + { + get => _selectionEnd; + set + { + if (SetAndRaise(SelectionEndProperty, ref _selectionEnd, value)) + { + RaisePropertyChanged(SelectedTextProperty, "", ""); + } + } + } + + /// + /// Gets the content of the current selection. + /// + public string SelectedText + { + get => GetSelection(); + } + + /// + /// Gets or sets a value that indicates whether text selection is enabled, either through user action or calling selection-related API. + /// + public bool IsTextSelectionEnabled + { + get => GetValue(IsTextSelectionEnabledProperty); + set => SetValue(IsTextSelectionEnabledProperty, value); + } + + /// + /// Gets or sets the inlines. + /// + [Content] + public InlineCollection Inlines + { + get => GetValue(InlinesProperty); + set => SetValue(InlinesProperty, value); + } + + /// + /// Property for determining if the Copy command can be executed. + /// + public bool CanCopy + { + get => _canCopy; + private set => SetAndRaise(CanCopyProperty, ref _canCopy, value); + } + + public event EventHandler? CopyingToClipboard + { + add => AddHandler(CopyingToClipboardEvent, value); + remove => RemoveHandler(CopyingToClipboardEvent, value); + } + + /// + /// Copies the current selection to the Clipboard. + /// + public async void Copy() + { + if (_canCopy || !IsTextSelectionEnabled) + { + return; + } + + var text = GetSelection(); + + if (string.IsNullOrEmpty(text)) + { + return; + } + + var eventArgs = new RoutedEventArgs(CopyingToClipboardEvent); + + RaiseEvent(eventArgs); + + if (!eventArgs.Handled) + { + await ((IClipboard)AvaloniaLocator.Current.GetRequiredService(typeof(IClipboard))) + .SetTextAsync(text); + } + } + + public override void Render(DrawingContext context) + { + var selectionStart = SelectionStart; + var selectionEnd = SelectionEnd; + var selectionBrush = SelectionBrush; + + var selectionEnabled = IsTextSelectionEnabled; + + if (selectionEnabled && selectionStart != selectionEnd && selectionBrush != null) + { + var start = Math.Min(selectionStart, selectionEnd); + var length = Math.Max(selectionStart, selectionEnd) - start; + + var rects = TextLayout.HitTestTextRange(start, length); + + foreach (var rect in rects) + { + context.FillRectangle(selectionBrush, PixelRect.FromRect(rect, 1).ToRect(1)); + } + } + + base.Render(context); + } + + /// + /// Select all text in the TextBox + /// + public void SelectAll() + { + if (!IsTextSelectionEnabled) + { + return; + } + + var text = Text; + + SelectionStart = 0; + SelectionEnd = text?.Length ?? 0; + } + + /// + /// Clears the current selection/> + /// + public void ClearSelection() + { + if (!IsTextSelectionEnabled) + { + return; + } + + SelectionEnd = SelectionStart; + } + + protected override string? GetText() + { + return _text ?? Inlines.Text; + } + + protected override void SetText(string? text) + { + var oldValue = _text ?? Inlines?.Text; + + if (Inlines is not null && Inlines.HasComplexContent) + { + Inlines.Text = text; + + _text = null; + } + else + { + _text = text; + } + + RaisePropertyChanged(TextProperty, oldValue, text); + } + + /// + /// Creates the used to render the text. + /// + /// A object. + protected override TextLayout CreateTextLayout(string? text) + { + var defaultProperties = new GenericTextRunProperties( + new Typeface(FontFamily, FontStyle, FontWeight, FontStretch), + FontSize, + TextDecorations, + Foreground); + + var paragraphProperties = new GenericTextParagraphProperties(FlowDirection, TextAlignment, true, false, + defaultProperties, TextWrapping, LineHeight, 0); + + ITextSource textSource; + + var inlines = Inlines; + + if (inlines is not null && inlines.HasComplexContent) + { + var textRuns = new List(); + + foreach (var inline in inlines) + { + inline.BuildTextRun(textRuns); + } + + textSource = new InlinesTextSource(textRuns); + } + else + { + textSource = new SimpleTextSource((text ?? "").AsMemory(), defaultProperties); + } + + return new TextLayout( + textSource, + paragraphProperties, + TextTrimming, + _constraint.Width, + _constraint.Height, + maxLines: MaxLines, + lineHeight: LineHeight); + } + + protected override void OnLostFocus(RoutedEventArgs e) + { + base.OnLostFocus(e); + + ClearSelection(); + } + + protected override void OnKeyDown(KeyEventArgs e) + { + var handled = false; + var modifiers = e.KeyModifiers; + var keymap = AvaloniaLocator.Current.GetRequiredService(); + + bool Match(List gestures) => gestures.Any(g => g.Matches(e)); + + if (Match(keymap.Copy)) + { + Copy(); + + handled = true; + } + + e.Handled = handled; + } + + protected override void OnPointerPressed(PointerPressedEventArgs e) + { + if (!IsTextSelectionEnabled) + { + return; + } + + var text = Text; + var clickInfo = e.GetCurrentPoint(this); + + if (text != null && clickInfo.Properties.IsLeftButtonPressed) + { + var point = e.GetPosition(this); + + var clickToSelect = e.KeyModifiers.HasFlag(KeyModifiers.Shift); + + var oldIndex = SelectionStart; + + var hit = TextLayout.HitTestPoint(point); + var index = hit.TextPosition; + + SelectionStart = SelectionEnd = index; + +#pragma warning disable CS0618 // Type or member is obsolete + switch (e.ClickCount) +#pragma warning restore CS0618 // Type or member is obsolete + { + case 1: + if (clickToSelect) + { + SelectionStart = Math.Min(oldIndex, index); + SelectionEnd = Math.Max(oldIndex, index); + } + else + { + SelectionStart = SelectionEnd = index; + } + + break; + case 2: + if (!StringUtils.IsStartOfWord(text, index)) + { + SelectionStart = StringUtils.PreviousWord(text, index); + } + + SelectionEnd = StringUtils.NextWord(text, index); + break; + case 3: + SelectAll(); + break; + } + } + + e.Pointer.Capture(this); + e.Handled = true; + } + + protected override void OnPointerMoved(PointerEventArgs e) + { + if (!IsTextSelectionEnabled) + { + return; + } + + // selection should not change during pointer move if the user right clicks + if (e.Pointer.Captured == this && e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) + { + var point = e.GetPosition(this); + + point = new Point( + MathUtilities.Clamp(point.X, 0, Math.Max(Bounds.Width - 1, 0)), + MathUtilities.Clamp(point.Y, 0, Math.Max(Bounds.Height - 1, 0))); + + var hit = TextLayout.HitTestPoint(point); + + SelectionEnd = hit.TextPosition; + } + } + + protected override void OnPointerReleased(PointerReleasedEventArgs e) + { + if (!IsTextSelectionEnabled) + { + return; + } + + if (e.Pointer.Captured != this) + { + return; + } + + if (e.InitialPressMouseButton == MouseButton.Right) + { + var point = e.GetPosition(this); + + var hit = TextLayout.HitTestPoint(point); + + var caretIndex = hit.TextPosition; + + // see if mouse clicked inside current selection + // if it did not, we change the selection to where the user clicked + var firstSelection = Math.Min(SelectionStart, SelectionEnd); + var lastSelection = Math.Max(SelectionStart, SelectionEnd); + var didClickInSelection = SelectionStart != SelectionEnd && + caretIndex >= firstSelection && caretIndex <= lastSelection; + if (!didClickInSelection) + { + SelectionStart = SelectionEnd = caretIndex; + } + } + + e.Pointer.Capture(null); + } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change) + { + base.OnPropertyChanged(change); + + switch (change.Property.Name) + { + case nameof(InlinesProperty): + { + OnInlinesChanged(change.OldValue as InlineCollection, change.NewValue as InlineCollection); + InvalidateTextLayout(); + break; + } + case nameof(TextProperty): + { + InvalidateTextLayout(); + break; + } + } + } + + private string GetSelection() + { + if (!IsTextSelectionEnabled) + { + return ""; + } + + var text = Inlines.Text ?? Text; + + if (string.IsNullOrEmpty(text)) + { + return ""; + } + + var selectionStart = SelectionStart; + var selectionEnd = SelectionEnd; + var start = Math.Min(selectionStart, selectionEnd); + var end = Math.Max(selectionStart, selectionEnd); + + if (start == end || text.Length < end) + { + return ""; + } + + var length = Math.Max(0, end - start); + + var selectedText = text.Substring(start, length); + + return selectedText; + } + + private void OnInlinesChanged(InlineCollection? oldValue, InlineCollection? newValue) + { + if (oldValue is not null) + { + oldValue.Parent = null; + oldValue.InlineHost = null; + oldValue.Invalidated -= (s, e) => InvalidateTextLayout(); + } + + if (newValue is not null) + { + newValue.Parent = this; + newValue.InlineHost = this; + newValue.Invalidated += (s, e) => InvalidateTextLayout(); + } + } + + void IInlineHost.AddVisualChild(IControl child) + { + if (child.VisualParent == null) + { + VisualChildren.Add(child); + } + } + + void IInlineHost.Invalidate() + { + InvalidateTextLayout(); + } + + private readonly struct InlinesTextSource : ITextSource + { + private readonly IReadOnlyList _textRuns; + + public InlinesTextSource(IReadOnlyList textRuns) + { + _textRuns = textRuns; + } + + public TextRun? GetTextRun(int textSourceIndex) + { + var currentPosition = 0; + + foreach (var textRun in _textRuns) + { + if (textRun.TextSourceLength == 0) + { + continue; + } + + if (currentPosition >= textSourceIndex) + { + return textRun; + } + + currentPosition += textRun.TextSourceLength; + } + + return null; + } + } + } +} diff --git a/src/Avalonia.Controls/Selection/InternalSelectionModel.cs b/src/Avalonia.Controls/Selection/InternalSelectionModel.cs index d92ffb0d1a..d0715e402d 100644 --- a/src/Avalonia.Controls/Selection/InternalSelectionModel.cs +++ b/src/Avalonia.Controls/Selection/InternalSelectionModel.cs @@ -168,7 +168,7 @@ namespace Avalonia.Controls.Selection { if (_writableSelectedItems is INotifyCollectionChanged incc) { - incc.CollectionChanged += OnSelectedItemsCollectionChanged; + incc.CollectionChanged -= OnSelectedItemsCollectionChanged; } } diff --git a/src/Avalonia.Controls/SplitView.cs b/src/Avalonia.Controls/SplitView.cs index 532cb1d329..c344dd795d 100644 --- a/src/Avalonia.Controls/SplitView.cs +++ b/src/Avalonia.Controls/SplitView.cs @@ -431,23 +431,45 @@ namespace Avalonia.Controls } } + private string GetPseudoClass(SplitViewDisplayMode mode) + { + return mode switch + { + SplitViewDisplayMode.Inline => "inline", + SplitViewDisplayMode.CompactInline => "compactinline", + SplitViewDisplayMode.Overlay => "overlay", + SplitViewDisplayMode.CompactOverlay => "compactoverlay", + _ => throw new ArgumentOutOfRangeException(nameof(mode), mode, null) + }; + } + + private string GetPseudoClass(SplitViewPanePlacement placement) + { + return placement switch + { + SplitViewPanePlacement.Left => "left", + SplitViewPanePlacement.Right => "right", + _ => throw new ArgumentOutOfRangeException(nameof(placement), placement, null) + }; + } + private void OnPanePlacementChanged(AvaloniaPropertyChangedEventArgs e) { - var oldState = e.OldValue!.ToString()!.ToLower(); - var newState = e.NewValue!.ToString()!.ToLower(); + var oldState = GetPseudoClass(e.GetOldValue()); + var newState = GetPseudoClass(e.GetNewValue()); PseudoClasses.Remove($":{oldState}"); PseudoClasses.Add($":{newState}"); } private void OnDisplayModeChanged(AvaloniaPropertyChangedEventArgs e) { - var oldState = e.OldValue!.ToString()!.ToLower(); - var newState = e.NewValue!.ToString()!.ToLower(); + var oldState = GetPseudoClass(e.GetOldValue()); + var newState = GetPseudoClass(e.GetNewValue()); PseudoClasses.Remove($":{oldState}"); PseudoClasses.Add($":{newState}"); - var (closedPaneWidth, paneColumnGridLength) = (SplitViewDisplayMode)e.NewValue switch + var (closedPaneWidth, paneColumnGridLength) = e.GetNewValue() switch { SplitViewDisplayMode.Overlay => (0, new GridLength(0, GridUnitType.Pixel)), SplitViewDisplayMode.CompactOverlay => (CompactPaneLength, new GridLength(CompactPaneLength, GridUnitType.Pixel)), diff --git a/src/Avalonia.Controls/SystemDialog.cs b/src/Avalonia.Controls/SystemDialog.cs index 093f10be51..f3fb4d9a6d 100644 --- a/src/Avalonia.Controls/SystemDialog.cs +++ b/src/Avalonia.Controls/SystemDialog.cs @@ -3,12 +3,15 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Avalonia.Controls.Platform; +using Avalonia.Platform.Storage; +using Avalonia.Platform.Storage.FileIO; namespace Avalonia.Controls { /// /// Base class for system file dialogs. /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] public abstract class FileDialog : FileSystemDialog { /// @@ -26,6 +29,7 @@ namespace Avalonia.Controls /// /// Base class for system file and directory dialogs. /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] public abstract class FileSystemDialog : SystemDialog { [Obsolete("Use Directory")] @@ -45,6 +49,7 @@ namespace Avalonia.Controls /// /// Represents a system dialog that prompts the user to select a location for saving a file. /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] public class SaveFileDialog : FileDialog { /// @@ -73,11 +78,27 @@ namespace Avalonia.Controls return (await service.ShowFileDialogAsync(this, parent) ?? Array.Empty()).FirstOrDefault(); } + + public FilePickerSaveOptions ToFilePickerSaveOptions() + { + return new FilePickerSaveOptions + { + SuggestedFileName = InitialFileName, + DefaultExtension = DefaultExtension, + FileTypeChoices = Filters?.Select(f => new FilePickerFileType(f.Name!) { Patterns = f.Extensions.Select(e => $"*.{e}").ToArray() }).ToArray(), + Title = Title, + SuggestedStartLocation = InitialDirectory is { } directory + ? new BclStorageFolder(new System.IO.DirectoryInfo(directory)) + : null, + ShowOverwritePrompt = ShowOverwritePrompt + }; + } } /// /// Represents a system dialog that allows the user to select one or more files to open. /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] public class OpenFileDialog : FileDialog { /// @@ -100,11 +121,25 @@ namespace Avalonia.Controls var service = AvaloniaLocator.Current.GetRequiredService(); return service.ShowFileDialogAsync(this, parent); } + + public FilePickerOpenOptions ToFilePickerOpenOptions() + { + return new FilePickerOpenOptions + { + AllowMultiple = AllowMultiple, + FileTypeFilter = Filters?.Select(f => new FilePickerFileType(f.Name!) { Patterns = f.Extensions.Select(e => $"*.{e}").ToArray() }).ToArray(), + Title = Title, + SuggestedStartLocation = InitialDirectory is { } directory + ? new BclStorageFolder(new System.IO.DirectoryInfo(directory)) + : null + }; + } } /// /// Represents a system dialog that allows the user to select a directory. /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] public class OpenFolderDialog : FileSystemDialog { [Obsolete("Use Directory")] @@ -129,14 +164,35 @@ namespace Avalonia.Controls var service = AvaloniaLocator.Current.GetRequiredService(); return service.ShowFolderDialogAsync(this, parent); } + + public FolderPickerOpenOptions ToFolderPickerOpenOptions() + { + return new FolderPickerOpenOptions + { + Title = Title, + SuggestedStartLocation = InitialDirectory is { } directory + ? new BclStorageFolder(new System.IO.DirectoryInfo(directory)) + : null + }; + } } /// /// Base class for system dialogs. /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] public abstract class SystemDialog { + static SystemDialog() + { + if (AvaloniaLocator.Current.GetService() is null) + { + // Register default implementation. + AvaloniaLocator.CurrentMutable.Bind().ToSingleton(); + } + } + /// /// Gets or sets the dialog title. /// @@ -146,6 +202,7 @@ namespace Avalonia.Controls /// /// Represents a filter in an or an . /// + [Obsolete("Use Window.StorageProvider API or TopLevel.StorageProvider API")] public class FileDialogFilter { /// diff --git a/src/Avalonia.Controls/Templates/DataTemplates.cs b/src/Avalonia.Controls/Templates/DataTemplates.cs index f203539536..d4eeda7908 100644 --- a/src/Avalonia.Controls/Templates/DataTemplates.cs +++ b/src/Avalonia.Controls/Templates/DataTemplates.cs @@ -1,3 +1,4 @@ +using System; using Avalonia.Collections; namespace Avalonia.Controls.Templates @@ -13,6 +14,22 @@ namespace Avalonia.Controls.Templates public DataTemplates() { ResetBehavior = ResetBehavior.Remove; + + Validate += ValidateDataTemplate; + } + + private static void ValidateDataTemplate(IDataTemplate template) + { + var valid = template switch + { + ITypedDataTemplate typed => typed.DataType is not null, + _ => true + }; + + if (!valid) + { + throw new InvalidOperationException("DataTemplate inside of DataTemplates must have a DataType set. Set DataType property or use ItemTemplate with single template instead."); + } } } } \ No newline at end of file diff --git a/src/Avalonia.Controls/Templates/ITypedDataTemplate.cs b/src/Avalonia.Controls/Templates/ITypedDataTemplate.cs new file mode 100644 index 0000000000..239dbd79f4 --- /dev/null +++ b/src/Avalonia.Controls/Templates/ITypedDataTemplate.cs @@ -0,0 +1,10 @@ +using System; +using Avalonia.Metadata; + +namespace Avalonia.Controls.Templates; + +public interface ITypedDataTemplate : IDataTemplate +{ + [DataType] + Type? DataType { get; } +} diff --git a/src/Avalonia.Controls/TextBlock.cs b/src/Avalonia.Controls/TextBlock.cs index 1a69d1218c..52261d1c76 100644 --- a/src/Avalonia.Controls/TextBlock.cs +++ b/src/Avalonia.Controls/TextBlock.cs @@ -1,12 +1,9 @@ using System; -using System.Collections.Generic; -using System.Text; using Avalonia.Automation.Peers; using Avalonia.Controls.Documents; using Avalonia.Layout; using Avalonia.Media; using Avalonia.Media.TextFormatting; -using Avalonia.Metadata; using Avalonia.Utilities; namespace Avalonia.Controls @@ -14,7 +11,7 @@ namespace Avalonia.Controls /// /// A control that displays a block of text. /// - public class TextBlock : Control, IInlineHost + public class TextBlock : Control { /// /// Defines the property. @@ -101,19 +98,13 @@ namespace Avalonia.Controls o => o.Text, (o, v) => o.Text = v); - /// - /// Defines the property. - /// - public static readonly DirectProperty InlinesProperty = - AvaloniaProperty.RegisterDirect( - nameof(Inlines), - o => o.Inlines); - /// /// Defines the property. /// public static readonly AttachedProperty TextAlignmentProperty = - AvaloniaProperty.RegisterAttached(nameof(TextAlignment), + AvaloniaProperty.RegisterAttached( + nameof(TextAlignment), + defaultValue: TextAlignment.Start, inherits: true); /// @@ -137,8 +128,9 @@ namespace Avalonia.Controls public static readonly StyledProperty TextDecorationsProperty = AvaloniaProperty.Register(nameof(TextDecorations)); - private TextLayout? _textLayout; - private Size _constraint; + protected string? _text; + protected TextLayout? _textLayout; + protected Size _constraint; /// /// Initializes static members of the class. @@ -150,14 +142,6 @@ namespace Avalonia.Controls AffectsRender(BackgroundProperty, ForegroundProperty); } - /// - /// Initializes a new instance of the class. - /// - public TextBlock() - { - Inlines = new InlineCollection(this, this); - } - /// /// Gets the used to render the text. /// @@ -165,7 +149,7 @@ namespace Avalonia.Controls { get { - return _textLayout ?? (_textLayout = CreateTextLayout(_constraint, Text)); + return _textLayout ??= CreateTextLayout(_text); } } @@ -192,28 +176,10 @@ namespace Avalonia.Controls /// public string? Text { - get => Inlines.Text; - set - { - var old = Text; - - if (value == old) - { - return; - } - - Inlines.Text = value; - - RaisePropertyChanged(TextProperty, old, value); - } + get => GetText(); + set => SetText(value); } - /// - /// Gets the inlines. - /// - [Content] - public InlineCollection Inlines { get; } - /// /// Gets or sets the font family used to draw the control's text. /// @@ -507,6 +473,10 @@ namespace Avalonia.Controls control.SetValue(MaxLinesProperty, maxLines); } + public void Add(string text) + { + _text = text; + } /// /// Renders the to a drawing context. @@ -542,13 +512,21 @@ namespace Avalonia.Controls TextLayout.Draw(context, new Point(padding.Left, top)); } + protected virtual string? GetText() + { + return _text; + } + + protected virtual void SetText(string? text) + { + SetAndRaise(TextProperty, ref _text, text); + } + /// /// Creates the used to render the text. /// - /// The constraint of the text. - /// The text to format. /// A object. - protected virtual TextLayout CreateTextLayout(Size constraint, string? text) + protected virtual TextLayout CreateTextLayout(string? text) { var defaultProperties = new GenericTextRunProperties( new Typeface(FontFamily, FontStyle, FontWeight, FontStretch), @@ -559,30 +537,12 @@ namespace Avalonia.Controls var paragraphProperties = new GenericTextParagraphProperties(FlowDirection, TextAlignment, true, false, defaultProperties, TextWrapping, LineHeight, 0); - ITextSource textSource; - - if (Inlines.HasComplexContent) - { - var textRuns = new List(); - - foreach (var inline in Inlines) - { - inline.BuildTextRun(textRuns); - } - - textSource = new InlinesTextSource(textRuns); - } - else - { - textSource = new SimpleTextSource((text ?? "").AsMemory(), defaultProperties); - } - return new TextLayout( - textSource, + new SimpleTextSource((text ?? "").AsMemory(), defaultProperties), paragraphProperties, TextTrimming, - constraint.Width, - constraint.Height, + _constraint.Width, + _constraint.Height, maxLines: MaxLines, lineHeight: LineHeight); } @@ -599,11 +559,6 @@ namespace Avalonia.Controls protected override Size MeasureOverride(Size availableSize) { - if (!Inlines.HasComplexContent && string.IsNullOrEmpty(Text)) - { - return new Size(); - } - var scale = LayoutHelper.GetLayoutScale(this); var padding = LayoutHelper.RoundLayoutThickness(Padding, scale, scale); @@ -621,9 +576,11 @@ namespace Avalonia.Controls protected override Size ArrangeOverride(Size finalSize) { - if(finalSize.Width < TextLayout.Bounds.Width) + var textWidth = Math.Ceiling(TextLayout.Bounds.Width); + + if(finalSize.Width < textWidth) { - finalSize = finalSize.WithWidth(TextLayout.Bounds.Width); + finalSize = finalSize.WithWidth(textWidth); } if (MathUtilities.AreClose(_constraint.Width, finalSize.Width)) @@ -635,7 +592,7 @@ namespace Avalonia.Controls var padding = LayoutHelper.RoundLayoutThickness(Padding, scale, scale); - _constraint = new Size(finalSize.Deflate(padding).Width, double.PositiveInfinity); + _constraint = new Size(Math.Ceiling(finalSize.Deflate(padding).Width), double.PositiveInfinity); _textLayout = null; @@ -683,57 +640,7 @@ namespace Avalonia.Controls } } - private void InlinesChanged(object? sender, EventArgs e) - { - InvalidateTextLayout(); - } - - void IInlineHost.AddVisualChild(IControl child) - { - if (child.VisualParent == null) - { - VisualChildren.Add(child); - } - } - - void IInlineHost.Invalidate() - { - InvalidateTextLayout(); - } - - private readonly struct InlinesTextSource : ITextSource - { - private readonly IReadOnlyList _textRuns; - - public InlinesTextSource(IReadOnlyList textRuns) - { - _textRuns = textRuns; - } - - public TextRun? GetTextRun(int textSourceIndex) - { - var currentPosition = 0; - - foreach (var textRun in _textRuns) - { - if(textRun.TextSourceLength == 0) - { - continue; - } - - if(currentPosition >= textSourceIndex) - { - return textRun; - } - - currentPosition += textRun.TextSourceLength; - } - - return null; - } - } - - private readonly struct SimpleTextSource : ITextSource + protected readonly struct SimpleTextSource : ITextSource { private readonly ReadOnlySlice _text; private readonly TextRunProperties _defaultProperties; @@ -748,14 +655,14 @@ namespace Avalonia.Controls { if (textSourceIndex > _text.Length) { - return null; + return new TextEndOfParagraph(); } var runText = _text.Skip(textSourceIndex); if (runText.IsEmpty) { - return null; + return new TextEndOfParagraph(); } return new TextCharacters(runText, _defaultProperties); diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index 7652b23162..9531f719b9 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -53,7 +53,7 @@ namespace Avalonia.Controls public static readonly StyledProperty PasswordCharProperty = AvaloniaProperty.Register(nameof(PasswordChar)); - + public static readonly StyledProperty SelectionBrushProperty = AvaloniaProperty.Register(nameof(SelectionBrush)); @@ -196,7 +196,6 @@ namespace Avalonia.Controls private TextBoxTextInputMethodClient _imClient = new TextBoxTextInputMethodClient(); private UndoRedoHelper _undoRedoHelper; private bool _isUndoingRedoing; - private bool _ignoreTextChanges; private bool _canCut; private bool _canCopy; private bool _canPaste; @@ -276,7 +275,7 @@ namespace Avalonia.Controls get => GetValue(IsReadOnlyProperty); set => SetValue(IsReadOnlyProperty, value); } - + public char PasswordChar { get => GetValue(PasswordCharProperty); @@ -368,21 +367,17 @@ namespace Avalonia.Controls get => _text; set { - if (!_ignoreTextChanges) - { - var caretIndex = CaretIndex; - var selectionStart = SelectionStart; - var selectionEnd = SelectionEnd; + var caretIndex = CaretIndex; + var selectionStart = SelectionStart; + var selectionEnd = SelectionEnd; - CaretIndex = CoerceCaretIndex(caretIndex, value); - SelectionStart = CoerceCaretIndex(selectionStart, value); - SelectionEnd = CoerceCaretIndex(selectionEnd, value); - - if (SetAndRaise(TextProperty, ref _text, value) && IsUndoEnabled && !_isUndoingRedoing) - { - _undoRedoHelper.Clear(); - SnapshotUndoRedo(); // so we always have an initial state - } + CaretIndex = CoerceCaretIndex(caretIndex, value); + SelectionStart = CoerceCaretIndex(selectionStart, value); + SelectionEnd = CoerceCaretIndex(selectionEnd, value); + if (SetAndRaise(TextProperty, ref _text, value) && IsUndoEnabled && !_isUndoingRedoing) + { + _undoRedoHelper.Clear(); + SnapshotUndoRedo(); // so we always have an initial state } } } @@ -736,32 +731,23 @@ namespace Avalonia.Controls { var oldText = _text; - _ignoreTextChanges = true; - - try - { - DeleteSelection(false); - var caretIndex = CaretIndex; - text = Text ?? string.Empty; - SetTextInternal(text.Substring(0, caretIndex) + input + text.Substring(caretIndex)); - ClearSelection(); - - if (IsUndoEnabled) - { - _undoRedoHelper.DiscardRedo(); - } - - if (_text != oldText) - { - RaisePropertyChanged(TextProperty, oldText, _text); - } + DeleteSelection(false); + var caretIndex = CaretIndex; + text = Text ?? string.Empty; + SetTextInternal(text.Substring(0, caretIndex) + input + text.Substring(caretIndex)); + ClearSelection(); - CaretIndex = caretIndex + input.Length; + if (IsUndoEnabled) + { + _undoRedoHelper.DiscardRedo(); } - finally + + if (_text != oldText) { - _ignoreTextChanges = false; + RaisePropertyChanged(TextProperty, oldText, _text); } + + CaretIndex = caretIndex + input.Length; } } @@ -1499,15 +1485,7 @@ namespace Avalonia.Controls { if (raiseTextChanged) { - try - { - _ignoreTextChanges = true; - SetAndRaise(TextProperty, ref _text, value); - } - finally - { - _ignoreTextChanges = false; - } + SetAndRaise(TextProperty, ref _text, value); } else { diff --git a/src/Avalonia.Controls/ToolTip.cs b/src/Avalonia.Controls/ToolTip.cs index 91c93c87c8..bb18bf4c64 100644 --- a/src/Avalonia.Controls/ToolTip.cs +++ b/src/Avalonia.Controls/ToolTip.cs @@ -271,8 +271,9 @@ namespace Avalonia.Controls _popupHost = OverlayPopupHost.CreatePopupHost(control, null); _popupHost.SetChild(this); ((ISetLogicalParent)_popupHost).SetParent(control); - - _popupHost.ConfigurePosition(control, GetPlacement(control), + ApplyTemplatedParent(this, control.TemplatedParent); + + _popupHost.ConfigurePosition(control, GetPlacement(control), new Point(GetHorizontalOffset(control), GetVerticalOffset(control))); WindowManagerAddShadowHintChanged(_popupHost, false); diff --git a/src/Avalonia.Controls/ToolTipService.cs b/src/Avalonia.Controls/ToolTipService.cs index a3100ff296..c6efe10488 100644 --- a/src/Avalonia.Controls/ToolTipService.cs +++ b/src/Avalonia.Controls/ToolTipService.cs @@ -26,14 +26,14 @@ namespace Avalonia.Controls if (e.OldValue != null) { - control.PointerEnter -= ControlPointerEnter; - control.PointerLeave -= ControlPointerLeave; + control.PointerEntered -= ControlPointerEntered; + control.PointerExited -= ControlPointerExited; } if (e.NewValue != null) { - control.PointerEnter += ControlPointerEnter; - control.PointerLeave += ControlPointerLeave; + control.PointerEntered += ControlPointerEntered; + control.PointerExited += ControlPointerExited; } if (ToolTip.GetIsOpen(control) && e.NewValue != e.OldValue && !(e.NewValue is ToolTip)) @@ -80,7 +80,7 @@ namespace Avalonia.Controls /// /// The event sender. /// The event args. - private void ControlPointerEnter(object? sender, PointerEventArgs e) + private void ControlPointerEntered(object? sender, PointerEventArgs e) { StopTimer(); @@ -101,7 +101,7 @@ namespace Avalonia.Controls /// /// The event sender. /// The event args. - private void ControlPointerLeave(object? sender, PointerEventArgs e) + private void ControlPointerExited(object? sender, PointerEventArgs e) { var control = (Control)sender!; Close(control); diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 57fb82485c..5c5053b982 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -11,6 +11,7 @@ using Avalonia.Logging; using Avalonia.LogicalTree; using Avalonia.Media; using Avalonia.Platform; +using Avalonia.Platform.Storage; using Avalonia.Rendering; using Avalonia.Styling; using Avalonia.Utilities; @@ -93,7 +94,8 @@ namespace Avalonia.Controls private ILayoutManager? _layoutManager; private Border? _transparencyFallbackBorder; private TargetWeakEventSubscriber? _resourcesChangesSubscriber; - + private IStorageProvider? _storageProvider; + /// /// Initializes static members of the class. /// @@ -319,6 +321,11 @@ namespace Avalonia.Controls double IRenderRoot.RenderScaling => PlatformImpl?.RenderScaling ?? 1; IStyleHost IStyleHost.StylingParent => _globalStyles!; + + public IStorageProvider StorageProvider => _storageProvider + ??= AvaloniaLocator.Current.GetService()?.CreateProvider(this) + ?? (PlatformImpl as ITopLevelImplWithStorageProvider)?.StorageProvider + ?? throw new InvalidOperationException("StorageProvider platform implementation is not available."); IRenderTarget IRenderRoot.CreateRenderTarget() => CreateRenderTarget(); @@ -484,7 +491,11 @@ namespace Avalonia.Controls /// Raises the event. /// /// The event args. - protected virtual void OnOpened(EventArgs e) => Opened?.Invoke(this, e); + protected virtual void OnOpened(EventArgs e) + { + FrameSize = PlatformImpl?.FrameSize; + Opened?.Invoke(this, e); + } /// /// Raises the event. diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index a4f4534b88..2dd391945b 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -871,10 +871,10 @@ namespace Avalonia.Controls var scaling = owner?.DesktopScaling ?? PlatformImpl?.DesktopScaling ?? 1; - // TODO: We really need non-client size here. - var rect = new PixelRect( - PixelPoint.Origin, - PixelSize.FromSize(ClientSize, scaling)); + // Use frame size, falling back to client size if the platform can't give it to us. + var rect = FrameSize.HasValue ? + new PixelRect(PixelSize.FromSize(FrameSize.Value, scaling)) : + new PixelRect(PixelSize.FromSize(ClientSize, scaling)); if (startupLocation == WindowStartupLocation.CenterScreen) { @@ -901,10 +901,10 @@ namespace Avalonia.Controls { if (owner != null) { - // TODO: We really need non-client size here. + var ownerSize = owner.FrameSize ?? owner.ClientSize; var ownerRect = new PixelRect( owner.Position, - PixelSize.FromSize(owner.ClientSize, scaling)); + PixelSize.FromSize(ownerSize, scaling)); Position = ownerRect.CenterRect(rect).Position; } } @@ -991,28 +991,28 @@ namespace Avalonia.Controls /// protected sealed override void HandleResized(Size clientSize, PlatformResizeReason reason) { - if (ClientSize == clientSize) - return; - - var sizeToContent = SizeToContent; - - // If auto-sizing is enabled, and the resize came from a user resize (or the reason was - // unspecified) then turn off auto-resizing for any window dimension that is not equal - // to the requested size. - if (sizeToContent != SizeToContent.Manual && - CanResize && - reason == PlatformResizeReason.Unspecified || - reason == PlatformResizeReason.User) + if (ClientSize != clientSize || double.IsNaN(Width) || double.IsNaN(Height)) { - if (clientSize.Width != ClientSize.Width) - sizeToContent &= ~SizeToContent.Width; - if (clientSize.Height != ClientSize.Height) - sizeToContent &= ~SizeToContent.Height; - SizeToContent = sizeToContent; - } + var sizeToContent = SizeToContent; + + // If auto-sizing is enabled, and the resize came from a user resize (or the reason was + // unspecified) then turn off auto-resizing for any window dimension that is not equal + // to the requested size. + if (sizeToContent != SizeToContent.Manual && + CanResize && + reason == PlatformResizeReason.Unspecified || + reason == PlatformResizeReason.User) + { + if (clientSize.Width != ClientSize.Width) + sizeToContent &= ~SizeToContent.Width; + if (clientSize.Height != ClientSize.Height) + sizeToContent &= ~SizeToContent.Height; + SizeToContent = sizeToContent; + } - Width = clientSize.Width; - Height = clientSize.Height; + Width = clientSize.Width; + Height = clientSize.Height; + } base.HandleResized(clientSize, reason); } diff --git a/src/Avalonia.Controls/WindowBase.cs b/src/Avalonia.Controls/WindowBase.cs index 12ba143c8a..cb68c1f6e1 100644 --- a/src/Avalonia.Controls/WindowBase.cs +++ b/src/Avalonia.Controls/WindowBase.cs @@ -169,7 +169,6 @@ namespace Avalonia.Controls } } - [Obsolete("No longer used. Has no effect.")] protected IDisposable BeginAutoSizing() => Disposable.Empty; @@ -186,6 +185,26 @@ namespace Avalonia.Controls } } + /// + protected override void OnClosed(EventArgs e) + { + // Window must manually raise Loaded/Unloaded events as it is a visual root and + // does not raise OnAttachedToVisualTreeCore/OnDetachedFromVisualTreeCore events + OnUnloadedCore(); + + base.OnClosed(e); + } + + /// + protected override void OnOpened(EventArgs e) + { + // Window must manually raise Loaded/Unloaded events as it is a visual root and + // does not raise OnAttachedToVisualTreeCore/OnDetachedFromVisualTreeCore events + ScheduleOnLoadedCore(); + + base.OnOpened(e); + } + protected override void HandleClosed() { _ignoreVisibilityChange = true; @@ -217,10 +236,14 @@ namespace Avalonia.Controls /// The reason for the resize. protected override void HandleResized(Size clientSize, PlatformResizeReason reason) { - ClientSize = clientSize; FrameSize = PlatformImpl?.FrameSize; - LayoutManager.ExecuteLayoutPass(); - Renderer?.Resized(clientSize); + + if (ClientSize != clientSize) + { + ClientSize = clientSize; + LayoutManager.ExecuteLayoutPass(); + Renderer?.Resized(clientSize); + } } /// diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs index b009778f97..811f9c7baa 100644 --- a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -37,6 +37,7 @@ namespace Avalonia.DesignerSupport var localAsm = assemblyPath != null ? Assembly.LoadFile(Path.GetFullPath(assemblyPath)) : null; var loaded = loader.Load(stream, localAsm, null, baseUri, true); var style = loaded as IStyle; + var resources = loaded as ResourceDictionary; if (style != null) { var substitute = Design.GetPreviewWith((AvaloniaObject)style); @@ -58,6 +59,27 @@ namespace Avalonia.DesignerSupport } }; } + else if (resources != null) + { + var substitute = Design.GetPreviewWith(resources); + if (substitute != null) + { + substitute.Resources.MergedDictionaries.Add(resources); + control = substitute; + } + else + control = new StackPanel + { + Children = + { + new TextBlock {Text = "ResourceDictionaries can't be previewed without Design.PreviewWith. Add"}, + new TextBlock {Text = ""}, + new TextBlock {Text = " "}, + new TextBlock {Text = ""}, + new TextBlock {Text = "in your resource dictionary"} + } + }; + } else if (loaded is Application) control = new TextBlock {Text = "Application can't be previewed in design view"}; else diff --git a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs index 12af602f54..037c5e0c71 100644 --- a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs +++ b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs @@ -1,15 +1,17 @@ using System; using Avalonia.Controls; +using Avalonia.Controls.Platform; using Avalonia.Controls.Remote.Server; using Avalonia.Input; using Avalonia.Platform; +using Avalonia.Platform.Storage; using Avalonia.Remote.Protocol; using Avalonia.Remote.Protocol.Viewport; using Avalonia.Threading; namespace Avalonia.DesignerSupport.Remote { - class PreviewerWindowImpl : RemoteServerTopLevelImpl, IWindowImpl + class PreviewerWindowImpl : RemoteServerTopLevelImpl, IWindowImpl, ITopLevelImplWithStorageProvider { private readonly IAvaloniaRemoteTransportConnection _transport; @@ -90,6 +92,8 @@ namespace Avalonia.DesignerSupport.Remote public bool NeedsManagedDecorations => false; + public IStorageProvider StorageProvider => new NoopStorageProvider(); + public void Activate() { } diff --git a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs index 5d8b166b5a..5277435858 100644 --- a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs +++ b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs @@ -55,7 +55,6 @@ namespace Avalonia.DesignerSupport.Remote .Bind().ToConstant(threading) .Bind().ToConstant(new RenderLoop()) .Bind().ToConstant(new DefaultRenderTimer(60)) - .Bind().ToSingleton() .Bind().ToConstant(instance) .Bind().ToSingleton() .Bind().ToSingleton(); diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs index a5f478f445..e6677194b0 100644 --- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -11,6 +11,8 @@ using Avalonia.Input; using Avalonia.Input.Platform; using Avalonia.Input.Raw; using Avalonia.Platform; +using Avalonia.Platform.Storage; +using Avalonia.Platform.Storage.FileIO; using Avalonia.Rendering; namespace Avalonia.DesignerSupport.Remote @@ -222,15 +224,6 @@ namespace Avalonia.DesignerSupport.Remote public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) => new IconStub(); } - class SystemDialogsStub : ISystemDialogImpl - { - public Task ShowFileDialogAsync(FileDialog dialog, Window parent) => - Task.FromResult((string[])null); - - public Task ShowFolderDialogAsync(OpenFolderDialog dialog, Window parent) => - Task.FromResult((string)null); - } - class ScreenStub : IScreenImpl { public int ScreenCount => 1; @@ -253,4 +246,25 @@ namespace Avalonia.DesignerSupport.Remote return ScreenHelper.ScreenFromWindow(window, AllScreens); } } + + internal class NoopStorageProvider : BclStorageProvider + { + public override bool CanOpen => false; + public override Task> OpenFilePickerAsync(FilePickerOpenOptions options) + { + return Task.FromResult>(Array.Empty()); + } + + public override bool CanSave => false; + public override Task SaveFilePickerAsync(FilePickerSaveOptions options) + { + return Task.FromResult(null); + } + + public override bool CanPickFolder => false; + public override Task> OpenFolderPickerAsync(FolderPickerOpenOptions options) + { + return Task.FromResult>(Array.Empty()); + } + } } diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs index e383c160e3..631da80d8b 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlDetailsViewModel.cs @@ -67,8 +67,15 @@ namespace Avalonia.Diagnostics.ViewModels var setters = new List(); - if (styleSource is Style style) + if (styleSource is StyleBase style) { + var selector = style switch + { + Style s => s.Selector?.ToString(), + ControlTheme t => t.TargetType?.Name.ToString(), + _ => null, + }; + foreach (var setter in style.Setters) { if (setter is Setter regularSetter @@ -105,7 +112,7 @@ namespace Avalonia.Diagnostics.ViewModels } } - AppliedStyles.Add(new StyleViewModel(appliedStyle, style.Selector?.ToString() ?? "No selector", setters)); + AppliedStyles.Add(new StyleViewModel(appliedStyle, selector ?? "No selector", setters)); } } @@ -113,6 +120,8 @@ namespace Avalonia.Diagnostics.ViewModels } } + public bool CanNavigateToParentProperty => _selectedEntitiesStack.Count >= 1; + private (object resourceKey, bool isDynamic)? GetResourceInfo(object? value) { if (value is StaticResourceExtension staticResource) @@ -415,7 +424,14 @@ namespace Avalonia.Diagnostics.ViewModels } } - public void ApplySelectedProperty() + private static IEnumerable GetAllPublicProperties(Type type) + { + return type + .GetProperties() + .Concat(type.GetInterfaces().SelectMany(i => i.GetProperties())); + } + + public void NavigateToSelectedProperty() { var selectedProperty = SelectedProperty; var selectedEntity = SelectedEntity; @@ -423,72 +439,103 @@ namespace Avalonia.Diagnostics.ViewModels if (selectedEntity == null || selectedProperty == null || selectedProperty.PropertyType == typeof(string) - || selectedProperty.PropertyType.IsValueType - ) + || selectedProperty.PropertyType.IsValueType) return; - object? property; - if (selectedProperty.Key is AvaloniaProperty avaloniaProperty) + object? property = null; + + switch (selectedProperty) { - property = (_selectedEntity as IControl)?.GetValue(avaloniaProperty); + case AvaloniaPropertyViewModel avaloniaProperty: + + property = (_selectedEntity as IControl)?.GetValue(avaloniaProperty.Property); + + break; + + case ClrPropertyViewModel clrProperty: + { + property = GetAllPublicProperties(selectedEntity.GetType()) + .FirstOrDefault(pi => clrProperty.Property == pi)? + .GetValue(selectedEntity); + + break; + } } - else + + if (property == null) + return; + + _selectedEntitiesStack.Push((Name:selectedEntityName!, Entry:selectedEntity)); + + var propertyName = selectedProperty.Name; + + //Strip out interface names + if (propertyName.LastIndexOf('.') is var p && p != -1) { - property = selectedEntity.GetType().GetProperties() - .FirstOrDefault(pi => pi.Name == selectedProperty.Name - && pi.DeclaringType == selectedProperty.DeclaringType - && pi.PropertyType.Name == selectedProperty.PropertyType.Name) - ?.GetValue(selectedEntity); + propertyName = propertyName.Substring(p + 1); } - if (property == null) return; - _selectedEntitiesStack.Push((Name:selectedEntityName!,Entry:selectedEntity)); - NavigateToProperty(property, selectedProperty.Name); + + NavigateToProperty(property, selectedEntityName + "." + propertyName); + + RaisePropertyChanged(nameof(CanNavigateToParentProperty)); } - public void ApplyParentProperty() + public void NavigateToParentProperty() { - if (_selectedEntitiesStack.Any()) + if (_selectedEntitiesStack.Count > 0) { var property = _selectedEntitiesStack.Pop(); NavigateToProperty(property.Entry, property.Name); + + RaisePropertyChanged(nameof(CanNavigateToParentProperty)); } } - protected void NavigateToProperty(object o, string? entityName) + protected void NavigateToProperty(object o, string? entityName) { var oldSelectedEntity = SelectedEntity; - if (oldSelectedEntity is IAvaloniaObject ao1) - { - ao1.PropertyChanged -= ControlPropertyChanged; - } - else if (oldSelectedEntity is INotifyPropertyChanged inpc1) + + switch (oldSelectedEntity) { - inpc1.PropertyChanged -= ControlPropertyChanged; + case IAvaloniaObject ao1: + ao1.PropertyChanged -= ControlPropertyChanged; + break; + + case INotifyPropertyChanged inpc1: + inpc1.PropertyChanged -= ControlPropertyChanged; + break; } - + SelectedEntity = o; SelectedEntityName = entityName; SelectedEntityType = o.ToString(); + var properties = GetAvaloniaProperties(o) .Concat(GetClrProperties(o, _showImplementedInterfaces)) .OrderBy(x => x, PropertyComparer.Instance) .ThenBy(x => x.Name) .ToArray(); - _propertyIndex = properties.GroupBy(x => x.Key).ToDictionary(x => x.Key, x => x.ToArray()); + _propertyIndex = properties + .GroupBy(x => x.Key) + .ToDictionary(x => x.Key, x => x.ToArray()); + + TreePage.PropertiesFilter.FilterString = string.Empty; var view = new DataGridCollectionView(properties); view.GroupDescriptions.Add(new DataGridPathGroupDescription(nameof(AvaloniaPropertyViewModel.Group))); view.Filter = FilterProperty; PropertiesView = view; - if (o is IAvaloniaObject ao2) + switch (o) { - ao2.PropertyChanged += ControlPropertyChanged; - } - else if (o is INotifyPropertyChanged inpc2) - { - inpc2.PropertyChanged += ControlPropertyChanged; + case IAvaloniaObject ao2: + ao2.PropertyChanged += ControlPropertyChanged; + break; + + case INotifyPropertyChanged inpc2: + inpc2.PropertyChanged += ControlPropertyChanged; + break; } } @@ -498,7 +545,9 @@ namespace Avalonia.Diagnostics.ViewModels if (SelectedEntity != _avaloniaObject) { - NavigateToProperty(_avaloniaObject, (_avaloniaObject as IControl)?.Name ?? _avaloniaObject.ToString()); + NavigateToProperty( + _avaloniaObject, + (_avaloniaObject as IControl)?.Name ?? _avaloniaObject.ToString()); } if (PropertiesView is null) diff --git a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs index 0c0c005122..a453fef212 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs +++ b/src/Avalonia.Diagnostics/Diagnostics/ViewModels/ControlLayoutViewModel.cs @@ -30,20 +30,28 @@ namespace Avalonia.Diagnostics.ViewModels if (control is AvaloniaObject ao) { - MarginThickness = ao.GetValue(Layoutable.MarginProperty); - - if (HasPadding) + try { - PaddingThickness = ao.GetValue(Decorator.PaddingProperty); - } + _updatingFromControl = true; + MarginThickness = ao.GetValue(Layoutable.MarginProperty); + + if (HasPadding) + { + PaddingThickness = ao.GetValue(Decorator.PaddingProperty); + } - if (HasBorder) + if (HasBorder) + { + BorderThickness = ao.GetValue(Border.BorderThicknessProperty); + } + + HorizontalAlignment = ao.GetValue(Layoutable.HorizontalAlignmentProperty); + VerticalAlignment = ao.GetValue(Layoutable.VerticalAlignmentProperty); + } + finally { - BorderThickness = ao.GetValue(Border.BorderThicknessProperty); + _updatingFromControl = false; } - - HorizontalAlignment = ao.GetValue(Layoutable.HorizontalAlignmentProperty); - VerticalAlignment = ao.GetValue(Layoutable.VerticalAlignmentProperty); } UpdateSize(); diff --git a/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml b/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml index cc392853be..a426b387f7 100644 --- a/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml +++ b/src/Avalonia.Diagnostics/Diagnostics/Views/ControlDetailsView.xaml @@ -30,7 +30,11 @@ -