]> O.S.I.I.S - jp/crow.git/commitdiff
temp
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 5 May 2019 20:43:46 +0000 (22:43 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sun, 5 May 2019 20:43:46 +0000 (22:43 +0200)
722 files changed:
.gitignore [new file with mode: 0644]
.nuget/NuGet.config [new file with mode: 0644]
.travis.yml [new file with mode: 0644]
Crow.ControlsLib/AnalogMeter.cs [new file with mode: 0644]
Crow.ControlsLib/Crow.ControlsLib.csproj [new file with mode: 0644]
Crow.ControlsLib/Default.style [new file with mode: 0644]
Crow.ControlsLib/DockingView.cs [new file with mode: 0644]
Crow.ControlsLib/DocksView.cs [new file with mode: 0644]
Crow.ControlsLib/Templates/AnalogMeter0.goml [new file with mode: 0755]
Crow.ControlsLib/Templates/Checkbox2.goml [new file with mode: 0755]
Crow.ControlsLib/Templates/DockingView.template [new file with mode: 0755]
Crow.ControlsLib/Templates/ListBox.template [new file with mode: 0755]
Crow.ControlsLib/Templates/Menu.template [new file with mode: 0644]
Crow.ControlsLib/Templates/MenuItem.template [new file with mode: 0644]
Crow.ControlsLib/Templates/MessageBox.template [new file with mode: 0644]
Crow.ControlsLib/Templates/Popper.template [new file with mode: 0755]
Crow.ControlsLib/Templates/RadioButton.template [new file with mode: 0755]
Crow.ControlsLib/Templates/ScrollBar.template [new file with mode: 0755]
Crow.ControlsLib/Templates/ScrollingListBox.goml [new file with mode: 0644]
Crow.ControlsLib/Templates/Slider.template [new file with mode: 0755]
Crow.ControlsLib/Templates/Spinner (copier).goml [new file with mode: 0755]
Crow.ControlsLib/Templates/Spinner.template [new file with mode: 0755]
Crow.ControlsLib/Templates/TabItem.template [new file with mode: 0644]
Crow.ControlsLib/Templates/ToolWindow.template [new file with mode: 0755]
Crow.ControlsLib/Templates/TreeView.template [new file with mode: 0644]
Crow.ControlsLib/Templates/Window.template [new file with mode: 0755]
Crow.ControlsLib/Templates/imgItemTemplate.goml [new file with mode: 0755]
Crow.ControlsLib/Templates/tmpDirItem.goml [new file with mode: 0755]
Crow.ControlsLib/Templates/treeList.crow [new file with mode: 0755]
Crow.sln [new file with mode: 0644]
Crow/Crow.csproj [new file with mode: 0644]
Crow/Crow.dll.config [new file with mode: 0644]
Crow/Default.style [new file with mode: 0644]
Crow/Icons/IconAlerte.svg [new file with mode: 0755]
Crow/Icons/Icon_no.svg [new file with mode: 0644]
Crow/Icons/assembly.svg [new file with mode: 0644]
Crow/Icons/checkbox.svg [new file with mode: 0644]
Crow/Icons/compiler_error.svg [new file with mode: 0644]
Crow/Icons/compiler_warning.svg [new file with mode: 0644]
Crow/Icons/compiler_warning_orange.svg [new file with mode: 0644]
Crow/Icons/copy-file.svg [new file with mode: 0644]
Crow/Icons/crow.svg [new file with mode: 0644]
Crow/Icons/crowproj.svg [new file with mode: 0644]
Crow/Icons/exit-symbol.svg [new file with mode: 0644]
Crow/Icons/exit2.svg [new file with mode: 0644]
Crow/Icons/expandable.svg [new file with mode: 0644]
Crow/Icons/file.svg [new file with mode: 0644]
Crow/Icons/folder.svg [new file with mode: 0644]
Crow/Icons/frame.svg [new file with mode: 0644]
Crow/Icons/iconInfo.svg [new file with mode: 0644]
Crow/Icons/level-up.svg [new file with mode: 0644]
Crow/Icons/maximize.svg [new file with mode: 0644]
Crow/Icons/minimize.svg [new file with mode: 0644]
Crow/Icons/normalize.svg [new file with mode: 0644]
Crow/Icons/open-file.svg [new file with mode: 0644]
Crow/Icons/paste-on-document.svg [new file with mode: 0644]
Crow/Icons/project.svg [new file with mode: 0644]
Crow/Icons/projectRef.svg [new file with mode: 0644]
Crow/Icons/question.svg [new file with mode: 0644]
Crow/Icons/radiobutton.svg [new file with mode: 0644]
Crow/Icons/scissors.svg [new file with mode: 0644]
Crow/Icons/updown.svg [new file with mode: 0644]
Crow/Icons/warning_construction.svg [new file with mode: 0644]
Crow/Images/Icons/Cursors/arrow [new file with mode: 0644]
Crow/Images/Icons/Cursors/bottom_left_corner [new file with mode: 0644]
Crow/Images/Icons/Cursors/bottom_right_corner [new file with mode: 0644]
Crow/Images/Icons/Cursors/cross [new file with mode: 0644]
Crow/Images/Icons/Cursors/hand [new file with mode: 0644]
Crow/Images/Icons/Cursors/help [new file with mode: 0644]
Crow/Images/Icons/Cursors/ibeam [new file with mode: 0644]
Crow/Images/Icons/Cursors/move [new file with mode: 0644]
Crow/Images/Icons/Cursors/sb_h_double_arrow [new file with mode: 0644]
Crow/Images/Icons/Cursors/sb_v_double_arrow [new file with mode: 0644]
Crow/Images/Icons/Cursors/top_left_corner [new file with mode: 0644]
Crow/Images/Icons/Cursors/top_right_corner [new file with mode: 0644]
Crow/Images/Icons/buttonB.svg [new file with mode: 0755]
Crow/Images/Icons/crow.png [new file with mode: 0644]
Crow/Images/Icons/exit.svg [new file with mode: 0644]
Crow/Images/Icons/file.svg [new file with mode: 0644]
Crow/Images/Icons/folder.svg [new file with mode: 0644]
Crow/Images/Icons/member.svg [new file with mode: 0644]
Crow/Images/Icons/tetra.png [new file with mode: 0644]
Crow/Images/button.svg [new file with mode: 0644]
Crow/Images/crow0.svg [new file with mode: 0644]
Crow/Images/meter.svg [new file with mode: 0755]
Crow/Images/screenshot.png [new file with mode: 0644]
Crow/Images/screenshot2.png [new file with mode: 0644]
Crow/Templates/ArrowBut.template [new file with mode: 0755]
Crow/Templates/Button.template [new file with mode: 0755]
Crow/Templates/CheckBox.template [new file with mode: 0755]
Crow/Templates/CheckBox2.template [new file with mode: 0644]
Crow/Templates/ColorPicker.template [new file with mode: 0755]
Crow/Templates/ComboBox.template [new file with mode: 0755]
Crow/Templates/ContextMenu.template [new file with mode: 0644]
Crow/Templates/DefaultItem.template [new file with mode: 0755]
Crow/Templates/DirectoryView.template [new file with mode: 0755]
Crow/Templates/DockWindow.template [new file with mode: 0755]
Crow/Templates/Expandable.template [new file with mode: 0755]
Crow/Templates/FileDialog.template [new file with mode: 0644]
Crow/Templates/FileItems.template [new file with mode: 0644]
Crow/Templates/GroupBox.template [new file with mode: 0755]
Crow/Templates/HScrollBar.template [new file with mode: 0755]
Crow/Templates/ListBox.template [new file with mode: 0755]
Crow/Templates/Menu.template [new file with mode: 0644]
Crow/Templates/MenuItem.template [new file with mode: 0644]
Crow/Templates/MessageBox.template [new file with mode: 0644]
Crow/Templates/Popper.template [new file with mode: 0755]
Crow/Templates/RadioButton.template [new file with mode: 0755]
Crow/Templates/ScrollBar.template [new file with mode: 0755]
Crow/Templates/ScrollingListBox.template [new file with mode: 0644]
Crow/Templates/Slider.template [new file with mode: 0755]
Crow/Templates/Spinner.template [new file with mode: 0755]
Crow/Templates/TabItem.template [new file with mode: 0644]
Crow/Templates/ToolWindow.template [new file with mode: 0755]
Crow/Templates/Tooltip.template [new file with mode: 0644]
Crow/Templates/TreeView.template [new file with mode: 0644]
Crow/Templates/Window.template [new file with mode: 0755]
Crow/Templates/imgItem.template [new file with mode: 0755]
Crow/Templates/treeList.template [new file with mode: 0755]
Crow/crow.key [new file with mode: 0644]
Crow/src/BmpPicture.cs [new file with mode: 0644]
Crow/src/BubblingMouseButtonEventArgs.cs [new file with mode: 0644]
Crow/src/Cairo/DrawingHelpers.cs [new file with mode: 0644]
Crow/src/Colors.cs [new file with mode: 0644]
Crow/src/Command.cs [new file with mode: 0644]
Crow/src/CompilerServices/CompilerServices.cs [new file with mode: 0644]
Crow/src/Configuration.cs [new file with mode: 0644]
Crow/src/CrowThread.cs [new file with mode: 0644]
Crow/src/DragDropEventArgs.cs [new file with mode: 0644]
Crow/src/DynAttribute.cs [new file with mode: 0644]
Crow/src/Enums.cs [new file with mode: 0644]
Crow/src/ExtensionsMethods.cs [new file with mode: 0644]
Crow/src/Fill/Fill.cs [new file with mode: 0644]
Crow/src/Font.cs [new file with mode: 0644]
Crow/src/Gradient.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Border.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Button.cs [new file with mode: 0644]
Crow/src/GraphicObjects/CheckBox.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ColorPicker.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ColorSelector.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ComboBox.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Container.cs [new file with mode: 0644]
Crow/src/GraphicObjects/DataSourceChangeEventArgs.cs [new file with mode: 0644]
Crow/src/GraphicObjects/DirectoryView.cs [new file with mode: 0644]
Crow/src/GraphicObjects/DockStack.cs [new file with mode: 0644]
Crow/src/GraphicObjects/DockWindow.cs [new file with mode: 0644]
Crow/src/GraphicObjects/EnumSelector.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Expandable.cs [new file with mode: 0644]
Crow/src/GraphicObjects/FileDialog.cs [new file with mode: 0644]
Crow/src/GraphicObjects/GenericStack.cs [new file with mode: 0644]
Crow/src/GraphicObjects/GraduatedSlider.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Grid.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Group.cs [new file with mode: 0644]
Crow/src/GraphicObjects/GroupBox.cs [new file with mode: 0644]
Crow/src/GraphicObjects/HorizontalStack.cs [new file with mode: 0644]
Crow/src/GraphicObjects/HueSelector.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ILayoutable.cs [new file with mode: 0644]
Crow/src/GraphicObjects/IMLContainer.cs [new file with mode: 0644]
Crow/src/GraphicObjects/IValueChange.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Image.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Label.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ListBox.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Menu.cs [new file with mode: 0644]
Crow/src/GraphicObjects/MenuItem.cs [new file with mode: 0644]
Crow/src/GraphicObjects/MessageBox.cs [new file with mode: 0644]
Crow/src/GraphicObjects/NumericControl.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Popper.cs [new file with mode: 0644]
Crow/src/GraphicObjects/PrivateContainer.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ProgressBar.cs [new file with mode: 0644]
Crow/src/GraphicObjects/RadioButton.cs [new file with mode: 0644]
Crow/src/GraphicObjects/SaturationValueSelector.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ScrollBar.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Scroller.cs [new file with mode: 0644]
Crow/src/GraphicObjects/ScrollingObject.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Shape.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Slider.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Spinner.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Splitter.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TabItem.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TabView.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TemplatedContainer.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TemplatedControl.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TemplatedGroup.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TestCairoPatch.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TextBox.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TextRun.cs [new file with mode: 0644]
Crow/src/GraphicObjects/TreeView.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Trend.cs [new file with mode: 0644]
Crow/src/GraphicObjects/VerticalStack.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Widget.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Window.cs [new file with mode: 0644]
Crow/src/GraphicObjects/Wrapper.cs [new file with mode: 0644]
Crow/src/GraphicObjects/XmlIgnoreAttribute.cs [new file with mode: 0644]
Crow/src/IListChanged.cs [new file with mode: 0644]
Crow/src/IML/BindingDefinition.cs [new file with mode: 0644]
Crow/src/IML/BindingMember.cs [new file with mode: 0644]
Crow/src/IML/EventBinding.cs [new file with mode: 0644]
Crow/src/IML/IMLContext.cs [new file with mode: 0644]
Crow/src/IML/MemberAddress.cs [new file with mode: 0644]
Crow/src/IML/Node.cs [new file with mode: 0644]
Crow/src/IML/NodeAddress.cs [new file with mode: 0644]
Crow/src/IML/NodeStack.cs [new file with mode: 0644]
Crow/src/IMLAttributes.cs [new file with mode: 0644]
Crow/src/Input/ButtonState.cs [new file with mode: 0644]
Crow/src/Input/Buttons.cs [new file with mode: 0644]
Crow/src/Input/Key.cs [new file with mode: 0644]
Crow/src/Input/KeyEventArgs.cs [new file with mode: 0644]
Crow/src/Input/KeyPressEventArgs.cs [new file with mode: 0644]
Crow/src/Input/MouseButton.cs [new file with mode: 0644]
Crow/src/Input/MouseEventArgs.cs [new file with mode: 0644]
Crow/src/Input/MouseScroll.cs [new file with mode: 0644]
Crow/src/Input/MouseState.cs [new file with mode: 0644]
Crow/src/Instantiator.cs [new file with mode: 0644]
Crow/src/Interface.cs [new file with mode: 0644]
Crow/src/ItemTemplate.cs [new file with mode: 0644]
Crow/src/LayoutingEventArgs.cs [new file with mode: 0644]
Crow/src/LayoutingQueueItem.cs [new file with mode: 0644]
Crow/src/Measure.cs [new file with mode: 0644]
Crow/src/MouseCursorChangedEventArgs.cs [new file with mode: 0644]
Crow/src/ObservableList.cs [new file with mode: 0644]
Crow/src/ParsingException.cs [new file with mode: 0644]
Crow/src/PerformanceMeasure.cs [new file with mode: 0644]
Crow/src/Picture.cs [new file with mode: 0644]
Crow/src/Point.cs [new file with mode: 0644]
Crow/src/Rectangle.cs [new file with mode: 0644]
Crow/src/Rectangles.cs [new file with mode: 0644]
Crow/src/ReflexionExtensions.cs [new file with mode: 0644]
Crow/src/ScrollingEventArgs.cs [new file with mode: 0644]
Crow/src/SelectionChangeEventArgs.cs [new file with mode: 0644]
Crow/src/Size.cs [new file with mode: 0644]
Crow/src/SolidColor.cs [new file with mode: 0644]
Crow/src/Style.cs [new file with mode: 0644]
Crow/src/StyleReader.cs [new file with mode: 0644]
Crow/src/SvgPicture.cs [new file with mode: 0644]
Crow/src/TextChangeEventArgs.cs [new file with mode: 0644]
Crow/src/ValueChangeEventArgs.cs [new file with mode: 0644]
Crow/src/debug/DbgEventTypeColors.cs [new file with mode: 0644]
Crow/src/debug/DbgLogViewer.cs [new file with mode: 0644]
Crow/src/debug/DebugLogger.cs [new file with mode: 0644]
Crow/src/rsvg/DimensionData.cs [new file with mode: 0644]
Crow/src/rsvg/Global.cs [new file with mode: 0644]
Crow/src/rsvg/Handle.cs [new file with mode: 0644]
Crow/src/vkvg/Context.cs [new file with mode: 0644]
Crow/src/vkvg/Device.cs [new file with mode: 0644]
Crow/src/vkvg/Enums.cs [new file with mode: 0644]
Crow/src/vkvg/FontExtents.cs [new file with mode: 0644]
Crow/src/vkvg/Matrix.cs [new file with mode: 0644]
Crow/src/vkvg/NativeMethods.cs [new file with mode: 0644]
Crow/src/vkvg/Pattern.cs [new file with mode: 0644]
Crow/src/vkvg/Point.cs [new file with mode: 0644]
Crow/src/vkvg/PointD.cs [new file with mode: 0644]
Crow/src/vkvg/Surface.cs [new file with mode: 0644]
Crow/src/vkvg/TextExtents.cs [new file with mode: 0644]
Crow/src/vkvg/TextRun.cs [new file with mode: 0644]
CrowIDE/CrowIDE.NetStd.csproj [new file with mode: 0644]
CrowIDE/CrowIDE.csproj [new file with mode: 0644]
CrowIDE/CrowIDE.sln [new file with mode: 0644]
CrowIDE/CrowIDE.userprefs [new file with mode: 0644]
CrowIDE/DefaultTemplateOverrides/ContextMenu.template [new file with mode: 0644]
CrowIDE/DefaultTemplateOverrides/MenuItem.template [new file with mode: 0644]
CrowIDE/DefaultTemplateOverrides/TabItem.template [new file with mode: 0644]
CrowIDE/IDE.style [new file with mode: 0644]
CrowIDE/icons/basic_floppydisk.svg [new file with mode: 0644]
CrowIDE/icons/binding.svg [new file with mode: 0644]
CrowIDE/icons/blank-file.svg [new file with mode: 0644]
CrowIDE/icons/center-align.svg [new file with mode: 0644]
CrowIDE/icons/cogwheel.svg [new file with mode: 0644]
CrowIDE/icons/compile.svg [new file with mode: 0644]
CrowIDE/icons/copy-file.svg [new file with mode: 0644]
CrowIDE/icons/cs-file.svg [new file with mode: 0644]
CrowIDE/icons/curly-brackets.svg [new file with mode: 0644]
CrowIDE/icons/drawsvg.svg [new file with mode: 0644]
CrowIDE/icons/edit.svg [new file with mode: 0644]
CrowIDE/icons/eraser.svg [new file with mode: 0644]
CrowIDE/icons/expand-arrows-1.svg [new file with mode: 0644]
CrowIDE/icons/file-code.svg [new file with mode: 0644]
CrowIDE/icons/file.svg [new file with mode: 0644]
CrowIDE/icons/font-file.svg [new file with mode: 0644]
CrowIDE/icons/light-bulb.svg [new file with mode: 0644]
CrowIDE/icons/magic-wand.svg [new file with mode: 0644]
CrowIDE/icons/magnet.svg [new file with mode: 0644]
CrowIDE/icons/move-arrows.svg [new file with mode: 0644]
CrowIDE/icons/open-folder-1.svg [new file with mode: 0644]
CrowIDE/icons/open.svg [new file with mode: 0644]
CrowIDE/icons/paint-brush.svg [new file with mode: 0644]
CrowIDE/icons/palette.svg [new file with mode: 0644]
CrowIDE/icons/paragraph.svg [new file with mode: 0644]
CrowIDE/icons/paste-on-document.svg [new file with mode: 0644]
CrowIDE/icons/pin.svg [new file with mode: 0644]
CrowIDE/icons/previous.svg [new file with mode: 0644]
CrowIDE/icons/question.svg [new file with mode: 0644]
CrowIDE/icons/redo.svg [new file with mode: 0644]
CrowIDE/icons/reply.svg [new file with mode: 0644]
CrowIDE/icons/save.svg [new file with mode: 0644]
CrowIDE/icons/scissors.svg [new file with mode: 0644]
CrowIDE/icons/search.svg [new file with mode: 0644]
CrowIDE/icons/share-arrow.svg [new file with mode: 0644]
CrowIDE/icons/sign-out.svg [new file with mode: 0644]
CrowIDE/icons/text-file.svg [new file with mode: 0644]
CrowIDE/icons/text-label.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Border.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Button.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.CheckBox.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.ColorPicker.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.ComboBox.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Container.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.DirectoryView.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Docker.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Expandable.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.FileDialog.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Grid.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Group.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.GroupBox.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.HorizontalStack.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.IMLContainer.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Image.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Label.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.ListBox.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Menu.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.MenuItem.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.MessageBox.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.ProgressBar.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.RadioButton.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.ScrollBar.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Scroller.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Shape.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Slider.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Spinner.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Splitter.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.TabItem.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.TabView.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.TemplatedContainer.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.TemplatedGroup.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.TextBox.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.TreeView.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.VerticalStack.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Window.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/Crow.Wrapper.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/bar-chart.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/bar-menu.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/bullets.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/calendar.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/check-square-1.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/database.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/ellipsis.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/exclamation-circle-1.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/exclamation-circle.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/file-code.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/grab.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/hard-drive-1.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/hash.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/info.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/layout.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/line-list.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/list.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/modal-list.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/options.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/package.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/padding.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/picture-file.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/pointer.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/puzzle-piece.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/refresh-file.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/sliders.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/split-browser-1.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/table.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/tasks.svg [new file with mode: 0644]
CrowIDE/icons/toolbox/warning.svg [new file with mode: 0644]
CrowIDE/icons/tools.svg [new file with mode: 0644]
CrowIDE/icons/trash.svg [new file with mode: 0644]
CrowIDE/icons/undo.svg [new file with mode: 0644]
CrowIDE/icons/xml-file.svg [new file with mode: 0644]
CrowIDE/icons/zoom-in.svg [new file with mode: 0644]
CrowIDE/icons/zoom-out.svg [new file with mode: 0644]
CrowIDE/images/save.svg [new file with mode: 0644]
CrowIDE/src/CrowIDE.cs [new file with mode: 0644]
CrowIDE/src/DesignInterface.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/CodeLine.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/Node.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/TextEditor.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs [new file with mode: 0644]
CrowIDE/src/Editors/CodeBuffer/Token.cs [new file with mode: 0644]
CrowIDE/src/Editors/EditPane.cs [new file with mode: 0644]
CrowIDE/src/Editors/Editor.cs [new file with mode: 0644]
CrowIDE/src/Editors/ImlSchematicEditor.cs [new file with mode: 0644]
CrowIDE/src/Editors/ImlVisualEditor.cs [new file with mode: 0644]
CrowIDE/src/Editors/Parsers/BufferParser.cs [new file with mode: 0644]
CrowIDE/src/Editors/Parsers/CSharpParser.cs [new file with mode: 0644]
CrowIDE/src/Editors/Parsers/StyleParser.cs [new file with mode: 0644]
CrowIDE/src/Editors/Parsers/XMLParser.cs [new file with mode: 0644]
CrowIDE/src/Editors/Parsers2/Tokenizer.cs [new file with mode: 0644]
CrowIDE/src/Editors/SourceEditor.cs [new file with mode: 0644]
CrowIDE/src/Editors/SvgEditor.cs [new file with mode: 0644]
CrowIDE/src/Extensions.cs [new file with mode: 0644]
CrowIDE/src/GraphicObjectDesignContainer.cs [new file with mode: 0644]
CrowIDE/src/INetProject.cs [new file with mode: 0644]
CrowIDE/src/MemberView/CategoryContainer.cs [new file with mode: 0644]
CrowIDE/src/MemberView/MembersView.cs [new file with mode: 0644]
CrowIDE/src/MemberView/PropertyContainer.cs [new file with mode: 0644]
CrowIDE/src/Project.cs [new file with mode: 0644]
CrowIDE/src/ProjectTree/CSProjectFile.cs [new file with mode: 0644]
CrowIDE/src/ProjectTree/ImlProjectItem.cs [new file with mode: 0644]
CrowIDE/src/ProjectTree/ProjectFile.cs [new file with mode: 0644]
CrowIDE/src/ProjectTree/ProjectItem.cs [new file with mode: 0644]
CrowIDE/src/ProjectTree/ProjectNodes.cs [new file with mode: 0644]
CrowIDE/src/ProjectTree/ProjectReference.cs [new file with mode: 0644]
CrowIDE/src/ProjectTree/StyleProjectItem.cs [new file with mode: 0644]
CrowIDE/src/Solution.cs [new file with mode: 0644]
CrowIDE/src/SolutionControler.cs [new file with mode: 0644]
CrowIDE/src/VerticalLine.cs [new file with mode: 0644]
CrowIDE/ui/CategoryExp.template [new file with mode: 0755]
CrowIDE/ui/CrowIDE.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/GTreeExpITemp.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/WinSchemaItem.template [new file with mode: 0755]
CrowIDE/ui/DockWindows/toolboxBut.template [new file with mode: 0644]
CrowIDE/ui/DockWindows/winDesign.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winEditor.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winErrors.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winGTExplorer.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winProperties.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winSchema.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winSolution.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winStyleView.crow [new file with mode: 0644]
CrowIDE/ui/DockWindows/winToolbox.crow [new file with mode: 0644]
CrowIDE/ui/IcoBut.template [new file with mode: 0644]
CrowIDE/ui/ItemTemplates/Enum.template [new file with mode: 0755]
CrowIDE/ui/ItemTemplates/Fill.template [new file with mode: 0755]
CrowIDE/ui/LQIsExplorer.crow [new file with mode: 0644]
CrowIDE/ui/MemberView.crow [new file with mode: 0644]
CrowIDE/ui/MembersItem.template [new file with mode: 0755]
CrowIDE/ui/MembersView.template [new file with mode: 0755]
CrowIDE/ui/NewFile.crow [new file with mode: 0644]
CrowIDE/ui/Options.crow [new file with mode: 0644]
CrowIDE/ui/ProjectProperties.crow [new file with mode: 0644]
CrowIDE/ui/ProjectTree.template [new file with mode: 0644]
CrowIDE/ui/TreeExpandable.template [new file with mode: 0644]
CrowIDE/ui/editors/EditPane.template [new file with mode: 0644]
CrowIDE/ui/editors/EditPaneItems.template [new file with mode: 0644]
CrowIDE/ui/editors/EditTabItem.template [new file with mode: 0644]
CrowIDE/ui/editors/IMLEdit.itemp [new file with mode: 0644]
CrowIDE/ui/editors/SourceEditor.crow [new file with mode: 0644]
CrowIDE/ui/editors/SrcEdit.itemp [new file with mode: 0644]
CrowIDE/ui/editors/SvgEdit.itemp [new file with mode: 0644]
CrowIDE/ui/editors/TextEditor.crow [new file with mode: 0644]
CrowIDE/ui/test.crow [new file with mode: 0644]
Doxyfile [new file with mode: 0644]
Images/crow.png [new file with mode: 0644]
Images/crow0.svg [new file with mode: 0644]
Images/screenshot.png [new file with mode: 0644]
Images/screenshot2.png [new file with mode: 0644]
LICENSE.md [new file with mode: 0644]
MDCrow/AddinInfo.cs [new file with mode: 0644]
MDCrow/MDCrow.addin.xml [new file with mode: 0644]
MDCrow/MDCrow.csproj [new file with mode: 0644]
MDCrow/src/CrowCanvas.cs [new file with mode: 0644]
MDCrow/src/CrowDisplayBinding.cs [new file with mode: 0644]
MDCrow/src/CrowView.cs [new file with mode: 0644]
MDCrow/src/DesignInterface.cs [new file with mode: 0644]
MDCrow/src/MDCrowNodeExtension.cs [new file with mode: 0644]
README.md [new file with mode: 0644]
Samples/HelloWorld/HelloWorld.csproj [new file with mode: 0644]
Samples/HelloWorld/main.cs [new file with mode: 0644]
Samples/HelloWorld/ui/helloworld.crow [new file with mode: 0644]
Samples/ShowCase/ShowCase.csproj [new file with mode: 0644]
Samples/ShowCase/main.cs [new file with mode: 0644]
Samples/ShowCase/packages.config [new file with mode: 0644]
Samples/ShowCase/ui/showcase.crow [new file with mode: 0755]
Samples/Tests/Tests.csproj [new file with mode: 0644]
Samples/Tests/main.cs [new file with mode: 0644]
Samples/common/CrowWin.cs [new file with mode: 0644]
Samples/common/ui/Interfaces/CheckBox2.imlt [new file with mode: 0644]
Samples/common/ui/Interfaces/Container/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Container/1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Container/2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Container/3.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/3.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/4.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/5.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/6.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/clip0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/clip1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/clip2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/clip3.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/clip4.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/colorPicker.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/fps.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/perfMeasures.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/test1.1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/test1.2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/test1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/test2WayBinding.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testBind0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testCtxMenu.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testDisable.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/Divers/testFileDialog.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/Divers/testFocus.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testIMLContainer.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/Divers/testImage.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testMenu.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testOutOfClipUpdate.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testPropLess.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testShape.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/Divers/testStacks.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testTextBox.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/testVisibility.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/test_stack.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Divers/welcome.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/DragAndDrop/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Experimental/DockWindow.template [new file with mode: 0755]
Samples/common/ui/Interfaces/Experimental/testDock.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/Experimental/testDock2.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/Experimental/testStack.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/Experimental/testTypeViewer.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/GraphicObject/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/GraphicObject/1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/GraphicObject/2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/GraphicObject/4.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/GraphicObject/5.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/GraphicObject/6.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/GraphicObject/7.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Group/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Group/1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Group/2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Group/3.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Group/4.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Splitter/1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Splitter/3.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/0h.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/1h.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/2h.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/3.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/3h.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Stack/4.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TabItem.template [new file with mode: 0644]
Samples/common/ui/Interfaces/TemplatedContainer/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/6.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/7.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/testGroupBox.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/testMsgBox.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/testPopper.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/testTabView.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/TemplatedContainer/testTabView2.crow [new file with mode: 0644]
Samples/common/ui/Interfaces/TemplatedContainer/testTreeView.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/testWindow.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/testWindow2.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/testWindow3.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedContainer/test_Listbox.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedControl/testButton.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedControl/testCheckbox.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedControl/testCombobox.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedControl/testItemTemplateTag.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedControl/testRadioButton.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedControl/testScrollbar.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedControl/testSpinner.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedGroup/0.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedGroup/1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TemplatedGroup/2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/TmpExpandable.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/Wrapper/1.1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Wrapper/1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Wrapper/2.1.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Wrapper/2.2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/Wrapper/2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/basicTests/7.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/colorItem.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/colorItem2.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/itemTmp.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/log.xml [new file with mode: 0755]
Samples/common/ui/Interfaces/perfMsr.crow [new file with mode: 0755]
Samples/common/ui/Interfaces/testMeter.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/testWindow.goml.sav [new file with mode: 0755]
Samples/common/ui/Interfaces/tmpDirItem.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/tmpMembers.goml [new file with mode: 0755]
Samples/common/ui/Interfaces/treeList.crow [new file with mode: 0755]
Tests/GraphicObjects/ColorCircleSelector.cs [new file with mode: 0644]
Tests/GraphicObjects/HexaContainer.cs [new file with mode: 0644]
Tests/GraphicObjects/LaggingGraphicObject.cs [new file with mode: 0644]
Tests/GraphicObjects/SimpleGauge.cs [new file with mode: 0644]
Tests/GraphicObjects/TechBorder.cs [new file with mode: 0644]
Tests/Interfaces/CheckBox2.imlt [new file with mode: 0644]
Tests/Interfaces/Container/0.crow [new file with mode: 0755]
Tests/Interfaces/Container/1.crow [new file with mode: 0755]
Tests/Interfaces/Container/2.crow [new file with mode: 0755]
Tests/Interfaces/Container/3.crow [new file with mode: 0755]
Tests/Interfaces/Divers/0.crow [new file with mode: 0755]
Tests/Interfaces/Divers/2.crow [new file with mode: 0755]
Tests/Interfaces/Divers/3.crow [new file with mode: 0755]
Tests/Interfaces/Divers/4.crow [new file with mode: 0755]
Tests/Interfaces/Divers/5.crow [new file with mode: 0755]
Tests/Interfaces/Divers/6.crow [new file with mode: 0755]
Tests/Interfaces/Divers/clip0.crow [new file with mode: 0755]
Tests/Interfaces/Divers/clip1.crow [new file with mode: 0755]
Tests/Interfaces/Divers/clip2.crow [new file with mode: 0755]
Tests/Interfaces/Divers/clip3.crow [new file with mode: 0755]
Tests/Interfaces/Divers/clip4.crow [new file with mode: 0755]
Tests/Interfaces/Divers/colorPicker.crow [new file with mode: 0755]
Tests/Interfaces/Divers/fps.crow [new file with mode: 0755]
Tests/Interfaces/Divers/perfMeasures.crow [new file with mode: 0755]
Tests/Interfaces/Divers/test1.1.crow [new file with mode: 0755]
Tests/Interfaces/Divers/test1.2.crow [new file with mode: 0755]
Tests/Interfaces/Divers/test1.crow [new file with mode: 0755]
Tests/Interfaces/Divers/test2WayBinding.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testBind0.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testCtxMenu.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testDisable.crow [new file with mode: 0644]
Tests/Interfaces/Divers/testFileDialog.crow [new file with mode: 0644]
Tests/Interfaces/Divers/testFocus.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testIMLContainer.crow [new file with mode: 0644]
Tests/Interfaces/Divers/testImage.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testMenu.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testOutOfClipUpdate.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testPropLess.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testShape.crow [new file with mode: 0644]
Tests/Interfaces/Divers/testStacks.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testTextBox.crow [new file with mode: 0755]
Tests/Interfaces/Divers/testVisibility.crow [new file with mode: 0755]
Tests/Interfaces/Divers/test_stack.crow [new file with mode: 0755]
Tests/Interfaces/Divers/welcome.crow [new file with mode: 0644]
Tests/Interfaces/DragAndDrop/0.crow [new file with mode: 0755]
Tests/Interfaces/Experimental/DockWindow.template [new file with mode: 0755]
Tests/Interfaces/Experimental/testDock.crow [new file with mode: 0644]
Tests/Interfaces/Experimental/testDock2.crow [new file with mode: 0644]
Tests/Interfaces/Experimental/testStack.crow [new file with mode: 0644]
Tests/Interfaces/Experimental/testTypeViewer.goml [new file with mode: 0755]
Tests/Interfaces/GraphicObject/0.crow [new file with mode: 0755]
Tests/Interfaces/GraphicObject/1.crow [new file with mode: 0755]
Tests/Interfaces/GraphicObject/2.crow [new file with mode: 0755]
Tests/Interfaces/GraphicObject/4.crow [new file with mode: 0755]
Tests/Interfaces/GraphicObject/5.crow [new file with mode: 0755]
Tests/Interfaces/GraphicObject/6.crow [new file with mode: 0755]
Tests/Interfaces/GraphicObject/7.crow [new file with mode: 0755]
Tests/Interfaces/Group/0.crow [new file with mode: 0755]
Tests/Interfaces/Group/1.crow [new file with mode: 0755]
Tests/Interfaces/Group/2.crow [new file with mode: 0755]
Tests/Interfaces/Group/3.crow [new file with mode: 0755]
Tests/Interfaces/Group/4.crow [new file with mode: 0755]
Tests/Interfaces/Splitter/1.crow [new file with mode: 0755]
Tests/Interfaces/Splitter/3.crow [new file with mode: 0755]
Tests/Interfaces/Stack/0.crow [new file with mode: 0755]
Tests/Interfaces/Stack/0h.crow [new file with mode: 0755]
Tests/Interfaces/Stack/1.crow [new file with mode: 0755]
Tests/Interfaces/Stack/1h.crow [new file with mode: 0755]
Tests/Interfaces/Stack/2.crow [new file with mode: 0755]
Tests/Interfaces/Stack/2h.crow [new file with mode: 0755]
Tests/Interfaces/Stack/3.crow [new file with mode: 0755]
Tests/Interfaces/Stack/3h.crow [new file with mode: 0755]
Tests/Interfaces/Stack/4.crow [new file with mode: 0755]
Tests/Interfaces/TabItem.template [new file with mode: 0644]
Tests/Interfaces/TemplatedContainer/0.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/6.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/7.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/testGroupBox.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/testMsgBox.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/testPopper.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/testTabView.crow [new file with mode: 0644]
Tests/Interfaces/TemplatedContainer/testTabView2.crow [new file with mode: 0644]
Tests/Interfaces/TemplatedContainer/testTreeView.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/testWindow.goml [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/testWindow2.goml [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/testWindow3.goml [new file with mode: 0755]
Tests/Interfaces/TemplatedContainer/test_Listbox.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedControl/testButton.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedControl/testCheckbox.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedControl/testCombobox.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedControl/testItemTemplateTag.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedControl/testRadioButton.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedControl/testScrollbar.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedControl/testSpinner.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedGroup/0.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedGroup/1.crow [new file with mode: 0755]
Tests/Interfaces/TemplatedGroup/2.crow [new file with mode: 0755]
Tests/Interfaces/TmpExpandable.goml [new file with mode: 0755]
Tests/Interfaces/Wrapper/1.1.crow [new file with mode: 0755]
Tests/Interfaces/Wrapper/1.crow [new file with mode: 0755]
Tests/Interfaces/Wrapper/2.1.crow [new file with mode: 0755]
Tests/Interfaces/Wrapper/2.2.crow [new file with mode: 0755]
Tests/Interfaces/Wrapper/2.crow [new file with mode: 0755]
Tests/Interfaces/basicTests/7.crow [new file with mode: 0755]
Tests/Interfaces/colorItem.crow [new file with mode: 0755]
Tests/Interfaces/colorItem2.crow [new file with mode: 0755]
Tests/Interfaces/itemTmp.goml [new file with mode: 0755]
Tests/Interfaces/log.xml [new file with mode: 0755]
Tests/Interfaces/perfMsr.crow [new file with mode: 0755]
Tests/Interfaces/testMeter.goml [new file with mode: 0755]
Tests/Interfaces/testWindow.goml.sav [new file with mode: 0755]
Tests/Interfaces/tmpDirItem.goml [new file with mode: 0755]
Tests/Interfaces/tmpMembers.goml [new file with mode: 0755]
Tests/Interfaces/treeList.crow [new file with mode: 0755]
Tests/Tests.NetStd.csproj [new file with mode: 0644]
Tests/Tests.csproj [new file with mode: 0644]
Tests/image/Mana.svg [new file with mode: 0755]
Tests/image/blank-file.svg [new file with mode: 0644]
Tests/image/crow0.svg [new file with mode: 0644]
Tests/image/folder0.svg [new file with mode: 0644]
Tests/image/folder1.svg [new file with mode: 0644]
Tests/image/tetra.png [new file with mode: 0755]
Tests/image/textest.png [new file with mode: 0755]
Tests/image/u.svg [new file with mode: 0644]
Tests/test.style [new file with mode: 0644]
Tests/testClass.cs [new file with mode: 0644]
Tests/ui/LabelButton.style [new file with mode: 0644]
Tests/ui/MenuItem.style [new file with mode: 0644]
Tests/ui/MenuItem.template [new file with mode: 0644]
Tests/ui/Popper.template [new file with mode: 0755]
Tests/ui/TreeExpandable.template [new file with mode: 0644]
Tests/ui/dbgLog.crow [new file with mode: 0755]
Tests/ui/dbgLogColors.crow [new file with mode: 0755]
Tests/ui/showcase.crow [new file with mode: 0755]
Tests/ui/test.crow [new file with mode: 0755]
Tests/ui/test.style [new file with mode: 0644]
Tests/ui/tmpWindow.crow [new file with mode: 0755]
appveyor.yml [new file with mode: 0644]
netfx.props [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..fcf4a26
--- /dev/null
@@ -0,0 +1,12 @@
+*.log
+build
+Win_x86
+Crow.userprefs
+packages
+*.nupkg
+*.user
+.vs/
+/GOLib.suo
+/tmp
+bin
+obj
diff --git a/.nuget/NuGet.config b/.nuget/NuGet.config
new file mode 100644 (file)
index 0000000..9724103
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+       <config>
+               <add key="repositoryPath" value="../packages" />
+       </config>
+</configuration>
diff --git a/.travis.yml b/.travis.yml
new file mode 100644 (file)
index 0000000..06116d8
--- /dev/null
@@ -0,0 +1,12 @@
+language: csharp
+dist: xenial
+dotnet: 2.1.502
+mono: latest
+
+script:
+    - nuget restore Crow.sln
+    - msbuild Crow.sln
+    - dotnet restore
+    - dotnet build Crow.sln
+    
\ No newline at end of file
diff --git a/Crow.ControlsLib/AnalogMeter.cs b/Crow.ControlsLib/AnalogMeter.cs
new file mode 100644 (file)
index 0000000..ff23bd6
--- /dev/null
@@ -0,0 +1,68 @@
+//
+// AnalogMeter.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using Cairo;
+
+namespace Crow
+{
+       public class AnalogMeter : NumericControl
+       {
+               #region CTOR
+               protected AnalogMeter () : base(){}
+               public AnalogMeter (Interface iface) : base(iface){}
+               #endregion
+
+               #region GraphicObject Overrides
+               protected override void onDraw (Context gr)
+               {                       
+                       base.onDraw (gr);
+
+                       Rectangle r = ClientRectangle;
+                       Point m = r.Center;
+
+                       gr.Save ();
+
+
+                       double aUnit = Math.PI*2.0 / (Maximum - Minimum);
+                       gr.Translate (m.X, r.Height *1.1);
+                       gr.Rotate (Value/4.0 * aUnit - Math.PI/4.0);
+                       gr.Translate (-m.X, -m.Y);
+
+                       gr.LineWidth = 2;
+                       Foreground.SetAsSource (gr);
+                       gr.MoveTo (m.X,0.0);
+                       gr.LineTo (m.X, -m.Y*0.5);
+                       gr.Stroke ();
+
+                       gr.Restore ();
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow.ControlsLib/Crow.ControlsLib.csproj b/Crow.ControlsLib/Crow.ControlsLib.csproj
new file mode 100644 (file)
index 0000000..75fd3f1
--- /dev/null
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{6E48BD3D-7B33-4368-AA8A-D878427DAC83}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <RootNamespace>Crow.ControlsLib</RootNamespace>
+    <AssemblyName>Crow.ControlsLib</AssemblyName>
+    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+    <ReleaseVersion>0.5</ReleaseVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug</OutputPath>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+<!--    <Reference Include="System.Data" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Drawing" />-->
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <EmbeddedResource Include="Default.style" />
+    <EmbeddedResource Include="Templates\AnalogMeter0.goml" />
+    <EmbeddedResource Include="Templates\Checkbox2.goml" />
+    <EmbeddedResource Include="Templates\DockingView.template">
+      <LogicalName>Crow.DockingView.template</LogicalName>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Templates\" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="AnalogMeter.cs" />
+    <Compile Include="DockingView.cs" />
+    <Compile Include="DocksView.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Crow.csproj">
+      <Project>{C2980F9B-4798-4C05-99E2-E174810F7C7B}</Project>
+      <Name>Crow</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/Crow.ControlsLib/Default.style b/Crow.ControlsLib/Default.style
new file mode 100644 (file)
index 0000000..07689b5
--- /dev/null
@@ -0,0 +1,139 @@
+Button, CheckBox, RadioButton, ComboBox, Expandable,
+MessageBox, Popper, Slider, Spinner, TextBox {
+       Focusable = true;
+       Height = Fit;
+}
+Border {
+       Foreground = Gray;
+}
+CheckBox { Caption = CheckBox; }
+RadioButton { Caption = RadioButton; }
+Expandable { Caption = Expandable; }
+Popper { Caption = Popper; }
+GroupBox { Caption = Group Box; }
+Wrapper {
+       Orientation = Vertical;
+}
+Button {
+       Caption = Button;
+       Width = Fit;
+}
+Label {
+       Height = Fit;
+       Width = Fit;
+       Margin = 0;
+}
+Menu {
+       Margin = 1;
+       Background = vgradient|0:DimGray|1:Onyx;
+       Height = Fit;
+       Width = Stretched;
+       VerticalAlignment = Top;
+}
+MenuItem {
+       Caption = MenuItem;
+       Width = Stretched;
+       Height = Fit;
+       Background = Transparent;
+       Foreground = LightGray;
+       MouseEnter = {Background = vgradient|0:UnitedNationsBlue|1:Onyx;Foreground=White;}
+       MouseLeave = {Foreground=LightGray;Background=Transparent;}
+}
+MessageBox {
+       Background = 0.3,0.3,0.3,0.3;
+       Width = Fit;
+       Title=MessageBox;
+       Font = serif, 12;
+       MinimumSize = 200,120;
+}
+Slider {
+       Background = vgradient|0:Black|0.1:Gray|0.9:Gray|1:LightGray;
+       Foreground = Gray;
+       Width = Fit;
+}
+Splitter {
+       Focusable = true;
+       Background = DimGray;
+}
+Spinner {
+       Foreground = DimGray;
+}
+TabView {
+       CacheEnabled = false;
+}
+TabItem {
+       Caption = TabItem;
+       Focusable = true;
+       CacheEnabled = false;
+}
+TextBox {
+       Background = White;
+       Foreground = Black;
+       Selectable = True;
+       Text = TextBox;
+       Margin = 1;
+}
+Window {
+       Caption = Window;
+       Focusable = true;
+       MinimumSize=5,5;
+       Width = 150;
+       Height = 150;
+}
+ToolWindow {
+       Caption = Window;
+       Template = #Crow.ToolWindow.template;
+       Focusable = true;
+       MinimumSize=50,50;
+       Width = 150;
+       Height = 150;
+}
+DocksView {
+       AllowDrop = true;
+}
+DockingView {
+       Focusable = true;
+       AllowDrag = true;
+}
+FileDialog {
+       Template = #Crow.FileDialog.template;
+       Focusable = true;
+       MinimumSize=50,50;
+       Width = 500;
+       Height = 300;
+}
+ProgressBar {
+       Foreground = vgradient|0:BlueCrayola|0.5:SkyBlue|1:BlueCrayola;
+}
+ScrollBar {
+       Maximum = 0;
+       Value = 0;
+}
+Scroller {
+       CacheEnabled = false;
+}
+Icon {
+       Margin=1;
+       Width=12;
+       Height=12;
+}
+Control {
+       Margin=0;
+       Spacing=3;
+}
+SaturationValueSelector {
+       Foreground=Red;
+}
+HueSelector {
+       ClipToClientRect=False;
+}
+ColorSpinner {
+       Minimum = 0;
+       Maximum = 255;
+       SmallIncrement = 1;
+}
+HSVSpinner {
+       Minimum = 0;
+       Maximum = 1;
+       SmallIncrement = 0.01;
+}
\ No newline at end of file
diff --git a/Crow.ControlsLib/DockingView.cs b/Crow.ControlsLib/DockingView.cs
new file mode 100644 (file)
index 0000000..8d76d45
--- /dev/null
@@ -0,0 +1,166 @@
+//
+// DockingView.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow
+{
+       public class DockingView : Window
+       {
+               #region CTOR
+               protected DockingView() : base ()
+               {
+               }
+               #endregion
+
+               bool isDocked = false;
+               Alignment docking = Alignment.Center;
+
+               Point lastMousePos;     //last known mouse pos in this control
+               Point undockingMousePosOrig; //mouse pos when docking was donne, use for undocking on mouse move
+               Rectangle savedSlot;    //last undocked slot recalled when view is undocked
+               bool wasResizable;
+
+               public DocksView docker;
+
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       if (isDocked)
+                               return;
+                       
+                       if (docker == null)
+                               return;
+
+                       Rectangle dvCliRect = docker.ClientRectangle;
+
+                       if (layoutType == LayoutingType.X) {
+                               if (Slot.X < docker.DockingThreshold)
+                                       dock (Alignment.Left);
+                               else if (Slot.Right > dvCliRect.Width - docker.DockingThreshold)
+                                       dock (Alignment.Right);
+                       }else if (layoutType == LayoutingType.Y) {
+                               if (Slot.Y < docker.DockingThreshold)
+                                       dock (Alignment.Top);
+                               else if (Slot.Bottom > dvCliRect.Height - docker.DockingThreshold)
+                                       dock (Alignment.Bottom);
+                       }
+               }
+
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       lastMousePos = e.Position;
+
+                       if (this.HasFocus && e.Mouse.IsButtonDown (MouseButton.Left) && isDocked) {                             
+                               if (docking == Alignment.Left) {
+                                       if (lastMousePos.X - undockingMousePosOrig.X > docker.DockingThreshold)
+                                               undock ();
+                               } else if (docking == Alignment.Right) {
+                                       if (undockingMousePosOrig.X - lastMousePos.X > docker.DockingThreshold)
+                                               undock ();
+                               } else if (docking == Alignment.Top) {
+                                       if (lastMousePos.Y - undockingMousePosOrig.Y > docker.DockingThreshold)
+                                               undock ();
+                               } else if (docking == Alignment.Bottom) {
+                                       if (undockingMousePosOrig.Y - lastMousePos.Y > docker.DockingThreshold)
+                                               undock ();
+                               }
+                               return;
+                       }
+
+                       base.onMouseMove (sender, e);
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+
+                       if (this.HasFocus && isDocked && e.Button == MouseButton.Left)
+                               undockingMousePosOrig = lastMousePos;
+               }
+
+//             protected override void onBorderMouseEnter (object sender, MouseMoveEventArgs e)
+//             {
+//                     base.onBorderMouseEnter (sender, e);
+//
+//                     if (isDocked) {
+//                             switch (docking) {
+//                             case Alignment.Top:
+//                                     if (this.currentDirection != Window.Direction.S)
+//                                             onBorderMouseLeave (this, null);
+//                                     break;
+//                             case Alignment.Left:
+//                                     if (this.currentDirection != Window.Direction.E)
+//                                             onBorderMouseLeave (this, null);
+//                                     break;
+//                             case Alignment.TopLeft:
+//                                     break;
+//                             case Alignment.Right:
+//                                     if (this.currentDirection != Window.Direction.W)
+//                                             onBorderMouseLeave (this, null);
+//                                     break;
+//                             case Alignment.TopRight:
+//                                     break;
+//                             case Alignment.Bottom:
+//                                     if (this.currentDirection != Window.Direction.N)
+//                                             onBorderMouseLeave (this, null);                                        
+//                                     break;
+//                             case Alignment.BottomLeft:
+//                                     break;
+//                             case Alignment.BottomRight:
+//                                     break;
+//                             case Alignment.Center:
+//                                     break;
+//                             default:
+//                                     break;
+//                             }
+//                     }
+//             }
+
+               void undock () {
+                       docker.Undock(this);
+
+                       this.Left = savedSlot.Left;
+                       this.Top = savedSlot.Top;
+                       this.Width = savedSlot.Width;
+                       this.Height = savedSlot.Height;
+
+                       isDocked = false;
+                       Resizable = wasResizable;
+               }
+               void dock (Alignment align){
+                       this.Left = this.Top = 0;
+                       isDocked = true;
+                       docking = align;
+                       undockingMousePosOrig = lastMousePos;
+                       savedSlot = this.LastPaintedSlot;
+                       wasResizable = Resizable;
+                       Resizable = false;
+
+                       docker.Dock (this, align);
+               }
+       }
+}
+
diff --git a/Crow.ControlsLib/DocksView.cs b/Crow.ControlsLib/DocksView.cs
new file mode 100644 (file)
index 0000000..a93bdc7
--- /dev/null
@@ -0,0 +1,91 @@
+//
+// DocksView.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Collections.Generic;
+
+namespace Crow
+{
+       public class DocksView : Group
+       {
+               List<DockingView> childViews = new List<DockingView>();
+               GenericStack rootStack = null;
+
+               public override void AddChild (GraphicObject g)
+               {
+                       DockingView dv = g as DockingView;
+                       if (g == null)
+                               throw new Exception ("DocksView accept only DockingView as child");
+                       base.AddChild (g);
+                       childViews.Add (dv);
+                       dv.docker = this;
+               }
+               public override void RemoveChild (GraphicObject child)
+               {
+                       DockingView dv = child as DockingView;
+                       if (child == null)
+                               throw new Exception ("DocksView accept only DockingView as child");
+                       base.RemoveChild (child);
+                       childViews.Remove (dv);
+                       dv.docker = this;
+               }
+               public void Dock (DockingView dv, Alignment pos){
+                       switch (pos) {
+                       case Alignment.Top:
+                               if (rootStack?.Orientation != Orientation.Vertical)
+                               this.Width = Measure.Stretched;
+                               break;
+                       case Alignment.Bottom:
+                               this.Width = Measure.Stretched;
+                               break;
+                       case Alignment.Left:
+                               this.Height = Measure.Stretched;
+                               break;
+                       case Alignment.Right:
+                               this.Height = Measure.Stretched;
+                               break;
+                       }
+               }
+               public void Undock (DockingView dv){
+               }
+
+               int dockingThreshold;
+
+               [XmlAttributeAttribute][DefaultValue(10)]
+               public virtual int DockingThreshold {
+                       get { return dockingThreshold; }
+                       set {
+                               if (dockingThreshold == value)
+                                       return;
+                               dockingThreshold = value; 
+                               NotifyValueChanged ("DockingThreshold", dockingThreshold);
+
+                       }
+               } 
+       }
+}
+
diff --git a/Crow.ControlsLib/Templates/AnalogMeter0.goml b/Crow.ControlsLib/Templates/AnalogMeter0.goml
new file mode 100755 (executable)
index 0000000..8187aac
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Group Margin="0" Width="-1" Height="-1" Focusable="false">
+       <Image Name="Image"  Path="#go.Images.meter.svg" SvgSub="background"/>
+<!--   <Image Name="Image"  Path="#go.Images.meter.svg" SvgSub="gauge"/>-->
+</Group>
\ No newline at end of file
diff --git a/Crow.ControlsLib/Templates/Checkbox2.goml b/Crow.ControlsLib/Templates/Checkbox2.goml
new file mode 100755 (executable)
index 0000000..0a67fce
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<HorizontalStack Margin="0" Spacing="1" Focusable="false">
+       <Image Name="Image" Width="16" Height="16" Path="#go.Images.Icons.checkbox.svg"/>
+       <Label Name="Caption" Background="Red"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Crow.ControlsLib/Templates/DockingView.template b/Crow.ControlsLib/Templates/DockingView.template
new file mode 100755 (executable)
index 0000000..0a3b4e0
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="White" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+<!--           <Border Name="TitleBar" BorderWidth="1" Foreground="White" Width="{./WidthPolicy}" Height="Fit"
+                               Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9">-->
+                       <HorizontalStack Background="vgradient|0:0.5,0.6,0.5,0.5|1:0.2,0.3,0.3,0.7"
+                                       Name="hs" Margin="2" Spacing="0" Height="Fit">
+                               <GraphicObject Width="5"/>
+                               <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                               <Label Width="Stretched" Foreground="White" Margin="1" TextAlignment="Center" Text="{./Caption}" />
+                               <Border CornerRadius="6" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Images.Icons.exit2.svg"
+                                                MouseClick="./butQuitPress"/>
+                               </Border>
+                               <GraphicObject Width="5"/>
+                       </HorizontalStack>
+<!--           </Border>-->
+               <Container Name="Content" MinimumSize="50,50" Background="0.5,0.5,0.5,0.5"/>
+       </VerticalStack>
+</Border>
diff --git a/Crow.ControlsLib/Templates/ListBox.template b/Crow.ControlsLib/Templates/ListBox.template
new file mode 100755 (executable)
index 0000000..f6d6214
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Margin="1" MinimumSize="10,10">
+       <Scroller  Name="scroller1" Margin="1" VerticalScrolling="true">
+               <VerticalStack
+                       Height="Fit" Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+       </Scroller>
+</Border>
diff --git a/Crow.ControlsLib/Templates/Menu.template b/Crow.ControlsLib/Templates/Menu.template
new file mode 100644 (file)
index 0000000..c560043
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<HorizontalStack Name="ItemsContainer" Margin="0" Background="{./Background}"/>
diff --git a/Crow.ControlsLib/Templates/MenuItem.template b/Crow.ControlsLib/Templates/MenuItem.template
new file mode 100644 (file)
index 0000000..0f93b20
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
+       Foreground = "{./Foreground}" CanPop="{./HasChildren}" MouseClick="./onMI_Click"
+       IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}">
+       <Template>
+               <Border Name="border1"
+                               MouseEnter="{Foreground=vgradient|0:White|0.2:Gray|0.9:Gray|1:Black}"
+                               MouseLeave="{Foreground=Transparent}"
+                               MouseDown="{Foreground=vgradient|0:Black|0.05:Gray|0.85:Gray|1:White}"
+                               MouseUp="{Foreground=vgradient|0:White|0.2:Gray|0.9:Gray|1:Black}"
+                               MinimumSize = "60,0"
+                               Foreground="Transparent"
+                               Background="{./Background}">
+                               <Label Text="{./Caption}"
+                                       Foreground="{./Foreground}"
+                                       Margin="1" HorizontalAlignment="Left"
+                                       Font="{./Font}" />
+               </Border>
+       </Template>
+       <Border Foreground="DimGray" Width="{../PopWidth}" Height="{../PopHeight}" Background="Onyx">
+               <VerticalStack Name="ItemsContainer"/>
+       </Border>
+</Popper>
diff --git a/Crow.ControlsLib/Templates/MessageBox.template b/Crow.ControlsLib/Templates/MessageBox.template
new file mode 100644 (file)
index 0000000..c33eb86
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<Border        CornerRadius="0"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Background="{./Background}">
+               <Border BorderWidth="0" Foreground="White" Height="Fit" Width="Stretched" MinimumSize="200,0"
+                               Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9">
+                       <HorizontalStack Name="hs" Margin="2" Spacing="1" Height="Fit" >
+                               <GraphicObject Width="5" Height="5"/>
+                               <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                               <Label Width="Stretched" Foreground="White" Margin="1" TextAlignment="Center" Text="{./Caption}" />
+                               <Border CornerRadius="3" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Name="Image" Path="#Crow.Images.Icons.exit2.svg"
+                                                MouseClick="./butQuitPress"/>
+                               </Border>
+                               <GraphicObject Width="5" Height="5"/>
+                       </HorizontalStack>
+               </Border>
+               <HorizontalStack Margin="5">
+                       <Image Name="Image" Width="20%" Height="30" Path="{./MsgIcon}" />
+                       <Label Margin="5" Font="{./Font}" Width="Fit" Text="{./Message}"
+                               TextAlignment="Left"
+                               Multiline="true" />             
+               </HorizontalStack>
+               <HorizontalStack Margin="1" Spacing="0" Height="Fit" Width="60%" HorizontalAlignment="Right">
+                       <Button Width="50%" Caption="{./OkMessage}" MouseClick="./onOkButtonClick" />
+                       <Button Width="50%" Caption="{./CancelMessage}" MouseClick="./onCancelButtonClick" />
+               </HorizontalStack>
+       </VerticalStack>
+</Border>
diff --git a/Crow.ControlsLib/Templates/Popper.template b/Crow.ControlsLib/Templates/Popper.template
new file mode 100755 (executable)
index 0000000..0bc7c74
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Border Background="{./Background}" BorderWidth="1" Foreground="{./Foreground}" Height="Fit">
+       <HorizontalStack Spacing="1" Height="Fit">
+               <Image Style="Icon" Margin="1" Width="9" Height="9"
+                               Path="#Crow.Images.Icons.expandable.svg" SvgSub="{./IsPopped}"/>
+               <Label Text="{./Caption}" />
+       </HorizontalStack>
+</Border>
\ No newline at end of file
diff --git a/Crow.ControlsLib/Templates/RadioButton.template b/Crow.ControlsLib/Templates/RadioButton.template
new file mode 100755 (executable)
index 0000000..b96eec2
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<HorizontalStack Style="Control" Background="{./Background}">
+       <Image Style="Icon" Path="#Crow.Images.Icons.radiobutton.svg"
+               SvgSub="{./IsChecked}"/>
+       <Label Text="{./Caption}"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Crow.ControlsLib/Templates/ScrollBar.template b/Crow.ControlsLib/Templates/ScrollBar.template
new file mode 100755 (executable)
index 0000000..70dce93
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="LightGray">
+       <GenericStack Orientation="{./Orientation}" Spacing="0">
+               <Button MouseRepeat="true" Width="12" Height="12" MouseClick="./onScrollBack"
+                       Template="#Crow.Templates.ArrowButTemplate.crow">
+                       <Image Margin="1" Path="#Crow.Images.Icons.updown.svg" SvgSub="up"/>
+               </Button>
+               <Slider Name="Slider"
+                       Orientation="{./Orientation}"
+                       Value="{²./Value}"
+                       Maximum="{./Maximum}"
+                       Height="{./HeightPolicy}" Width="{./WidthPolicy}"
+                       LargeIncrement="{./LargeIncrement}"
+                       SmallIncrement="{./SmallIncrement}"
+                       Background="hgradient|0:DimGray|0.1:Gray|0.95:Gray|1:White"/>
+               <Button MouseRepeat="true" Width="12" Height="12" MouseClick="./onScrollForth"
+                       Template="#Crow.Templates.ArrowButTemplate.crow">
+                       <Image Margin="1" Path="#Crow.Images.Icons.updown.svg" SvgSub="down"/>
+               </Button>
+       </GenericStack>
+</Border>
\ No newline at end of file
diff --git a/Crow.ControlsLib/Templates/ScrollingListBox.goml b/Crow.ControlsLib/Templates/ScrollingListBox.goml
new file mode 100644 (file)
index 0000000..f294aea
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Background="{./Background}">
+       <HorizontalStack Margin="1">
+               <Scroller Name="scroller1" 
+                               Margin="2" VerticalScrolling="true" ScrollY="{../scrollbar1.Value}">
+                       <VerticalStack Height="Fit" MinimumSize="10,10"
+                               Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+               </Scroller>
+               <ScrollBar Name="scrollbar1" Value="{²../scroller1.ScrollY}" 
+                       Maximum="{../scroller1.MaximumScroll}" Orientation="Vertical" 
+                       Width="14" />
+       </HorizontalStack>
+</Border>
diff --git a/Crow.ControlsLib/Templates/Slider.template b/Crow.ControlsLib/Templates/Slider.template
new file mode 100755 (executable)
index 0000000..9c7bb70
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0"?>
diff --git a/Crow.ControlsLib/Templates/Spinner (copier).goml b/Crow.ControlsLib/Templates/Spinner (copier).goml
new file mode 100755 (executable)
index 0000000..fcb849c
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Border CornerRadius="5" Margin="1" BorderWidth="1" Fit="True" Background="SteelBlue">
+       <HorizontalStack Name="hstack" Margin="0" Spacing="5">
+               <Label Name="labCpt" Text="55"/>
+               <VerticalStack Spacing="1" Name="vstack">
+                       <Button Width="10" Height="8" MouseClick="onUp">
+                               <Image Margin="1" Path="#go.Images.Icons.updown.svg" SvgSub="up"/>
+                       </Button>
+                       <Button Width="10" Height="8"  MouseClick="onDown">
+                               <Image Margin="1" Path="#go.Images.Icons.updown.svg" SvgSub="down"/>
+                       </Button>
+               </VerticalStack>
+       </HorizontalStack>
+</Border>
\ No newline at end of file
diff --git a/Crow.ControlsLib/Templates/Spinner.template b/Crow.ControlsLib/Templates/Spinner.template
new file mode 100755 (executable)
index 0000000..4d3569b
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<HorizontalStack MinimumSize="40,10" Name="hstack" Margin="0" Spacing="0">
+       <Border BorderWidth="1" Width="80%"  Background="White" 
+               Foreground="{./Foreground}" Margin="0">
+               <TextBox Foreground="{./Foreground}" Font="{./Font}" Width="Stretched"
+                       Text="{²./Value}" TextAlignment="Right" Margin="0"/>
+       </Border>
+       <VerticalStack MinimumSize="8,10" Width="20%" Height="Stretched" Spacing="0" Margin="0" Background="Red">
+               <Button MouseRepeat="true" Width="Stretched" Height="50%" Margin="0" MouseClick="./onUp"
+                       Template="#Crow.Templates.ArrowButTemplate.crow">
+                       <Image Path="#Crow.Images.Icons.updown.svg" SvgSub="up" Margin="0"/>
+               </Button>                               
+               <Button MouseRepeat="true" Width="Stretched" Height="50%" Margin="0" MouseClick="./onDown" 
+                       Template="#Crow.Templates.ArrowButTemplate.crow">
+                       <Image Path="#Crow.Images.Icons.updown.svg" SvgSub="down" Margin="0"/>
+               </Button>
+       </VerticalStack>
+</HorizontalStack>
diff --git a/Crow.ControlsLib/Templates/TabItem.template b/Crow.ControlsLib/Templates/TabItem.template
new file mode 100644 (file)
index 0000000..f82b79c
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<GenericStack Orientation="Vertical" Spacing="0"
+               Background="Onyx"
+               MouseEnter="{caption.Foreground=White}"
+               MouseLeave="{caption.Foreground=Gray}">
+       <HorizontalStack Margin="2" Left="{./TabOffset}"
+               Name="TabTitle"
+               HorizontalAlignment="Left"
+               Height="{./TabThickness}"
+               Width="Fit">
+               <Label Name="caption" Text="{./Caption}" Foreground="Gray"/>
+               <Border CornerRadius="5" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Images.Icons.exit2.svg"
+                                MouseClick="./butCloseTabClick"/>
+               </Border>
+       </HorizontalStack>
+       <Container Name="Content"/>
+</GenericStack>
+
diff --git a/Crow.ControlsLib/Templates/ToolWindow.template b/Crow.ControlsLib/Templates/ToolWindow.template
new file mode 100755 (executable)
index 0000000..f021f6e
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="White" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+<!--           <Border Name="TitleBar" BorderWidth="1" Foreground="White" Width="{./WidthPolicy}" Height="Fit"
+                               Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9">-->
+                       <HorizontalStack Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9"
+                                       Name="hs" Margin="2" Spacing="0" Height="Fit">
+                               <GraphicObject Width="5"/>
+                               <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                               <Label Width="Stretched" Foreground="White" Margin="1" TextAlignment="Center" Text="{./Caption}" />
+                               <Border CornerRadius="6" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Images.Icons.exit2.svg"
+                                                MouseClick="./butQuitPress"/>
+                               </Border>
+                               <GraphicObject Width="5"/>
+                       </HorizontalStack>
+<!--           </Border>-->
+               <Container Name="Content" MinimumSize="50,50" Background="0.5,0.5,0.5,0.5"/>
+       </VerticalStack>
+</Border>
diff --git a/Crow.ControlsLib/Templates/TreeView.template b/Crow.ControlsLib/Templates/TreeView.template
new file mode 100644 (file)
index 0000000..c29e34c
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<HorizontalStack>
+       <Scroller  Name="scroller1" Margin="1" VerticalScrolling="true"
+               Background="{./Background}"
+               ScrollY="{../scrollbar1.Value}">
+               <VerticalStack
+                       Height="Fit" Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+       </Scroller>
+       <ScrollBar
+               Name="scrollbar1"
+               Value="{../scroller1.ScrollY}"
+               Maximum="{../scroller1.MaximumScroll}"
+               Width="14" Orientation="Vertical"/>
+</HorizontalStack>
diff --git a/Crow.ControlsLib/Templates/Window.template b/Crow.ControlsLib/Templates/Window.template
new file mode 100755 (executable)
index 0000000..20b2314
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="White" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+<!--           <Border Name="TitleBar" BorderWidth="1" Foreground="White" Width="{./WidthPolicy}" Height="Fit"
+                               Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9">-->
+                       <HorizontalStack Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9"
+                                       Name="hs" Margin="2" Spacing="0" Height="Fit">
+                               <GraphicObject Width="5"/>
+                               <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                               <Label Width="Stretched" Foreground="White" Margin="2" TextAlignment="Center" Text="{./Caption}" />
+                               <Border Visible="{./ShowMinimize}" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Images.Icons.minimize.svg"
+                                                MouseClick="./onMinimized"/>
+                               </Border>
+                               <Border Visible="{./ShowNormal}" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Images.Icons.normalize.svg"
+                                                MouseClick="./onUnmaximized"/>
+                               </Border>
+                               <Border Visible="{./ShowMaximize}" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Images.Icons.maximize.svg"
+                                                MouseClick="./onMaximized"/>
+                               </Border>
+                               <Border BorderWidth="1" Foreground="Transparent"  Height="14" Width="14"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Images.Icons.exit2.svg"
+                                                MouseClick="./butQuitPress"/>
+                               </Border>
+                               <GraphicObject Width="5"/>
+                       </HorizontalStack>
+<!--           </Border>-->
+               <Container Name="Content" MinimumSize="0,0" Background="0.5,0.5,0.5,0.5"/>
+       </VerticalStack>
+</Border>
diff --git a/Crow.ControlsLib/Templates/imgItemTemplate.goml b/Crow.ControlsLib/Templates/imgItemTemplate.goml
new file mode 100755 (executable)
index 0000000..c08f390
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+       <VerticalStack Width="0" Height="-1" Focusable="true"                   
+                       MouseEnter="{Background=BlueCrayola}"
+                       MouseLeave="{Background=Transparent}">
+               <Image Width="-1" Height="-1" Path="{FullName}" MaximumSize="80,80"/>
+               <Label Text="{Name}" Width="-1" Height="-1" Margin="0" MaximumSize="100,0"/>
+       </VerticalStack>
+
diff --git a/Crow.ControlsLib/Templates/tmpDirItem.goml b/Crow.ControlsLib/Templates/tmpDirItem.goml
new file mode 100755 (executable)
index 0000000..01aef1e
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+       <HorizontalStack Width="-1" Height="-1" Focusable="true"
+                       HorizontalAlignment="Left"
+                       MouseEnter="{Background=BlueCrayola}"
+                       MouseLeave="{Background=Transparent}">
+               <Image Width="16" Height="16" Path="#Tests.image.folder1.svg" SvgSub="{Attributes}"/>
+               <Label Text="{Name}" Width="-1" Height="-1" Margin="0"/>
+<!--           <Label Text="{Attributes}" Width="-1" Height="-1" Margin="0"/>
+               <Label Text="{Extension}" Width="-1" Height="-1" Margin="0"/>-->
+       </HorizontalStack>
+
diff --git a/Crow.ControlsLib/Templates/treeList.crow b/Crow.ControlsLib/Templates/treeList.crow
new file mode 100755 (executable)
index 0000000..d47621a
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<VerticalStack
+       Height="Fit" Name="ItemsContainer"/>
diff --git a/Crow.sln b/Crow.sln
new file mode 100644 (file)
index 0000000..cde439d
--- /dev/null
+++ b/Crow.sln
@@ -0,0 +1,81 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Crow", "Crow\Crow.csproj", "{C2980F9B-4798-4C05-99E2-E174810F7C7B}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{B2C7855A-2878-47FD-AD32-9A83DB4AB8C6}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HelloWorld", "Samples\HelloWorld\HelloWorld.csproj", "{F535A8AB-CD93-49AB-B1B0-FFF9AE51ED6A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShowCase", "Samples\ShowCase\ShowCase.csproj", "{56329D48-D382-4850-93DE-59C453894E8A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Samples\Tests\Tests.csproj", "{5B7CA5BD-AEE8-40EE-85B0-0CAADD19B43A}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Any CPU = Debug|Any CPU
+               Release|Any CPU = Release|Any CPU
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {C2980F9B-4798-4C05-99E2-E174810F7C7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {C2980F9B-4798-4C05-99E2-E174810F7C7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {C2980F9B-4798-4C05-99E2-E174810F7C7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {C2980F9B-4798-4C05-99E2-E174810F7C7B}.Release|Any CPU.Build.0 = Release|Any CPU
+               {F535A8AB-CD93-49AB-B1B0-FFF9AE51ED6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {F535A8AB-CD93-49AB-B1B0-FFF9AE51ED6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {F535A8AB-CD93-49AB-B1B0-FFF9AE51ED6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {F535A8AB-CD93-49AB-B1B0-FFF9AE51ED6A}.Release|Any CPU.Build.0 = Release|Any CPU
+               {56329D48-D382-4850-93DE-59C453894E8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {56329D48-D382-4850-93DE-59C453894E8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {56329D48-D382-4850-93DE-59C453894E8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {56329D48-D382-4850-93DE-59C453894E8A}.Release|Any CPU.Build.0 = Release|Any CPU
+               {5B7CA5BD-AEE8-40EE-85B0-0CAADD19B43A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {5B7CA5BD-AEE8-40EE-85B0-0CAADD19B43A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {5B7CA5BD-AEE8-40EE-85B0-0CAADD19B43A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {5B7CA5BD-AEE8-40EE-85B0-0CAADD19B43A}.Release|Any CPU.Build.0 = Release|Any CPU
+       EndGlobalSection
+       GlobalSection(MonoDevelopProperties) = preSolution
+               Policies = $0
+               $0.StandardHeader = $1
+               $1.Text = @\n${FileName}\n \nAuthor:\n      ${AuthorName} <${AuthorEmail}>\n\nCopyright (c) 2013-2017 Jean-Philippe Bruyère\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the "Software"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.
+               $0.DotNetNamingPolicy = $2
+               $0.TextStylePolicy = $3
+               $3.EolMarker = Unix
+               $3.scope = text/x-csharp
+               $0.CSharpFormattingPolicy = $4
+               $4.AfterDelegateDeclarationParameterComma = True
+               $4.scope = text/x-csharp
+               $4.IndentSwitchSection = False
+               $4.NewLinesForBracesInProperties = False
+               $4.NewLinesForBracesInAccessors = False
+               $4.NewLinesForBracesInAnonymousMethods = False
+               $4.NewLinesForBracesInControlBlocks = False
+               $4.NewLinesForBracesInAnonymousTypes = False
+               $4.NewLinesForBracesInObjectCollectionArrayInitializers = False
+               $4.NewLinesForBracesInLambdaExpressionBody = False
+               $4.NewLineForElse = False
+               $4.NewLineForCatch = False
+               $4.NewLineForFinally = False
+               $4.NewLineForMembersInObjectInit = False
+               $4.NewLineForMembersInAnonymousTypes = False
+               $4.NewLineForClausesInQuery = False
+               $4.SpacingAfterMethodDeclarationName = True
+               $4.SpaceAfterMethodCallName = True
+               $4.SpaceBeforeOpenSquareBracket = True
+               $0.VersionControlPolicy = $5
+               $5.CommitMessageStyle = $6
+               $6.Indent = @\t
+               $6.FileSeparator = ", "
+               $6.LastFilePostfix = "@:\n  "
+               $6.LineAlign = 0
+               $6.Wrap = False
+               $5.inheritsSet = Mono
+               description = @C.R.O.W. c# Rapid Open Widgets\n\nCrow is a pure c# widget toolkit with XML definition of interface, bindings, styling...\n
+               version = 0.8.0
+       EndGlobalSection
+       GlobalSection(NestedProjects) = preSolution
+               {F535A8AB-CD93-49AB-B1B0-FFF9AE51ED6A} = {B2C7855A-2878-47FD-AD32-9A83DB4AB8C6}
+               {56329D48-D382-4850-93DE-59C453894E8A} = {B2C7855A-2878-47FD-AD32-9A83DB4AB8C6}
+               {5B7CA5BD-AEE8-40EE-85B0-0CAADD19B43A} = {B2C7855A-2878-47FD-AD32-9A83DB4AB8C6}
+       EndGlobalSection
+EndGlobal
diff --git a/Crow/Crow.csproj b/Crow/Crow.csproj
new file mode 100644 (file)
index 0000000..9c23b53
--- /dev/null
@@ -0,0 +1,70 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <Import Project="$(SolutionDir)netfx.props" />
+  <PropertyGroup>
+<!--    <TargetFrameworks>net471;netstandard2.0</TargetFrameworks>-->
+    <TargetFrameworks>net471</TargetFrameworks>
+    <AssemblyName>Crow</AssemblyName>
+    <Copyright></Copyright>
+    <AssemblyVersion>0.9.0</AssemblyVersion>    
+    <Description>C.R.O.W. is a widget toolkit and rendering engine entirely developed in C# with templates, styles, compositing, and bindings.</Description>        
+                    
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>        
+    <EnableDefaultItems>false</EnableDefaultItems>
+    <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
+        
+    <Authors>Jean-Philippe Bruyère</Authors>
+    <Title>C# Rapid Open Widget Toolkit</Title>        
+    <PackageId>Crow.VK</PackageId>
+    <PackageTags>Crow Vulkan Widget Interface GUI</PackageTags>
+    <PackageVersion>$(AssemblyVersion)-beta</PackageVersion>
+    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
+    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
+    <PackageProjectUrl>https://github.com/jpbruyere/Crow/wiki</PackageProjectUrl>        
+    <PackageLicense>https://opensource.org/licenses/MIT</PackageLicense>
+    <PackageIconUrl>https://jpbruyere.github.io/Crow/images/crow.png</PackageIconUrl>
+    <PackageCopyright>Copyright 2013-2019</PackageCopyright>
+    <PackageReleaseNotes>Turn on vulkan layer through vkvg</PackageReleaseNotes>    
+    <RepositoryUrl>https://github.com/jpbruyere/Crow</RepositoryUrl>
+        
+    <OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>        
+    <DefineConstants>DESIGN_MODE</DefineConstants>
+    <ReleaseVersion>0.8.0</ReleaseVersion>
+  </PropertyGroup>
+   
+  
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <DefineConstants>TRACE;DESIGN_MODE;DEBUG;NETFRAMEWORK;NET471</DefineConstants>
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+  </PropertyGroup>
+  
+  <ItemGroup Condition="$(TargetFramework.StartsWith('net4'))">
+    <Reference Include="System" />
+    <Reference Include="mscorlib" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="Microsoft.CSharp" />        
+  </ItemGroup>
+    
+  <ItemGroup Condition="$(TargetFramework.StartsWith('netstandard'))">
+    <PackageReference Include="System.Reflection.Emit.ILGeneration" Version="4.3.0" />
+    <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
+  </ItemGroup>        
+    
+  <ItemGroup>
+    <Compile Include="src\**\*.cs" />
+        
+    <EmbeddedResource Include="Templates\*.*">
+      <LogicalName>Crow.%(Filename).template</LogicalName>
+    </EmbeddedResource>
+    
+    <EmbeddedResource Include="Default.style" />
+    <EmbeddedResource Include="Icons\*.*">
+        <LogicalName>Crow.Icons.%(Filename)%(Extension)</LogicalName>    
+    </EmbeddedResource>
+  </ItemGroup>  
+    
+  <ItemGroup>
+    <PackageReference Include="Vulkan" Version="0.1.2.8-beta" />    
+  </ItemGroup>
+</Project>
diff --git a/Crow/Crow.dll.config b/Crow/Crow.dll.config
new file mode 100644 (file)
index 0000000..4300476
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+  <dllmap os="!windows,osx" dll="libgio-2.0-0.dll" target="libgio-2.0.so.0"/>
+  <dllmap os="!windows,osx" dll="libglib-2.0-0.dll" target="libglib-2.0.so.0"/>
+  <dllmap os="!windows,osx" dll="libgobject-2.0-0.dll" target="libgobject-2.0.so.0"/>
+  <dllmap os="!windows,osx" dll="libgdk-3-0.dll" target="libgdk-3.so.0"/>
+  <dllmap os="!windows,osx" dll="libgdk_pixbuf-2.0-0.dll" target="libgdk_pixbuf-2.0.so.0"/>
+  <dllmap os="!windows,osx" dll="rsvg-2" target="librsvg-2.so.2"/>
+  <dllmap os="!windows,osx" dll="libinput" target="libinput.so.10"/>
+
+  
+  <dllmap os="windows" dll="rsvg-2" target="librsvg-2-2.dll"/>
+  <dllmap os="windows" dll="cairo" target="libcairo-2.dll"/>
+  
+  <dllmap os="osx" dll="libgio-2.0-0.dll" target="libgio-2.0.0.dylib"/>
+  <dllmap os="osx" dll="libgio-2.0-0.dll" target="libgio-2.0.0.dylib"/>
+  <dllmap os="osx" dll="libglib-2.0-0.dll" target="libglib-2.0.0.dylib"/>
+  <dllmap os="osx" dll="libgobject-2.0-0.dll" target="libgobject-2.0.0.dylib"/>
+  <dllmap os="osx" dll="libgdk-3.0.dll" target="libgdk-quartz-3.0.0.dylib"/>
+  <dllmap os="osx" dll="libgdk_pixbuf-2.0-0.dll" target="libgdk_pixbuf-2.0.0.dylib"/>
+</configuration>
diff --git a/Crow/Default.style b/Crow/Default.style
new file mode 100644 (file)
index 0000000..309c99a
--- /dev/null
@@ -0,0 +1,232 @@
+Button, CheckBox, RadioButton, ComboBox, Expandable,
+MessageBox, Popper, Slider, Spinner, TextBox {
+       Focusable = "true";
+       Height = "Fit";
+}
+Border {
+       Foreground = "Grey";
+}
+CheckBox { Caption = "CheckBox"; }
+RadioButton { Caption = "RadioButton"; }
+Expandable { Caption = "Expandable"; }
+Popper { Caption = "Popper";}
+GroupBox { Caption = "Group Box"; }
+
+ControlBorder {
+       BorderWidth     = "1";
+       Foreground  = "DimGrey";
+       Background      = "Transparent";
+}
+ControlCaption {
+       Foreground  = "Grey";
+       MouseEnter      = "{Foreground=White}";
+       MouseLeave      = "{Foreground=Grey}";
+}
+Icon {
+       Margin = "1";
+       Width = "12";
+       Height = "12";
+}
+
+Wrapper {
+       Orientation = "Vertical";
+}
+Button {
+       Caption = "Button";
+       Width = "Fit";
+}
+Label {
+       Height = "Fit";
+       Width = "Fit";
+       Margin = "1";
+    CacheEnabled = "false";
+}
+Menu {
+       Margin = "1";
+       Background = "vgradient|0:DimGrey|1:Black";
+       //Background = "Transparent";
+       Height = "Fit";
+       Width = "Stretched";
+       VerticalAlignment = "Top";
+       SelectionBackground = "Transparent";
+}
+MenuItem {
+       Caption = "MenuItem";
+       Width = "Stretched";
+       Height = "Fit";
+       //Background = "vgradient|0:DimGrey|1:Black";
+       //Background = "Transparent";
+       Foreground = "LightGrey";
+       MouseEnter = "{Background=SteelBlue;}";
+       MouseLeave = "{Background=Transparent;}";
+       //MouseEnter = "{Background = vgradient|0:SteelBlue|1:Jet;Foreground=White;}";
+       //MouseLeave = "{Foreground=LightGrey;Background=Transparent;}";
+       SelectionBackground = "Transparent";
+}
+MessageBox {
+       Background = "0.1,0.1,0.2,0.7";
+       Width = "Fit";
+       Caption="MessageBox";
+       Font = "serif, 12";
+       MinimumSize = "200,120";
+       AlwaysOnTop = "true";
+}
+Slider {
+       Background = "vgradient|0:Black|0.1:Grey|0.9:Grey|1:LightGrey";
+       Foreground = "Grey";
+       Height = "8";
+       Value="5";
+}
+Splitter {
+       Focusable = "true";
+       Margin = "1";
+       Background = "Grey";
+}
+Spinner {
+       Foreground = "DimGrey";
+}
+TabView {
+       CacheEnabled = "false";
+       AllowDrop = "true";
+}
+TabItem {
+       Caption = "TabItem";
+       Focusable = "true";
+       CacheEnabled = "true";
+       //MouseEnter = "{Background = Cobalt;Foreground=White;}";
+       //MouseLeave = "{Foreground=LightGrey;Background=Jet;}";
+       AllowDrag = "true";
+}
+TextBox {
+       Background = "White";
+       Foreground = "Black";
+       Selectable = "True";
+       Text = "TextBox";
+       Margin = "1";
+}
+Window {
+       Caption = "Window";
+       Focusable = "true";
+       MinimumSize="5,5";
+       Width = "150";
+       Height = "150";
+}
+ToolWindow {
+       Caption = "Window";
+       Template = "#Crow.ToolWindow.template";
+       Focusable = "true";
+    Movable = "true";
+       MinimumSize="50,50";
+       Width = "150";
+       Height = "150";
+}
+Docker {
+       AllowDrop = "false";
+       Margin="0";
+       Focusable="true";
+}
+DockStack {
+       Margin="1";
+       AllowDrop = "true";
+       Focusable="true";
+       //DragEnter="{Background=Blue}";
+       //DragLeave="{Background=Transparent}";
+       //EndDrag="{Background=Jet}";
+}
+DockWindow {
+       //Background = "Onyx";
+       Focusable = "true";
+       AllowDrag = "true";
+       AlwaysOnTop = "true";
+       Margin="0";
+       Width="200";
+       Height="200";
+       //MinimumSize="50,50";
+}
+FileDialog {
+       Template = "#Crow.FileDialog.template";
+       AlwaysOnTop = "true";
+       Focusable = "true";
+       MinimumSize="50,50";
+       Width = "500";
+       Height = "300";
+}
+ProgressBar {
+       Foreground = "vgradient|0:DarkBlue|0.5:SkyBlue|1:DarkBlue";
+}
+Scroller {
+       CacheEnabled = "false";
+}
+Control {
+       Margin="0";
+       Spacing="3";
+}
+SaturationValueSelector {
+       Foreground="Red";
+}
+HueSelector {
+       ClipToClientRect="False";
+}
+ColorSpinner {
+       Minimum = "0";
+       Maximum = "255";
+       SmallIncrement = "1";
+    Width="50";
+}
+HSVSpinner {
+       Minimum = "0";
+       Maximum = "1";
+       SmallIncrement = "0.01";
+}
+TxtInFileDialog {
+       Margine = "1";
+       Font = "droid, 12";
+}
+CheckBoxAlt {
+       Template= "#Crow.CheckBox2.template";
+       Background = "Transparent";
+       Checked="{Background=Grey;Foreground=LightGrey;}";
+       Unchecked = "{Background=Transparent;Foreground=DimGrey;}";
+}
+
+ArrowBut {
+       MouseRepeat="true";     
+       Focusable="true";
+       Foreground="Onyx";
+       Background="hgradient|0:Grey|1:Jet";
+       MouseDown="{Background=hgradient|0:White|0.4:CornflowerBlue|1:Jet}";
+       MouseUp="{Background=hgradient|0:Grey|1:DimGrey}";
+       MouseEnter="{Foreground=Black}";
+       MouseLeave="{Foreground=Onyx}";
+}
+HArrowBut {
+       MouseRepeat="true";
+    Focusable="true";
+       Foreground="Onyx";
+       Background="vgradient|0:Grey|1:DimGrey";
+       MouseDown="{Background=vgradient|0:White|0.4:DarkBlue|1:Jet}";
+       MouseUp="{Background=vgradient|0:Grey|1:DimGrey}";
+       MouseEnter="{Foreground=Black}";
+       MouseLeave="{Foreground=DimGrey}";
+}
+ScrollBar {
+    Maximum = "0";
+    Value = "0";
+    Background = "Silver";
+    Foreground = "DimGrey";
+    Width = "12";
+    CornerRadius = "0";
+    Margin="0";
+}
+HScrollBar {
+    Template = "#Crow.HScrollBar.template";
+    Maximum = "0";
+    Value = "0";
+    Height = "12";
+    Width = "Stretched";
+}
+EnumSelector {
+    Orientation = "Vertical";
+    Height = "Fit";
+    Spacing = "0";
+}
\ No newline at end of file
diff --git a/Crow/Icons/IconAlerte.svg b/Crow/Icons/IconAlerte.svg
new file mode 100755 (executable)
index 0000000..286dbf3
--- /dev/null
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.0"
+   width="64"
+   height="64"
+   id="svg2"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="IconAlerte.svg">
+  <metadata
+     id="metadata49">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1280"
+     inkscape:window-height="984"
+     id="namedview47"
+     showgrid="false"
+     fit-margin-top="1"
+     fit-margin-left="1"
+     fit-margin-right="1"
+     fit-margin-bottom="1"
+     inkscape:zoom="4.2211598"
+     inkscape:cx="60.205288"
+     inkscape:cy="44.735206"
+     inkscape:window-x="0"
+     inkscape:window-y="16"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="defs4">
+    <linearGradient
+       id="Grad1"
+       x1="41.194874"
+       y1="616.47717"
+       x2="118.93135"
+       y2="527.55511"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.48821801,0,0,-0.48010384,3.766054,311.02113)">
+      <stop
+         offset="0"
+         stop-color="#bb0000"
+         id="stop7" />
+      <stop
+         offset="1"
+         stop-color="#5f0000"
+         id="stop9" />
+    </linearGradient>
+    <linearGradient
+       id="Grad2"
+       x1="530.80951"
+       y1="486.63101"
+       x2="174.80548"
+       y2="211.22995"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1028564,0,0,0.10681322,1.0000004,5.1888378)">
+      <stop
+         offset="0"
+         stop-color="#9a0000"
+         id="stop12" />
+      <stop
+         offset="1"
+         stop-color="#f22803"
+         id="stop14" />
+    </linearGradient>
+    <linearGradient
+       id="Grad3"
+       x1="187.87357"
+       y1="224.59892"
+       x2="581.83746"
+       y2="483.10001"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1028564,0,0,0.10681322,1.0000004,5.1888372)">
+      <stop
+         offset="0"
+         stop-color="#ec6c60"
+         id="stop17" />
+      <stop
+         offset="1"
+         stop-color="#d11412"
+         id="stop19" />
+    </linearGradient>
+    <linearGradient
+       id="Grad4"
+       x1="250.39845"
+       y1="101.53633"
+       x2="412.0943"
+       y2="264.54187"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.1028564,0,0,0.10681322,1.0000004,5.1888378)">
+      <stop
+         offset="0"
+         stop-color="#ffd9d9"
+         id="stop22" />
+      <stop
+         offset="1"
+         stop-color="#ff2727"
+         id="stop24" />
+    </linearGradient>
+    <radialGradient
+       id="Grad5"
+       cx="295.47125"
+       cy="186.09634"
+       r="179.55"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,0.17037225,-0.09390987,-2.4099214e-6,49.328051,-23.159866)">
+      <stop
+         offset="0"
+         stop-color="#ffffff"
+         id="stop27" />
+      <stop
+         offset="0.5"
+         stop-color="#ffffff"
+         id="stop29" />
+      <stop
+         offset="1"
+         stop-color="#d5d5d5"
+         id="stop31" />
+    </radialGradient>
+  </defs>
+  <path
+     d="m 30.5028,7.5139081 c 0,0 -27.8740714,47.5318579 -27.8740714,47.5318579 -0.5348541,0.907918 -0.5348541,2.029451 0,2.937368 0.5245675,0.897228 1.5119883,1.463345 2.5816945,1.463345 l 55.7481489,0 c 1.059418,0 2.046843,-0.566117 2.58169,-1.463345 0.524565,-0.907917 0.524565,-2.02945 0,-2.937368 L 35.666191,7.5139081 c -0.534848,-0.9079111 -1.522275,-1.4740216 -2.5817,-1.4740216 -1.059414,0 -2.04684,0.5661105 -2.581691,1.4740216 z"
+     style="fill-opacity:0.17857104"
+     id="path33"
+     inkscape:connector-curvature="0" />
+  <path
+     d="m 29.275219,6.6628606 c 0,0 -27.8740792,47.5318564 -27.8740792,47.5318564 -0.53485309,0.907918 -0.53485309,2.029463 0,2.937369 0.5245677,0.897237 1.5119881,1.463341 2.5816944,1.463341 l 55.7481458,0 c 1.059424,0 2.046838,-0.566104 2.581701,-1.463341 0.52456,-0.907906 0.52456,-2.029451 0,-2.937369 L 34.438597,6.6628606 C 33.903747,5.7549484 32.916334,5.188839 31.856907,5.188839 c -1.059426,0 -2.046838,0.5661094 -2.581688,1.4740216 z"
+     style="fill:url(#Grad1)"
+     id="path35"
+     inkscape:connector-curvature="0" />
+  <path
+     d="m 31.856907,7.6348601 c -0.174854,0 -0.339422,0.096135 -0.431993,0.2456701 L 17.487873,31.646467 3.550838,55.41239 c -0.092571,0.14954 -0.092571,0.341802 0,0.491339 0.09257,0.149539 0.2571403,0.245671 0.4319962,0.245671 l 55.7481458,0 c 0.174855,0 0.339424,-0.09613 0.432007,-0.245671 0.09256,-0.149537 0.09256,-0.341799 0,-0.491339 L 32.288901,7.8805302 C 32.196331,7.7309918 32.031763,7.6348601 31.856907,7.6348601 Z"
+     style="fill:url(#Grad2)"
+     id="path37"
+     inkscape:connector-curvature="0" />
+  <path
+     d="m 31.853051,7.6348601 c -0.174856,0 -0.339436,0.096135 -0.432004,0.2456701 L 17.484016,31.646467 3.5469789,55.41239 c -0.092572,0.14954 -0.092572,0.341802 0,0.491339 0.09257,0.149539 0.2571404,0.245671 0.4319963,0.245671 l 55.7481468,0 c 0.174855,0 0.339424,-0.09613 0.431994,-0.245671 0.09257,-0.149537 0.09257,-0.341799 0,-0.491339 L 32.285045,7.8805302 C 32.192475,7.7309918 32.027904,7.6348601 31.853051,7.6348601 Z"
+     style="fill:none;stroke:url(#Grad3);stroke-width:1.2577858;stroke-linejoin:round"
+     id="path39"
+     inkscape:connector-curvature="0" />
+  <path
+     d="m 31.8643,8.4908547 c -0.165609,0.00854 -0.319978,0.1044731 -0.408207,0.2470058 L 17.519052,32.503792 15.577638,35.815003 c 4.728601,2.947692 10.261233,4.646368 16.174165,4.646368 5.996896,0 11.604186,-1.744327 16.376659,-4.769869 L 32.320723,8.7378605 c -0.09257,-0.1495396 -0.255854,-0.2470058 -0.430709,-0.2470058 -0.0082,0 -0.01758,-4.087e-4 -0.02572,0 z"
+     style="fill:url(#Grad4);stroke-width:10;stroke-linejoin:round"
+     id="path41"
+     inkscape:connector-curvature="0" />
+  <path
+     d="m 30.437499,20.313589 -16.837595,28.70071 c -0.287995,0.502028 -0.287995,1.121539 0,1.612881 0.288007,0.502017 0.833143,0.811785 1.419421,0.811785 l 33.664901,0 c 0.58628,0 1.131427,-0.309768 1.419424,-0.811785 0.287994,-0.502022 0.287994,-1.110853 0,-1.612881 L 33.276338,20.313589 c -0.287995,-0.502021 -0.833141,-0.811777 -1.419419,-0.811777 -0.586279,0 -1.131423,0.309756 -1.41942,0.811777 z"
+     style="fill:url(#Grad5)"
+     id="path43"
+     inkscape:connector-curvature="0" />
+  <path
+     d="m 30.969176,50.420598 c -0.964669,-0.479803 -1.699326,-1.633479 -1.699326,-2.668545 0,-1.92727 1.939303,-3.37905 3.774142,-2.825358 1.237815,0.373544 2.079121,1.533547 2.068815,2.852514 -0.0088,1.120421 -0.475773,1.945794 -1.428956,2.525663 -0.729622,0.44385 -1.950349,0.495876 -2.714675,0.115726 z m 0.219256,-7.610173 c -0.120588,-0.06883 -0.404599,-0.308433 -0.631097,-0.532473 -0.791399,-0.78278 -0.790414,-0.775892 -1.30629,-9.151632 -0.458585,-7.445434 -0.462378,-7.561125 -0.265603,-8.095945 0.442678,-1.203277 1.429043,-1.730174 3.071401,-1.640697 1.043956,0.05689 1.847956,0.437609 2.370558,1.122567 0.446394,0.585054 0.543443,0.915796 0.543036,1.850484 -4.75e-4,1.015697 -0.625235,13.471485 -0.714045,14.234796 -0.116279,0.999709 -0.678344,1.810994 -1.502164,2.168205 -0.470757,0.204147 -1.247544,0.22632 -1.565796,0.04469 z"
+     id="path45"
+     inkscape:connector-curvature="0" />
+</svg>
diff --git a/Crow/Icons/Icon_no.svg b/Crow/Icons/Icon_no.svg
new file mode 100644 (file)
index 0000000..c7613fb
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16">
+<path d="M1,1H15V15H1zM3.5,3.5 12.5,12.5M12.5,3.5 3.5,12.5" fill="none" stroke="#f00" stroke-width="2"/>
+</svg>
\ No newline at end of file
diff --git a/Crow/Icons/assembly.svg b/Crow/Icons/assembly.svg
new file mode 100644 (file)
index 0000000..5ac3643
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   viewBox="0 0 64 64"
+   height="64"
+   width="64"
+   id="svg2"
+   version="1.1">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <path
+     d="M 15,33.964845 A 6.2543149,5.8551034 0 0 1 8.7456846,39.819949 6.2543149,5.8551034 0 0 1 2.4913703,33.964845 6.2543149,5.8551034 0 0 1 8.7456846,28.109741 6.2543149,5.8551034 0 0 1 15,33.964845 Z M 30.205524,19.726298 h 24.484978 c 3.833495,0 6.919666,3.88699 6.919666,8.715226 v 11.046641 c 0,4.828235 -3.086171,8.715225 -6.919666,8.715225 H 30.205524 c -3.833494,0 -6.919665,-3.88699 -6.919665,-8.715225 V 28.441524 c 0,-4.828236 3.086171,-8.715226 6.919665,-8.715226 z M 15,33.964845 h 8.285859"
+     style="opacity:1;fill:#a0a8ab;fill-opacity:1;stroke:#181818;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+     id="path819" />
+</svg>
diff --git a/Crow/Icons/checkbox.svg b/Crow/Icons/checkbox.svg
new file mode 100644 (file)
index 0000000..f2d562d
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   id="svg2"
+   viewBox="0 0 64 64"
+   height="64"
+   width="64">
+  <defs
+     id="defs4" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g id="False">
+    <rect
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.38882232;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"       
+       width="50.832325"
+       height="50.832325"
+       x="7.1542463"
+       y="10.990663" />
+  </g>
+  <g id="True">
+    <rect
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3.38882232;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       width="50.832333"
+       height="50.832333"
+       x="7.1542463"
+       y="10.990663" />
+    <path
+       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.99999988;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
+       d="m 31.716712,35.071243 c 0,0 -6.596639,-15.24725 -21.446849,-19.472822 C 28.252789,42.42005 32.673128,59.741754 32.673128,59.741754 42.630927,26.54013 47.25986,13.972168 62.050847,1.147331 42.892384,10.522281 37.883684,17.76245 31.716712,35.071243 Z" />
+  </g>
+</svg>
diff --git a/Crow/Icons/compiler_error.svg b/Crow/Icons/compiler_error.svg
new file mode 100644 (file)
index 0000000..1b50568
--- /dev/null
@@ -0,0 +1,13 @@
+<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg">
+ <!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
+ <g id="False">
+  <title>Layer 1</title>
+  <rect id="svg_1" height="27" width="27" y="2.5" x="2.5" stroke-width="5" stroke="#bf0000" fill="#fff"/>
+  <text font-weight="bold" xml:space="preserve" text-anchor="start" font-family="Helvetica, Arial, sans-serif" font-size="24" id="svg_2" y="24.84615" x="7.82692" stroke-width="0" stroke="#bf0000" fill="#000000">X</text>
+ </g>
+  <g id="True">
+  <title>Layer 2</title>
+  <path id="svg_1" d="m16.28846,3.46154l13.78846,26.61539l-27.57692,0l13.78846,-26.61539z" stroke-linecap="null" stroke-linejoin="null" stroke-width="3" stroke="#d1d100" fill-opacity="null" fill="#fff"/>
+  <text font-weight="bold" xml:space="preserve" text-anchor="start" font-family="Georgia, Times, 'Times New Roman', serif" font-size="24" id="svg_3" y="27.15385" x="12.44231" stroke-width="0" stroke="#bf0000" fill="#000000">!</text>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Icons/compiler_warning.svg b/Crow/Icons/compiler_warning.svg
new file mode 100644 (file)
index 0000000..9dac377
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="378.30496" height="326.05325" id="svg2" sodipodi:version="0.32" inkscape:version="0.46" version="1.0" sodipodi:docbase="C:\Documents and Settings\KevinDuke\Desktop" sodipodi:docname="Ambox_warning_yellow.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.4225" inkscape:cx="90.333919" inkscape:cy="200" inkscape:document-units="px" inkscape:current-layer="layer1" width="400px" height="400px" showgrid="false" inkscape:window-width="1280" inkscape:window-height="750" inkscape:window-x="-8" inkscape:window-y="-8"/>
+  <defs id="defs4">
+    <linearGradient id="linearGradient3149">
+      <stop id="stop3151" style="stop-color:#f6eb71;stop-opacity:1;" offset="0"/>
+      <stop offset="0.5138889" style="stop-color:#ffeb00;stop-opacity:1;" id="stop3271"/>
+      <stop offset="1" style="stop-color:#f4c930;stop-opacity:1;" id="stop3153"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3134">
+      <stop offset="0" style="stop-color:#ffb300;stop-opacity:1;" id="stop3136"/>
+      <stop id="stop3165" style="stop-color:#ff9900;stop-opacity:1;" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3140" gradientUnits="userSpaceOnUse" inkscape:collect="always" x1="57.553783" x2="142.16243" xlink:href="#linearGradient3149" y1="-7.0170116" y2="123.27175"/>
+    <linearGradient id="linearGradient3148" gradientUnits="userSpaceOnUse" inkscape:collect="always" x1="57.553783" x2="142.16243" xlink:href="#linearGradient3149" y1="-7.0170116" y2="123.27175"/>
+    <filter inkscape:collect="always" id="filter3172">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="5.0924795" id="feGaussianBlur3174"/>
+    </filter>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient3134" id="linearGradient2184" gradientUnits="userSpaceOnUse" x1="-49.164131" y1="-82.266502" x2="227.38515" y2="216.95886" gradientTransform="matrix(1.2084425,0,0,1.2084425,89.669573,106.93911)"/>
+  </defs>
+  <metadata id="metadata7">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <dc:title>3D effect warning triangle</dc:title>
+        <dc:date>18/9/07</dc:date>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Tim O'Ryan</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/"/>
+      </cc:Work>
+      <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/">
+        <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g inkscape:label="Layer 1" id="layer1" inkscape:groupmode="layer" transform="translate(-15.90328,-38.352144)">
+    <path style="opacity:1;fill:#777777;fill-opacity:0.79729728;stroke:none;stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3172)" d="M 213.05399,47.37801 C 208.83955,47.5955 205.01929,49.92458 202.89552,53.57127 L 33.940149,345.10803 C 31.700749,348.97294 31.693669,353.73905 33.921559,357.61061 C 36.149459,361.48217 40.273789,363.87084 44.740599,363.87665 L 381.66948,364.40534 C 386.13811,364.41875 390.27406,362.04591 392.51793,358.18147 C 394.7618,354.31704 394.77229,349.54876 392.54546,345.67448 L 224.53419,53.60904 C 222.18314,49.53899 217.74782,47.13166 213.05399,47.37801 L 213.05399,47.37801 z M 213.65821,84.83972 L 360.06857,339.36792 L 66.417039,338.91476 L 213.65821,84.83972 z" id="path3152"/>
+    <path style="opacity:1;fill:url(#linearGradient2184);fill-opacity:1;stroke:#a37900;stroke-width:6.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 199.82666,41.494396 C 195.61222,41.711894 191.79197,44.040971 189.66819,47.687664 L 20.712823,339.22442 C 18.473424,343.08933 18.466339,347.85544 20.694238,351.727 C 22.922136,355.59856 27.04646,357.98723 31.513278,357.99304 L 368.44215,358.52173 C 372.91078,358.53514 377.04674,356.1623 379.2906,352.29786 C 381.53447,348.43343 381.54497,343.66515 379.31813,339.79087 L 211.30686,47.725427 C 208.95581,43.655381 204.52049,41.248051 199.82666,41.494396 L 199.82666,41.494396 z M 200.43088,78.956113 L 346.84124,333.48431 L 53.189715,333.03115 L 200.43088,78.956113 z" id="path2178"/>
+    <path sodipodi:arg2="1.5723975" style="opacity:1;fill:url(#linearGradient3140);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3148);stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path2160" sodipodi:cx="91.428574" sodipodi:cy="117.14286" sodipodi:arg1="0.52519998" sodipodi:type="star" d="M 230.71429,197.85715 L -48.114905,197.41068 L 91.686339,-43.839248 L 230.71429,197.85715 z" sodipodi:r2="80.491158" sodipodi:sides="3" inkscape:randomized="0" transform="matrix(1.2084425,0,0,1.2084425,89.669573,106.93911)" inkscape:rounded="0" sodipodi:r1="160.98232" inkscape:flatsided="true"/>
+    <path sodipodi:nodetypes="cccsccscccc" d="M 199.89464,117.765 C 197.29017,117.9016 194.92932,119.3644 193.61684,121.65473 L 89.204984,304.75655 C 87.82107,307.18391 87.81669,310.17731 89.193499,312.60887 C 90.570306,315.04044 93.119077,316.54066 95.879504,316.54431 L 304.09647,316.87636 C 306.85801,316.88477 309.41397,315.39449 310.80064,312.96739 C 312.18732,310.54032 312.1938,307.54558 310.81766,305.1123 L 206.98922,121.67846 C 205.53631,119.12222 202.79534,117.61029 199.89464,117.765 L 199.89464,117.765 z" style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" id="path19491"/>
+    <path style="font-size:333.22640991px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Angsana New" d="M 203.68708,256.44083 L 198.35371,256.44083 C 197.80195,246.98576 195.96287,235.6645 192.83645,222.47702 L 186.4916,195.60456 C 182.6908,179.49366 180.79042,167.95467 180.79043,160.9876 C 180.79042,146.92949 187.50308,139.90034 200.92845,139.90018 C 206.81347,139.90034 211.67173,141.84424 215.50321,145.73187 C 219.33458,149.61982 221.25031,154.58066 221.25036,160.61436 C 221.25031,167.0216 219.22731,178.685 215.18136,195.60456 L 208.74456,222.47702 C 206.47631,231.93222 204.79048,243.25347 203.68708,256.44083 L 203.68708,256.44083 z M 201.20431,274.07588 C 207.45715,274.07593 212.30007,276.20643 215.7331,280.46742 C 219.166,284.72848 220.88248,289.28498 220.88254,294.13692 C 220.88248,300.54403 218.79818,305.47375 214.62964,308.92611 C 210.461,312.37848 205.98588,314.10466 201.20431,314.10466 C 194.89007,314.10466 190.03183,311.98969 186.62953,307.75978 C 183.22721,303.52985 181.52605,298.9889 181.52607,294.13692 C 181.52605,288.47632 183.41112,283.71765 187.18126,279.86093 C 190.95137,276.00427 195.6257,274.07593 201.20431,274.07588 L 201.20431,274.07588 z" id="text2171"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Icons/compiler_warning_orange.svg b/Crow/Icons/compiler_warning_orange.svg
new file mode 100644 (file)
index 0000000..233437f
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="378.30496" height="326.05325" id="svg2" sodipodi:version="0.32" inkscape:version="0.46" version="1.0" sodipodi:docbase="C:\Documents and Settings\KevinDuke\Desktop" sodipodi:docname="Ambox_warning_orange.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.64877047" inkscape:cx="107.30042" inkscape:cy="95.503105" inkscape:document-units="px" inkscape:current-layer="layer1" width="400px" height="400px" showgrid="false" inkscape:window-width="1280" inkscape:window-height="750" inkscape:window-x="-8" inkscape:window-y="-8"/>
+  <defs id="defs4">
+    <linearGradient id="linearGradient3149">
+      <stop id="stop3151" style="stop-color:#f3c381;stop-opacity:1;" offset="0"/>
+      <stop offset="0.25" style="stop-color:#f4b24e;stop-opacity:1;" id="stop3172"/>
+      <stop offset="0.5" style="stop-color:#f39502;stop-opacity:1;" id="stop3171"/>
+      <stop offset="1" style="stop-color:#f67805;stop-opacity:1;" id="stop3153"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3134">
+      <stop offset="0" style="stop-color:#ffb300;stop-opacity:1;" id="stop3136"/>
+      <stop id="stop3165" style="stop-color:#ff9900;stop-opacity:1;" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3140" gradientUnits="userSpaceOnUse" inkscape:collect="always" x1="15.087464" x2="120.05667" xlink:href="#linearGradient3149" y1="9.8531685" y2="108.72849"/>
+    <linearGradient id="linearGradient3148" gradientUnits="userSpaceOnUse" inkscape:collect="always" x1="15.087464" x2="120.05667" xlink:href="#linearGradient3149" y1="9.8531685" y2="108.72849"/>
+    <filter inkscape:collect="always" id="filter3172">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="5.0924795" id="feGaussianBlur3174"/>
+    </filter>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient3134" id="linearGradient2184" gradientUnits="userSpaceOnUse" x1="-49.164131" y1="-82.266502" x2="227.38515" y2="216.95886" gradientTransform="matrix(1.2084425,0,0,1.2084425,89.669573,106.93911)"/>
+  </defs>
+  <metadata id="metadata7">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <dc:title>3D effect warning triangle</dc:title>
+        <dc:date>18/9/07</dc:date>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Tim O'Ryan</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/"/>
+      </cc:Work>
+      <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/">
+        <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g inkscape:label="Layer 1" id="layer1" inkscape:groupmode="layer" transform="translate(-15.90328,-38.352144)">
+    <path style="opacity:1;fill:#777777;fill-opacity:0.79729728;stroke:none;stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3172)" d="M 213.05399,47.37801 C 208.83955,47.5955 205.01929,49.92458 202.89552,53.57127 L 33.940149,345.10803 C 31.700749,348.97294 31.693669,353.73905 33.921559,357.61061 C 36.149459,361.48217 40.273789,363.87084 44.740599,363.87665 L 381.66948,364.40534 C 386.13811,364.41875 390.27406,362.04591 392.51793,358.18147 C 394.7618,354.31704 394.77229,349.54876 392.54546,345.67448 L 224.53419,53.60904 C 222.18314,49.53899 217.74782,47.13166 213.05399,47.37801 L 213.05399,47.37801 z M 213.65821,84.83972 L 360.06857,339.36792 L 66.417039,338.91476 L 213.65821,84.83972 z" id="path3152"/>
+    <path style="opacity:1;fill:url(#linearGradient2184);fill-opacity:1;stroke:#a37900;stroke-width:6.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 199.82666,41.494396 C 195.61222,41.711894 191.79197,44.040971 189.66819,47.687664 L 20.712823,339.22442 C 18.473424,343.08933 18.466339,347.85544 20.694238,351.727 C 22.922136,355.59856 27.04646,357.98723 31.513278,357.99304 L 368.44215,358.52173 C 372.91078,358.53514 377.04674,356.1623 379.2906,352.29786 C 381.53447,348.43343 381.54497,343.66515 379.31813,339.79087 L 211.30686,47.725427 C 208.95581,43.655381 204.52049,41.248051 199.82666,41.494396 L 199.82666,41.494396 z M 200.43088,78.956113 L 346.84124,333.48431 L 53.189715,333.03115 L 200.43088,78.956113 z" id="path2178"/>
+    <path sodipodi:arg2="1.5723975" style="opacity:1;fill:url(#linearGradient3140);fill-opacity:1.0;fill-rule:nonzero;stroke:url(#linearGradient3148);stroke-width:20.68778610000000000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path2160" sodipodi:cx="91.428574" sodipodi:cy="117.14286" sodipodi:arg1="0.52519998" sodipodi:type="star" d="M 230.71429,197.85715 L -48.114905,197.41068 L 91.686339,-43.839248 L 230.71429,197.85715 z" sodipodi:r2="80.491158" sodipodi:sides="3" inkscape:randomized="0" transform="matrix(1.2084425,0,0,1.2084425,89.669573,106.93911)" inkscape:rounded="0" sodipodi:r1="160.98232" inkscape:flatsided="true"/>
+    <path sodipodi:nodetypes="cccsccscccc" d="M 199.89464,117.765 C 197.29017,117.9016 194.92932,119.3644 193.61684,121.65473 L 89.204984,304.75655 C 87.82107,307.18391 87.81669,310.17731 89.193499,312.60887 C 90.570306,315.04044 93.119077,316.54066 95.879504,316.54431 L 304.09647,316.87636 C 306.85801,316.88477 309.41397,315.39449 310.80064,312.96739 C 312.18732,310.54032 312.1938,307.54558 310.81766,305.1123 L 206.98922,121.67846 C 205.53631,119.12222 202.79534,117.61029 199.89464,117.765 L 199.89464,117.765 z" style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" id="path19491"/>
+    <path style="font-size:333.22640991px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Angsana New" d="M 203.68708,256.44083 L 198.35371,256.44083 C 197.80195,246.98576 195.96287,235.6645 192.83645,222.47702 L 186.4916,195.60456 C 182.6908,179.49366 180.79042,167.95467 180.79043,160.9876 C 180.79042,146.92949 187.50308,139.90034 200.92845,139.90018 C 206.81347,139.90034 211.67173,141.84424 215.50321,145.73187 C 219.33458,149.61982 221.25031,154.58066 221.25036,160.61436 C 221.25031,167.0216 219.22731,178.685 215.18136,195.60456 L 208.74456,222.47702 C 206.47631,231.93222 204.79048,243.25347 203.68708,256.44083 L 203.68708,256.44083 z M 201.20431,274.07588 C 207.45715,274.07593 212.30007,276.20643 215.7331,280.46742 C 219.166,284.72848 220.88248,289.28498 220.88254,294.13692 C 220.88248,300.54403 218.79818,305.47375 214.62964,308.92611 C 210.461,312.37848 205.98588,314.10466 201.20431,314.10466 C 194.89007,314.10466 190.03183,311.98969 186.62953,307.75978 C 183.22721,303.52985 181.52605,298.9889 181.52607,294.13692 C 181.52605,288.47632 183.41112,283.71765 187.18126,279.86093 C 190.95137,276.00427 195.6257,274.07593 201.20431,274.07588 L 201.20431,274.07588 z" id="text2171"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Icons/copy-file.svg b/Crow/Icons/copy-file.svg
new file mode 100644 (file)
index 0000000..63c2dd3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M13 3h-3l-3-3h-7v13h6v3h10v-10l-3-3zM7 1l2 2h-2v-2zM1 12v-11h5v3h3v8h-8zM15 15h-8v-2h3v-9h2v3h3v8zM13 6v-2l2 2h-2z"></path>
+</svg>
diff --git a/Crow/Icons/crow.svg b/Crow/Icons/crow.svg
new file mode 100644 (file)
index 0000000..4904e68
--- /dev/null
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   version="1.1"
+   id="svg4242"
+   viewBox="0 0 256 256"
+   height="256"
+   width="256">
+  <defs
+     id="defs4244">
+    <radialGradient
+       r="110.25913"
+       fy="270.70752"
+       fx="372.23856"
+       cy="270.70752"
+       cx="372.23856"
+       gradientTransform="matrix(1.062155,-0.3274557,0.07305654,0.2041912,-10.009476,513.34516)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient4294"
+       xlink:href="#linearGradient3866" />
+    <linearGradient
+       id="linearGradient3866">
+      <stop
+         id="stop3868"
+         offset="0"
+         style="stop-color:#7f8084;stop-opacity:1;" />
+      <stop
+         id="stop3870"
+         offset="1"
+         style="stop-color:#33343c;stop-opacity:1;" />
+    </linearGradient>
+    <linearGradient
+       y2="306.08167"
+       x2="343.59439"
+       y1="279.60583"
+       x1="334.9541"
+       gradientTransform="matrix(1,0,0,1.0091769,40.07781,159.75914)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4296"
+       xlink:href="#linearGradient3876" />
+    <linearGradient
+       id="linearGradient3876">
+      <stop
+         id="stop3878"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#7f7f7f;stop-opacity:1;"
+         offset="0.64247584"
+         id="stop3884" />
+      <stop
+         id="stop3880"
+         offset="1"
+         style="stop-color:#1a1a1a;stop-opacity:1;" />
+    </linearGradient>
+  </defs>
+  <metadata
+     id="metadata4247">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     transform="translate(0,-796.36219)"
+     id="layer1">
+    <g
+       transform="matrix(1.2350742,-0.53882275,0.65916664,1.4650343,-673.53297,471.49303)"
+       id="g4184">
+      <path
+         style="opacity:1;fill:url(#radialGradient4294);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.96044916px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 487.68304,411.00893 c -2.99682,-0.23105 -5.81177,-0.55121 -9.1875,-0.59375 -8.40713,2.77744 -30.28806,5.94556 -33.03125,6.90625 -42.47708,7.28343 -94.98471,24.15339 -120.90625,39.21875 l 4.5,12 c -2.11072,-3.69563 -4.31718,-7.19861 -5.78125,-12.1875 -0.18227,2.82859 0.84496,7.82162 1.5,9.53125 0.65503,1.70962 1.61057,3.36756 3.34375,5.96875 -1.99166,-0.84449 -7.11658,-11.75343 -7.375,-12.875 -0.15386,-0.66767 1.05534,10.33056 2.84375,11.6875 -1.80696,-1.49188 -1.52305,-1.66181 -2.75,-2.84375 -1.22696,-1.18195 -2.71173,-3.93719 -3.9375,-5.0625 0.3843,2.49805 3.42098,8.39174 4.8125,9.40625 -0.86053,-0.0279 -2.97317,-2.46587 -3.46875,-3.03125 -0.99115,-1.13075 -1.48932,-3.9565 -2.03125,-4.9375 -0.50246,0.39731 -1.6681,3.34737 -2.0625,4 -0.39441,0.65262 -0.74884,1.40612 -1.03125,2.25 -0.56482,1.68775 -0.87547,3.68174 -0.96875,5.75 -0.0933,2.06825 0.0591,4.22015 0.46875,6.15625 0.20483,0.96804 0.47603,1.87987 0.8125,2.71875 0.33646,0.83887 0.71548,1.60436 1.1875,2.25 0.70264,0.75969 1.84388,1.48568 3.25,2.15625 1.40611,0.67056 3.0821,1.28578 4.84375,1.8125 1.76164,0.52671 3.60577,0.95312 5.375,1.28125 1.76922,0.32812 3.47738,0.55018 4.90625,0.625 0.24031,-0.0875 -0.45581,-0.78256 -1.3125,-2.15625 -0.42835,-0.68686 -0.90225,-1.56763 -1.3125,-2.59375 -0.41026,-1.02613 -0.77149,-2.21654 -0.96875,-3.59375 0.5081,1.36152 1.77536,3.78883 3.0625,5.34375 1.28714,1.55493 5.38999,3.14625 5.5,3.03125 -1.03917,-1.47385 -1.47448,-2.2088 -1.71875,-4.5625 -0.16233,-1.56406 -0.31418,-1.70098 -0.3125,-2.59375 0.002,-1.18053 -0.57594,-1.72994 -0.53125,-2.03125 1.77126,1.56 0.69713,6.57726 3.03125,8.65625 0.54324,0.48387 1.40275,0.27647 2.375,0.4375 0.36923,-0.0588 2.2407,0.0938 2.625,0.0312 l -4.34375,-9.75 5.75,9.5 c 2.18192,-0.25918 6.49585,-2.30584 6.53125,-2.3125 -1.93129,-2.48728 -4.12405,-4.98149 -6.53125,-7.46875 1.76984,1.76613 7.30073,6.91537 7.78125,6.96875 2.24762,0.24967 67.93089,-26.76399 85.5,-30.96875 l -4.71875,-6.3125 6.625,5.90625 c 16.63744,-3.85235 29.80389,-5.39971 51.3125,-12.78125 2.77265,-0.72543 5.88424,-2.80725 9.125,-5.3125 l -2.96875,-9.34375 4.1875,8.375 c 1.1134,-0.89476 2.14336,-1.65364 3.3125,-2.65625 l -4.28125,-6.4375 5.9375,5.03125 c 0.22145,-0.19242 0.4641,-0.39907 0.6875,-0.59375 l -3.40625,-4.4375 4.59375,3.40625 c 1.49874,-1.3084 2.9456,-2.59231 4.53125,-3.9375 l -4.84375,-1.25 7.75,-1.03125 c 2.01674,-1.64114 4.00268,-3.30676 6.15625,-4.8125 -4.34436,-4.58536 -11.02475,-7.98537 -20.34375,-10.09375 l -5.71875,4.15625 3.875,-4.59375 c -0.34329,-0.0684 -0.74363,-0.0912 -1.09375,-0.15625 l -6.34375,4.375 3.09375,-4.90625 c -0.40346,-0.0596 -0.77578,-0.13199 -1.1875,-0.1875 l -6.1875,6.1875 3.78125,-6.4375 c -0.69105,-0.0777 -1.53691,-0.0583 -2.25,-0.125 l -7.25,7.96875 5.1875,-8.125 z"
+         id="path4150" />
+      <path
+         style="fill:url(#linearGradient4296);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+         d="m 502.57781,423.08731 c -85.9867,11.86766 -158.64637,39.03586 -212.85714,75.32784 -0.54182,2.60394 0.35052,2.5753 2.37373,3.22191 50.90148,-37.35132 134.86502,-67.36701 210.48341,-78.54975 z"
+         id="path4143" />
+    </g>
+    <text
+       id="text4912"
+       y="1041.6479"
+       x="85.000008"
+       style="font-style:normal;font-weight:normal;font-size:40px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:'Arial Black';-inkscape-font-specification:'Arial Black, '"
+         y="1041.6479"
+         x="85.000008"
+         id="tspan4914">C<tspan
+   id="tspan4916"
+   style="font-size:15px">.</tspan>R<tspan
+   id="tspan4918"
+   style="font-size:15px">.</tspan>O<tspan
+   id="tspan4922"
+   style="font-size:15px">.</tspan>W<tspan
+   id="tspan4924"
+   style="font-size:15px">.</tspan></tspan></text>
+  </g>
+</svg>
diff --git a/Crow/Icons/crowproj.svg b/Crow/Icons/crowproj.svg
new file mode 100644 (file)
index 0000000..b0f6b86
--- /dev/null
@@ -0,0 +1,8 @@
+<svg width="64" height="64" xmlns="http://www.w3.org/2000/svg">
+ <!-- Created with Method Draw - http://github.com/duopixel/Method-Draw/ -->
+ <g>
+  <rect opacity="1.0" rx="5" id="svg_1" height="59" width="59" y="2.5" x="2.5" stroke-width="6" stroke="#111111" fill="#bbbbcc"/>
+  <rect opacity="1.0" rx="5" id="svg_1" height="22" width="59" y="2.5" x="2.5" stroke-width="6" stroke="#111111" fill="#4455aa"/>
+<!--  <line stroke-linecap="undefined" stroke-linejoin="undefined" id="svg_2" y2="24.5" x2="61.5" y1="24.5" x1="2.5" stroke-width="6" stroke="#bbbbbb" fill="none"/>-->
+ </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Icons/exit-symbol.svg b/Crow/Icons/exit-symbol.svg
new file mode 100644 (file)
index 0000000..3fbaa0d
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M14 6h-1.7c-0.2 0-0.4-0.1-0.6-0.2l-1.3-1.3c-0.2-0.3-0.6-0.5-1.1-0.5h-0.3c1.1 0 2-0.9 2-2s-0.9-2-2-2-2 0.9-2 2c0 0.7 0.4 1.4 1 1.7l-0.2 0.3h-2c-1.1 0-2.3 0.5-3 1.5l-0.6 0.8c-0.4 0.4-0.2 1 0.2 1.3 0.4 0.2 0.9 0.1 1.2-0.3l0.5-0.7c0.3-0.4 0.7-0.6 1.2-0.6h0.8l-0.7 1.6c-0.3 0.6-0.4 1.2-0.4 1.9v2c0 0.3-0.2 0.5-0.5 0.5h-2.5c-0.6 0-1 0.4-1 1s0.4 1 1 1h3.5c0.8 0 1.5-0.7 1.5-1.5v-2.5l3.8 4.5c0.6 0.9 1.7 1.5 2.8 1.5h0.9l-5.4-6.7c-0.3-0.4-0.2-0.8 0-1.3l0.6-1.5 0.7 0.8c0.4 0.4 1 0.7 1.6 0.7h2c0.6 0 1-0.4 1-1s-0.4-1-1-1z"></path>
+</svg>
diff --git a/Crow/Icons/exit2.svg b/Crow/Icons/exit2.svg
new file mode 100644 (file)
index 0000000..2361ba8
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64.000002"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="exit.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2.6992188"
+     inkscape:cx="-80.264621"
+     inkscape:cy="63.946457"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="1009"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <path
+     style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="m 13.884262,15.143117 c 24.231966,13.49131 34.18672,34.186719 34.18672,34.186719"
+     id="path4175"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cc" />
+  <path
+     sodipodi:nodetypes="cc"
+     inkscape:connector-curvature="0"
+     id="path4177"
+     d="M 50.43178,15.408178 C 20.436536,37.282439 16.245061,49.594898 16.245061,49.594898"
+     style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+</svg>
diff --git a/Crow/Icons/expandable.svg b/Crow/Icons/expandable.svg
new file mode 100644 (file)
index 0000000..5df4bc5
--- /dev/null
@@ -0,0 +1,11 @@
+<svg width="9" height="9" xmlns="http://www.w3.org/2000/svg">
+ <g id="False">
+  <rect height="8" width="8" y="0.5" x="0.5" stroke="#000" fill="#fff" stroke-width="1"/>
+  <line stroke-linecap="undefined" stroke-linejoin="undefined" y2="4.5" x2="7" y1="4.5" x1="2" stroke="#000" fill="none"/>
+  <line stroke-linecap="undefined" stroke-linejoin="undefined" y2="7" x2="4.5" y1="2" x1="4.5" stroke="#000" fill="none"/>
+ </g>
+ <g id="True">
+  <rect height="8" width="8" y="0.5" x="0.5" stroke="#000" fill="#fff" stroke-width="1"/>
+  <line stroke-linecap="undefined" stroke-linejoin="undefined" y2="4.5" x2="7" y1="4.5" x1="2" stroke="#000" fill="none"/>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Icons/file.svg b/Crow/Icons/file.svg
new file mode 100644 (file)
index 0000000..b156b0a
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
+<g>
+       <polygon fill="#ffffff" stroke="#000000" stroke-width="2" stroke-miterlimit="10" points="23,1 55,1 55,63 9,63 9,15      "/>
+       <polyline fill="#ffffff" stroke="#000000" stroke-width="2" stroke-miterlimit="10" points="9,15 23,15 23,1       "/>
+</g>
+</svg>
diff --git a/Crow/Icons/folder.svg b/Crow/Icons/folder.svg
new file mode 100644 (file)
index 0000000..185bdf9
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg width="64" version="1.1" xmlns="http://www.w3.org/2000/svg" height="64" viewBox="0 0 64 64" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
+ <defs id="defs5455">
+  <linearGradient id="linearGradient4172-7">
+   <stop style="stop-color:#4183d7" id="stop4174-9"/>
+   <stop offset="1" style="stop-color:#5b94df" id="stop4176-4"/>
+  </linearGradient>
+  <linearGradient inkscape:collect="always" id="linearGradient4178" xlink:href="#linearGradient4172-7" y1="541.79797" y2="499.78421" gradientUnits="userSpaceOnUse" x2="0" gradientTransform="matrix(1 0 0 0.99967455 0 0.176455)"/>
+ </defs>
+ <metadata id="metadata5458"/>
+ <g inkscape:label="Capa 1" inkscape:groupmode="layer" id="False" transform="matrix(1 0 0 1 -384.57143 -483.798)">
+  <path inkscape:connector-curvature="0" style="fill:#245da8" id="rect4180" d="m 388.57143,489.79812 0,5 0,22 c 0,0.55373 0.446,1 1,1 l 54,0 c 0.55399,0 1,-0.44627 1,-1 l 0,-21.99023 c 0,-0.003 -0.002,-0.006 -0.002,-0.01 l 0.002,0 0,-1 -28,0 -4,-4 -24,0 z"/>
+  <path inkscape:connector-curvature="0" style="fill:url(#linearGradient4178)" id="rect4113" d="m 410.57143,499.79812 -4,4 -19,0 0,1 0.002,0 c -5e-5,0.004 -0.002,0.008 -0.002,0.0117 l 0,35.98828 0,1 1,0 56,0 1,0 0,-1 0,-35.98828 0,-0.0117 0,-5 z"/>
+  <path inkscape:connector-curvature="0" style="fill:#ffffff;fill-opacity:0.235294;fill-rule:evenodd" id="path4224-1" d="m 387.57144,503.79812 0,1 19.99999,0 3,-5 -4,4 z"/>
+  <path inkscape:connector-curvature="0" style="fill-opacity:0.235294;fill-rule:evenodd" id="path4228-0" d="m 388.57143,502.79812 0,1 18,0 4,-4 -6,3 z"/>
+  <path inkscape:connector-curvature="0" style="fill-opacity:0.235294" id="path4151-2" d="m 387.57143,540.7981 0,1 1,0 56,0 1,0 0,-1 -1,0 -56,0 -1,0 z"/>
+  <path inkscape:connector-curvature="0" style="fill:#ffffff;fill-opacity:0.235294;fill-rule:evenodd" id="path4196" d="m 412.57143,489.798 3,5 2,0 27,0 0,-1 -27,0 -1,0 z"/>
+ </g>
+ <g inkscape:label="Capa 1" inkscape:groupmode="layer" id="True" transform="matrix(1 0 0 1 -384.57143 -483.798)">
+  <path inkscape:connector-curvature="0" style="fill:#245da8" id="rect4180" d="m 388.57143,489.79812 0,5 0,22 c 0,0.55373 0.446,1 1,1 l 54,0 c 0.55399,0 1,-0.44627 1,-1 l 0,-21.99023 c 0,-0.003 -0.002,-0.006 -0.002,-0.01 l 0.002,0 0,-1 -28,0 -4,-4 -24,0 z"/>
+  <path inkscape:connector-curvature="0" style="fill:url(#linearGradient4178)" id="rect4113" d="m 410.57143,507.79812 -4,4 -19,0 0,1 0.002,0 c -5e-5,0.004 -0.002,0.008 -0.002,0.0117 l 0,27.98828 0,1 1,0 56,0 1,0 0,-1 0,-27.98828 0,-0.0117 0,-5 z"/>
+  <path inkscape:connector-curvature="0" style="fill:#ffffff;fill-opacity:0.235294;fill-rule:evenodd" id="path4224-1" d="m 387.57144,503.79812 0,1 19.99999,0 3,-5 -4,4 z"/>
+  <path inkscape:connector-curvature="0" style="fill-opacity:0.235294;fill-rule:evenodd" id="path4228-0" d="m 388.57143,502.79812 0,1 18,0 4,-4 -6,3 z"/>
+  <path inkscape:connector-curvature="0" style="fill-opacity:0.235294" id="path4151-2" d="m 387.57143,540.7981 0,1 1,0 56,0 1,0 0,-1 -1,0 -56,0 -1,0 z"/>
+  <path inkscape:connector-curvature="0" style="fill:#ffffff;fill-opacity:0.235294;fill-rule:evenodd" id="path4196" d="m 412.57143,489.798 3,5 2,0 27,0 0,-1 -27,0 -1,0 z"/>
+ </g>
+</svg>
diff --git a/Crow/Icons/frame.svg b/Crow/Icons/frame.svg
new file mode 100644 (file)
index 0000000..576d418
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="67.316353mm"
+   height="27.756908mm"
+   viewBox="0 0 67.316353 27.756908"
+   version="1.1"
+   id="svg8895"
+   inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
+   sodipodi:docname="frame.svg">
+  <defs
+     id="defs8889" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#434343"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="195.58263"
+     inkscape:cy="-58.812438"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="1600"
+     inkscape:window-height="881"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <metadata
+     id="metadata8892">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Calque 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(106.44585,-169.24652)">
+    <polygon
+       transform="matrix(0.26458333,0,0,0.26458333,-314.15488,52.734079)"
+       style="fill:#f5fcff"
+       id="polygon6818"
+       points="860.815,440.362 785.042,440.362 785.042,469.369 789.327,469.369 789.327,515.071 815.242,540.986 971.44,540.986 971.44,545.27 1001.438,545.27 1001.438,540.986 1039.466,540.986 1039.466,470.564 1013.109,444.207 1012.21,445.105 1038.193,471.091 1038.193,539.714 815.77,539.714 790.598,514.544 790.598,445.919 1014.176,445.919 1014.176,444.648 860.815,444.648 " />
+  </g>
+</svg>
diff --git a/Crow/Icons/iconInfo.svg b/Crow/Icons/iconInfo.svg
new file mode 100644 (file)
index 0000000..8234550
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 62 62" width="62" height="62" version="1.0">
+       <defs>
+               <linearGradient id="fieldGradient" gradientUnits="userSpaceOnUse" x1="42.9863" y1="7.01270" x2="22.0144" y2="51.9871">
+                       <stop offset="0.0" stop-color="#BCD6FE"/>
+                       <stop offset="1.0" stop-color="#6787D3"/>
+               </linearGradient>
+               <linearGradient id="edgeGradient" gradientUnits="userSpaceOnUse" x1="55.4541" y1="42.7529" x2="9.54710" y2="16.2485">
+                       <stop offset="0.0" stop-color="#3057A7"/>
+                       <stop offset="1.0" stop-color="#5A7AC6"/>
+               </linearGradient>
+               <radialGradient id="shadowGradient">
+                       <stop offset="0.0" stop-color="#C0C0C0"/>
+                       <stop offset="0.88" stop-color="#C0C0C0"/>
+                       <stop offset="1.0" stop-color="#C0C0C0" stop-opacity="0.0"/>
+               </radialGradient>
+       </defs>
+       <circle id="shadow" r="26.5" cy="29.5" cx="32.5" fill="url(#shadowGradient)" transform="matrix(1.0648,0.0,0.0,1.064822,-2.1,1.0864)"/>
+       <circle id="field" r="25.8" cx="31" cy="31" fill="url(#fieldGradient)" stroke="url(#edgeGradient)" stroke-width="2"/>
+       <g id="info" fill="white">
+               <polygon points="23,25 35,25 35,44 39,44 39,48 23,48 23,44 27,44 27,28 23,28 23,25"/>
+               <circle r="4" cx="31" cy="17"/>
+       </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Icons/level-up.svg b/Crow/Icons/level-up.svg
new file mode 100644 (file)
index 0000000..86d7c78
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M9 0l4 7h-3v9h-7l2-3h2v-6h-3z"></path>
+</svg>
diff --git a/Crow/Icons/maximize.svg b/Crow/Icons/maximize.svg
new file mode 100644 (file)
index 0000000..b70604a
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   width="14"
+   height="14"
+   viewBox="0 0 14 14">
+       <path
+               style="fill:none;stroke:#ffffff;stroke-width:2"
+               d="m 2,2 10,0 0,10 -10,0 z"/>
+</svg>
diff --git a/Crow/Icons/minimize.svg b/Crow/Icons/minimize.svg
new file mode 100644 (file)
index 0000000..dc3dcd2
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 14 14">
+       <path
+               style="fill:#ffffff;stroke:none"
+               d="m 1,6 12,0 0,4 -12,0 z"/>
+</svg>
diff --git a/Crow/Icons/normalize.svg b/Crow/Icons/normalize.svg
new file mode 100644 (file)
index 0000000..b8b44bd
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   width="14"
+   height="14"
+   viewBox="0 0 14 14">
+<!--   <rect y="7" x="7" height="40" width="40"
+     style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-opacity:1" />
+   <rect y="7" x="7" height="10" width="40"
+     style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-opacity:1" />
+   <rect y="17" x="17" height="40" width="40"
+     style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-opacity:1" />
+   <rect y="17" x="17" height="10" width="40"
+     style="opacity:1;fill:none;fill-opacity:1;stroke:#ffffff;stroke-width:3;stroke-opacity:1" />-->
+       <path
+               style="fill:none;stroke:#ffffff;stroke-width:1"
+               d="m 1,1 8,0 0,8 -8,0 z"/>
+       <path
+               style="fill:none;stroke:#ffffff;stroke-width:1"
+               d="m 4,4 8,0 0,8 -8,0 z"/>
+</svg>
diff --git a/Crow/Icons/open-file.svg b/Crow/Icons/open-file.svg
new file mode 100644 (file)
index 0000000..d5c6a84
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M 4.0527344 0.24023438 L 4.0527344 2.1777344 L 1.9316406 2.1777344 L 0.93164062 4.1777344 L -0.068359375 4.1777344 L -0.068359375 15.177734 L 13.931641 15.177734 L 15.931641 6.1777344 L 13.759766 6.1777344 L 13.759766 3.4746094 L 10.525391 0.24023438 L 4.0527344 0.24023438 z M 4.8613281 1.0488281 L 9.7148438 1.0488281 L 9.7148438 4.2851562 L 12.951172 4.2851562 L 12.951172 6.1777344 L 4.8613281 6.1777344 L 4.8613281 1.0488281 z M 10.525391 1.0488281 L 12.951172 3.4746094 L 10.525391 3.4746094 L 10.525391 1.0488281 z M 2.53125 3.1777344 L 4.0527344 3.1777344 L 4.0527344 6.1777344 L 2.9316406 6.1777344 L 0.93164062 12.078125 L 0.93164062 5.1777344 L 1.53125 5.1777344 L 2.53125 3.1777344 z M 3.6328125 7.1777344 L 14.832031 7.1777344 L 13.232422 14.177734 L 1.3320312 14.078125 L 3.6328125 7.1777344 z "/>
+</svg>
diff --git a/Crow/Icons/paste-on-document.svg b/Crow/Icons/paste-on-document.svg
new file mode 100644 (file)
index 0000000..b0a705e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M13 4h-3v-4h-10v14h6v2h10v-9l-3-3zM3 1h4v1h-4v-1zM15 15h-8v-10h5v3h3v7zM13 7v-2l2 2h-2z"></path>
+</svg>
diff --git a/Crow/Icons/project.svg b/Crow/Icons/project.svg
new file mode 100644 (file)
index 0000000..7522605
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg xmlns="http://www.w3.org/2000/svg"
+   viewBox="0 0 64 64"
+   height="64"
+   width="64">  
+  <g>
+   <path fill="#3333dd" stroke="#bbbbff" stroke-width="10" d="m1.655043,19.482317l17.905939,-17.913175l25.323143,0l17.905937,17.913175l0,25.333551l-17.905937,17.913147l-25.323143,0l-17.905939,-17.913147l0,-25.333551z" id="svg_2"/>
+  </g>
+</svg>
diff --git a/Crow/Icons/projectRef.svg b/Crow/Icons/projectRef.svg
new file mode 100644 (file)
index 0000000..3ebd7b5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   viewBox="0 0 64 64"
+   height="64"
+   width="64"
+   id="svg2"
+   version="1.1">  
+  <defs id="defs6" />
+  <g>
+          <path fill="#007fff" stroke="#111111" stroke-width="2" d="m1.655043,19.482317l17.905939,-17.913175l25.323143,0l17.905937,17.913175l0,25.333551l-17.905937,17.913147l-25.323143,0l-17.905939,-17.913147l0,-25.333551z" id="svg_2"/>
+         <path
+            d="M 15,33.964845 A 6.2543149,5.8551034 0 0 1 8.7456846,39.819949 6.2543149,5.8551034 0 0 1 2.4913703,33.964845 6.2543149,5.8551034 0 0 1 8.7456846,28.109741 6.2543149,5.8551034 0 0 1 15,33.964845 Z M 30.205524,19.726298 h 24.484978 c 3.833495,0 6.919666,3.88699 6.919666,8.715226 v 11.046641 c 0,4.828235 -3.086171,8.715225 -6.919666,8.715225 H 30.205524 c -3.833494,0 -6.919665,-3.88699 -6.919665,-8.715225 V 28.441524 c 0,-4.828236 3.086171,-8.715226 6.919665,-8.715226 z M 15,33.964845 h 8.285859"
+            style="opacity:1;fill:#a0a8ab;fill-opacity:1;stroke:#181818;stroke-width:2;stroke-linecap:butt;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:normal"
+            id="path819" />
+  </g>
+</svg>
diff --git a/Crow/Icons/question.svg b/Crow/Icons/question.svg
new file mode 100644 (file)
index 0000000..fb8e3d3
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M9 11h-3c0-3 1.6-4 2.7-4.6 0.4-0.2 0.7-0.4 0.9-0.6 0.5-0.5 0.3-1.2 0.2-1.4-0.3-0.7-1-1.4-2.3-1.4-2.1 0-2.5 1.9-2.5 2.3l-3-0.4c0.2-1.7 1.7-4.9 5.5-4.9 2.3 0 4.3 1.3 5.1 3.2 0.7 1.7 0.4 3.5-0.8 4.7-0.5 0.5-1.1 0.8-1.6 1.1-0.9 0.5-1.2 1-1.2 2z"></path>
+<path fill="#FFFFFF" d="M9.5 14c0 1.105-0.895 2-2 2s-2-0.895-2-2c0-1.105 0.895-2 2-2s2 0.895 2 2z"></path>
+</svg>
diff --git a/Crow/Icons/radiobutton.svg b/Crow/Icons/radiobutton.svg
new file mode 100644 (file)
index 0000000..335d030
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   id="svg2"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64"
+   version="1.1">
+  <metadata
+     id="metadata12">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs10" />
+  <g id="True">
+    <circle r="30" cy="32" cx="32"       
+       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.99999952;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1" />
+    <circle r="22" cy="32" cx="32"
+       style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.99999952;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+  <circle
+     style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.99999952;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1"
+     id="False"
+     cx="32"
+     cy="32"
+     r="30" />
+</svg>
diff --git a/Crow/Icons/scissors.svg b/Crow/Icons/scissors.svg
new file mode 100644 (file)
index 0000000..4b5a225
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M16 3.1c0 0-2.1-1.1-3.5-1-0.3 0-0.5 0.1-0.7 0.2l-4.3 3.4-1.8-1.5c0.1-0.3 0.2-0.6 0.3-1 0.1-1.8-1.4-3.4-3.3-3.2-1.2 0.1-2.3 1-2.6 2.2-0.3 1.3 0.2 2.5 1.2 3.2l3.3 2.6-3.3 2.6c-1 0.7-1.5 1.9-1.2 3.2 0.3 1.2 1.4 2 2.6 2.2 1.9 0.2 3.4-1.4 3.2-3.2 0-0.3-0.1-0.7-0.3-1l1.8-1.5 4.3 3.4c0.2 0.1 0.4 0.2 0.7 0.2 1.4 0.1 3.5-1 3.5-1l-5.7-4.9 5.8-4.9zM2.8 4.6c-0.9-0.1-1.6-0.9-1.5-1.8s0.9-1.6 1.8-1.5c0.9 0.1 1.6 0.9 1.5 1.8 0 0.9-0.9 1.6-1.8 1.5zM3.1 14.7c-0.9 0.1-1.7-0.6-1.8-1.5s0.6-1.7 1.5-1.8c0.9-0.1 1.7 0.6 1.8 1.5s-0.6 1.7-1.5 1.8zM12.4 3.2c0 0 0.1 0 0.2 0 0.4 0 0.9 0.1 1.4 0.2l-6.8 5.7-0.9-1.1 6.1-4.8zM14 12.6c-0.5 0.2-1 0.3-1.4 0.2-0.1 0-0.2 0-0.2 0l-4-3.2 1-0.9 4.6 3.9z"></path>
+</svg>
diff --git a/Crow/Icons/updown.svg b/Crow/Icons/updown.svg
new file mode 100644 (file)
index 0000000..0df8175
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   version="1.1"
+   id="svg2"
+   width="44.717388"
+   height="31.938803"
+   viewBox="0 0 44.717389 31.938803">
+  <metadata
+     id="metadata11">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs9" />
+  <g
+     transform="matrix(0.81305037,0,0,0.79847006,-3.6589183,-5.1900554)"
+     id="up">
+    <path
+       id="path4144"
+       d="M 32,9 7,44 57,44 Z"
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+  <g
+     transform="matrix(0.81305037,0,0,0.79847006,-3.6589183,-5.1900554)"
+     id="down">
+    <path
+       id="path4144-0"
+       d="M 7,9 57,9 32,44 Z"
+       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+  </g>
+</svg>
diff --git a/Crow/Icons/warning_construction.svg b/Crow/Icons/warning_construction.svg
new file mode 100644 (file)
index 0000000..4c101ec
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="378.30496" height="326.05325" id="svg2" sodipodi:version="0.32" inkscape:version="0.46" version="1.0" sodipodi:docbase="C:\Documents and Settings\KevinDuke\Desktop" sodipodi:docname="Ambox_warning_blue_construction.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" gridtolerance="10000" guidetolerance="10" objecttolerance="10" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.64877047" inkscape:cx="-125.04673" inkscape:cy="39.346892" inkscape:document-units="px" inkscape:current-layer="layer1" width="400px" height="400px" showgrid="false" inkscape:window-width="1264" inkscape:window-height="764" inkscape:window-x="0" inkscape:window-y="0"/>
+  <defs id="defs4">
+    <linearGradient id="linearGradient3134">
+      <stop offset="0" style="stop-color:#4c99f5;stop-opacity:1;" id="stop3136"/>
+      <stop id="stop3165" style="stop-color:#1361ba;stop-opacity:1;" offset="0.5"/>
+      <stop offset="1" style="stop-color:#194c9a;stop-opacity:1;" id="stop3138"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3140" gradientUnits="userSpaceOnUse" inkscape:collect="always" x1="91.29969" x2="244.97258" xlink:href="#linearGradient3134" y1="4.3178039" y2="237.70302"/>
+    <linearGradient id="linearGradient3148" gradientUnits="userSpaceOnUse" inkscape:collect="always" x1="91.29969" x2="244.97258" xlink:href="#linearGradient3134" y1="4.3178039" y2="237.70302"/>
+    <filter inkscape:collect="always" id="filter3172">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="5.0924795" id="feGaussianBlur3174"/>
+    </filter>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient3134" id="linearGradient2184" gradientUnits="userSpaceOnUse" x1="29.753853" y1="-13.269632" x2="202.58235" y2="183.58783" gradientTransform="matrix(1.2084425,0,0,1.2084425,89.669573,106.93911)"/>
+  </defs>
+  <metadata id="metadata7">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <dc:title>3D effect warning triangle</dc:title>
+        <dc:date>18/9/07</dc:date>
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Tim O'Ryan</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <cc:license rdf:resource="http://creativecommons.org/licenses/by-sa/2.5/"/>
+      </cc:Work>
+      <cc:License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/">
+        <cc:permits rdf:resource="http://web.resource.org/cc/Reproduction"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/Distribution"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Notice"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/Attribution"/>
+        <cc:permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/>
+        <cc:requires rdf:resource="http://web.resource.org/cc/ShareAlike"/>
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g inkscape:label="Layer 1" id="layer1" inkscape:groupmode="layer" transform="translate(-15.90328,-38.352144)">
+    <path style="opacity:1;fill:#777777;fill-opacity:0.79729728;stroke:none;stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3172)" d="M 213.05399,47.37801 C 208.83955,47.5955 205.01929,49.92458 202.89552,53.57127 L 33.940149,345.10803 C 31.700749,348.97294 31.693669,353.73905 33.921559,357.61061 C 36.149459,361.48217 40.273789,363.87084 44.740599,363.87665 L 381.66948,364.40534 C 386.13811,364.41875 390.27406,362.04591 392.51793,358.18147 C 394.7618,354.31704 394.77229,349.54876 392.54546,345.67448 L 224.53419,53.60904 C 222.18314,49.53899 217.74782,47.13166 213.05399,47.37801 L 213.05399,47.37801 z M 213.65821,84.83972 L 360.06857,339.36792 L 66.417039,338.91476 L 213.65821,84.83972 z" id="path3152"/>
+    <path style="opacity:1;fill:url(#linearGradient2184);fill-opacity:1;stroke:#001387;stroke-width:6.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" d="M 199.82666,41.494396 C 195.61222,41.711894 191.79197,44.040971 189.66819,47.687664 L 20.712823,339.22442 C 18.473424,343.08933 18.466339,347.85544 20.694238,351.727 C 22.922136,355.59856 27.04646,357.98723 31.513278,357.99304 L 368.44215,358.52173 C 372.91078,358.53514 377.04674,356.1623 379.2906,352.29786 C 381.53447,348.43343 381.54497,343.66515 379.31813,339.79087 L 211.30686,47.725427 C 208.95581,43.655381 204.52049,41.248051 199.82666,41.494396 L 199.82666,41.494396 z M 200.43088,78.956113 L 346.84124,333.48431 L 53.189715,333.03115 L 200.43088,78.956113 z" id="path2178"/>
+    <path sodipodi:arg2="1.5723975" style="opacity:1;fill:url(#linearGradient3140);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3148);stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" id="path2160" sodipodi:cx="91.428574" sodipodi:cy="117.14286" sodipodi:arg1="0.52519998" sodipodi:type="star" d="M 230.71429,197.85715 L -48.114905,197.41068 L 91.686339,-43.839248 L 230.71429,197.85715 z" sodipodi:r2="80.491158" sodipodi:sides="3" inkscape:randomized="0" transform="matrix(1.2084425,0,0,1.2084425,89.669573,106.93911)" inkscape:rounded="0" sodipodi:r1="160.98232" inkscape:flatsided="true"/>
+    <path sodipodi:nodetypes="cccsccscccc" d="M 199.89464,117.765 C 197.29017,117.9016 194.92932,119.3644 193.61684,121.65473 L 89.204984,304.75655 C 87.82107,307.18391 87.81669,310.17731 89.193499,312.60887 C 90.570306,315.04044 93.119077,316.54066 95.879504,316.54431 L 304.09647,316.87636 C 306.85801,316.88477 309.41397,315.39449 310.80064,312.96739 C 312.18732,310.54032 312.1938,307.54558 310.81766,305.1123 L 206.98922,121.67846 C 205.53631,119.12222 202.79534,117.61029 199.89464,117.765 L 199.89464,117.765 z" style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:20.6877861;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" id="path19491"/>
+    <g id="g2689" transform="matrix(0.4429717,0,0,0.4429717,130.45212,176.47068)">
+      <path id="path633" style="font-size:12px;fill-rule:evenodd" d="M 385.98026,297.1542 L 140.36506,297.47 C 138.14026,297.2692 136.52876,296.7617 137.37106,294.1072 L 227.62156,178.4191 C 230.74276,173.9958 235.45166,171.6041 240.18906,171.7401 L 285.54036,171.6433 C 292.89546,171.6399 295.73166,173.769 299.77886,178.8507 L 388.15426,292.9709 C 388.96306,294.9787 388.23836,296.9865 385.98026,297.1542 z"/>
+      <rect id="rect613" style="font-size:12px;fill:#000002;fill-rule:evenodd" transform="matrix(0.8854492,0.4647361,-0.4080531,0.9129582,0,0)" y="-14.842998" x="123.87642" ry="11.816919" rx="11.204546" height="124.68408" width="62.141693"/>
+      <rect id="rect615" style="font-size:12px;fill-rule:evenodd" y="46.624874" x="62.235527" ry="8" rx="9.4117651" height="32.5" width="100.00001"/>
+      <rect id="rect616" style="font-size:12px;fill-rule:evenodd" transform="matrix(0.4686899,-0.8833628,0.7446349,0.6674719,0,0)" y="81.759407" x="-81.341789" ry="6.8044353" rx="8.770999" height="27.643017" width="93.191841"/>
+      <rect id="rect617" style="font-size:12px;fill-rule:evenodd" transform="matrix(0.8845854,0.4663782,-0.4366812,0.8996163,0,0)" y="83.646034" x="80.548698" ry="3.8168414" rx="27.532589" height="15.505919" width="292.53378"/>
+      <rect id="rect618" style="font-size:12px;fill-rule:evenodd" transform="matrix(-5.7205843e-2,-0.9983624,0.9970356,-7.6942184e-2,0,0)" y="144.00377" x="-203.17215" ry="6.6537714" rx="12.701341" height="27.030947" width="134.95171"/>
+      <ellipse sodipodi:ry="32.5" sodipodi:rx="31.25" sodipodi:cy="467.36218" sodipodi:cx="418.75" id="path619" style="font-size:12px;fill-rule:evenodd;stroke-width:1" transform="matrix(0.957573,0,0,0.972804,-219.55633,-423.0267)" ry="32.5" rx="31.25" cy="467.36218" cx="418.75"/>
+      <rect id="rect621" style="font-size:12px;fill-rule:evenodd" transform="matrix(-0.2340079,-0.9722347,0.9856452,-0.16883,0,0)" y="45.608078" x="-250.27161" ry="7.6888905" rx="7.3474178" height="31.236115" width="78.066315"/>
+      <rect id="rect622" style="font-size:12px;fill-rule:evenodd" transform="matrix(-7.5698648e-3,-0.9999713,0.9970336,7.6967061e-2,0,0)" y="100.42473" x="-287.73053" ry="7.6912837" rx="7.3637767" height="31.245834" width="78.240143"/>
+      <rect id="rect623" style="font-size:12px;fill-rule:evenodd" transform="matrix(0.4947081,-0.8690592,0.8178671,0.5754071,0,0)" y="135.70329" x="-232.42075" ry="7.8654013" rx="14.748785" height="31.953188" width="156.70583"/>
+    </g>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Images/Icons/Cursors/arrow b/Crow/Images/Icons/Cursors/arrow
new file mode 100644 (file)
index 0000000..61f968e
Binary files /dev/null and b/Crow/Images/Icons/Cursors/arrow differ
diff --git a/Crow/Images/Icons/Cursors/bottom_left_corner b/Crow/Images/Icons/Cursors/bottom_left_corner
new file mode 100644 (file)
index 0000000..e9a41a2
Binary files /dev/null and b/Crow/Images/Icons/Cursors/bottom_left_corner differ
diff --git a/Crow/Images/Icons/Cursors/bottom_right_corner b/Crow/Images/Icons/Cursors/bottom_right_corner
new file mode 100644 (file)
index 0000000..208faf4
Binary files /dev/null and b/Crow/Images/Icons/Cursors/bottom_right_corner differ
diff --git a/Crow/Images/Icons/Cursors/cross b/Crow/Images/Icons/Cursors/cross
new file mode 100644 (file)
index 0000000..4596b48
Binary files /dev/null and b/Crow/Images/Icons/Cursors/cross differ
diff --git a/Crow/Images/Icons/Cursors/hand b/Crow/Images/Icons/Cursors/hand
new file mode 100644 (file)
index 0000000..23939b7
Binary files /dev/null and b/Crow/Images/Icons/Cursors/hand differ
diff --git a/Crow/Images/Icons/Cursors/help b/Crow/Images/Icons/Cursors/help
new file mode 100644 (file)
index 0000000..cd7ec27
Binary files /dev/null and b/Crow/Images/Icons/Cursors/help differ
diff --git a/Crow/Images/Icons/Cursors/ibeam b/Crow/Images/Icons/Cursors/ibeam
new file mode 100644 (file)
index 0000000..ccbdcb5
Binary files /dev/null and b/Crow/Images/Icons/Cursors/ibeam differ
diff --git a/Crow/Images/Icons/Cursors/move b/Crow/Images/Icons/Cursors/move
new file mode 100644 (file)
index 0000000..ab98f6a
Binary files /dev/null and b/Crow/Images/Icons/Cursors/move differ
diff --git a/Crow/Images/Icons/Cursors/sb_h_double_arrow b/Crow/Images/Icons/Cursors/sb_h_double_arrow
new file mode 100644 (file)
index 0000000..1768b6a
Binary files /dev/null and b/Crow/Images/Icons/Cursors/sb_h_double_arrow differ
diff --git a/Crow/Images/Icons/Cursors/sb_v_double_arrow b/Crow/Images/Icons/Cursors/sb_v_double_arrow
new file mode 100644 (file)
index 0000000..a36abd4
Binary files /dev/null and b/Crow/Images/Icons/Cursors/sb_v_double_arrow differ
diff --git a/Crow/Images/Icons/Cursors/top_left_corner b/Crow/Images/Icons/Cursors/top_left_corner
new file mode 100644 (file)
index 0000000..3493adc
Binary files /dev/null and b/Crow/Images/Icons/Cursors/top_left_corner differ
diff --git a/Crow/Images/Icons/Cursors/top_right_corner b/Crow/Images/Icons/Cursors/top_right_corner
new file mode 100644 (file)
index 0000000..264cc57
Binary files /dev/null and b/Crow/Images/Icons/Cursors/top_right_corner differ
diff --git a/Crow/Images/Icons/buttonB.svg b/Crow/Images/Icons/buttonB.svg
new file mode 100755 (executable)
index 0000000..56bc8d9
--- /dev/null
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   width="228.18092"
+   height="82.974884"
+   id="Root"
+   pointer-events="none"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="buttonB.svg">
+  <metadata
+     id="metadata5666">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1280"
+     inkscape:window-height="984"
+     id="namedview5664"
+     showgrid="false"
+     inkscape:zoom="1.7041667"
+     inkscape:cx="64.029735"
+     inkscape:cy="41.487444"
+     inkscape:window-x="0"
+     inkscape:window-y="16"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="layer1"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0" />
+  <defs
+     id="defs4">
+    <linearGradient
+       id="linearGradient3159">
+      <stop
+         id="stop3163"
+         style="stop-color:#000000;stop-opacity:0"
+         offset="0" />
+      <stop
+         id="stop3161"
+         style="stop-color:#000000;stop-opacity:0.5"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3030">
+      <stop
+         id="stop3032"
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0" />
+      <stop
+         id="stop3034"
+         style="stop-color:#ffffff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       x1="120"
+       y1="10"
+       x2="120"
+       y2="50"
+       id="linearGradient3113"
+       xlink:href="#linearGradient3030"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.037186,0,0,1.037186,-4.4623201,-1.8593001)" />
+    <radialGradient
+       cx="120"
+       cy="170"
+       r="100"
+       fx="120"
+       fy="170"
+       id="radialGradient3165"
+       xlink:href="#linearGradient3159"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0,-0.75431712,2.074372,0,-232.64324,174.46232)" />
+  </defs>
+  <g
+     id="layer1"
+     transform="translate(-5.9095402,-8.5125599)">
+    <rect
+       width="228.18092"
+       height="82.974884"
+       ry="41.487442"
+       x="5.9095402"
+       y="8.5125599"
+       id="ButtonBase"
+       style="fill:currentColor;stroke:none" />
+    <rect
+       width="228.18092"
+       height="82.974884"
+       ry="41.487442"
+       x="5.9095402"
+       y="8.5125599"
+       id="ButtonGlow"
+       style="fill:url(#radialGradient3165);stroke:none" />
+    <path
+       d="m 47.39698,13.69849 145.20604,0 c 11.49202,0 23.35397,11.319856 20.74372,20.74372 -1.90259,6.868746 -9.2517,5.18593 -20.74372,5.18593 l -145.205989,0 c -11.49202,0 -18.841228,1.682847 -20.743771,-5.18593 -2.610262,-9.423863 9.251699,-20.74372 20.74372,-20.74372 z"
+       id="ButtonHighlight"
+       style="fill:url(#linearGradient3113)"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/Crow/Images/Icons/crow.png b/Crow/Images/Icons/crow.png
new file mode 100644 (file)
index 0000000..7b737d0
Binary files /dev/null and b/Crow/Images/Icons/crow.png differ
diff --git a/Crow/Images/Icons/exit.svg b/Crow/Images/Icons/exit.svg
new file mode 100644 (file)
index 0000000..cb8d1c2
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   width="64"
+   height="64"
+   viewBox="0 0 64 64">
+  <path
+     style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+     d="m 13.884262,15.143117 c 24.231966,13.49131 34.18672,34.186719 34.18672,34.186719"
+     id="path4175"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cc" />
+  <path
+     sodipodi:nodetypes="cc"
+     inkscape:connector-curvature="0"
+     id="path4177"
+     d="M 50.43178,15.408178 C 20.436536,37.282439 16.245061,49.594898 16.245061,49.594898"
+     style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:9;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+</svg>
diff --git a/Crow/Images/Icons/file.svg b/Crow/Images/Icons/file.svg
new file mode 100644 (file)
index 0000000..a31c367
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="128" height="128" id="svg2606" sodipodi:version="0.32" inkscape:version="0.48.0 r9654" version="1.0" sodipodi:docname="mime2.svgz" inkscape:output_extension="org.inkscape.output.svgz.inkscape" inkscape:export-filename="/home/pinheiro/pics/oxygen-icons/scalable/mimetypes/mime2.png" inkscape:export-xdpi="360" inkscape:export-ydpi="360">
+  <defs id="defs2608">
+    <linearGradient inkscape:collect="always" id="linearGradient3913">
+      <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop3915"/>
+      <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop3917"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3897">
+      <stop style="stop-color:#fcfcfc;stop-opacity:1" offset="0" id="stop3899"/>
+      <stop id="stop3901" offset="0.52275378" style="stop-color:#f8f8f8;stop-opacity:1"/>
+      <stop style="stop-color:#f0efef;stop-opacity:1;" offset="0.72337759" id="stop3903"/>
+      <stop style="stop-color:#e3e1e1;stop-opacity:1;" offset="0.89024991" id="stop3905"/>
+      <stop style="stop-color:#cecbcb;stop-opacity:1" offset="1" id="stop3907"/>
+    </linearGradient>
+    <linearGradient id="linearGradient6131">
+      <stop id="stop6133" offset="0" style="stop-color:#fcfcfc;stop-opacity:1"/>
+      <stop style="stop-color:#f8f8f8;stop-opacity:1" offset="0.52275378" id="stop6135"/>
+      <stop id="stop6141" offset="0.77457333" style="stop-color:#f0efef;stop-opacity:1;"/>
+      <stop id="stop6139" offset="0.90122044" style="stop-color:#e3e1e1;stop-opacity:1;"/>
+      <stop id="stop6137" offset="1" style="stop-color:#cecbcb;stop-opacity:1"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" id="linearGradient5982">
+      <stop style="stop-color:#ffffff;stop-opacity:1;" offset="0" id="stop5984"/>
+      <stop style="stop-color:#ffffff;stop-opacity:0;" offset="1" id="stop5986"/>
+    </linearGradient>
+    <linearGradient id="linearGradient4518">
+      <stop style="stop-color:#eeecec;stop-opacity:1" offset="0" id="stop4520"/>
+      <stop id="stop5969" offset="0.40000001" style="stop-color:#f4f4f4;stop-opacity:1"/>
+      <stop style="stop-color:#f6f5f5;stop-opacity:1" offset="1" id="stop4522"/>
+    </linearGradient>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient4518" id="linearGradient4524" x1="72" y1="0" x2="72" y2="116.40091" gradientUnits="userSpaceOnUse"/>
+    <radialGradient inkscape:collect="always" xlink:href="#linearGradient5982" id="radialGradient5988" cx="64" cy="64.004021" fx="63.793392" fy="47.274845" r="47.5" gradientTransform="matrix(1.6842105,-0.08429519,0.06886339,1.3758846,-48.197002,-18.663233)" gradientUnits="userSpaceOnUse"/>
+    <clipPath clipPathUnits="userSpaceOnUse" id="clipPath6093">
+      <path inkscape:connector-curvature="0" sodipodi:nodetypes="cccssccc" id="path6095" d="M 17.000001,8 17,120 l 57.5,0 c 1.675283,0 3.914297,-0.56468 7,-3.6 8.870045,-8.72523 20.24047,-19.851805 27.49904,-27.175957 C 111.4396,86.761431 112,84.752873 112,82.5 L 112,8 z" style="fill:#ffffff;fill-opacity:1"/>
+    </clipPath>
+    <filter inkscape:collect="always" id="filter6118" x="-0.1126375" width="1.225275" y="-0.12064722" height="1.2412944">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="2.3860572" id="feGaussianBlur6120"/>
+    </filter>
+    <filter inkscape:collect="always" id="filter6171" x="-0.47870938" width="1.9574188" y="-0.51275067" height="2.0255013">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="10.140743" id="feGaussianBlur6173"/>
+    </filter>
+    <clipPath clipPathUnits="userSpaceOnUse" id="clipPath3889">
+      <path sodipodi:nodetypes="cscscssc" inkscape:connector-curvature="0" id="path3891" d="m 112,82.502986 c 0,4.465301 -2.79749,6.409952 -5.27972,8.093625 -5.10854,3.46508 -14.939114,3.32536 -20.720284,3.40638 -0.081,5.781159 0.16586,15.504599 -3.29922,20.613139 -1.68367,2.48224 -5.29051,5.38687 -8.20078,5.38687 2.31803,0 4.74284,-1.33476 7.58402,-4.08481 9.14197,-8.84873 17.36714,-16.13535 25.673154,-25.297529 C 109.67612,88.503916 112,86.97878 112,82.502986 z" style="fill:url(#linearGradient3893);fill-opacity:1;stroke:none"/>
+    </clipPath>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient6131" id="linearGradient3893" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0119858,0,0,1.0119858,-0.89554075,-0.9871566)" x1="86.73793" y1="93.621468" x2="95.460213" y2="102.34375"/>
+    <linearGradient inkscape:collect="always" xlink:href="#linearGradient3897" id="linearGradient3895" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0119858,0,0,1.0119858,-0.89554075,-0.9871566)" x1="86.73793" y1="93.621468" x2="95.18235" y2="102.06589"/>
+    <filter inkscape:collect="always" id="filter3909">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="0.43040059" id="feGaussianBlur3911"/>
+    </filter>
+    <radialGradient inkscape:collect="always" xlink:href="#linearGradient3913" id="radialGradient3919" cx="90.75" cy="110.25299" fx="90.75" fy="110.25299" r="18.750002" gradientTransform="matrix(1.3067347,0,0,1.3067347,-27.83617,-33.818441)" gradientUnits="userSpaceOnUse"/>
+    <filter inkscape:collect="always" id="filter3826">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="1.036" id="feGaussianBlur3828"/>
+    </filter>
+    <filter inkscape:collect="always" id="filter3834">
+      <feGaussianBlur inkscape:collect="always" stdDeviation="1.50075" id="feGaussianBlur3836"/>
+    </filter>
+  </defs>
+  <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="2.8284271" inkscape:cx="36.031425" inkscape:cy="70.491779" inkscape:document-units="px" inkscape:current-layer="layer1" width="128px" height="128px" showgrid="false" inkscape:grid-points="true" showguides="true" inkscape:guide-bbox="true" inkscape:window-width="1487" inkscape:window-height="789" inkscape:window-x="317" inkscape:window-y="144" inkscape:snap-global="false" inkscape:window-maximized="0">
+    <inkscape:grid id="GridFromPre046Settings" type="xygrid" originx="0px" originy="0px" spacingx="1px" spacingy="1px" color="#0000ff" empcolor="#0000ff" opacity="0.2" empopacity="0.4" empspacing="2" visible="true" enabled="true" snapvisiblegridlinesonly="true"/>
+    <sodipodi:guide orientation="1,0" position="-68,29.325902" id="guide4564"/>
+    <sodipodi:guide orientation="1,0" position="-51.972348,130.81475" id="guide3859"/>
+  </sodipodi:namedview>
+  <metadata id="metadata2611">
+    <rdf:RDF>
+      <cc:Work rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+        <dc:title/>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g inkscape:label="Livello 1" inkscape:groupmode="layer" id="layer1">
+    <path style="opacity:0.26237623999999998;fill:#000000;fill-opacity:1;filter:url(#filter3834)" d="m 17,8.5 0,112 58.1875,0 c 2.115556,0 4.528919,-1.77169 7,-4.25 0.71234,-0.71442 1.440746,-1.39395 2.15625,-2.09375 0.415612,-0.40649 0.832187,-0.81443 1.25,-1.21875 7.773958,-7.40962 14.98341,-14.022603 22.21875,-22 0.42065,-0.420645 0.81207,-0.811101 1.15625,-1.1875 1.46444,-1.497657 2.76158,-2.837804 2.99375,-5.8625 L 112,83.15625 112,8.5 z" id="path5990" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsssccccccc"/>
+    <path sodipodi:nodetypes="cccssccc" id="path3722" d="M 17.000001,8 17,120.2 l 57.746418,0 c 4.168166,0 7.728581,-4.85625 20.853582,-17.1 7.48636,-6.9837 10.43958,-10.889428 13.15009,-13.599933 C 110.49334,87.756815 112,86.462557 112,82.3 L 112,8 z" style="fill:#000000;fill-opacity:0.70053478000000002;filter:url(#filter3826)" inkscape:connector-curvature="0"/>
+    <path style="fill:#ffffff;fill-opacity:1" d="M 17.000001,8 17,120 l 57.5,0 c 1.675283,0 3.914297,-0.56468 7,-3.6 8.870045,-8.72523 20.24047,-19.851805 27.49904,-27.175957 C 111.4396,86.761431 112,84.752873 112,82.5 L 112,8 z" id="path34" sodipodi:nodetypes="cccssccc" inkscape:connector-curvature="0"/>
+    <path style="fill:url(#linearGradient4524);fill-opacity:1" d="M 18.5,9 C 18.160156,9 18,9.2346178 18,9.5 l 0,107.96875 c 0,0.82158 0.679323,1.5 1.5,1.5 l 53.6875,0 c 0.05307,0 0.810384,0.0234 1.5,0.0313 1.777664,-0.0401 3.131974,-0.75374 4.356035,-1.59328 1.051866,-0.29103 20.649835,-19.619593 29.770955,-28.809238 1.36239,-1.372621 2.18546,-3.948169 2.18546,-4.895612 L 111,9.5 C 111,9.1772826 110.83678,9 110.5,9 z" id="path3967" inkscape:connector-curvature="0" sodipodi:nodetypes="ccsssccscccc"/>
+    <path clip-path="url(#clipPath6093)" style="opacity:0.27722772;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter6171)" d="m 114.4,82.502986 c 0,4.465301 -4.99749,6.609952 -7.47972,8.293625 -5.10854,3.46508 -14.739114,3.52536 -20.520284,3.60638 -0.081,5.781159 -0.03414,15.304599 -3.49922,20.413139 -1.68367,2.48224 -5.79051,8.68687 -8.70078,8.68687 -2.091359,1.5337 3.488204,8.21101 6.734971,5.31989 9.501888,-8.46107 35.131683,-30.022704 43.350823,-39.262889 2.04044,-2.29392 -4.90514,-9.844666 -9.88579,-7.057015 z" id="path6153" inkscape:connector-curvature="0" sodipodi:nodetypes="cscscssc"/>
+    <path style="fill:#000000" d="" id="path2197"/>
+    <g style="display:none" id="Frame_copy" display="none" transform="translate(1042.0419,-279.83386)">
+      <g style="display:inline" display="inline" id="g3978">
+        <image style="opacity:0.75" width="571" height="571" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjsAAAI7CAYAAAAK1lpbAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAANbY1E9YMgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAFS4SURB VHja7J0JdxrbkmaDFBpsX9fr//8rq969tqwJul2tfA6CiDhxkgQS2HstlgbbEsISufXFcFYCAJfK 6oC/syq8r/ftU7E98O3ofdn7q38OABf6ZAkAy/457RWX1uvV953jOWTbeL36vuz1XkFCggCQHQCY 4WeyJTS90qJfrg74O6d8HslEZhu8r/fvVP+sIjoIEACyA8DPX/H9VWnJxGQ109urQHiO+XwSpS5b 5yYzvj1FkBAgAGQHgJ+3othUZaYlJXPfhkSqjo0nIJtAeo51i+SoIkEIEACyA3BzctMrNBURqbw9 TPg33p+tOiTu0DQnS3Q2weuttzeNf5993DlEqPV1AgCyA3AVcpNJTUU8vJfR+6K/0/q4QyJL0dc4 d5rjyc7GeblpiIz9u623Wx9305CvQ5Ig5AcA2QG4KLmpJDUtgfHenvO2anwee59ETlPOyspXnqxs GnKT3T6Kf5Z9zkrCVOkJqiZBAIDsABz1Z2aK3NgkJZOYu+Tt1uut900VIZs4neK5xEtJNhOFxhMY 7+VH4e9UP08rDdpKfwkM+QFAdgCOnt5kU089YhNJyV3xbfu+6O+3RKiaHLVKWYc+v1T6daqCsw2S mUhuPhzRqdwiQcqkyKZP1X4gUh8AZAfgpOlNqxyVpTWRuKw7327dhuR1fZ+qJbLqKPoxU51tR5qz dYSjKjTvhdez9300UqJWCpT1AGWpD+IDgOwAlAWnld54vS6tpCaSm7Xz+jr5O5H4rJPPWS1prYqp zrnLWNtCalIpXUXiUnlZeV9VhqoCVCl7IT4AyA5ASXCy9CZKbVpCY2Umu90HEuR9zEq6E8lOZWqr d/z8FOlOayIrK2f1JDvvjdd7bpkQefLzIX39P4gPALIDfM93C06lgfjOSVyqEnPfeOndeiUnanRu SU0mOecePW9JTyZBUf9Or/Bktzfn9bfgzyvyk5XAEB8AZAegtO8mGwG/S9IbLSCRxFRfz4SnVcYa giTHK1lFkrNqyI0nO6dMdiLZyXbdtJKflvi8S17eiiTHe/nmvB3JUFQia8kP4gOA7AApTld6YyUi K0PdN24PieB4AlRNdHpHyyubkaMEZ6lnY1UkaCP1aa6etOejkOr03loC9C7t8hfiA4DsAIJTkhuv T+a+ITcPSmweAtmpJDlrJ8nJenGm9txkYiNymaee9wpQJD829bGJik19oqTHS3deG29777Mfb3w7 Kn8dIj5IDyA7AAv+Xo7KVPaC75WmouQmEpwHIzgPzvuqotNKcVoJTvX8q0pa0yM355Cdivz0pkAt 8akkP9Xylic0r8n7XpO/+yZx+atXfEh7ANkBuOAUpzU1VRGb+0Bmopv9+1XB0ZKTCU6W2AzJ4zFF alYLe+6oiE+vBE0VoOoIeyY8meRktzfz+hTxqY60Iz2A7AAsIMVpSU40Cm7l5qGR2lRu9t97pSpv fDxrMu4tR/WITY/QLOV5YztBhCriI1JrePYEyBtrj0pdFfHRQvOi3vfivO+1Q3zenfsZbXS2jw3i A8gOwJlTHG+CyktwtHhkUvPYeDuTHJvmVJuMexqKRdr9Na2UpvVccCnPE9vOP6smQJEEVRqes3JX pcyVyc5L8HpLfN4OTHxIewDZAThTimP7cLIS1b0jN4/Oy8fgz3oE517a/TfecQ2t9OaQxOaQn/+l PWdsZ/w3WSmsp/zVU/JqTXNFJS1Pdl6K4vM6k/hUUjQAZAfgQMmJUpxWierBCE1265GcdSPFaaU3 1eV91YmoFc8Dky7EUxuhe+Un2+nTkp4X5+VLQXxeAvHJ+nxIewDZATix5Nixaq/RuFdwnoLXM8mJ SlRTBGf8eqRTcKo/w/yczyNDVQmqTnxl8uMlPl4/z2uH9FSTn0h89H2sjLEjPYDsADQkR1/cvYV/ UR+OJzgPgdw8mdejVMcrU1X24FQO0azusmn9vPKzfB4JaglQK/mppD5e2uOJT5b2/HKE51ciP95Y e1Tm8sQH6QFkB6AgOba0U+nD8XpwbGrTIzpZihM1GU8VHJHaoj5+ZpcvQZXpr6r8ZD0+WV9PlvT8 Cl566U802VXZ32OFD+kBZAeQHCM5U1KcLL3J3o5KVtEkVUVwKlNTJDa3KUBV+cnEp9rb44mPlhx9 ezGvW+mJylxR2jPed6QHkB1AcgqSk6U4Xv9N65ZJjt6LE0lONb2pJDj8PCI/LfnJSl2Z+GRTXC+B 8PwKJGiOtAfpAWQHkBwjOfYU8ajRWMvLFyU0XwLJ8cpV3uK/VorTk94gN9ASoKzZ2ZOfSHyqTc1e WevZSM6zk/pk4tOa5EJ6ANkBJKczxXlyxOZLQXQejOS0SlXZBFV2CviKnzeYQX683pdNUXy8/h6v xGVLW8+B8DwH4mPLXN7hpEgPIDuA5DiSE6U4nuB8CURHJz9eP45XqhqSFKey+4afL5hbfloTXq1x 9krak5W1noOXlTKXN76O9ACyA0hOIjhWbqzwRCUruwDQS3G8c6i8AzURHLhE8fHKXJn0vCTC81wQ Hy/tQXoA2QEkJ5CcL4VbS3LuG5JTTXG8nxl+hmCJ4hOVukbRsCWuHunxxOdZ4sZmpAeQHUBylORk Cc7XJNWJylW6uTnaatzag4PgwLWIj3750Uh7qtKT3aZKz0ZYTgjIDixUcrTsDDNJzlclOV+DNOex IDlew7EnOQgOXKv4ZBNdFel5FX9yywrOz0B89L/NpCc6jkIkPnwUANmBo37feJKjD+acIjlfjeh4 iU4ryckajqOzqBAcuGbx8cbZvaWFVnyysXUv5fmpXv6UuMwVNTNnCwopbQGyA2dJc1bSPtLhvkNy WqKT9eRk/TiVUhU/E3BL4hOVuVpTXFnSY6Xnp5EfKz52iqvS04P0ALIDZ5WcrFxl9+N8KUjOV/H7 cnSSo5cAelNVpDgANfFplbi80XWvpycSnkx6tPiMHzeSHu/sLYQHkB2Y7XskO4XcSs6YuGSTVZHg fJW8L0dPV9mm42yqCsEB2BeDqMxlm5mt+OglhePN6+f5mdxazczRURTRKetIDyA7MFuaM4pEdDhn a3z8a3LzRsmznpyoH6d3szEAaU9+NpdNe0YBeQuSHtvP48nOD5P42C3Nr4n0UNoCZAeOIjleX07W eDxKi05wvnVKzqPs78mJzqmyy/9IcQAOT3si8dH7eqKeHjuqrsXmh3nppT26RPaWSA+lLUB2YNL3 Q1Sy8iRHl6sekxTnm3mpS1k9kpPtxyHFAZg/7elpZtZJz4uRHtvP8yMRH6+8NUqUPnsra2Im5QEu BlBKcwYnzRnlw5uuspLzLREdm+ZUJafSj8P3NcDx055oSaEnPbaJeRQaLTpR2vPLJD3RuHpW2kJ4 bpw1DwGi40hOVLLSY+Q6yXlKUhz9uk1zdCKE5AAs87lh6/ycbdVL/VzxYZ4v3iSeynyW/UN9f8j+ YMLPz3///PmxRum5k7yfR5z7j/QgO0CaU+rL8UbIvxq5+eakObZkpRcCIjkAlys9W+e540PiXVue +DzJfklb334o8fn1+fF+yZ/S1vApPCvZ7SmyKc8K4UF2gDRHTzd5zcf6yWeUl2+B6FjJsWnOFMmh 6Rjg8qXnviE9nvjohOen+ji/Pj+2Jz2kPIDskOaUSlZRX87XQHL+krg359FJc6ZIDoIDsDzpWTkJ iic9rc3qFenR5S29jmL8+GM/zyD7U1ukPMgO3HiaoxuQvb6crFz1l/i9OVHJKjvWAckBuLxfnrbq ZzaTnmii00t7npzU5zH4xelZfUzbz0PKA8gOaU46Sv6USM5f4petWiUrb+sxkgNwXWmPJz36uedD 4l1dWXnr0Xlu8X6R+iX7e7hIeZAdIM3ZSXOs5HxVcvOXIztZA3JlISCSA3D90jM+92ySpKclPp7s 2OeaZyU8pDyA7Nyg6GQ7c7ySlU1y/nISHS/NiUpWSA7AbUqPyO7IerTHKyptedLzmCQ8+rnnhZQH kJ3rlhyR+GRym+bofTmR5FjRiRqQo74cu/XYu78AcF3PR970ViQ+d5I3MlekZ/z7a/M8RMqD7MAN pTnezhyb5vwV3FppTrVkJaQ5ADed8owMzi9ktpcwkp7W7Z6UB5Cd63wyEYlPJ9dPGl4D8rdO0bGn kmdnWFGyAoBqE7Pe91WZ3noQv5ylb17KM+7keSukPAgPsgMLTHNWHWlOJDnfJS5beWnO+HnoywGA 3qTHK2utJkjPg8Q9PDbl+f3xxkWEWnhWRnooayE7sEDRiUbKK2nO90B0dNnKnmW1VpJzJ/TlAED9 +Svq59mYlz17elrSo2XHlrbGc7a03FDWQnbgzJIjEk82eEc96N6cUWa+O6KjtyF/baQ5UQOykOYA wISURz6fR1qTW5H0VHp7WstN3z/vB2UtZAcWlObouNc7uNNLc7TcfJf9/pxRdFq9OZSsAGBu6bH7 eXqlp9q8bFdj3AUpj1fWQniQHTih6EQj5VFvjic6UdnK7s2p7MxBcgBgzqTHPt9FSbb9RS8Sn3vx +3iiX+DeTbKzMfcZ6UF24Iiio3/YvTTnUfzenO+O5GjR0U3IXuTr9eaI0JcDAPM+32WlrY20z91a N1KeqIcn2gv2YdIdUh5kB44kOWJ+CPUPtm7Ki/bmZKJjm5C9NCcaJyfNAYBTpTxb9frg3Lz9PLaf 574hPVGJ/sNJeBAeZAdmTnNaZSvdhGzHySPRyZqQ18lvOqQ5ALCElKe1hXmdyM59Q3Zsyf7NSA/C g+zAkUQn2p1TTXNsf042Uk6aAwCXnPJEm5ij3TvrJOEZnwffkpRH1PsA2YFO0fEO8BxFZ5yW0qeT R5LzXfaXBEZNyPTmAMASnxsPTXnWSnDuzetWdKKS1pv6/PTxIDtwgOSI7G8RjcpWUZrzX1IvW40f m0krALiE58melCeTHk92KiUt28fDPh5kByakOVF/jt2d401a/Zd6qRcFRrtzspFy0hwAWOpzZk/K Y6XHkx9PdrKmZdvHwz4eZAcmiI7Xn6PLVnpvjhYdm+i0dudk0wekOQCw9OfOLOXJkh6b4FRlJytr CcKD7EBbdKL9Od7unL8cyfFExzvAMxopH0hzAOACn0ejlMf7RVJLj5Wfu0SGhob00LiM7ECH6OhG ZHu2lS1bWckZS1c60dFlK12jHsSfthJEBwAu9Pk02r4cpTxeecvr27kLpMf7HCI0LiM70BSdVn+O l+boRMcbK882IdsfUiQHAC75udVLeaaKj5Ugb0rL+4WRxmVkhx9G9VJPXGX7c7KyVSQ63pJAmpAB 4FaeY3ulJ5OcdUN2sudUGpeRnZsXHf1DFu3PicpW/5L9HTrRWLkVHdIcALiF51vvJHX95z2TW73l LHuQKMKD7NzMD57eoWMbkW1/zig63ztFR29D9o58QHQA4NZ+wdzK/g6zbOVHr/S09pMhPMjOzfyw RaPl3qJArz/nX7JfusoakXV/zuD8gCM6AHBLz8NeWct7bh5fv2tIzyBxKcu72UkthAfZuSnR8RqR o7LV+Lo3ceX150TTVkgOANy68FSmtjLpGSQfSY9Sno16ifAgO1ctOrp0Fe3PsZKjS1f66Af6cwAA pgnPIH19PIPEu3pa6c748W0fD8KD7FyN6EQ7dPTElT7bSgvO+LoVnVYjMksCAQDi5+dqH8/KPKfe FWSn1b+D8CA7Vy063g4dfVr5fxnJ8UpXWnS808rpzwEAqD1XV/p4rOzYdoTKZmXvufgD4UF2rl10 ngLR+ZcjO94Onex8K8pWAADThCfr41k5MjMUbl5i5IHwIDsXJzrZssBotPxf4ic63mi5FR36cwAA 5hGewZGN6gbmylRWBsKD7FyU6GTLAkfRyUpXNtGxomMnrujPAQA4/Dk86uNpTW6tGtLT85yM8CA7 FyU69tRyKzrfJe7RqYoO/TkAAPM+n0d9PCLtdGcl01MdhAfZuVjRyXbofDeCY5uRI9G5Q3QAAM4i PKvCrbVFGeFBdq5GdPRWZO8wT68ZOduKPH686MRyJAcA4HjCEz3PVmQnep6uPGcjPMjOokXHjpaP ovNfgeh8D0Qn26GD6AAAnE54dONyq5ende3oAeFBdhYvOt8C0fEmrrytyGOiw2g5AMD5hEeM9Ni/ 02piPvR5GuFBds4mOjqy9JqR9WGe3rSVHS0fd+jYZYGIDgDA+Z/3vUkt73n4WM/LCA+ycxbR0Rs0 bTOyJzr/R/zRcm8rsndqOaIDAHDea4BtXL6T/T6cVfFjITzIzkWIjt2jYw/0tKKjZSc7/iEbLUd0 AACWJTzDEaQG4UF2zvpNHh0B4Y2XW9H5P+p9VnQeP2+6EZllgQAAlyc8p3iORniQnaNJji1feUdA ZKJjx8tZFggAcJ3CcwoQHmTn7KLTmrr6Jn926LAsEAAA4bFsC+9HeJCdWb6R9eu6ITk66yqavPqX ER0v0WFZIADA7QpPj6y8IzzIzpyiE/Xo9IiObkaORIfRcgAAhKciRFslPPrzIjzIziyi442Ya9H5 LvvnXH2X3WbkJ0QHAADh6ZCa6H22nIXwIDsHiY4eMc+OgfAO9Gzt0UF0AAAQnor4tHp4EB5kp1t0 7HZkLTpe6cprSK5OXSE6AAAIj5UX72V0E0d4ANlpio4tXdkTzP+S+ATzsaT1DdEBAEB4OoWnR3Ky 0hbSg+w0RScrXY2iEzUj26krfagnW5EBABAeSaTEk5yNeenJjv27+n4gOxCKTmVpYKt0NfboeJuR ER0AAIQnEp9MdiL50TCSjuzsSU7P0kCvT2d8e0x0vgrNyAAAXGP6hSeSHXvLkh5G0pGdnW9C/bpX vvJEp7UwMBOdAdEBAEB4GnITCU4kPdG0FhNaNy47laWBdsQ8SnRsQ7LepaNLV4gOAADC4wmPyH7f Tq/4RL08Nz+htb7hbzqRuHxlR8wj0dGyY0VnTHTWQukKAADqJa1DEh4v6bn5Ca1bT3aiEXNbvvou +0dBeImOXRqoS1cDogMAgPBILeGJmpN/3z7MrSI7Nz2htb7RbzSb6OjFgY+SNyTrm7dLR/fo3BnJ AQAAiIRnK396RkX6k52spDVykxNa6xv8BtOvR306nuhkzcgsDQQAgEOF5069vv28rlSTnUrKc7MT Wusb+8bSkqPLV17pyvbp6DTHLg1EdAAAYA7hGZSMiPjlLC01WoBafTwjN9ewvL6hbygRvyH5XnbL V7ohOZKd6LwrtiMDAMAhwjPKzp0jO9tAcqKbLWlpwdmo+3D10nNryU525pU9xdxOX40LA1sHe7Id GQAA5hCeSHZ0utMSnaikpUtYV1/OWt/IN5GVHXuSeWtDsi5d2akrvUuHRAcAAOYQHv3L+dRkx5Oe m2xYXt/AN0+P6Hh9OrZH52siOiwNBACAOYSnsn/HS3feP29eD8/NHimxvvJvGis6Y+lqrUSn1afD dmQAADjXdUw3LN9LO915l76UR+QGGpZvIdnxjoN4ULIT9elURYfSFQAAzHnd8ia0vIZlPYXVkp1N Ijv65VWmO+sr/maxstNzknlFdLzyFaIDAADHEh5PdrYS9+68y25Zy5vQ0h9rda3Cs77SbxJPdHSq M4qOPffqu7SPgdDnXbEdGQAATiE8eiS9le58OJLTGku/6v6d9RV+c2jRWcn+4kA9Zv6XEhstOmMz MksDAQBgKcLjTWhF6c671NMdvXPnKvt3rjXZ6d2nYxMdvR3ZnmLO5BUAAJxDeLIDQ22zciQ7nvRE h4deTbqzvrJvCCs7ekuyPvdqTHX+SkTnayI6JDoAAHBq4RF1fdt+XpfsdFbWt+OVtjzZubr+nfUV fSN4orMuiM73hujQkAwAAEu61onEDcu6f+e9cIukR/fvXDzXluxk01e6IdlOX32X+CiIrCEZ0QEA gFNd46oNy17/ztvnLROdqy1nra/kG0AS0Rn7dLJUp3LmlVe+AgAAOJfwRA3L0WTWeyA+WePyVZSz 1lfwH++JTtSn860gOjQkAwDAJQhP1LCskxorOG9Gdt4c4dFTXldRzrqWZMfKzr3spzqe6ERnXo3/ noZkAABYqvCI+A3LD7Lbt/PhiM6rtEtbV1POWl/4f7ZIvjzwUXYP+bSy803aR0HQkAwAAEu+Dors Nyx7o+jvSnReZT/l8UTnKspZ6wv/D64cB2HLV/rlX0p0dKpj+3QE0QEAgIVdB7OGZU92snTH9vDY puWLLmdderJTaUr+JvtNybp09SURHdunAwAAsFThsddDLTxesvNq3rayczXlrPWF/ueKxE3JdvrK pjr2KAgWBwIAwDUIT7Rw8FH8dOfVER+b8FxFOWt9gf+pnuiMiU6W6mjhGUXnixKdUXaYvAIAgEsV HjHCE6U7Vdm5inLWpSY7veUrKzrRPh1EBwAALll6tOxo4fF6d14D4bm6ctb6Av8TK+Wrb7Lfq9Pq 0xmEPh0AALhc0fEalkfhefiUlifxe3dsD89VlbPWF/Sf6IlOpXxlRUfv09Fj5ndCqgMAAJcvPPp6 qaezRuFp9e5ECc/FlrMuLdmplq+ipuTsgE+b5iA6AABwqdIjsjuOXpnOeglk510uvJy1vqD/tOxI iKh81TN9RfkKAACuQXRa4+iPSmJeG7ds4eDFlLPWF/CflonOvfxZCOgd9On16TBmDgAAtyA8+vqp y1n3SnhsOcumO9GG5UEuqJx1KcmOlp1BdstX+kiIv8RPdb46okP5CgAArl16RNrlrKx3J+rf2Zqb lSxkp/M/SSQ+EsI70bw31aF8BQAA1yg6PeUsr3fnRfb37+h0x+vfWSSXUMbSiY495PNJiY5Nduz0 FeUrAAC4ReHR19NWOcuTHS/hsbKjp7QWJz3rBf8HSSA6rVRHNyRTvgIAAKTn/+OVs+yyQS03L+rm lbN0wrOSBTcrrxf8nxKNmlvRiWSHQz4BAADRyctZetmg7d3RouMdKWHLWYttVl5yshPt1NGj5l+l PWZulwdSvgIAgFsUHn19zZYNesmOt4PHG0dfZLPyeoH/IeLYp92pE/XqaNHRZ19RvgIAAKTn/zOo l7qc9f557XwLZGe8ZenOIpuVl1rGsr063pEQXwPRaR3ySfkKAABuUXRsOWtMd/Q6l3dHdn593rKE ZxSeQRbYrLxe2H+Elp3xP6I1gfXNER1v+upOKF8BAADCY4OFMVT4+Lx2ZqWsSjlrcc3KSyxjReWr SqpjRede/AM+ER0AALhl6RH5swX5Tv6Moutm5dfPa6tOd3TKE6U7i2tWXi/sge/dq/NN4j6de9k9 zZzyFQAAIDq7MqKFxw4C6XTHik62cHBxzcrrhTzwWnRsrPagHvivgez0bklGeAAA4NaFR8w1d5zO 0s3KWnY86XkNZGcjC0p3lpTseKPma9mdwPriyI4VHW+nDuUrAACAOGwYnKDh0QjP79uzIzteOWtM jBaR7qwX8kBbu4zKV1+V4GjR0Tt1okQHyQEAANiVDzsUZI+S0JNZvwXnL9kvZ+mEx9u9I0IZKz3V 3DYm20THGzPXvTpMXwEAALSFZ0xivOksfQ3+pV5WmpV1Kets6c76zA+yfl2Lzlr8Cayv0i5fadEZ EB0AAIDS9bjVrPziiI5OeGzvzti/8yGUsZrTV18cyfkq/U3JAAAAsH8d9pqVN+p6/C5/2kl0k/Kz /Onh8fp3xrLY2U9FX5/xwdWys5LdpmRvW3KW6tjyFU3JAAAA067L3pmU9pr8LH3lLJEbL2NFqY4+ 2bzSq+P16SA5AAAA7etxtFlZBxBvn9feLN0ZhUeXs8by2NnSnfWZHlRtj3YC616JTlTC8spX+vwr Uh0AAIDDrs9eujPKjk53vHLWmO68ywLSnfUCH1CvV+erkR1vpw6j5gAAANOvy3oUPWpW1sLzywiP V876/W/Pnu4MZ5ac1qj5V0d09E4db3kgo+YAAACHXaOjEw30NfqLCSS8Y5u8Bb8nvzYvoYzVSnWi 8pX3QDJqDgAAMM91Wqc7nvD8vi6Pe3ee1du/X19UujOc4cHzUp11YIzeBFYmOkgOAADA4ddqe71u Xat1KNGqwJz8Wn3uMlZrtM178OwEFuUrAACA+a/Xq+L12rtm6+u1HSI6ufQMJ3zQrCW2tiXbBYLR pmQWCAIAAMx/zbbX7ahZOQonFpPunLOMFdUAI0PMLJFRcwAAgPmv26sJ123ddrKIdGc40YNlHzjd 3a3P3vhizFC/zqg5AADA6QOKbNHgkyM8X2Rhk1mnLGN5UVir2Sl7sDgWAgAA4HTCY9MdL6zIem3P lu4MJ3qgRPJGp8wMHyXu1SHVAQAAOE1g0ZPuROtivLDiaspYnhXac7B0slNtcGICCwAA4PihRSXd iUILfR33Jqnl2NfxU5axsm5uT3SiOf3oQQIAAIDTBRfeZFZ0LbelrJNOUw9HfmCyB+hBdmt92YMT pTpHt0EAAABEZ+d6Hk1m2UO8KycfnOR6foqencgE7yUuYekHxk5grYReHQAAgHNIT7X/1mtJ0enO SftvhyM+IJEFeudgVVIdr3tbBOEBAAA4hei0rutZOat6ruVFyY59YKLTzaNU56wGCAAAAOn1Pevd eZRprSlHGzgajvQgiCM6U+xv3bA/hAcAAOD0oqOFxxs6ejpQeBYvO9b6VrK7RLDVqxONqJHqAAAA nFd0vDDDDh95wvMkfaWsWa/zxy5jZSWsHuu7EyawAAAAliI92fCRrd48OcITXeOPEmgMR3gAJHgQ 7BLBLwXr0w/CgOQAAACcXXQkuda3+nIfpT6GvljZ8YzPHvpp460nqcVbVqYAAADgfNKTlbK8UfTs Wu8Jz2zX+mHmL1wkPvQz69XRJSzdq8MEFgAAwPJEx5Oe6IQET3psFeeovbnHLGPZXp2sU9suEdQn o3IGFgAAwHKlx17zdbqjAw6d7LQalWe95h+zjNWyvOgLt1/00ZcNAQAAwGTRaS0ZjK77evJ67Vzz F1fGqpSwIsPz6ncnm70HAACAg67/1UblTHiO2qg8nOAL9vp1rOhER0Mwbg4AALBc0akKz5MjPCcr ZQ0zfrEitVSn8sXqcXNSHQAAgOWLj77+eyeiR2HH0as6c5axqiUs74s9+TZFAAAAOLkD9Kycmc0B jlXG0k1KUc0u6sa+kyM1KAEAAMDsomM9YM7AY5Z0Z5jpi4xEx0ZYj+qLO+sJqAAAADC79LQms/QJ CtoN9DT2nSywjOXN2euNyZHR6b06dokg4+YAAACXJzqVdOcxcYFMeCZ7wdw9O95ZWC3ZOWp0BQAA ACcVH69RuRJ+ZH07Z+vZ6dmt8yhxqpOdi3HwFwgAAAAnE53evTuPkld6FtOz41lcFlt5jcm2XwfJ AQAAuCzRsX6RpTteCKKdwJ6icJAbDDN8UT0Gl9XnaEwGAAC4fOnJFgzboaXHwAvWMuNywWHGL6jS jOR1XmcbkwEAAOByRCfyg+xQ8KOXsuYqY+mR80pUxcZkAACA6xafaPdelO5E25QPTniGiV+AZ252 CitrQoq+GO/zAAAAwGWJjohf+cmEp9XiMtkNhpm+kGx5kFfGynp1kBwAAIDLF52op/de9lfTVE5V OGvPTrRI0BOeB/V3sogKAAAALl98BmmvpsmalGcpZQ0T7nhmbOuGrXmd1uzWAQAAuD7R8Vwh6u09 ainr0J4dz9aiMhaHfgIAANyG6Ni39VSWDkYi4Zm1lHVIz060EjqbodclrOhoCIQHAADgesTHK2WN Acmj8YajlLKGzjsssh9NebGUd8crh3wBAADA9YhO6/iIk5SyDunZ0abmbUd8MK9njcnddxwAAAAW LTrWN4ZO4ZmtlDW1Z8dbFBTd8cjQKGEBAADchvhEO3dOUso6pGcnO+TL3u6FEhYAAMCtik40lVUp ZUXJzuw9O63zLnpSHUpYAAAAtyE61jkyd4j84eCzsg5pUPZSHS/Z8Xp1vI3JCA8AAMD1ik9WyvL6 faNe3+6EZzjCnfVkJ0p1EBwAAIDbEJ3WgsFq385RenayElZ01oWX6sx6qBcAAABchOjYt7NJ7soI endgMqVnxzYmZ6lOdCcRHgAAgNsTn0HOMODU27OTNSffS1+qg+AAAADcjuh4wUnmEeNtLf6ZmiLF 0GRKz85c/TrNOwcAAABXITpWerIKUXTMVNT7e3CDcmvkPIufsmVAiA4AAMBtik8mPFWfmL2M5QlP a+T8XvLjIVaB8QEAAMD1io5IfOTU2jiE9Yk7ySe7V4fIjgQW1mpOzs60QHAAAABuU3SiY6cqfTuT jo3olR17auna2Bcj5wAAAFBxCu9wUOsVlUrRQT07XqdztF+nIjqMnAMAACA6Vnis6HheoZ3C6wOe LDsi8SLBqIRlbYwSFgAAAHii02pU9pKdSUdPTe3Z6dmvMwiTWAAAALDvFlGjclTKOkqDspfsjMJz 7wiPNw9/h+gAAABA4hdRslNZZ9OsGg3JnfDMS9+ZtXNHKqecC9IDAABw06Ij0j5cPCpleS0yMkV2 RPajoVXxzlQakwEAAADRqSwYtH7RSndWPbIjgXnZzcneHdIlrFLzEAAAANyk/GR9O61kp9S3U+3Z ycpYWnSq1gUAAACITrVvJ9q3M7lB2duvUxkNW0u9nob0AAAA3LboWMdotcrYQKXctzN03onojkSi Q78OAAAAZI7RKzzdnlFpUB7Eb072hKd1FhbCAwAAANY3osXFFeHxPGNVlR0rPN4BoF6qwyJBAAAA qIpO66QGL1jxXKN7Gsv+Iy9aij5564gIpAcAAABWgfBEw1BZb3BayhqCT2ylJ/rka4knsJjCAgAA gKrw2BF0byDKBiulJuXWNJbXnOylO5O6owEAAOCmJUf7xipxDS9k8U4/d92jVcaqNCdHx66X598B AADgpsWnNf09JWBZtWRHpDZ27pWxuo9eBwAAAKRH6q0zXQHL0DAsrzv6rlN0AAAAACLBEam1zmS9 wmmT8uB8QnsnKvWzO4nPqkB4AAAAoCU6vX075cWCwwGGlU1iMW4OAAAAvfJTFZ4oZBFPerIy1tD4 hNkIGNNYAAAAMFV0omXGWd9O2KRcmcY6JNmhORkAAABaohP5R+YdWni8np10Gis67bz1iWhOBgAA gEOkpydoyXqF3TLWKhGd6idkczIAAAD0Co5IvUm5UsraozV63hKdO+lc2QwAAACQyE92CHlLdFwP iUbPo1TH+4T06gAAAMDcomP7du7M660m5f+8HJJPNN4yybmrfiL+DwEAAGCi9NwZ//A8pNmzUzWr ilFRygIAAIBewclE584RntaREf/5uNlSwYrolJuDAAAAABqiI+IHLi3pSRcLDhOsqmJTJDsAAABw iPhk6U7XMVU2ifF6dqJ0p7I1GeEBAACAXuGJJrJawUs6jeWtVx46P8lK2K8DAAAA84hORXoG8Zca h2WsyKiGxieJGpOZxAIAAIBDpGfocJFSg3KlhFWNjRAcAAAA6BUc6XSRTHhKyc7QYVSUsAAAAGBu +amkO60G5dVQsKpB8kQnO1odAAAAoCI2nocMEqc7mYs0j4vITGoomBTSAwAAAHOIjyc61XTnPz4y BB+4FR0N0o6OEB4AAACYKjyVgalSpSk7Gyv7oNmYF5IDAAAAcwnPkNyi/mER06Ac1ckym/IsCgAA AGAuyRGphzDpdPjQYVGVZiB27AAAAMCc0qMble8kD2BcJxmcDyiBRXkv09gIAAAAoFNwrEtkjcot 0flfevfseKKTHr4FAAAAMFF8vHRnaNz2psOrG5QrJgUAAABwiNxEwhOJTqWMFY6eV/p1mMQCAACA Y0lPFMCsekRHpD2NFS0VbB66BQAAAHCg8FSkJwtg/vfW2rMTCU/LohAeAAAAOFR4WsuOo/ftMDQ+ cKsBiDIWAAAAnFJ8ur3Ejp5LxwejORkAAABOLTmep6TT4a1kp8egvDsIAAAAMFVy5AAv2VsqKBI3 KK8kTnTYmgwAAADHlB6RWnuN17MTHhdRER5EBwAAAI4pOOI4yaSqUzQ6vko+OE3JAAAAcArpscFK JDilBmWRfHw8qp1lJgYAAAAwt/i0RtD3fCY7G0ukXrZCdAAAAGAOqamITiQ87rT4ULSoSIQQHQAA ADiW9KwawuP1Fu/9+6FgViwPBAAAgKUJTzZEteMy0annkrweSREAAADAscQnu4kkR1gNgbSsijeE BwAAAJYgPtHfLW1QRngAAADgnGIjjm9kLTc7f97aoNyzW4deHgAAADim+IjU2mx2GAJLysa7aFYG AACAc4hO9L5095899TxbybwqCg/yAwAAAKeSnuafZUsFq6uYAQAAABZLlOxE2wm9U0URHwAAAFgC q0h2bAnKS3KaJ4oCAAAALEFuPNnR/8BrUK6UsyZ9cgAAAIBjY5cKtkbOI9Fh3w4AAAAsWnYi4alM YCE6AAAAsGjZiTYQitQ3KAMAAAAsVnZEahuRSXAAAADgYmUnk5jKGVgIEAAAACxedgAAAACuWna2 wd/Zqj/L/g4AAADAYmVn25AcKQgPAAAAwCJlZ+sIztZ5O7oBAAAALFp2tOh4grP5vEWiQ+IDAAAA i5cdT3Q2gfggPAAAAHBxsiPil6825pYJj5iPBQAAALAI2bE9O57UWOGhZwcAAAAuRnZE4nLVJrl5 pS8AAACAU1FyjyH4h16akzUpAwAAACxSfqJkJ5rGak1mlS0LAAAA4BQMEi8O3BYlB7kBAACAU7Cd 8mfVPTve694nQXwAAADgFJKTVZW2kex4olPdoIzkAAAAwCmEZxu8HjIkRlQ9JgLRAQAAgGMJTuQc 28Rbdv58CP5i9EGk8T4AAACAUwhQpX94a2VHHFvaSn5QKAAAAMC5BCc7vPw//3YofGCRONkBAAAA OJbgSCIz0akPaRkrkhh6dgAAAGBJorNJhGfv32dlrJbYdHdDAwAAABQkJ3OS6EircE1OdOp59kkQ GwAAADi1BHmnO2SnPPzn3w6SNyFvG8KD+AAAAMCxBUckPqA8O7/TLWN5cuNFRFETEOIDAAAAh0pO JD3bRHo2gaM0j4vYSHwoKMIDAAAApxCfluRY4dn595XjIlo1sazXBwAAAGCK5GSTWJVU5z//fkg+ aOuDZYeCAgAAAMwlPdvAQ7K+nf/QSnZaMRHNygAAAHAO6Sl7ydD4YPaDfkihEQjpAQAAgBkFpzJy 7vXsyCg72ZZCT3Qi4UF0AAAAYC7RiaSn0ke8cxsC0dlInuhQxgIAAIBjik5LcqrVJneDcpbsZNID AAAAcKjkiOMmUcmqJDxD4wNvpD/lAQAAAJhDfipnYkU9O3sNytHxEDbVsX072XJBAAAAgF7BsS4R OUlpe7KWnegDeklOJdlBfAAAAOBQ8bGpzkdDesKlgtE0ltev8+F8AhqUAQAAYG7J8YTHc5Ksl7j7 uIjsg5PqAAAAwDGkJ+vPsV7ittVEo+fZjh3vAzOVBQAAAHOLjnaSD+e2qfhI5dTzj8InYd8OAAAA zCU6Ivnuvy4faR0XkX3g7BMAAAAATBEcKzrbouiUDwKVmT44wgMAAABTxafVO9wKX3Y+nrdBWZwP vpH+ZAfxAQAAgB7JsW8fXML6zeB8gpZNvYu/YJBSFgAAABwqPJXm5HfpCF56e3beC0aVWRoAAABA VXoqqY7XWrPjINlSwWzU6132Ex4WDAIAAMDcohM5yHvVQbxkRySvk0XREbt2AAAAYIrciLQXG7+L X2FqCk926rmX7rzLtHIWAAAAQEV8Wo3JUXUpmsZqHheRNShXylhMZAEAAEBFciLpiUTHBi+hfwwd ZpV9ouysLAAAAICK8GSBSyQ6Uaqzc+r53jtl/zh1L9XxeneYyAIAAIA5pCdrUP5IHCRsUPbKTa3x cyayAAAAYG7J8RYbvwc3LTphZam3Qbmyb2eD5AAAAEBRcOzLVnNyNI1VHj23wrMxwpOZVcmuAAAA AALh8cKWinukYcvUZKdn/JyJLAAAAKiKT1ZVymQnnAQfGp8wm8byambp6BcAAABAIjlV92gtNm6e jRV90pbsRJ8U0QEAAIBe4cm8w2tQDgOWaPRcAsOyn+QtkB4kBwAAAFpyYyWnKjpdJzi0GpTHm62b vSWikyU7CBAAAABEwpOVsDzv0M7RNXquqfbseJ/YPWYdAAAAIBCfbVF0spBlzzuqyY43/vUmuwlP Nu+O8AAAAEDLOWzI4nlHS3TEekc0ei4dn/i98MkRHQAAANgTEZnWmOyVsUSKZaysSVl/8jfZT3Yy 4QEAAACQxDvsQJTnHD1nc4ayI45pRX07b8kdyM7JQn4AAAAgWnfj9etkwUrz5IahcEeyWKlHeBAd AAAA8Dwj2uv35gjPeGstFCzJTlTKspLzKnGzMn07AAAA0BKeiui0PENkwjSWFGwrSnY84wIAAADI lgnaYaiW6DQXCkay0zoywitjvUot2aGcBQAAAFmo0mqVyZKdsux4d6gykUXfDgAAAPQIT8UxonaZ sl8MnXfEs65XqdfTEB0AAADQnpFVj1p9wSXh6W1Q1uYVWRd9OwAAAFBxiyhQmVI96p7Gap1E6tXT 6NsBAACAXuFp9QS/ir9QsNSvk8mOd8eyU0hfJW8iom8HAAAAxBGdKNXJ2mS6jqXqaVBuxUyv4qc7 5dEwAAAAuGrBidzCNie/Sp7sdA1ADcU7VmlSfjV3sNKkjPgAAADcpvT0TmG9yf6ZWEdvUP5w7kRl mzKSAwAAgOjYgz+9Xh1vAKqrX6clO94dzJqUszvmTWUhPAAAALcpPF4JywYn1iuysfOj9ezY2ppX ynoT9u0AAAAgOLtO4TUmR1NYWXOyyMw9OyLTmpRbjcqIDwAAwG0KT0t0oubkrvBkShkruoOvReFB dAAAAG5XeFpTWPZmS1gn7dmZcgcpZQEAANye4HiiE+3W8XqAtU90LykeDrijWRmrtXOHbcoAAAC3 KzytVOdF/OBkkkcME+5gZGTeHWylO4gOAADA7QhPJdV5kdoUVplh4p1tTWXZO5pZGQAAAFyv4HgO YY+eepW4HcYKT3c7zDDhTusyVqvWNt6iw7uyBwQAAACuQ3i86pAWndEhXqRdwure2dfboCySH9z1 6tzZNyM8Xr0N0QEAALhu4bHuYBcJZqmO15x8kgZl3aT8XrzDH4mdAQAAwHUJTiQ83vmaL+bWak4u M7VnJ2tS9u6sXQoUiQ7iAwAAcF3C0zoe4k35QuQNBw04TenZEWkvF3w1d9w7sZRSFgAAwG0IT9T+ MorOS+ANs5zCMLVnp3LHbcrTuuMAAABwPYITCY8XkETNyVFI0sVwwBeRnVbq3WlKWQAAALclPJUT zrP2l1l29E3t2cmEp9VoRCkLAADgdoQnm+Cu9PlGzckn7dlp9e1UOqspZQEAAFyP4GhX2Ep7Y/Kv xBUOKmFNkR37xWTnW7yYLyDbqMxZWQAAANcpPF4wkoUir4knTHKEYYYvwjO21hcRRVOIDgAAwPUI j3fqQuQIeqBpthLWVNmplrKiL0ILz+RzLgAAAGCRgmNFR09h2cbkX7Jfwmo1J3czzPBFVZqU9Rdj S1mTjmsHAACAxQpPax9fFobYye2D3eDQnh0rPJUm5Rdpb0ZEdAAAAC5PcjTZOVg2DBkDEW9FzaJ6 drxlQd4Xko2hbxoPHAAAACxbeLIprKjqc7QS1iGy431hPaWsaAydnTsAAACXLzytVOeX7Ich2cGf Imfu2fG+sPeOL8pLdxAdAACAyxKc8WUr1fklfj+vt19nln7eYeYvzNu343VcZxZHozIAAMBlC09r B9+z7FZ7Ric4yqT2MOMXGM3S6y/k1+cXWNmSiOgAAABcjuRoH7Dj5lGlp1LCWlTPTm8pq5LuCNID AABwEcJTcYGp/ToHucBcPTvSKTvPp7I5AAAAOJnwRB6Q9fBGW5MXXcbKtilHX6Q3akajMgAAwPIF J/MAL9V5lr4SlshCylgi9VLWs/SVsujfAQAAuAzhyRqTW5PZWTvLQQxH+IJb42ae1VWFBwAAAJYl OVp0pl7/j3o4+HCEL7p66FcrxprlWHcAAAA4qvBs1fW6muqcrIQ1p+z0lLI84bGnob8fy+4AAABg tuu+d+2v9uocvTF5btmxX7AVHq9vp7d3R5AeAACARQlP73BSzzT2bNf8Y5Wxqk1KVnp0uqO/8Nmb lQAAAOCg671IfA7WeD3X1/rKFNZRrvXDER+I1viZ/eJfhHQHAADgUoTHS3bGPl2vT8dLdcbr/VFb V4YTPAA23fF6dkbpqYyhIToAAADLEZ7KBFbWr3PUEtYxZGfqGJoXbUWlLDmG9QEAAED5Ol9tWXkW v5IzhhonOTnh2GWslvF5D4JXy7MPAqIDAABwPuHJrvG/itf4aApr9kDjWGWsQ4Snp3cHAAAATic5 In6qE/Xl/vy8taawjnp9H07wwFSOj/CEhyWDAAAAyxOeVpDxHNy8VOckU9fDiR+Q8UGJ+na8UXQa lQEAAM4vOSJxquOVsHSq82yu629ywonr4cgPiki9lGUflOxEdNIdAACA0wtPdE1/CUQnKmHZa/pR r+fDiR4YW8p6l3YpKypnke4AAACcVnK88MJLdTzRqZawjiY8wwkeHO8B8h4cr5HJi7xIdwAAAE4v PL2pjic6Xnhx9Ov4cKIHSCTv3M5iLz2TT7oDAABwWsnxQotWqvMsfgnr5KnOKWTHio4+ETUqZXnC Q7oDAABwPuE5pFcnGzg6yfV7OOEDJVLfuUO6AwAAcH7JEbnwVOdUstOb7vwU0h0AAIClCM9Fpzqn kp1IelrrpaemOwgPAADAfNfsi051Tik7c6U7rb07iA4AAMB81+6LT3VOKTuR9FTTnfHBi0bXOBEd AABg/mv1xac6p5adQ9Kd6qw+6Q4AAMB8onPxqc5v1md6IFeSpztesvPl832P/+/28P9u95/3/+5T 2jafH3dlPg8AAAD0XadbJ5tX207OnuqcQ3as6Kyklu78+JSdp8+bFZ6PT+HRsoPoAAAA9F2j9esb yU82jyowi0p1ziE7kfRED+STEp3xZZTujAnPVskO6Q4AAEDf9bl6gHfrwM9FpDrnkp0p6Y4WnjHZ icpZKyU9CA8AAEDt2qxfn3Ligd2Lt4hU51yyE0mP1/w0pjtaeL6IX8rSsrOS3YQHAAAA2tdlW77y enV0i8niU51zyk6W7ngP6pPsJjs63bl3hEcnOyKkOwAAANk1WdQ1eSt5U/KzEp0f6n1nPdl8ibIT SY+X7jwq4RmlRzcrP3zerOyQ7gAAANRFZ2tEx5uU/mlEZ/Gpzrllx0t3PhzheVbC46U7Wna8chbp DgAAQH499kpY3sLfn47oaNlZXKpzbtmx0qOFZ2yG+n3/7pXwPDk33btzL/vpDqPoAAAA/vVXv66b kqOdOj/UbRQfb+HvYlKdJciOTnfGt0fZuZPdMXSvnOVNZt3J7ij6RnbLWkgPAADAn+tuNmo+pjqR 6Cw+1VmC7Fi7tOnOmyM8XsJjJ7PWsj+ZxSg6AADA7nW3coTTT0d2RuHJDummjGUe8JXzoNt0Z3zA tex8kd1kx1s0uBGalQEAADzR0U3JWnS8pmQrOlmqs1mC5CxJdiLLtI3K958yo0tZT0p+Wnt3aFYG AADYF52oKTkSnR/iT2CNqY49mJsyliMfdjrLTmY9fD7Qj+KXsjzh8ZqVER4AALhFyRFzvc323I1y 88/nLUp1xhKWLl9tl/JFrxf6n9A6M8s2K2dHSNiEZ1DCAwAAcGuisxX/SAgv1fGSHW+JoO7V2QZy hezIbgOxriEOsj+K/vNTah6dW5busFkZAABuXXiyIyH09NXv2z/ipzovEk9gLSrVWZrsWOGxpayo WVmXs6rpDiejAwDArUmOJzyj6LzJfvlqFJxqU/LienWWKjv2P0ULz9untIzNyvfiJzt2yaBNd8YO ccpZAABwS6KTHQkRLQ9s9erYCazFic5SZcdrVh7LWaPw/JK8nBWNodt0h3IWAADcivB4O3VsT2wm Oj8LorNd4he/Xvh/jBUe20B1r8TmIZCdqHeHchYAANyC5FjhsTt1RtF5DkQnWiD4LvuJjixReJZc xrLNylp4xmbltRIeL9mJ0p1BiQ3lLAAAuGbRya6levrKis54y8pX3l6dxbH0ZCdqVh6U8DzLfrqj X+p0x1s2SDkLAACuWXjs9FU0Zm5Fx56BZRcIeqUrylgHmql3Kvqd/El37gPZeQhkh3IWAABcs+RY 4dHlK2/6KpIdu1Mn6tUh2TngP8trVh6XA97JfjnLu7V6d0QoZwEAwHWJTnaiuXfIpxUdr1fnYpqS L0l2vP8420X+In/KWfdGemwpi+ksAAC4FeGJylfemPlvwflb+lKdxZevLkl2bLOyTnf0KHor3cnK WfrMLBHKWQAAcLmSY4XHm76yywPt7Yf4m5IvpnR1abJjhUdkf/fOoIQnk54o3eHsLAAAuBbRseGA N31ly1c61dHTV79k96BPrzGZMtYR/yN1LDfIn3KWbViOZCc6FV2fjk66AwAAl3adzJYHVspXP5Ts vF666Fya7GTlrJX8OUqiIjs23bH9OyK7k1oIDwAAXEoYsJXalmQrOv8Y0bmYgz6vSXas8Ij45Sw9 oaUlp9W7Y5MdxtEBAOAaROdN9rckV0Unkh25JOFZX8F/bKWc5cmOFR5PekQJDwAAwNJFJxsz97Yk /y35QZ8XXb66ZNlplbMGJS9eSeu+ITu2WZn+HQAAWPp1sXdL8t+y36tzdeWrS5YdKzwiu+Use3aW TXjupXaMBOPoAACw9Guhfj0SnXH6yqY5UarzKldSvrp02bH/0fo/eezdeRE/3clkJ5rOGhAeAABY 8PXPpjrePp0f8ifR0aKjd+roLclXITqXLjutZYO2nGV38ETlrEH2j5OgfwcAAJYoOlvnF36d6nil Kys7XlPyVZSvrkF2rPCI7J+d5Z2fdR+ITiXdoX8HAACWJDqV4yD+cWQnOxLiqlKda5Ad7z/fm87y 0p2q9FipYf8OAACc+5oXTV7ZfTqR6NhNyVlT8kWLzrXIjlfOWslu3VIvD1wXRCfaqsz+HQAAOPcv 9vqX+3GfzntDdP79efNSnawheXsND9w1JTtROcsraXmiU21WFqFhGQAAziM6XukqO+DT69PRqY49 0dwe9CnXIDzrK/1m0OmO3b1jS1pr6ZvMEqFhGQAAziM6rcWBnuj8uyA6H9cqOtcmO166M8rIaL06 3bGNy1aA7oSGZQAAWJbotBqSI9Gx5SuvT8fr1bkKrjHZWZlvjGi7spfwVEVHQ8MyAACcQnRaDck/ jOxo0RllR4uOnb6yfTpXIzzrK/7mEPmT7thxdLuD586RHW8qiwNDAQDgXNc2ryHZHgVhE53xpbcl +eqWB96S7HhGbMfRbcPynSM6Vnai09FFaFgGAIDjXsMqDcladLzpq6s9DuJWZScaR3+X/ZJWtGn5 TvbLWV66I7LfsIzwAADAHKLjla+miM5PJTqvRnSusk/nFmTHCo/IbsNyq6TlvR2lOyK752chPAAA MJfojJIzRXT+NqKjy1c3k+pcu+zYb5ysf8c2Lkfyk/XuCMIDAAAzi45NdLIzr6zs6EM+bfnqasfM b1F2bLpjD0vzSlr2PC1vMqsynQUAADBVdLaJ6OgNyaPo/I/U+3RuSnRuQXas8GzU+1dKeFoJT0V4 rPgwkg4AAFNFR5eusjOv/p2Izs3t07ll2RHJ9++8yW55KpOeQdrpzloYSQcAgOmio8tXkejYslXU pzOKzpvE515dvfCsb/AbSmS3f0fEP0MrkxwrO5H4MJIOAAC9opMtDYx6dFp9OjrR2dyS6Nya7Nhv LlvS8tIdL+mxstM6PwvhAQCAyrVJT155iY6Wnf9RN69Pxx7w+WEk52ZE5xZlp9Kw3JIeT3ZWieyw gwcAAKJfvHXZSl+PosM9/y1+omMbknWfjm1IvplenVuVHSs8UcNyr/QMifT85g7hAQAAR3R0+aq1 HXmUG5vo/C35huSba0hGdnaFR1u17d/plR5PcuzHQXgAABAdkXxpYLRLx4qOd+7VWL7ylgbeVJ8O suP/Z28OlJ1WuiMIDwAAoiPx0sA3R3Ss5ESiY08y946DuEnRuXXZsd98dkJLHOnpFR1PZBAeAABE Z1sQHTtiXl0c6EnOzYoOshOfnyWy32zsiU9ryaD+WAgPAACi4y0NfJd4O7Lt0/kfJTo/pXaS+c32 6iA7sfBo214lotMqcWUTWggPAMDtio6dvHpRohP16HgNyT8T0bnphmRkpy08m+DveKLTalJuyQvC AwBwe6KTHQOhTzHPdul4fTqR6Ny88CA7vvB4Y+lZ4/JqouwgPAAAiI5XurLNyFp2es68ItlBdlLh kc9vmtXnN1JVeiLZWSE8AACIjtR7dPTLSqJz8yPmyE7/N6ko4ZFEdqrbk1sgPAAA1y06epeOtx35 b0d0xpKWTnTGPh2b6Nz8iDmyM/0btio7cqDsIDwAANcrOl6ikzUj2z4dPXk1HifBLh1k5+BvWG8k /SP4+9lenV4QHgCA6xedbGlgJjreKebs0kF2ZhceEf9ICGm8D+EBALgd0RlFpKcZOTvFnF06yM7J hEcf1jaH1CA8AACXLzladPQOnQ/Z3Yz861NexkRnlJv//rzppYGtwz0RHWTnaMKj0533jo+xmvjD g/AAAFym6ExJdHSq0xIdlgYiOycTno8Z5EYa36wIDwDAMkVHtzl4R0C8iL8wcBSd/zYv7Yi5PsWc pYHIzlmFZy6psb8h6LfvEB4AgMWJTuX0cp3o/CO7iY4uXUVLA70Rc0QH2Vm88PQK0Sg645EUWngE 6QEAWITovDdExzsCIpu80tuR34WlgcjOBQvPNrjpP7s3/2YwkkPKAwBwPtGxywLtHh1duoomr/5x REf36WyEXTrIzgUKz7ZDgPT77pTo2JQH4QEAOI/ojEv+9Fbk6AiI7ATzrEcH0UF2LkJ4to0fHP0D 1IoqbbqD8AAAnF509LLA6PiHv43gRKLjnXfFdmRk5yKFJ/s4kex4t7WRHoQHAOA0omOXBb7Jnx06 0TlXnujohYG6RwfRQXauSngikdkUxOc3dwgPAMBRJUekvSzQjpaPE1f2QE97qKfeo6OnrujRQXau SnjsVuboViltITwAAKcRnfdEdEaZ8fpzsrOuEB1k5yqFJ0t1WtLj7Vi4E0bTAQDmEp1sWWBLdP4n EJ1/JD7Uk2ZkZOfqhMebsoqkJpIefbOj6UxqAQAcJjpRovOaiE40Wu5NXHlHQHzIbpKP6CA7Fyk8 3jfvNvnBakmOd7sTJrUAAOYSnY9EdPQOHZvo6H4dnej8kvpZV4gOsnOxwvPu/D0rOq1kpyVANC4D APRJjkjciOwtC7THP0Q9OlZ0XhAdZOeWhKe1Z6f3Fi0ipI8HACAXHdufk+3Q8Y5/8MbL/1aio0fL sx06iA6yc1XCUylj9aY7nvTo/1v6eAAAfNHJJq7GrcijsHjHP+iSld2hY7cijwL1IZx1hexcufCs AtHxduzY20fyeiQ99PEAAMS/bFYmrkbR8RKdfweiY3fo2EQH0UF2rlp4RPxJrUo560N2a8kfgfRY caKPBwB4Ht59actWrYmrLNHRE1dWdN4QHWQH4dkVHU96toH0fCTSs0l+oOjjAYBbFp2obDUmOmN/ TnT8g71lo+XRskD7vA/IztULj/2Gb21W/ijcIuGxfTz6RsoDANcqOSLtspUWHW9Z4N+B6Oj+HDta zrJAZAfhUe/zUp5sB8+H+W3kvSA+Xh+PV9YSpAcArkh0WmWrUXK8iSsv0Rnf/kf8wzxZFojsQEF4 WhuWrexUE57ftwcjPNtEehAeALgG0amUraKJq78D2flH/P4cduggOxD8MIqRi9ZoetSk3Ep6rPis P29bJT12WkuQHgC44OdV75fFrGzl7dDRL72xct2fww4dZAeSH87KaHprMsuTnHfzg+fVjtdGbEh5 AOCSRSf6JbFVtvrREJ2obDVOXEWnliM6yA44wiOyP5pemcx6l/105z2RIZvy6BH1lZDyAMBlSU70 XFktW0Wi84/sHvuQHf3AaDmyAxOEp7J0sCU7WWnrMRCesaRFygMAl5LmiORlK+98K1u2+jtJc3TZ Su/PifpzEB1kB4rCM0pP9BtLVs7Sv8m8mx9MT34elPTcCSkPAFxumrMxz4He+VY/HNGxvTk2zfH2 5+g0ZxNIGCA70BCebfGHO2pW9mQnkh4tPKQ8AHBJac7WPAe+KdH5pUQnK1t5TchR2Yr+HGQHZvyt RaTeuBylO1p27G388yfxe3lIeQBgyWlO1IScbUOOEh2vCVmLjtf7SNkK2YEZfri9xuXektab+S1H v7TSM/by3AspDwBcRprTU7b6p5Hm/DBpTnS+FaKD7MCRhaeV8kSy85rIjpWeR1IeAFhomuM1IXuH eOptyHZRYFS2am1D9spWiA6yA0cQnmyfxNY8AWTSY29eL4+X8gyf0kPKAwCnlJzolzqd5rTGyq3k ULZCdmChP/w24ZHik4G9ebLz5ojPo/gNzIOwfRkAjvNc55Ws9KSVbUL2ylY/lNR4kuPtzqFshezA AlOejdR6eKrpjhWfbGJrLGtp4bEnqSM9ADBHmuP15nhLAr3+nH+CNOen5GdbWdERRAfZgfMJjzg/ jK0enqrsaOl5Uh/rXvzyFqUtAJhTcqppji1b/dOQnFF0XoSyFbIDFyE8W9ltGM6a+Fopz0tDfGxp SwvP2MsjQgMzAPRJjohfsop+UdO7c34moqMlJ2tCpmyF7MDCnywqx0y0RtJ7pOdLIDy6pDUIpS0A yJ+7vDTaGye3k1Z6d44nOp7k2CZkO5hB2QrZgQtKeSSRnuxoiaic9eKIjxak36WtByflsb08XmkL 6QG47TSnp2SVpTk20YlKVlkTMmUrZAcuTHi2JknZmt9WNs5vTdmUVquv5+nzYzwo8VnLbmnLTm1p 6UF4AG5XcuwGZO/wTq83R+/P+SdIcmzJKjry4cO5T4gOsgMLf0JppTzZWVrvsrt48CW5/f7zr4H0 6NLWRvypLVIegNuSHJH2UTdeA7JNczzRGV//GaQ5dsrUHo/DkkBkB2405fHKWVZ2xte/OsIzlrbW Snjo5wG4LdGJ+nKySdEX2d+b45Wtfsh+87FXsqpsQibNQXbghlKeqKz10kh6tBg9OSnP/afsrCXf zYP0AFxXmlM55iErWXlNyJnkeCWrVm8OooPswA2mPNlOnhfzW9eL+Q1qTHm09Dwo6fmQ3YWEA9ID cHOSUy1Z2TQnkpyf6t/qX76qaQ6ig+wAKc9eWaslO1p4Rul5NNKjhQfpAbh8wfEkx/slylsM6KU5 tjfH3nSSE5WsdAMyaQ6yA6Q84W9flZTnl/mtTD/xfDHC8yi7pa0p0oP4ACwrxRHp2+8V7czRk1Y/ xJ+usvtyfgWSQ5oDyA5PUqWUx5a03oPfyF4c2RlvX5X0PAUpT4/0CGkPwEVJTjRKrs+zaqU5VnKe zXOPnbKKJIc0B9kBUp6dt4dAerx9PJHo/FK/fX35FJ8vJuV5VMJTlR5BegAuSnJaJSuvN8dKju3L sZKTjZOT5iA7wBNYmvL0lrV+mSeyb+rlKD1fTNLzgPQAXKTkeGPknuS0GpB/BqJT7cvR2+H1/RLS HEB2oJryRP08bxKXtfSTmhaer07K0ys9K9lfToj0AMwvOCL75Z+N1Cas3pznhGfxe3N+GPHRE1bR KHm1ZIXoABcECL8n9MtRLEbZGPflrD+FZJSURyUuX4zYjKJjb18mSI9dTDiY+7vi+xxg9hTHS3u9 haTeAEPUm+NJTtR8/Ko+h5Wcjfg9OUgOcBGA0veFbRAelPDcKeHJpOeLkp6vndJjx9XtmVvZ9Jb3 tQBAnuKI5HtyojFyry/Hpjk/kxSn0nxs0xxKVoDswFFSnpVJVkbpuS8kPV+cxKclPd64ut3GPEh+ DIWQ9gCUUhyRuB/HK1e9y27f3pjEjMmMlhx9+2H+TA8zeEsBKVkBsgNnkR5dQrorJD2PSdLzJZCe 8e8/OknPWvzyVtbXQ9oDCE47xcn6cVorKLySlXfTf8dOWEWSY5uPkRxAduCo3yut0pYnPQ8m6Xkq SI+d3HqUeDHhWvK+HtIeQHJqKU5LcrwJTLsz59mRm5bkjB/7XfxRckpWgOzA2aXHS3q0hFSlJxMe nfI8St7T09vMjPgAKc5uihKNkEd9Oc+y35/z05Ege7yMTXJa+3JIcwDZgZN/72T9PMNE6fHSHm8/ z2MgPd7I+l0gPa0yFz8ncC2CI4UUJzsTz0tyfgWJznNDcnRPjh0jpy8HkB1YfMojRigOlZ4vQcLz VEh67p2kp1Liynp6+JmBSxEckXgBoG06fpf2wb92U/pz4fYrkRyb5HgTVpSsANmBq5Sex0R6vgTS Y5Oex6L0eM3M2c4exAeWLDgifpmqJ8XpkZxfidz0SI4da4/OsEJ0ANmBq5aeSH6eJkiPLnF5+3p0 2oP4wCUJjjgJjneUQ6VUFUnOL0dunhuCU+3J2ThfD5IDyA5cvfRE4vPFkZ+nidKTlbiyEXbEB04p NyJxSceWfWyKs1GCEaU4tun4xUjMc/DSCk7Uj4PkALIDSE8gPV7ak4mPJzxRM7MnPetEemziI1Jr bubnDOYWnFaZamqpKkty7PteCinOm+xuWkZyANkBpMdIj7eV2Ut7Hh3J8V5/TKTHW1JYFZ8pR1Tw cwctuZkiOK0FgG9JiuNJjn39ZUKKg+QAsgNIT0N6etOex0B4vMmtbGzdlrgy8VlJ+4gK5AemyI3I /iRVVKbSCYo9ymGK5ESNxp7gRNuOkRxAdoDvu07puXOkp1Lmim6PDemxaY8VH+8g0mriUzmugp/N 6xObTG4kSW8qZapqP07Uk1MVnFaK4+3IQXIA2QG+/xLpWTWkx0t7IvF5DITHlra8Ete9tMtcPeKD /NyG2EyRm6rgVEpVrZ6cluAcmuJskRxAdgDa0rOaMe3xyl2PQcoTiU+rzOWNsR8qPwjQZYuNvdj3 CI530rhtOPZKVa9KVKKSlX3fi/k3VnC8LcfRuVXsyQFkB6BDekTi87es9Nw50mPFx2tufkzeZ4Wn MsnVEp+ektch4+38bB9PalpiUxGcLL3JBMdLcd4cwfHKVlGTsT2jytuL827uWyQ4SA4gOwAzSY93 8Kg3vh6VuTz5yW4PzsuoxOWVuQ6RH5H5J734ua9fhFvL/CSQGnFEoFWe2pj0xCY4UakqKllF0mMT nKhMFU1UbQKBQ3IA2QE4kvREh4+2xCdKfR4awhM1M3vSM0V+ppa8KsnP6oaeG7YH/t2ekpQEUhON h09JcFqS8+qkNFH/zZRm400xxUFyANkBmOn7NEt7ot4e29+zDsQnSn482fFSnntHfO7N5281OB9S 8ooEsfJzv1rIc8vcF8tt8f3bwsvoaIaW3HgNxlZuIsl5DUTnpfjyVfZLVFGZihQHkB2AK0h7MvGJ Sl5e+uPJjtfIHPX3eFub50h9MgHq7QFaShK0neHvV8tRlZ6bjfT33rQSnKwXJxOd6H3ex3iXeJqq JTn2MUFyANkBOFPaEzU1j4JgRWItebnLSsxD4xZJz4MjVV7J607iJmdvtH0Qv48peizmkqDqn095 ftlO/LNeqWkJTaWpeFuQmx7BaSU5URnLS21aPTikOIDsAFxp2tOT+HjiY8telZf3xcSn1eCcHV1h U59K+hNJz6rxuFakc+pzzLbz7ZbUSHDB3so0uan03kRy05Kc10ai89YhNja98SapPhxxI8UBZAfg QtMeSaRnVRCfOyMi9xKXvu6T97XkJ2pubvX43AXSM6cAVURmakrUk8REF9wpi/sysdkWxCZb8vfh SMdbQXTeApmpik2U3lQTHFIcQHYAriTtkYnicydxz43XkHzfkJ+sqblXeu7M/a4mPz39P9JIfaZM ifU0CLf22vQIzqYoOC25qaQ4Wbmq92bToQ/npb3P2dI/JqoA2QG4gbSnR3yGIPXJ+n4qAtRqZr6X 9hj7IfIzx7h7pU+oRTbxtE1EqCo5Wb9Nb3oTJTnvTuLSEp73JK2JUhtvPDxKb1rj4qQ4gOwAID5h n0+U/kQCFMnPWvKRdfvv7Qh7dqvKT1V8vMdKpF4ay5KdSqkpS3mmCs6H+Mv9MsGJkpyq8LwHSU1F bD6c+xwlVRXBQXIA2QFAfFzxiZKfoUN+Ipm5T/7OuiA8UZmr1eszZaNz1gu1KiY8FVlplV6mNBdX SlSe4HwEQhKJS/b2R1FsrNxspb88heAAT/gA/Bx0iU8r+WklQJ6wrIs3r4R2V0x6MuGpjLZXG75X yb+VQHgqPTVZyuMt9tsmCU5FdLJE5yMRnvdEiFpS8xHc55bYIDgAyA7A7OIjQZpREaBW+esuEZsp gjNFeLyvKROdVjmsmuxkpadWP090TMMU0cmEJ2oMzpqGI6n5kHy0vTe5QXAAkB2AWcRHpL+sU0l/ WjLUIzKt/p1KWas6sRV9jatCuhOVoHov+D0bjT3ZqYjPh7T7aFpSkzUSRweHRkmWIDgAyA7AsX9W KtNJ1SQk6wEaOoWlV25a/TtTv55WutNKdTIRaB3nkPXpTJGfTeP1TeN1T9xaJanK6D2CA4DsAJwt 9emVn1VDGIainHh/ftf571uy0kp1op6fluxkk1NZ0uEdzLkp3D4KMhRJS1R+at3vav+RSFyaQm4A kB2ARaU+mfxk8tBq/B0ar7d260zZvSNSK2PZ99mv2V60bc9N1LdTbVKu7tSp/nlFZFpC09tvQ2kK ANkBuDr5kYJYDAfKUesoibnGzudqUJ5z/HxblKlN4X5UZKaa2gjpDQCyA3AL8lMRIJH5dt4Mxb9X WSq4lD07IvVjIloff06Z6dlUjNwAIDsAV/9z1zpxvFeIpCAuU87Gan3eIfk7LdmRQDgiqZgiPZW/ JzK9r4bUBgDZAYCJAjS3ELVeF8kPAe1Jn1pEAtKSDCkkKr2vV15WpQa5AUB2AGDiz+fqSFLUel+P XLU+RiQPh4rGdsLHrr6O2AAgOwCwgJ/Znh6hXnGqyk9FdKqSUU1Qth1vz1FqQmoAkB0AuBARav3b VefHXE24X9vOt3vl45CmYKQG4ML5vwIMADa9e26qZ/20AAAAAElFTkSuQmCC" id="image3980"/>
+        <g id="g3982">
+          <circle sodipodi:ry="275.909" sodipodi:rx="275.909" sodipodi:cy="278.93399" sodipodi:cx="279.51501" cx="279.51501" cy="278.93399" r="275.909" id="circle3984" d="m 555.42401,278.93399 c 0,152.38033 -123.52866,275.909 -275.909,275.909 -152.38033,0 -275.9089919,-123.52867 -275.9089919,-275.909 0,-152.38033 123.5286619,-275.9089961 275.9089919,-275.9089961 152.38034,0 275.909,123.5286661 275.909,275.9089961 z"/>
+        </g>
+      </g>
+      <g style="display:inline" id="Frame_copy_1_" display="inline"/>
+    </g>
+    <g style="display:none" id="Frame_copy_2" display="none" transform="translate(1042.0419,-279.83386)">
+      <circle style="fill:#ffffff;display:inline" sodipodi:ry="275.909" sodipodi:rx="275.909" sodipodi:cy="278.93399" sodipodi:cx="279.51501" display="inline" cx="279.51501" cy="278.93399" r="275.909" id="circle3988" d="m 555.42401,278.93399 c 0,152.38033 -123.52866,275.909 -275.909,275.909 -152.38033,0 -275.9089919,-123.52867 -275.9089919,-275.909 0,-152.38033 123.5286619,-275.9089961 275.9089919,-275.9089961 152.38034,0 275.909,123.5286661 275.909,275.9089961 z"/>
+      <g style="display:inline" id="Frame_copy_2_1_" display="inline"/>
+    </g>
+    <g id="Foreground_Grid_1_" transform="matrix(0.333692,0,0,0.333692,-610.81394,-151.23635)"/>
+    <g id="layer4" inkscape:label="box" style="display:inline" transform="matrix(0.6433923,0,0,0.6433923,563.19164,120.38376)"/>
+    <g id="layer5" inkscape:label="zip_app" style="display:inline" transform="matrix(0.6433923,0,0,0.6433923,563.19164,120.38376)"/>
+    <rect style="opacity:0.57786889;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" id="rect1327" width="0.64339232" height="0" x="563.78369" y="130.76021"/>
+    <path sodipodi:nodetypes="ccssscccccc" inkscape:connector-curvature="0" id="path5980" d="M 18.5,9 C 18.160156,9 18,9.2346178 18,9.5 l 0,107.96875 c 0,0.82158 0.679323,1.49953 1.5,1.5 L 74,119 c 0.05307,3e-5 3.273884,-0.008 3.9635,5e-5 6.540972,-4.50361 22.6373,-21.953284 31.58253,-30.955094 1.47685,-1.656484 0.4576,-0.370067 1.45391,-1.607456 L 111,9.5 C 111,9.1772826 110.83678,9 110.5,9 z" style="opacity:0.84653476;fill:url(#radialGradient5988);fill-opacity:1"/>
+    <path sodipodi:nodetypes="cscscssc" inkscape:connector-curvature="0" id="path6081" d="m 113.9,82.502986 c 0,4.465301 -4.49749,6.609952 -6.97972,8.293625 -5.10854,3.46508 -14.739114,3.52536 -20.520284,3.60638 -0.081,5.781159 0.76586,15.304599 -2.69922,20.413139 -1.68367,2.48224 -5.79051,7.98687 -8.70078,7.98687 -2.091359,1.5337 3.488204,11.21101 6.734971,8.31989 9.501888,-8.46107 45.998943,-30.20138 54.218083,-39.441569 2.04044,-2.29392 -17.0724,-11.965986 -22.05305,-9.178335 z" style="opacity:0.40099009;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter6118)" clip-path="url(#clipPath6093)"/>
+    <path style="fill:url(#linearGradient3895);fill-opacity:1;stroke:none" d="m 112,82.502986 c 0,4.465301 -2.79749,6.409952 -5.27972,8.093625 -5.10854,3.46508 -14.939114,3.32536 -20.720284,3.40638 -0.081,5.781159 0.16586,15.504599 -3.29922,20.613139 -1.68367,2.48224 -5.29051,5.38687 -8.20078,5.38687 2.31803,0 4.74284,-1.33476 7.58402,-4.08481 9.14197,-8.84873 17.36714,-16.13535 25.673154,-25.297529 C 109.67612,88.503916 112,86.97878 112,82.502986 z" id="path6011" inkscape:connector-curvature="0" sodipodi:nodetypes="cscscssc"/>
+    <path style="fill:#ffffff;fill-opacity:1;stroke:none" d="m 112.01875,83.2125 c -0.31643,3.899106 -3.52291,5.902807 -5.85,7.48125 C 101.06021,94.15883 90.83117,93.01898 85.05,93.1 c -0.081,5.781159 0.85258,16.31646 -2.6125,21.425 -1.473211,2.17196 -4.099456,4.6601 -6.7625,5.25 1.980459,-0.3623 3.884931,-1.66139 6.26875,-3.96875 0.339117,-0.38853 0.574297,-0.67895 1.10625,-1.5 3.46508,-5.10854 2.8315,-14.51259 2.9125,-20.29375 5.78117,-0.08102 15.81021,0.25883 20.91875,-3.20625 0.46542,-0.315689 1.59399,-1.187744 2.00625,-1.6 1.53629,-1.536293 2.90171,-2.613421 3.13125,-5.99375 z M 75.675,119.775 c -0.157658,0.0349 -0.313437,0.0414 -0.46875,0.0625 0.156991,-0.0169 0.310443,-0.0335 0.46875,-0.0625 z" id="path6122" inkscape:connector-curvature="0" sodipodi:nodetypes="cscsccccsscccc"/>
+    <path style="fill:none;stroke:url(#radialGradient3919);stroke-width:1.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;filter:url(#filter3909)" d="M 117.31456,81.861283 72.639105,125.34835" id="path3873" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" clip-path="url(#clipPath3889)"/>
+  </g>
+</svg>
\ No newline at end of file
diff --git a/Crow/Images/Icons/folder.svg b/Crow/Images/Icons/folder.svg
new file mode 100644 (file)
index 0000000..beac8a1
--- /dev/null
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+       <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+       <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" viewBox="0 0 128 128" style="overflow:visible;enable-background:new 0 0 128 128;" xml:space="preserve">
+<linearGradient id="XMLID_14_" gradientUnits="userSpaceOnUse" x1="53.9155" y1="91.1152" x2="55.8202" y2="110.6698">
+       <stop offset="0" style="stop-color:#999999"/>
+       <stop offset="1" style="stop-color:#4D4D4D"/>
+</linearGradient>
+<path style="opacity:0.2;fill:url(#XMLID_14_);" d="M0,96.969C0,101.766,4.52,104,6.5,104h98.342  c3.922-0.238,4.158-3.357,4.158-7.104v0.109C109,93.197,0,96.969,0,96.969z"/>
+<linearGradient id="XMLID_15_" gradientUnits="userSpaceOnUse" x1="56.8511" y1="91.5078" x2="58.8261" y2="111.7843">
+       <stop offset="0" style="stop-color:#999999"/>
+       <stop offset="1" style="stop-color:#4D4D4D"/>
+</linearGradient>
+<path style="opacity:0.2;fill:url(#XMLID_15_);" d="M0,97.969C0,102.078,3.266,105,6.5,105h101.553  c3.922-0.238,7.114-0.754,7.114-4.5L115,98.005C115,94.296,0,95.861,0,97.969z"/>
+<linearGradient id="XMLID_16_" gradientUnits="userSpaceOnUse" x1="57.9409" y1="89.6006" x2="60.2324" y2="113.1264">
+       <stop offset="0" style="stop-color:#999999"/>
+       <stop offset="1" style="stop-color:#4D4D4D"/>
+</linearGradient>
+<path style="opacity:0.2;fill:url(#XMLID_16_);" d="M110.053,97.824L0,95.969v3C0,104.609,4.52,106,6.5,106h103.167  c1.729-0.104,3.551-0.264,5.05-0.729c1.903-0.591,3.283-1.675,3.283-3.771C118,101.5,116.206,97.824,110.053,97.824z"/>
+<linearGradient id="XMLID_17_" gradientUnits="userSpaceOnUse" x1="47.3115" y1="10.7583" x2="58.863" y2="110.2979">
+       <stop offset="0" style="stop-color:#999999"/>
+       <stop offset="1" style="stop-color:#4D4D4D"/>
+</linearGradient>
+<path style="opacity:0.75;fill:url(#XMLID_17_);" d="M6.946,16.1C3.116,16.1,0,19.209,0,23.031v73.038C0,99.891,3.116,103,6.946,103  h93.108c3.83,0,6.945-3.109,6.945-6.931V32.097c0-3.822-3.115-6.931-6.945-6.931H62.729c-2.793,0-6.33-1.492-8.801-3.713  c0,0-1.035-0.928-1.035-0.928c-2.114-1.899-5.372-4.425-9.246-4.425H6.946z"/>
+<linearGradient id="XMLID_18_" gradientUnits="userSpaceOnUse" x1="35.979" y1="15.0229" x2="68.9291" y2="107.2834">
+       <stop offset="0" style="stop-color:#FFFFFF"/>
+       <stop offset="0.2191" style="stop-color:#F4F4F4"/>
+       <stop offset="0.6013" style="stop-color:#D8D8D8"/>
+       <stop offset="1" style="stop-color:#B3B3B3"/>
+</linearGradient>
+<path style="fill:url(#XMLID_18_);" d="M106,96.069c0,3.263-2.676,5.931-5.945,5.931H6.946C3.676,102,1,99.332,1,96.069V23.031  C1,19.769,3.676,17.1,6.946,17.1h36.701c3.271,0,6.149,1.987,8.578,4.169l1.034,0.928c2.429,2.182,6.2,3.969,9.47,3.969h37.326  c3.27,0,5.945,2.668,5.945,5.931V96.069z"/>
+<path style="fill:#FFFFFF;" d="M100.055,26.167H62.729c-3.27,0-7.041-1.787-9.47-3.969l-1.034-0.928  c-2.428-2.182-5.307-4.169-8.578-4.169H6.946C3.676,17.1,1,19.769,1,23.031v1C1,20.769,3.676,18.1,6.946,18.1h36.701  c3.271,0,6.149,1.987,8.578,4.169l1.034,0.928c2.429,2.182,6.2,3.969,9.47,3.969h37.326c3.27,0,5.945,2.668,5.945,5.931v-1  C106,28.835,103.324,26.167,100.055,26.167z"/>
+<linearGradient id="XMLID_19_" gradientUnits="userSpaceOnUse" x1="49.9219" y1="23.2446" x2="58.3703" y2="104.0195">
+       <stop offset="0" style="stop-color:#D9D9D9"/>
+       <stop offset="0.3749" style="stop-color:#CECECE"/>
+       <stop offset="1" style="stop-color:#B3B3B3"/>
+</linearGradient>
+<path style="fill:url(#XMLID_19_);" d="M3.344,99.816c0,0,0.984,0.168,1.615-0.284C5.625,99.054,6,97.695,6,95.896V54.132  c0-3.808,3.117-6.905,6.947-6.905h37.308c2.996,0,6.582-2.007,8.807-3.997l1.033-0.924c3.164-2.831,6.188-4.207,9.247-4.207H106  v-0.6H68.342c-3.059,0-6.083,1.376-9.247,4.207l-1.033,0.924c-2.225,1.989-5.811,3.997-8.807,3.997H11.947  C8.117,46.627,5,49.725,5,53.533v41.763c0.062,2.017-0.495,3.878-1.167,4.351C3.701,99.739,3.344,99.816,3.344,99.816z"/>
+<linearGradient id="XMLID_20_" gradientUnits="userSpaceOnUse" x1="54.9907" y1="39.2622" x2="63.2101" y2="110.0893">
+       <stop offset="0" style="stop-color:#999999"/>
+       <stop offset="1" style="stop-color:#4D4D4D"/>
+</linearGradient>
+<path style="opacity:0.75;fill:url(#XMLID_20_);" d="M69.342,38.1c-3.059,0-6.083,1.376-9.247,4.207l-1.033,0.924  c-2.225,1.989-5.811,3.996-8.807,3.996H12.947C9.117,47.227,6,50.325,6,54.132v41.763c0,1.847-0.37,3.165-1.015,3.619  C4.607,99.78,3.94,99.97,3.171,99.78c-0.762-0.188-1.067-0.562-1.563-1.022c-0.241,0.421,0.332,2.104,0.705,2.414  c0.219,0.183,2.062,1.719,4.344,1.719L109.053,103c3.923-0.238,6.947-3.358,6.947-7.104V45.005c0-3.807-3.116-6.905-6.947-6.905  H69.342z"/>
+<radialGradient id="XMLID_21_" cx="79.6152" cy="116.7344" r="88.0417" gradientUnits="userSpaceOnUse">
+       <stop offset="0" style="stop-color:#FFDD70"/>
+       <stop offset="0.4225" style="stop-color:#FFAB43"/>
+       <stop offset="0.8022" style="stop-color:#FF841F"/>
+       <stop offset="1" style="stop-color:#FF7512"/>
+</radialGradient>
+<path style="fill:url(#XMLID_21_);" d="M7,95.896c0,3.417-1.516,5.839-4.047,4.558c0,0,1.859,1.547,3.547,1.547s102.553,0,102.553,0  c3.271-0.2,5.947-2.857,5.947-6.104V45.005c0-3.248-2.676-5.905-5.947-5.905H69.342c-3.271,0-6.151,1.779-8.58,3.952l-1.033,0.924  c-2.43,2.172-6.202,4.251-9.474,4.251H12.947C9.676,48.227,7,50.884,7,54.132V95.896z"/>
+<radialGradient id="XMLID_22_" cx="126.5" cy="130.1982" r="82.3742" gradientUnits="userSpaceOnUse">
+       <stop offset="0" style="stop-color:#F2D26A"/>
+       <stop offset="0.2621" style="stop-color:#F6B650"/>
+       <stop offset="0.7541" style="stop-color:#FC8723"/>
+       <stop offset="1" style="stop-color:#FF7512"/>
+</radialGradient>
+<path style="fill:url(#XMLID_22_);" d="M109.053,39.1H106V102c2.578,0,3.053,0,3.053,0c3.271-0.2,5.947-2.857,5.947-6.104V45.005  C115,41.757,112.324,39.1,109.053,39.1z"/>
+<linearGradient id="XMLID_23_" gradientUnits="userSpaceOnUse" x1="132.5059" y1="35.3008" x2="40.7597" y2="115.4526">
+       <stop offset="0" style="stop-color:#FFDD70"/>
+       <stop offset="0.3826" style="stop-color:#FFB047"/>
+       <stop offset="0.791" style="stop-color:#FF8521"/>
+       <stop offset="1" style="stop-color:#FF7512"/>
+</linearGradient>
+<path style="fill:url(#XMLID_23_);" d="M109.053,100c0,0-100.947-0.52-102.553,0c-0.324,0.104-0.608,0.189-0.866,0.26  c-0.623,0.479-1.739,0.85-2.638,0.19C3.479,100.83,5.083,102,6.5,102c1.688,0,102.553,0,102.553,0  c3.271-0.2,5.947-2.857,5.947-6.104v-1C115,98.143,112.324,99.8,109.053,100z"/>
+<radialGradient id="XMLID_24_" cx="87.5469" cy="108.1338" r="112.4545" gradientUnits="userSpaceOnUse">
+       <stop offset="0" style="stop-color:#FFF3CC"/>
+       <stop offset="0.1912" style="stop-color:#FFDBAA"/>
+       <stop offset="0.5738" style="stop-color:#FFB06C"/>
+       <stop offset="0.854" style="stop-color:#FF9445"/>
+       <stop offset="1" style="stop-color:#FF8A36"/>
+</radialGradient>
+<path style="fill:url(#XMLID_24_);" d="M58.636,69.891C86.75,66.5,115,65.75,115,65.75V45.005c0-3.248-2.676-5.905-5.947-5.905  H69.342c-3.271,0-6.151,1.779-8.58,3.952l-1.033,0.924c-2.43,2.172-6.202,4.251-9.474,4.251H12.947C9.676,48.227,7,50.884,7,54.132  V84.75C7,84.75,30.521,73.281,58.636,69.891z"/>
+<linearGradient id="XMLID_25_" gradientUnits="userSpaceOnUse" x1="59.6372" y1="28.6401" x2="65.5115" y2="120.5861">
+       <stop offset="0" style="stop-color:#EBDBA6"/>
+       <stop offset="1" style="stop-color:#FF7512"/>
+</linearGradient>
+<path style="fill:url(#XMLID_25_);" d="M109.053,39.1H69.342c-3.271,0-6.151,1.779-8.58,3.952l-1.033,0.924  c-2.43,2.172-6.202,4.251-9.474,4.251H12.947C9.676,48.227,7,50.884,7,54.132v1c0-3.248,2.676-5.905,5.947-5.905h37.308  c3.271,0,7.044-2.079,9.474-4.251l1.033-0.924c2.429-2.173,5.309-3.952,8.58-3.952h39.711c3.271,0,5.947,2.657,5.947,5.905v-1  C115,41.757,112.324,39.1,109.053,39.1z"/>
+<linearGradient id="XMLID_26_" gradientUnits="userSpaceOnUse" x1="103.9541" y1="11.4053" x2="108.0303" y2="106.0095">
+       <stop offset="0" style="stop-color:#999999"/>
+       <stop offset="1" style="stop-color:#4D4D4D"/>
+</linearGradient>
+<rect x="106" y="39" style="opacity:0.15;fill:url(#XMLID_26_);" width="1" height="63"/>
+<path style="fill:#F3AF61;" d="M42,24c0,1.1-0.9,2-2,2H9c-1.1,0-2-0.9-2-2v-2c0-1.1,0.9-2,2-2h31c1.1,0,2,0.9,2,2V24z"/>
+<path style="fill:#CCCCCC;" d="M8.5,42C7.672,42,7,42.672,7,43.5S7.672,45,8.5,45s1.5-0.672,1.5-1.5S9.328,42,8.5,42z M17.5,42  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S18.328,42,17.5,42z M26.5,42c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S27.328,42,26.5,42z M35.5,42c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S36.328,42,35.5,42z M44.5,42c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S45.328,42,44.5,42z M53.5,42  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S54.328,42,53.5,42z"/>
+<path style="opacity:0.07;fill:#802600;" d="M8.5,51C7.672,51,7,51.672,7,52.5S7.672,54,8.5,54s1.5-0.672,1.5-1.5S9.328,51,8.5,51z   M17.5,51c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S18.328,51,17.5,51z M26.5,51c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S27.328,51,26.5,51z M35.5,51c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S36.328,51,35.5,51z M44.5,51c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S45.328,51,44.5,51z M53.5,51  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S54.328,51,53.5,51z M62.5,51c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S63.328,51,62.5,51z M71.5,51c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S72.328,51,71.5,51z M80.5,51c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S81.328,51,80.5,51z M89.5,51  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S90.328,51,89.5,51z M98.5,51c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S99.328,51,98.5,51z M62.5,42c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S63.328,42,62.5,42z M71.5,42c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S72.328,42,71.5,42z M80.5,42  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S81.328,42,80.5,42z M89.5,42c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S90.328,42,89.5,42z M98.5,45c0.828,0,1.5-0.672,1.5-1.5S99.328,42,98.5,42S97,42.672,97,43.5  S97.672,45,98.5,45z M8.5,60C7.672,60,7,60.672,7,61.5S7.672,63,8.5,63s1.5-0.672,1.5-1.5S9.328,60,8.5,60z M17.5,60  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S18.328,60,17.5,60z M26.5,60c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S27.328,60,26.5,60z M35.5,60c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S36.328,60,35.5,60z M44.5,60c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S45.328,60,44.5,60z M53.5,60  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S54.328,60,53.5,60z M62.5,60c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S63.328,60,62.5,60z M71.5,60c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S72.328,60,71.5,60z M80.5,60c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S81.328,60,80.5,60z M89.5,60  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S90.328,60,89.5,60z M98.5,60c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S99.328,60,98.5,60z M8.5,69C7.672,69,7,69.672,7,70.5S7.672,72,8.5,72s1.5-0.672,1.5-1.5  S9.328,69,8.5,69z M17.5,69c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S18.328,69,17.5,69z M26.5,69  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S27.328,69,26.5,69z M35.5,69c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S36.328,69,35.5,69z M44.5,69c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S45.328,69,44.5,69z M53.5,69c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S54.328,69,53.5,69z M62.5,69  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S63.328,69,62.5,69z M71.5,69c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S72.328,69,71.5,69z M80.5,69c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S81.328,69,80.5,69z M89.5,69c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S90.328,69,89.5,69z M98.5,69  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S99.328,69,98.5,69z M8.5,78C7.672,78,7,78.672,7,79.5  S7.672,81,8.5,81s1.5-0.672,1.5-1.5S9.328,78,8.5,78z M17.5,78c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S18.328,78,17.5,78z M26.5,78c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S27.328,78,26.5,78z M35.5,78  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S36.328,78,35.5,78z M44.5,78c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S45.328,78,44.5,78z M53.5,78c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S54.328,78,53.5,78z M62.5,78c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S63.328,78,62.5,78z M71.5,78  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S72.328,78,71.5,78z M80.5,78c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S81.328,78,80.5,78z M89.5,78c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S90.328,78,89.5,78z M98.5,78c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S99.328,78,98.5,78z M8.5,87  C7.672,87,7,87.672,7,88.5S7.672,90,8.5,90s1.5-0.672,1.5-1.5S9.328,87,8.5,87z M17.5,87c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S18.328,87,17.5,87z M26.5,87c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S27.328,87,26.5,87z M35.5,87c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S36.328,87,35.5,87z M44.5,87  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S45.328,87,44.5,87z M53.5,87c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S54.328,87,53.5,87z M62.5,87c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S63.328,87,62.5,87z M71.5,87c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S72.328,87,71.5,87z M80.5,87  c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S81.328,87,80.5,87z M89.5,87c-0.828,0-1.5,0.672-1.5,1.5  s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5S90.328,87,89.5,87z M98.5,87c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5s1.5-0.672,1.5-1.5  S99.328,87,98.5,87z"/>
+</svg>
\ No newline at end of file
diff --git a/Crow/Images/Icons/member.svg b/Crow/Images/Icons/member.svg
new file mode 100644 (file)
index 0000000..af654a9
--- /dev/null
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="64"
+   height="64"
+   viewBox="0 0 63.999998 63.999998"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="member.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.9604882"
+     inkscape:cx="-66.406882"
+     inkscape:cy="33.211154"
+     inkscape:document-units="px"
+     inkscape:current-layer="svg2"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     units="px"
+     inkscape:window-width="1280"
+     inkscape:window-height="1009"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <g
+     id="ctor">
+    <rect
+       style="opacity:1;fill:#3fff69;fill-opacity:1;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:0.74509804"
+       id="rect4185"
+       width="58"
+       height="58"
+       x="3"
+       y="3" />
+    <text
+       sodipodi:linespacing="125%"
+       id="text4176"
+       y="51.758148"
+       x="7.4200573"
+       style="font-style:normal;font-weight:normal;font-size:57.0553093px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+       xml:space="preserve"><tspan
+         y="51.758148"
+         x="7.4200573"
+         id="tspan4178"
+         sodipodi:role="line">#</tspan></text>
+  </g>
+  <circle
+     style="opacity:1;fill:#70bbff;fill-opacity:1;stroke:#000000;stroke-width:5.99999905;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:0.74509804"
+     id="property"
+     cx="32"
+     cy="32"
+     r="29" />
+  <metadata
+     id="metadata4158">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <rect
+     style="opacity:1;fill:#ff543f;fill-opacity:1;stroke:#000000;stroke-width:6;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:0.74509804"
+     id="method"
+     width="58"
+     height="58"
+     x="3"
+     y="3" />
+  <path
+     style="fill:#f7ff3f;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.06100774px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+     d="M 22.471298,1.892924 8.8054675,32.128113 30.276085,31.763018 10.90935,62.764759 56.012472,21.268821 30.415746,22.059981 47.587854,2.0447011 Z"
+     id="event"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/Crow/Images/Icons/tetra.png b/Crow/Images/Icons/tetra.png
new file mode 100644 (file)
index 0000000..b0c855a
Binary files /dev/null and b/Crow/Images/Icons/tetra.png differ
diff --git a/Crow/Images/button.svg b/Crow/Images/button.svg
new file mode 100644 (file)
index 0000000..314f63f
--- /dev/null
@@ -0,0 +1,16 @@
+ <svg width="200" height="100">
+       <g id="normal">
+               <rect width="98%" height="98%" 
+                       rx="10px" ry="10px" x="2%" y="2%"
+                       style="fill:rgb(50,50,50);" />
+               <rect width="98%" height="98%" 
+                       rx="10px" ry="10px" 
+                       style="fill:rgb(200,200,200);" />
+       </g>
+       <g id="pressed">
+               <rect width="98%" height="98%" 
+                       rx="10px" ry="10px" x="2%" y="2%"
+                       style="fill:rgb(200,200,200);" />
+       </g>
+
+</svg> 
diff --git a/Crow/Images/crow0.svg b/Crow/Images/crow0.svg
new file mode 100644 (file)
index 0000000..c621130
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   height="35.987217"
+   width="51.116982"
+   version="1.1"
+   id="svg2">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <path
+     id="path2818"
+     d="m 36.232985,35.977162 c -0.02345,-0.0094 -0.04263,-0.04436 -0.04263,-0.07772 0,-0.03337 -0.04543,-0.117846 -0.100965,-0.187724 -0.05553,-0.06987 -0.10986,-0.152552 -0.120738,-0.183728 -0.04888,-0.140096 -0.547064,-0.441575 -0.740404,-0.448061 -0.01333,-6.73e-4 -0.0417,0.06441 -0.06301,0.144127 -0.0213,0.07971 -0.05448,0.164118 -0.0737,0.187567 -0.06807,0.08303 -0.2351,0.04596 -0.448164,-0.09947 -0.114492,-0.07815 -0.231452,-0.140793 -0.259915,-0.139198 -0.103032,0.0057 -0.22753,-0.0647 -0.284401,-0.160973 -0.105659,-0.178872 -0.451937,-0.41031 -0.613884,-0.41031 -0.11287,0 -0.378547,-0.121442 -0.488394,-0.223239 -0.06283,-0.05824 -0.129597,-0.08369 -0.219515,-0.08369 -0.191898,0 -0.291236,-0.05025 -0.332315,-0.168082 -0.02007,-0.05761 -0.05795,-0.104746 -0.08415,-0.104746 -0.02621,0 -0.07371,-0.02879 -0.105549,-0.06398 -0.03185,-0.03519 -0.108169,-0.07213 -0.169604,-0.08211 -0.219849,-0.03568 -0.937873,-0.414299 -0.993727,-0.524009 -0.01875,-0.03685 -0.103161,-0.143806 -0.187567,-0.237705 -0.189643,-0.210956 -0.537045,-0.371869 -0.741262,-0.343338 -0.710425,0.09925 -0.737631,0.100685 -1.030367,0.05449 -0.337983,-0.05334 -0.630446,-0.05889 -1.115893,-0.02117 -0.331487,0.02576 -0.347801,0.02387 -0.368967,-0.04283 -0.01219,-0.03838 0.0026,-0.154623 0.03266,-0.258318 0.03015,-0.103694 0.04455,-0.205124 0.03202,-0.225402 -0.04471,-0.07234 -0.314032,-0.0065 -0.532991,0.130268 -0.165667,0.103489 -0.230973,0.169125 -0.288563,0.290041 -0.07126,0.149603 -0.19268,0.232754 -0.339892,0.232754 -0.09327,0 -0.01149,-0.448641 0.108895,-0.597398 0.0301,-0.03719 0.045,-0.04843 0.03312,-0.02499 -0.01262,0.02492 3.4e-5,0.04263 0.03051,0.04263 0.03229,0 0.04463,-0.01945 0.03247,-0.05115 -0.0108,-0.02813 -0.0027,-0.05115 0.01813,-0.05115 0.02077,0 0.03776,-0.02034 0.03776,-0.04521 0,-0.05853 0.151433,-0.201223 0.181571,-0.171088 0.01268,0.01268 0.02305,0.003 0.02305,-0.02158 0,-0.05501 0.190827,-0.241992 0.218611,-0.214209 0.01107,0.01107 0.02012,0.0013 0.02012,-0.02169 0,-0.02299 0.01358,-0.03341 0.03018,-0.02314 0.0166,0.01026 0.07415,0.0046 0.127887,-0.01261 0.05374,-0.01721 0.185946,-0.03746 0.293797,-0.04502 0.154262,-0.01082 0.196092,-0.0032 0.196092,0.03533 0,0.03062 0.02017,0.04134 0.05362,0.02851 0.02949,-0.01132 0.08321,-0.0048 0.119365,0.01461 0.04469,0.02391 0.06573,0.02399 0.06573,0 0,-0.0546 0.166343,-0.02716 0.19016,0.03136 0.01696,0.04168 0.02726,0.03685 0.05065,-0.02383 0.03017,-0.0782 0.05209,-0.07969 0.33327,-0.02256 0.04625,0.0094 0.07104,0.0023 0.05918,-0.01685 -0.01918,-0.03103 0.105189,-0.09308 0.158609,-0.07913 0.01351,0.0035 0.0409,-0.02412 0.06088,-0.06145 0.01998,-0.03733 0.06279,-0.06787 0.09513,-0.06787 0.03235,0 0.07872,-0.0319 0.103074,-0.07089 0.03874,-0.06204 0.03597,-0.07306 -0.02225,-0.08828 -0.04068,-0.01065 -0.07465,-0.05808 -0.08746,-0.122132 -0.01151,-0.0576 -0.03098,-0.0947 -0.04325,-0.08243 -0.02243,0.02243 -0.09396,-0.07925 -0.134223,-0.190818 -0.01192,-0.03303 -0.05709,-0.06895 -0.100386,-0.07981 -0.0433,-0.01087 -0.08702,-0.04139 -0.09717,-0.06783 -0.01015,-0.02644 -0.03811,-0.04866 -0.06215,-0.04937 -0.02403,-6.72e-4 -0.09734,-0.06977 -0.162897,-0.153463 -0.06556,-0.08369 -0.141017,-0.152171 -0.167679,-0.152171 -0.02665,0 -0.03909,-0.0094 -0.02762,-0.02084 0.02949,-0.02949 -0.161533,-0.183774 -0.227545,-0.183774 -0.03567,0 -0.05475,-0.02971 -0.05475,-0.08526 0,-0.04689 -0.01667,-0.08526 -0.03705,-0.08526 -0.02039,0 -0.132932,-0.09206 -0.250118,-0.204591 -0.117184,-0.112527 -0.225744,-0.193097 -0.241239,-0.179042 -0.0155,0.01404 -0.01813,0.008 -0.0059,-0.01351 0.02148,-0.0376 -0.06692,-0.09775 -0.12476,-0.08487 -0.01546,0.0034 -0.01943,-0.0078 -0.0088,-0.02496 0.01062,-0.01717 -0.02277,-0.05853 -0.0742,-0.09191 -0.05142,-0.03337 -0.113546,-0.08877 -0.138053,-0.123093 -0.02451,-0.03432 -0.06672,-0.0624 -0.09378,-0.0624 -0.02707,0 -0.04922,-0.01355 -0.04922,-0.03012 0,-0.0438 -0.778285,-0.624964 -0.930964,-0.695162 -0.0729,-0.03352 -0.164401,-0.05081 -0.209278,-0.03955 -0.05655,0.01418 -0.102151,-0.0031 -0.15683,-0.05944 -0.0424,-0.0437 -0.06447,-0.05739 -0.04905,-0.03043 0.01542,0.02698 -0.03574,-0.0023 -0.113694,-0.06486 -0.140423,-0.112848 -0.199258,-0.210672 -0.162485,-0.270173 0.01048,-0.01696 -0.0034,-0.03946 -0.03092,-0.05001 -0.03157,-0.0121 -0.04839,-0.06147 -0.04566,-0.133995 0.0046,-0.123415 -0.115972,-0.333547 -0.242202,-0.421962 -0.03969,-0.0278 -0.06324,-0.06494 -0.05237,-0.08255 0.01089,-0.01761 -0.0042,-0.04121 -0.03354,-0.05247 -0.02932,-0.01125 -0.05331,-0.04833 -0.05331,-0.0824 0,-0.03407 -0.03837,-0.107533 -0.08526,-0.163263 -0.07704,-0.09156 -0.08519,-0.130424 -0.08459,-0.403332 0.0011,-0.467434 0.102818,-0.951299 0.346875,-1.649081 0.133708,-0.382291 0.234679,-0.776483 0.280602,-1.095504 0.01999,-0.138863 0.01188,-0.170521 -0.06808,-0.265547 -0.09126,-0.108463 -0.277674,-0.207699 -0.390138,-0.207699 -0.03326,0 -0.167911,-0.04572 -0.299229,-0.101598 -0.334854,-0.142493 -0.698295,-0.199641 -1.524701,-0.239741 -0.393891,-0.01911 -0.856189,-0.05756 -1.027322,-0.08543 -0.171134,-0.02796 -0.404168,-0.05076 -0.517855,-0.05076 -0.113686,0 -0.249901,-0.01718 -0.302703,-0.03821 -0.0528,-0.02101 -0.22913,-0.0397 -0.391836,-0.04152 -0.16271,-0.0018 -0.288412,-0.01532 -0.27934,-0.03 0.0091,-0.01468 -0.01127,-0.02647 -0.0452,-0.02621 -0.03393,2.24e-4 -0.315468,-0.0481 -0.625641,-0.107494 l -0.563945,-0.107977 -0.33979,0.10758 c -0.186882,0.05917 -0.349511,0.107539 -0.361388,0.107494 -0.04086,-1.36e-4 -0.05638,-0.13324 -0.01741,-0.149221 0.02145,-0.0088 -0.0023,-0.01721 -0.05276,-0.01869 -0.05047,-0.0015 -0.100161,0.01089 -0.110412,0.02747 -0.03208,0.05191 -0.458126,0.118498 -0.505769,0.07904 -0.02811,-0.02328 -0.09385,-0.0242 -0.195783,-0.0028 -0.08441,0.01777 -0.280073,0.0495 -0.434816,0.07054 -0.154743,0.02104 -0.281352,0.05283 -0.281352,0.07068 0,0.01786 -0.02302,0.02362 -0.05115,0.01281 -0.02814,-0.0108 -0.05123,-0.0086 -0.05131,0.0049 0,0.01348 -0.05615,0.02741 -0.124603,0.03097 -0.06845,0.0036 -0.1336,0.01891 -0.144786,0.0341 -0.02606,0.03542 -0.139983,0.04146 -0.796184,0.04221 -0.297591,4.49e-4 -0.537126,0.01439 -0.537126,0.0315 0,0.01698 -0.134282,0.03143 -0.298403,0.0321 -0.369505,0.0015 -0.539084,0.01992 -0.844055,0.09164 -0.131298,0.03088 -0.373004,0.06513 -0.537126,0.0761 -0.164122,0.01097 -0.298404,0.03207 -0.298404,0.04687 0,0.01481 -0.05371,0.0182 -0.119361,0.0076 -0.08039,-0.01304 -0.119361,-0.0061 -0.119361,0.02122 0,0.02232 -0.01443,0.03166 -0.03208,0.02075 -0.03408,-0.02106 -0.587009,0.111706 -0.615884,0.147893 -0.0094,0.01176 -0.04775,0.02527 -0.08526,0.03003 -0.319552,0.04061 -0.388045,0.05571 -0.371812,0.08197 0.01026,0.01661 -0.02466,0.02725 -0.07759,0.02367 -0.107275,-0.0073 -0.331986,0.114563 -0.292219,0.15843 0.014,0.01544 0.0067,0.01729 -0.01626,0.0041 -0.03986,-0.0229 -0.410541,0.170723 -0.776766,0.405746 -0.09378,0.06018 -0.400713,0.229852 -0.682064,0.377042 -0.8431486,0.441091 -1.5106691,0.786933 -1.9438848,1.00712 -0.331279,0.168378 -0.7656083,0.411685 -1.2106655,0.678201 -0.1208071,0.07234 -0.7235464,0.348753 -1.0060453,0.461358 -0.1688108,0.06729 -0.3529682,0.143067 -0.4092389,0.168389 -0.3782305,0.170213 -0.4488005,0.204855 -0.4944967,0.24276 -0.1118065,0.09275 -0.7795227,0.48269 -0.974639,0.569184 -0.1140235,0.05055 -0.3212008,0.108223 -0.4603938,0.12817 -0.2794774,0.04005 -0.6793677,0.03386 -0.6793677,-0.01051 0,-0.01562 -0.014897,-0.01916 -0.033103,-0.0079 -0.018206,0.01125 -0.04289,-0.01852 -0.054852,-0.0662 -0.011962,-0.04766 -0.028767,-0.08665 -0.037344,-0.08665 -0.027842,0 -0.1640932,0.0777 -0.1816285,0.103583 -0.024028,0.03546 -0.2704515,0.135139 -0.3340901,0.135139 -0.040327,0 -0.033244,-0.02142 0.029742,-0.08996 l 0.082677,-0.08996 -0.1534646,0.02493 c -0.084405,0.01371 -0.2762361,0.02752 -0.4262904,0.0307 -0.1617809,0.0034 -0.3133657,0.02625 -0.3724277,0.0561 -0.076685,0.03876 -0.1028397,0.04063 -0.113677,0.0081 -0.00774,-0.02322 -0.050258,-0.04223 -0.09448,-0.04223 -0.044221,0 -0.090781,-0.0168 -0.1034652,-0.03732 -0.012684,-0.02052 -0.05963,-0.03032 -0.1043224,-0.02178 -0.044694,0.0085 -0.0812605,0.0028 -0.0812605,-0.01277 0,-0.01557 -0.0226251,-0.01963 -0.0502787,-0.009 -0.0276536,0.01062 -0.0747891,-0.0052 -0.10474605,-0.03517 -0.0299569,-0.02996 -0.0836695,-0.05446 -0.11936206,-0.05446 -0.0755134,0 -0.16300798,-0.155442 -0.14396948,-0.255775 0.0216458,-0.114071 0.0858903,-0.269677 0.13551736,-0.328235 0.0258287,-0.03048 0.0424846,-0.07582 0.0370134,-0.100762 -0.005471,-0.02494 0.0126179,-0.04604 0.0401989,-0.04689 0.0275816,-8.75e-4 0.0695576,-0.03992 0.0932812,-0.08681 0.0237239,-0.04689 0.0433594,-0.07187 0.0436366,-0.05551 2.7333e-4,0.01638 0.0233532,0.0108 0.0512819,-0.01239 0.0279281,-0.02318 0.0409047,-0.05812 0.0288344,-0.07765 -0.0120695,-0.01954 -0.00597,-0.02563 0.013563,-0.01355 0.03826,0.02364 0.1334119,-0.06902 0.102556,-0.09987 -0.010234,-0.01023 -0.081291,0.01337 -0.15790503,0.05246 -0.19132318,0.0976 -0.53029094,0.131726 -0.60948002,0.06135 -0.040574,-0.03605 -0.10602968,-0.04828 -0.20760549,-0.03876 L 0,26.723956 0.13129745,26.603285 c 0.20194096,-0.185598 1.15569925,-0.834706 1.22646285,-0.834706 0.017944,0 1.0011722,-0.593762 1.1596288,-0.700289 l 0.1062908,-0.07146 -0.097498,-0.04316 c -0.075194,-0.03329 -0.09082,-0.05618 -0.068306,-0.100101 0.016056,-0.03132 0.038207,-0.148677 0.049225,-0.2608 0.013936,-0.141813 0.038705,-0.216631 0.081377,-0.245814 0.1348325,-0.09221 0.317117,-0.268214 0.317117,-0.306188 0,-0.04333 -0.2144179,0.01817 -0.8473768,0.243035 -0.1940842,0.06895 -0.3609084,0.117337 -0.3707213,0.107524 -0.030038,-0.03004 0.1889381,-0.28351 0.3932649,-0.455219 0.1064018,-0.08942 0.2148835,-0.182797 0.2410706,-0.207519 0.134978,-0.127412 0.6824316,-0.46318 1.0116807,-0.620491 0.2054297,-0.09815 0.4118743,-0.205241 0.4587663,-0.237974 0.046892,-0.03274 0.2270451,-0.133333 0.40034,-0.223546 0.1732947,-0.09022 0.3093674,-0.169742 0.3023838,-0.176726 -0.00698,-0.007 -0.1087422,0.01965 -0.226129,0.0592 -0.1501313,0.05057 -0.2241353,0.06119 -0.249524,0.0358 -0.025388,-0.02539 -0.024637,-0.03609 0.00253,-0.03609 0.021244,0 0.048451,-0.03096 0.060459,-0.06879 0.019185,-0.06045 0.1680893,-0.221549 0.4635947,-0.501568 0.048755,-0.0462 0.1428871,-0.117089 0.2091823,-0.157532 0.2161395,-0.131856 0.3951126,-0.257621 0.4169899,-0.29302 0.022754,-0.03682 1.0610754,-0.562441 1.1881729,-0.601483 0.04125,-0.01267 0.1911105,-0.08059 0.3330257,-0.150923 0.1419153,-0.07034 0.2933966,-0.139111 0.3366242,-0.152832 0.043226,-0.01372 0.1463559,-0.07271 0.2291753,-0.131083 0.1199707,-0.08456 0.1625792,-0.09864 0.2096072,-0.06927 0.047284,0.02953 0.1538875,-0.0087 0.5358933,-0.192258 0.2622766,-0.126017 0.5689448,-0.264972 0.6814862,-0.308789 0.1125401,-0.04382 0.2249981,-0.09985 0.2499076,-0.124513 0.081951,-0.08115 0.1773194,-0.116582 0.3449729,-0.128175 0.1131113,-0.0078 0.1886589,-0.03475 0.2391522,-0.08524 0.040595,-0.0406 0.1438461,-0.118225 0.2294472,-0.172512 0.1733184,-0.109916 0.2284002,-0.176259 0.2623733,-0.316014 0.01334,-0.05486 0.06939,-0.123095 0.132975,-0.161862 0.06158,-0.03755 0.08742,-0.0685 0.05876,-0.07038 -0.08661,-0.0057 0.555593,-0.16351 0.673539,-0.16552 0.06836,-0.0011 0.110835,-0.01922 0.110835,-0.0471 0,-0.02486 0.03789,-0.08081 0.08421,-0.124319 0.09656,-0.09071 0.08465,-0.1374 -0.03506,-0.1374 -0.139172,0 -0.09502,-0.04884 0.164003,-0.181411 0.306614,-0.156928 0.449342,-0.161093 0.841624,-0.02456 0.28366,0.09873 0.288206,0.09917 0.345032,0.03364 0.03167,-0.03652 0.06838,-0.06639 0.08158,-0.06639 0.02544,0 0.444123,-0.288445 0.530711,-0.36562 0.02814,-0.02508 0.1816,-0.14031 0.341033,-0.256071 0.159432,-0.115763 0.427996,-0.311618 0.596806,-0.435234 0.324997,-0.237988 0.519973,-0.363211 0.852581,-0.547569 0.112541,-0.06238 0.272663,-0.181743 0.355823,-0.265252 l 0.151204,-0.151834 -0.279091,0.01616 c -0.295876,0.01713 -0.322422,0.0016 -0.24494,-0.143172 0.05332,-0.09963 0.736112,-0.634181 1.100461,-0.86154 0.05926,-0.03698 0.08714,-0.07645 0.07227,-0.102311 -0.01332,-0.02315 -0.01159,-0.03067 0.0038,-0.01669 0.01542,0.01398 0.07543,-0.01065 0.133354,-0.05471 0.219267,-0.166827 1.171023,-0.727058 1.367134,-0.804733 0.258942,-0.102562 0.861798,-0.404573 0.886111,-0.443911 0.0101,-0.01634 0.121786,-0.06366 0.248193,-0.105146 0.287589,-0.09439 0.30873,-0.106826 0.229061,-0.134772 -0.06732,-0.02362 -0.07326,-0.02127 0.880461,-0.347551 0.239998,-0.08211 0.429331,-0.156371 0.420748,-0.165033 -0.0086,-0.0087 0.03161,-0.01751 0.08933,-0.01966 0.05771,-0.0022 0.121598,-0.02517 0.141958,-0.05115 0.02171,-0.0277 0.120634,-0.05234 0.239187,-0.05957 0.210669,-0.01285 0.602989,-0.173276 0.928324,-0.379597 0.08567,-0.05433 0.264945,-0.123611 0.398397,-0.153965 0.133453,-0.03035 0.2584,-0.06637 0.277662,-0.08004 0.01927,-0.01367 0.09641,-0.04558 0.171433,-0.07092 0.07503,-0.02534 0.173013,-0.07458 0.217746,-0.109424 0.04473,-0.03484 0.09298,-0.06335 0.107228,-0.06335 0.01425,0 0.07348,-0.04445 0.131636,-0.09877 0.113963,-0.106457 0.351444,-0.240935 0.463279,-0.26234 0.038,-0.0073 0.08445,-0.03321 0.10321,-0.05764 0.01875,-0.02443 0.09498,-0.08983 0.169391,-0.145337 0.194156,-0.144837 0.214536,-0.162058 0.478569,-0.404414 0.251516,-0.230862 0.606848,-0.516232 1.227718,-0.98599 0.344093,-0.2603468 0.589539,-0.4332454 1.258562,-0.886573 0.133088,-0.09018 0.449157,-0.2640469 0.702374,-0.3863728 0.253216,-0.1223245 0.529451,-0.2557186 0.613857,-0.2964302 0.08441,-0.04071 0.158614,-0.085626 0.16491,-0.099811 0.0063,-0.014184 0.02548,-0.017112 0.04263,-0.00653 0.01716,0.010605 0.0312,0.00558 0.0312,-0.011156 0,-0.016741 0.02005,-0.030435 0.04455,-0.030435 0.0245,0 0.158784,-0.058252 0.298402,-0.129445 0.139619,-0.071195 0.430335,-0.1978034 0.646038,-0.2813523 0.215704,-0.083549 0.491939,-0.1954213 0.613858,-0.2486049 0.121921,-0.053185 0.306077,-0.1321049 0.40924,-0.1753788 0.103162,-0.043273 0.29828,-0.1359289 0.433601,-0.2058975 0.135324,-0.069969 0.361685,-0.1753594 0.503025,-0.2342005 0.141344,-0.058844 0.256987,-0.118339 0.256987,-0.1322199 0,-0.013882 0.01945,-0.02524 0.04319,-0.02524 0.02377,0 0.303834,-0.1227275 0.622385,-0.2727296 0.318551,-0.1500017 0.675102,-0.3078947 0.792333,-0.3508747 0.117228,-0.042978 0.213145,-0.092292 0.213145,-0.1095837 0,-0.017291 0.01918,-0.027759 0.04263,-0.02326 0.06969,0.013374 0.594379,-0.1884232 0.639435,-0.2459351 0.0094,-0.011971 0.04007,-0.021527 0.06821,-0.021238 0.121558,0.00127 0.660662,-0.1945862 0.918837,-0.3337747 0.241294,-0.1300895 0.587545,-0.3830342 0.701059,-0.5121391 0.01875,-0.021333 0.06131,-0.048999 0.09456,-0.061479 0.03325,-0.012481 0.07001,-0.047591 0.08169,-0.078024 0.02692,-0.070138 0.174568,-0.219039 0.217202,-0.219039 0.01774,0 0.05143,-0.030691 0.07486,-0.068207 0.02342,-0.037513 0.06448,-0.068206 0.09123,-0.068206 0.02675,0 0.03887,-0.00976 0.02696,-0.021682 -0.01192,-0.011924 0.05783,-0.09633 0.155007,-0.1875678 0.09718,-0.091238 0.161929,-0.1668596 0.143886,-0.168049 -0.01803,-0.00118 0.0028,-0.016405 0.04612,-0.033815 0.04747,-0.019039 0.06915,-0.047456 0.05441,-0.071314 -0.01348,-0.021822 -0.0098,-0.030553 0.0083,-0.019409 0.01801,0.011138 0.09144,-0.040204 0.163151,-0.1140923 0.0717,-0.073888 0.117738,-0.1343421 0.10229,-0.1343421 -0.01546,0 0.02072,-0.036015 0.08038,-0.080032 0.05967,-0.044017 0.09718,-0.091336 0.08336,-0.105152 -0.01383,-0.013815 -0.0095,-0.020006 0.0097,-0.013752 0.04939,0.01615 0.223702,-0.1274928 0.194271,-0.1600887 -0.01342,-0.014875 -0.0072,-0.017247 0.01376,-0.00527 0.06096,0.034779 0.607999,-0.4589859 0.563584,-0.5087016 -0.0121,-0.013544 -0.0039,-0.014234 0.01831,-0.00155 0.02248,0.012885 0.06394,-0.010665 0.09378,-0.053276 0.02942,-0.042001 0.05349,-0.064232 0.05349,-0.049403 0,0.035425 0.155483,-0.078134 0.314002,-0.2293306 0.06954,-0.066327 0.191209,-0.1634486 0.270384,-0.2158258 l 0.143933,-0.095226 -0.09461,-0.017052 c -0.09208,-0.016595 -0.08962,-0.020213 0.09234,-0.1351948 0.102836,-0.064979 0.180276,-0.1355869 0.172099,-0.1569075 -0.0082,-0.021322 0.03576,-0.063723 0.09766,-0.094226 l 0.112534,-0.055461 -0.110835,-7.738e-4 c -0.121681,-8.545e-4 -0.148951,-0.052289 -0.04518,-0.085223 0.03611,-0.011461 0.177308,-0.1287936 0.313783,-0.260741 0.136473,-0.1319475 0.294923,-0.2638643 0.352116,-0.2931487 0.05718,-0.029285 0.112307,-0.066044 0.122484,-0.081687 0.01017,-0.015643 0.08691,-0.0653452 0.170517,-0.1104495 0.08361,-0.0451035 0.148684,-0.0976873 0.144617,-0.11685267 -0.0041,-0.0191645 0.0331,-0.0450046 0.08257,-0.0574227 0.04948,-0.0124174 0.127764,-0.0523182 0.173974,-0.0886698 0.04622,-0.0363507 0.110775,-0.0660921 0.143466,-0.0660921 0.08441,0 0.311151,-0.09789 0.391757,-0.16912543 0.07224,-0.0638419 0.511584,-0.24011339 0.598463,-0.24011339 0.02826,0 0.08528,-0.0237481 0.126716,-0.0527741 0.137291,-0.09616158 0.661132,-0.14352007 1.525634,-0.1379271367 0.792642,0.005129127 0.827085,0.008206607 1.091305,0.0975625367 0.150053,0.050747 0.291903,0.09246343 0.315215,0.09270283 0.09396,9.6895e-4 0.976611,0.42511458 1.100071,0.52862744 0.02811,0.02359 0.159498,0.0947176 0.291932,0.15806233 0.235834,0.11281152 0.25372,0.12719829 0.25372,0.20412699 0,0.023291 0.03271,0.029587 0.08526,0.016402 0.05003,-0.012556 0.08526,-0.00673 0.08526,0.014086 0,0.019516 0.04219,0.054229 0.09378,0.077137 0.05158,0.022909 0.123537,0.06862 0.159895,0.1015785 0.03637,0.032959 0.08624,0.059926 0.110835,0.059926 0.02459,0 0.04471,0.012883 0.04471,0.028629 0,0.037801 0.156041,0.1077839 0.240323,0.1077839 0.03664,0 0.0666,0.015347 0.0666,0.034103 0,0.050098 0.102113,0.041678 0.103394,-0.00853 4.52e-4,-0.025512 0.01972,-0.01804 0.04753,0.018611 0.03352,0.044207 0.07116,0.055035 0.135327,0.038932 0.05776,-0.014496 0.08889,-0.00837 0.08889,0.017504 0,0.021897 0.01498,0.030556 0.0333,0.019242 0.0461,-0.028494 0.444224,0.057046 0.423279,0.090944 -0.0093,0.015101 0.01841,0.027008 0.06163,0.02646 0.09589,-0.00121 0.512136,0.096881 0.42817,0.100902 -0.03285,0.00157 -0.05968,0.016565 -0.05968,0.033318 0,0.03259 0.410853,0.1157062 0.437957,0.0886 0.0089,-0.00889 0.03294,-0.00257 0.0534,0.014024 0.06789,0.055028 0.736829,0.2457834 0.776319,0.2213777 0.02148,-0.013281 0.02951,-0.00894 0.01796,0.00974 -0.01146,0.018537 0.130919,0.1054296 0.316393,0.1930939 0.185473,0.087664 0.472547,0.2615323 0.637942,0.3863739 0.1654,0.1248417 0.319902,0.2270363 0.343352,0.2270984 0.02346,6.81e-5 0.03547,0.00725 0.02675,0.015975 -0.0087,0.00872 0.03686,0.077444 0.101278,0.1527108 0.06442,0.075267 0.110018,0.148369 0.101315,0.162449 -0.0087,0.014079 0.0071,0.034399 0.03515,0.045154 0.02802,0.010755 0.0512,8.546e-4 0.05148,-0.022004 4.51e-4,-0.032265 0.0064,-0.032371 0.02662,-4.693e-4 0.01435,0.022595 0.02243,0.1068802 0.01796,0.1872996 -0.0057,0.1024476 0.0013,0.1309839 0.024,0.09533 0.02653,-0.041988 0.03272,-0.038959 0.03537,0.017319 0.0018,0.037513 0.01096,0.049024 0.0204,0.025578 0.0094,-0.023446 0.02802,-0.042629 0.04119,-0.042629 0.03781,0 0.03799,0.1327189 0,0.1560674 -0.02003,0.012395 -0.01119,0.037667 0.0217,0.061689 0.03979,0.029097 0.04904,0.067036 0.03244,0.1331389 -0.01277,0.050846 -0.03781,0.092447 -0.05563,0.092447 -0.01783,0 -0.02058,-0.019183 -0.0061,-0.042629 0.01444,-0.023446 -0.01394,-0.016324 -0.06312,0.015829 -0.08648,0.056549 -0.219373,0.09752 -0.342779,0.1056776 -0.0328,0.00217 -0.05968,0.015832 -0.05968,0.030358 0,0.014528 -0.03452,0.026195 -0.07673,0.025926 -0.04219,-2.688e-4 -0.12277,0.00591 -0.17904,0.013737 -0.971882,0.1351175 -1.779858,0.2316536 -2.0803,0.2485518 -0.206324,0.011606 -0.393648,0.035672 -0.416267,0.053482 -0.02261,0.017814 -0.05578,0.023341 -0.07366,0.012286 -0.05845,-0.036117 -0.137867,0.016695 -0.115393,0.076729 0.01854,0.049502 0.01385,0.050803 -0.03628,0.010053 -0.03979,-0.032383 -0.05754,-0.034549 -0.05754,-0.00703 0,0.021875 -0.01918,0.037283 -0.04264,0.034238 -0.113695,-0.014764 -0.168405,0.00487 -0.149657,0.0537 0.02179,0.056803 -0.03027,0.070789 -0.06349,0.017051 -0.01159,-0.018757 -0.0547,-0.032889 -0.0958,-0.031409 -0.04111,0.00149 -0.0564,0.010143 -0.03402,0.019253 0.02238,0.00911 0.03199,0.039256 0.02134,0.066986 -0.01674,0.043659 -0.02757,0.043 -0.0805,-0.00493 -0.04614,-0.041755 -0.07725,-0.046733 -0.126687,-0.020273 -0.03605,0.019289 -0.100448,0.02594 -0.143132,0.014777 -0.06857,-0.017931 -0.07496,-0.010784 -0.05491,0.061432 0.02026,0.072941 0.01773,0.075587 -0.02355,0.024614 -0.043,-0.053101 -0.05392,-0.052267 -0.155229,0.011876 -0.05993,0.037942 -0.108954,0.096734 -0.108954,0.1306499 0,0.044877 -0.01859,0.056808 -0.0682,0.04383 -0.0459,-0.012002 -0.06821,-0.00104 -0.06821,0.033502 0,0.031463 -0.04526,0.059826 -0.11689,0.073265 -0.0945,0.017728 -0.121158,0.041367 -0.139184,0.1234405 -0.02175,0.099065 -0.131379,0.1912377 -0.208964,0.1757021 -0.0213,-0.00429 -0.04769,0.015535 -0.05861,0.044002 -0.01092,0.028466 -0.0342,0.051758 -0.05175,0.051758 -0.03502,0 -0.139325,0.089285 -0.496709,0.4251098 -0.130107,0.1222664 -0.264395,0.2311337 -0.298403,0.241927 -0.03401,0.010793 -0.0623,0.045447 -0.06289,0.077007 -6.73e-4,0.031562 -0.0658,0.1065697 -0.144939,0.1666874 -0.270923,0.2058155 -0.531097,0.4853767 -0.510157,0.5481845 0.0076,0.022891 -0.0026,0.041625 -0.02258,0.041625 -0.02005,0 -0.05384,0.069059 -0.0751,0.1534642 -0.02126,0.084405 -0.05168,0.153465 -0.06763,0.153465 -0.01593,0 -0.02014,0.023019 -0.0093,0.051153 0.0108,0.028133 0.0056,0.051153 -0.01149,0.051153 -0.01712,0 -0.03115,0.034533 -0.03119,0.076733 0,0.1328989 -0.05393,0.4006339 -0.07758,0.3860182 -0.02005,-0.012388 -0.02725,0.1344432 -0.04256,0.8672752 -0.002,0.1031621 -0.01694,0.1959073 -0.03288,0.2061001 -0.03087,0.019749 -0.0581,0.1355871 -0.06226,0.2648322 -0.0013,0.043314 -0.0177,0.069369 -0.03625,0.057909 -0.01933,-0.011951 -0.02505,0.00175 -0.0134,0.03209 0.01118,0.029109 0.0038,0.052929 -0.01638,0.052929 -0.02017,0 -0.02725,0.024567 -0.01573,0.054598 0.01151,0.030024 0.004,0.065088 -0.01676,0.077907 -0.02074,0.012818 -0.04479,0.099111 -0.05345,0.1917602 -0.0087,0.092648 -0.03066,0.1734248 -0.0489,0.1795037 -0.01824,0.00606 -0.02536,0.040824 -0.01584,0.077209 0.01077,0.041208 -0.0034,0.074092 -0.03753,0.087197 -0.03015,0.01157 -0.04634,0.03478 -0.03596,0.05157 0.01038,0.0168 0.005,0.03053 -0.01205,0.03053 -0.017,0 -0.03228,0.04742 -0.03393,0.105393 -0.0051,0.179718 -0.117438,0.644115 -0.15081,0.623489 -0.01741,-0.01076 -0.02813,0.0011 -0.02381,0.02649 0.0043,0.02533 -0.0024,0.08442 -0.01478,0.131309 -0.01244,0.04689 -0.02923,0.154317 -0.03733,0.238722 -0.03648,0.380211 -0.166541,0.813049 -0.262056,0.87208 -0.01658,0.01025 -0.03014,0.06376 -0.03014,0.118927 0,0.05516 -0.01494,0.100297 -0.03323,0.100297 -0.04322,0 -0.145532,0.197792 -0.122006,0.23586 0.01,0.01608 -0.0048,0.04821 -0.0327,0.07138 -0.02793,0.02318 -0.05078,0.06201 -0.05078,0.08628 0,0.02428 -0.01521,0.04926 -0.03381,0.05551 -0.01859,0.0063 -0.03965,0.06171 -0.0468,0.123232 -0.0071,0.06153 -0.03801,0.139504 -0.06858,0.173284 -0.03057,0.03378 -0.04532,0.07168 -0.03278,0.08423 0.01255,0.01254 0.0024,0.02281 -0.02266,0.02281 -0.02501,0 -0.03585,0.0096 -0.0241,0.02137 0.0306,0.0306 -0.07344,0.220798 -0.170284,0.311282 -0.04526,0.04228 -0.07383,0.09055 -0.06351,0.107262 0.01033,0.01671 -0.0042,0.03918 -0.03219,0.04993 -0.02803,0.01075 -0.05096,0.05164 -0.05096,0.09084 0,0.03921 -0.01459,0.06228 -0.03239,0.05127 -0.03561,-0.022 -0.113081,0.09788 -0.08282,0.128147 0.01035,0.01034 -0.02074,0.04474 -0.06911,0.07642 -0.04835,0.03169 -0.08004,0.07036 -0.0704,0.08595 0.01898,0.03069 -0.114371,0.168819 -0.162961,0.168819 -0.01633,0 -0.02025,0.01524 -0.0088,0.03387 0.01151,0.01863 -0.03329,0.0897 -0.09956,0.157928 -0.06627,0.06823 -0.110938,0.139503 -0.09927,0.158378 0.01168,0.01887 -0.01552,0.06424 -0.06042,0.100806 -0.0449,0.03656 -0.05862,0.05631 -0.03048,0.04387 0.02814,-0.01243 0.01662,0.0079 -0.02558,0.04514 -0.0422,0.03726 -0.07673,0.08078 -0.07673,0.09671 0,0.01593 -0.03129,0.0485 -0.06953,0.07238 -0.03825,0.02388 -0.06135,0.05666 -0.05135,0.07284 0.01,0.01618 -0.0057,0.03859 -0.03494,0.0498 -0.02921,0.01121 -0.04333,0.03622 -0.03137,0.05557 0.01196,0.01935 0.0028,0.03097 -0.02039,0.02582 -0.02317,-0.0052 -0.05348,0.02899 -0.06734,0.07589 -0.01387,0.04689 -0.02673,0.07265 -0.0286,0.05724 -0.0047,-0.0388 -0.105707,0.06596 -0.105707,0.109636 0,0.01944 -0.03113,0.05199 -0.06916,0.07235 -0.03805,0.02035 -0.06111,0.05004 -0.05127,0.06597 0.0099,0.01593 -0.03193,0.07271 -0.09283,0.126176 -0.0609,0.05347 -0.118399,0.112566 -0.127777,0.131323 -0.0094,0.01876 -0.0255,0.03129 -0.03584,0.02784 -0.01033,-0.0034 -0.03831,0.02502 -0.0622,0.06325 -0.03566,0.0571 -0.03535,0.06485 0.0018,0.0434 0.05754,-0.03329 -0.100394,0.1488 -0.202424,0.233387 -0.04238,0.03514 -0.06834,0.078 -0.05767,0.09525 0.01067,0.01725 -0.0028,0.03137 -0.02973,0.03137 -0.05121,0 -0.198718,0.175689 -0.238939,0.28459 -0.01279,0.0346 -0.05386,0.07092 -0.09128,0.08071 -0.03742,0.0098 -0.06803,0.03258 -0.06803,0.05064 0,0.01807 -0.09548,0.127541 -0.212171,0.243271 -0.116693,0.115729 -0.208771,0.221926 -0.204617,0.235994 0.0042,0.01407 -0.0136,0.02558 -0.03946,0.02558 -0.0419,0 -0.36223,0.342153 -0.36223,0.386912 0,0.01812 -0.168333,0.207786 -0.434598,0.489667 -0.0797,0.08438 -0.134927,0.169585 -0.122716,0.189342 0.01221,0.01976 0.0063,0.02606 -0.01324,0.01401 -0.01949,-0.01205 -0.148957,0.09803 -0.287676,0.244627 -0.138717,0.146595 -0.276317,0.280693 -0.305775,0.297993 -0.113761,0.06682 -0.575254,0.510672 -0.575254,0.553274 0,0.0247 -0.01457,0.0359 -0.03239,0.0249 -0.01781,-0.01102 -0.04944,0.01184 -0.07028,0.05078 -0.02084,0.03893 -0.07624,0.08538 -0.123127,0.103201 -0.04688,0.01782 -0.07681,0.04604 -0.06651,0.06271 0.01031,0.01667 0,0.04609 -0.02352,0.06537 -0.04179,0.03468 -0.06108,0.04086 -0.127513,0.04086 -0.01875,0 -0.03027,0.01782 -0.02558,0.03961 0.0047,0.02178 -0.02216,0.04864 -0.05968,0.05968 -0.09596,0.02823 -0.460392,0.278998 -0.460392,0.316789 0,0.01721 -0.01255,0.02353 -0.02789,0.01405 -0.01535,-0.0095 -0.06906,0.02093 -0.119362,0.06757 -0.05031,0.04665 -0.09193,0.07268 -0.09251,0.05785 -6.72e-4,-0.01482 -0.01667,-6.8e-5 -0.0358,0.03272 -0.01911,0.03282 -0.06469,0.05968 -0.101275,0.05968 -0.03659,0 -0.09465,0.02686 -0.129032,0.05968 -0.03439,0.03282 -0.08427,0.06436 -0.110835,0.07008 -0.02657,0.0057 -0.06461,0.03156 -0.08453,0.05742 -0.01992,0.02586 -0.07746,0.05738 -0.127885,0.07003 -0.05042,0.01265 -0.09168,0.03925 -0.09168,0.0591 0,0.01985 -0.0097,0.02636 -0.02162,0.01447 -0.04327,-0.04327 -0.532043,0.244878 -0.72163,0.425432 -0.107024,0.101924 -0.294339,0.269485 -0.416257,0.372357 -0.351072,0.296226 -0.477445,0.419441 -0.477445,0.465526 0,0.02358 -0.01248,0.03903 -0.02774,0.03434 -0.03696,-0.01136 -0.401163,0.357536 -0.389174,0.394188 0.0052,0.01575 -0.0044,0.02012 -0.0213,0.0097 -0.01687,-0.01042 -0.120842,0.08723 -0.231043,0.217028 -0.110194,0.129794 -0.21571,0.237324 -0.234468,0.238955 -0.01875,0.0015 -0.139775,0.102333 -0.268924,0.223779 -0.129156,0.121446 -0.242179,0.220809 -0.251161,0.220809 -0.02537,0 -0.405851,0.275683 -0.572008,0.414454 -0.08205,0.06852 -0.314931,0.239897 -0.51753,0.380842 -0.387603,0.269655 -0.569368,0.44102 -0.766137,0.7223 -0.153643,0.219636 -0.36955,0.618807 -0.36955,0.683236 0,0.02749 -0.01176,0.04998 -0.02616,0.04998 -0.03167,0 -0.156417,0.321733 -0.224782,0.579755 -0.02733,0.103161 -0.05974,0.38707 -0.07201,0.63091 -0.01228,0.243838 -0.0367,0.457921 -0.0543,0.47574 -0.01759,0.01781 -0.03199,0.148686 -0.03199,0.290814 0,0.176685 -0.01649,0.281962 -0.05214,0.332861 -0.06265,0.08945 -0.03628,0.229636 0.05526,0.293757 0.03494,0.02447 0.273134,0.242804 0.529317,0.485172 0.256175,0.242373 0.479046,0.445791 0.495268,0.452042 0.01622,0.0063 0.02949,0.03311 0.02949,0.05968 0,0.02657 0.01297,0.04831 0.02881,0.04831 0.01584,0 0.103231,0.07579 0.194197,0.168432 0.09096,0.09264 0.17544,0.16222 0.187725,0.154627 0.01228,-0.0076 0.05524,0.02404 0.09546,0.07029 0.04022,0.04625 0.08856,0.0841 0.107445,0.0841 0.01889,0 0.03433,0.02302 0.03433,0.05115 0,0.02814 0.02393,0.05115 0.05316,0.05115 0.02924,0 0.04403,0.01481 0.03285,0.03288 -0.01118,0.01808 0.0378,0.07056 0.108823,0.116611 0.146636,0.09507 0.410528,0.327953 0.371622,0.327953 -0.01411,0 -0.0027,0.02302 0.02548,0.05115 0.02813,0.02814 0.07527,0.05115 0.104743,0.05115 0.02948,0 0.04976,0.01918 0.04506,0.04263 -0.0047,0.02344 0.01067,0.03879 0.0341,0.0341 0.02345,-0.0047 0.03879,0.01066 0.0341,0.0341 -0.0047,0.02344 0.01067,0.03879 0.03411,0.0341 0.02345,-0.0047 0.04263,0.0068 0.04263,0.02558 0,0.01875 0.01151,0.03167 0.02558,0.02869 0.01407,-0.003 0.05372,0.0068 0.08812,0.0218 0.04921,0.02142 0.05285,0.03336 0.01705,0.05605 -0.03107,0.0197 -0.01515,0.029 0.05031,0.02936 0.05269,4.48e-4 0.08814,0.01291 0.07878,0.02806 -0.0094,0.01515 0.01658,0.05262 0.05767,0.08326 0.211981,0.158129 0.321478,0.232868 0.398667,0.272128 0.115603,0.05878 0.204537,0.136366 0.205017,0.178823 6.73e-4,0.01926 0.06544,0.06496 0.144938,0.101519 0.141447,0.06505 0.340091,0.238163 0.308982,0.269278 -0.02718,0.02718 0.06833,0.153699 0.127777,0.169241 0.06948,0.01817 0.188265,0.276674 0.320871,0.69827 0.08404,0.267179 0.118475,0.330863 0.220688,0.408197 0.06662,0.0504 0.147197,0.124217 0.17907,0.164057 0.09286,0.116054 0.407185,0.314295 0.561941,0.354407 0.212211,0.05501 0.317944,0.197997 0.317944,0.42998 0,0.177064 0.0046,0.186422 0.114315,0.232258 0.06286,0.02626 0.181802,0.05857 0.2643,0.07179 0.08249,0.01322 0.264143,0.05332 0.403658,0.08911 0.139516,0.0358 0.327111,0.06508 0.416878,0.06508 0.191088,0 0.623427,0.160645 0.804959,0.299105 0.06647,0.0507 0.148841,0.153773 0.183033,0.229045 0.08345,0.183693 0.08156,0.232392 -0.0079,0.203999 -0.0628,-0.01994 -0.06843,-0.01289 -0.04589,0.05738 0.06069,0.189278 0.08178,0.333911 0.08254,0.566071 l 8.75e-4,0.247251 -0.10231,0 c -0.141004,0 -0.224605,-0.0965 -0.270173,-0.311862 -0.02207,-0.104268 -0.09225,-0.260923 -0.163567,-0.365089 -0.119313,-0.174261 -0.130354,-0.181565 -0.24619,-0.162767 -0.149842,0.02432 -0.206755,0.09784 -0.206755,0.267096 l 0,0.130514 -0.144938,-0.0091 c -0.128781,-0.0081 -0.143506,-0.0015 -0.132061,0.05907 0.02757,0.146015 0.01951,0.403542 -0.01289,0.41185 -0.01875,0.0048 -0.05329,0.0011 -0.07673,-0.0083 z m -4.19369,-3.988246 c 0.03255,-0.03255 -0.11857,-0.219098 -0.220265,-0.271924 -0.05026,-0.0261 -0.100619,-0.07448 -0.111934,-0.107508 -0.01132,-0.03303 -0.08846,-0.113161 -0.171444,-0.178065 -0.08298,-0.06491 -0.144604,-0.124279 -0.136937,-0.131946 0.01826,-0.01826 -0.252842,-0.244541 -0.292968,-0.244541 -0.01698,0 -0.03088,-0.02302 -0.03088,-0.05116 0,-0.02813 -0.01918,-0.04732 -0.04263,-0.04263 -0.02345,0.0047 -0.03879,-0.01067 -0.03411,-0.0341 0.0047,-0.02344 -0.0145,-0.04263 -0.04263,-0.04263 -0.02814,0 -0.05115,-0.02165 -0.05115,-0.04811 0,-0.02646 -0.09552,-0.13005 -0.212251,-0.230198 -0.116736,-0.100146 -0.253339,-0.224289 -0.30356,-0.27587 -0.05022,-0.05158 -0.09883,-0.09379 -0.108026,-0.09379 -0.0092,0 -0.09926,-0.08057 -0.200152,-0.17904 -0.186476,-0.182007 -0.359788,-0.332507 -0.382912,-0.332507 -0.007,0 -0.08682,-0.06799 -0.177335,-0.151102 -0.09051,-0.08311 -0.17673,-0.143589 -0.191592,-0.1344 -0.01486,0.0092 -0.02702,0.0024 -0.02702,-0.01528 0,-0.04201 -0.511787,-0.42675 -0.567681,-0.42675 -0.02375,0 -0.03553,-0.01237 -0.02619,-0.02747 0.02194,-0.03549 -0.281469,-0.225376 -0.403641,-0.252609 -0.05158,-0.01149 -0.09378,-0.03557 -0.09378,-0.05349 0,-0.019 -0.02956,-0.01678 -0.07091,0.0054 -0.06793,0.03636 -0.064,0.04498 0.09378,0.205769 0.09058,0.0923 0.183871,0.167842 0.207322,0.167869 0.02344,2.7e-5 0.04263,0.01302 0.04263,0.02885 0,0.01584 0.117144,0.14245 0.26033,0.281352 0.143178,0.138902 0.292804,0.289504 0.332507,0.334665 0.125042,0.142265 0.487691,0.495555 0.560957,0.546484 0.03864,0.02686 0.06096,0.06523 0.04957,0.08526 -0.01138,0.02003 -0.0087,0.02557 0.0061,0.0123 0.0147,-0.01326 0.07471,0.01169 0.133356,0.05543 0.05864,0.04375 0.165259,0.106726 0.236917,0.139967 0.0936,0.04341 0.117608,0.06848 0.08526,0.08899 -0.03381,0.02144 -0.02966,0.02869 0.01667,0.02908 0.03393,4.48e-4 0.05331,0.01409 0.04306,0.03066 -0.01667,0.02698 0.14951,0.115529 0.236282,0.125904 0.01875,0.0023 0.05419,0.0064 0.07875,0.0093 0.02455,0.0029 0.03515,0.02054 0.02356,0.0393 -0.01161,0.01875 0.0036,0.0341 0.0339,0.0341 0.03023,0 0.111436,0.03837 0.180445,0.08526 0.06901,0.04689 0.10272,0.08549 0.07492,0.08578 -0.04424,6.72e-4 -0.04417,0.0046 6.73e-4,0.03333 0.02814,0.01803 0.0764,0.02496 0.107242,0.01537 0.05882,-0.01828 0.141637,0.04693 0.20138,0.15856 0.01945,0.03632 0.09688,0.104889 0.17209,0.152367 0.10982,0.06933 0.132322,0.100292 0.114247,0.157236 -0.01432,0.04508 -0.0096,0.06294 0.01288,0.04903 0.01947,-0.01203 0.04436,-0.0074 0.05532,0.01035 0.01095,0.01772 -0.01483,0.0389 -0.05733,0.04706 -0.06684,0.01286 -0.06461,0.01548 0.01656,0.01949 0.07775,0.0038 0.09378,0.02023 0.09378,0.09574 0,0.149781 0.08859,0.215831 0.289483,0.215831 0.09713,0 0.186006,-0.0094 0.197504,-0.02091 z m -3.916702,-3.351519 c 0.01031,-0.01667 -0.03866,-0.07277 -0.108823,-0.124668 -0.162544,-0.12024 -0.245198,-0.220673 -0.246159,-0.299097 -0.0011,-0.08664 -0.139045,-0.398508 -0.176318,-0.398508 -0.01692,0 -0.04534,-0.03837 -0.06316,-0.08526 -0.01784,-0.04689 -0.04766,-0.08526 -0.06629,-0.08526 -0.01864,0 -0.02504,-0.02302 -0.01425,-0.05115 0.0108,-0.02813 0.0057,-0.05115 -0.01129,-0.05115 -0.04968,0 -0.120395,0.399496 -0.08306,0.469258 0.01779,0.03321 0.143661,0.159902 0.279747,0.281536 0.13608,0.121632 0.279425,0.254059 0.318537,0.294281 0.07702,0.0792 0.141411,0.09803 0.17108,0.05003 z m -0.771004,-2.50443 c -0.0043,-0.02202 0.0183,-0.08917 0.05025,-0.149197 0.03194,-0.06003 0.05808,-0.149179 0.05808,-0.198109 0,-0.05436 0.01416,-0.08021 0.0364,-0.06647 0.03025,0.01869 0.09496,-0.116002 0.0709,-0.147575 -0.004,-0.0054 0.01613,-0.03331 0.04495,-0.06211 0.02881,-0.02881 0.05237,-0.08874 0.05237,-0.133183 0,-0.04445 0.01414,-0.08955 0.03142,-0.100225 0.01728,-0.01069 0.05839,-0.09215 0.09136,-0.181054 0.03297,-0.08891 0.08744,-0.201739 0.12104,-0.250748 0.0336,-0.04901 0.05132,-0.09889 0.03937,-0.110837 -0.01194,-0.01194 -0.0038,-0.02173 0.01806,-0.02173 0.02189,0 0.03955,-0.02686 0.03927,-0.05968 -6.73e-4,-0.05155 -0.0055,-0.05271 -0.03706,-0.0085 -0.03005,0.04207 -0.03367,0.03904 -0.02039,-0.01705 0.0089,-0.03751 0.02822,-0.09773 0.04298,-0.13381 0.02151,-0.05253 0.01548,-0.06124 -0.03023,-0.0437 -0.07092,0.02721 -0.07416,-0.02222 -0.0059,-0.09045 0.02814,-0.02813 0.05065,-0.07911 0.05002,-0.113272 -8.75e-4,-0.05383 -0.01019,-0.05124 -0.06906,0.01945 -0.03736,0.04486 -0.07781,0.07168 -0.08988,0.0596 -0.01208,-0.01207 -0.05363,0.0049 -0.09234,0.0378 -0.06688,0.05679 -0.06809,0.05679 -0.02417,0 0.02827,-0.0365 0.03201,-0.05968 0.0096,-0.05968 -0.02012,0 -0.04886,0.01918 -0.06386,0.04263 -0.01501,0.02344 -0.057,0.06565 -0.09334,0.09379 -0.06006,0.0465 -0.06403,0.04573 -0.0437,-0.0085 0.0123,-0.03282 0.0081,-0.05969 -0.0093,-0.05969 -0.01746,0 -0.04841,0.06522 -0.06882,0.144939 -0.02042,0.07972 -0.04562,0.167959 -0.05602,0.196096 -0.04849,0.131129 -0.111834,0.499144 -0.09503,0.552109 0.01033,0.03255 0.0018,0.09092 -0.01898,0.129723 -0.04485,0.08379 -0.0079,0.827525 0.03967,0.798134 0.01662,-0.01026 0.02669,-0.0367 0.02239,-0.05873 z m 0.415265,-1.487433 c 0,-0.01986 0.01535,-0.03611 0.0341,-0.03611 0.01875,0 0.03411,0.0068 0.03411,0.01503 0,0.0083 -0.01535,0.02453 -0.03411,0.03611 -0.01875,0.01158 -0.0341,0.0048 -0.0341,-0.01503 z m 0.06821,-0.102309 c 0,-0.01985 0.01535,-0.03611 0.0341,-0.03611 0.01875,0 0.0341,0.0068 0.0341,0.01503 0,0.0083 -0.01535,0.02452 -0.0341,0.03611 -0.01875,0.01158 -0.0341,0.0048 -0.0341,-0.01503 z M 50.350048,2.911456 c -0.04024,-0.04024 -0.0851,-0.060404 -0.09969,-0.044811 -0.01458,0.015594 -0.0073,0.035235 0.01633,0.043647 0.02355,0.00841 0.03614,0.026146 0.02793,0.039407 -0.0082,0.013261 0.01737,0.026543 0.05685,0.029515 l 0.07175,0.0054 -0.07316,-0.073163 z M 28.551232,31.653751 c 0,-0.0083 0.01534,-0.02453 0.0341,-0.03611 0.01875,-0.01158 0.0341,-0.0048 0.0341,0.01503 0,0.01987 -0.01534,0.03611 -0.0341,0.03611 -0.01875,0 -0.0341,-0.0067 -0.0341,-0.01503 z M 47.469354,1.6014697 c 0.0231,-0.00934 0.06912,-0.00991 0.102307,-0.00127 0.03317,0.00865 0.01431,0.016289 -0.04196,0.016985 -0.05627,6.93e-4 -0.08342,-0.00638 -0.06032,-0.015721 z"
+     style="fill:#000000" />
+</svg>
diff --git a/Crow/Images/meter.svg b/Crow/Images/meter.svg
new file mode 100755 (executable)
index 0000000..cc3d4e9
--- /dev/null
@@ -0,0 +1,584 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="358.84189"
+   height="213.71251"
+   id="svg5482"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="meter.svg">
+  <defs
+     id="defs5484">
+    <inkscape:path-effect
+       effect="bend_path"
+       id="path-effect5049"
+       is_visible="true"
+       bendpath="m 2212.9341,609.06371 c 56.0922,-68.23166 186.5294,-57.7916 231.5248,0"
+       prop_scale="1"
+       scale_y_rel="false"
+       vertical="false"
+       bendpath-nodetypes="cc" />
+    <linearGradient
+       id="linearGradient5562">
+      <stop
+         style="stop-color:#090909;stop-opacity:1;"
+         offset="0"
+         id="stop5564" />
+      <stop
+         style="stop-color:#444444;stop-opacity:1"
+         offset="1"
+         id="stop5566" />
+    </linearGradient>
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1"
+     inkscape:cx="161.38816"
+     inkscape:cy="62.457854"
+     inkscape:document-units="px"
+     inkscape:current-layer="background"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1214"
+     inkscape:window-height="816"
+     inkscape:window-x="64"
+     inkscape:window-y="33"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata5487">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="background"
+     transform="translate(0.49098801,0.49175768)">
+    <path
+       style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.79999989;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 3.580112,-0.09175773 350.699898,0 c 2.0337,0 3.6709,1.98745993 3.6709,4.45612993 l 0,203.8363478 c 0,2.46871 -1.6372,4.45615 -3.6709,4.45615 -260.867099,0.36873 -182.3838,0 -350.699898,0 -2.0338,0 -3.67110006,-1.98744 -3.67110006,-4.45615 l 0,-203.8363478 c 0,-2.46867 1.63730006,-4.45612993 3.67110006,-4.45612993 z"
+       id="rect5471-8-1-9-8"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ssssccsss" />
+    <path
+       style="display:inline;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.79999995;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+       d="m 16.535111,11.100601 324.789899,0 c 1.8834,0 3.3997,1.7785 3.3997,3.98763 l 0,182.405869 c 0,2.20916 -1.5163,3.98765 -3.3997,3.98765 -241.593999,0.32996 -168.9091,0 -324.789899,0 -1.8835,0 -3.3998,-1.77849 -3.3998,-3.98765 l 0,-182.405869 c 0,-2.20913 1.5163,-3.98763 3.3998,-3.98763 z"
+       id="rect5471-8-1-9"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ssssccsss" />
+    <path
+       style="display:inline;fill:none;fill-opacity:1;stroke:none;stroke-width:10;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;stroke-dasharray:none"
+       d="m 20.798511,15.453201 316.263299,0 c 1.8339,0 3.3104,1.69724 3.3104,3.80544 l 0,174.071799 c 0,2.10822 -1.4765,3.80545 -3.3104,3.80545 -235.2515,0.31489 -164.4748,0 -316.263299,0 -1.834,0 -3.3105,-1.69723 -3.3105,-3.80545 l 0,-174.071799 c 0,-2.1082 1.4765,-3.80544 3.3105,-3.80544 z"
+       id="rect5471-8-1"
+       inkscape:connector-curvature="0"
+       sodipodi:nodetypes="ssssccsss" />
+    <g
+       id="g4984"
+       inkscape:path-effect="#path-effect5049"
+       transform="matrix(1.0315417,0,0,1.1956775,-2225.4304,-607.66273)">
+      <g
+         id="g4913">
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2328.6578,555.28595 -0.095,12.8839"
+           id="path4662"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2332.9084,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2333.776,561.83359 -0.2149,6.43605"
+           id="path4662-9"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2338.0163,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2338.938,562.0725 -0.381,6.4311"
+           id="path4662-9-8"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2343.1241,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2344.0935,562.44544 -0.5491,6.42037"
+           id="path4662-9-4"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2348.2318,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2349.2383,562.95413 -0.7193,6.40384"
+           id="path4662-9-0"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2353.3397,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2355.2592,557.21866 -1.7833,12.76309"
+           id="path4662-7"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2358.4476,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2355.2592,557.21866 -1.7833,12.76309"
+           id="path4662-6"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2358.4476,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2359.4766,564.38544 -1.0661,6.3534"
+           id="path4662-9-3"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2363.5555,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2364.5606,565.31142 -1.2426,6.31948"
+           id="path4662-9-8-6"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2368.6633,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2369.615,566.37983 -1.4212,6.27979"
+           id="path4662-9-4-1"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2373.771,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2374.6354,567.59244 -1.6019,6.23429"
+           id="path4662-9-0-5"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2378.8789,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2381.4018,562.76784 -3.5696,12.36605"
+           id="path4662-7-4"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2383.9868,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2381.4018,562.76784 -3.5696,12.36605"
+           id="path4662-2"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2383.9868,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2384.5551,570.45687 -1.9697,6.12592"
+           id="path4662-9-09"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2389.0947,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2389.445,572.11202 -2.1567,6.06304"
+           id="path4662-9-8-7"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2394.2025,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2394.2821,573.91802 -2.3459,5.99437"
+           id="path4662-9-4-3"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2399.3102,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2399.0617,575.87705 -2.5397,5.91841"
+           id="path4662-9-0-7"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2404.4181,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2406.5173,572.1671 -5.4849,11.65685"
+           id="path4662-7-2"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2409.526,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2406.5173,572.1671 -5.4849,11.65685"
+           id="path4662-60"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2409.526,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2408.4101,580.27926 -2.9515,5.72413"
+           id="path4662-9-1"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2414.6339,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2412.9559,582.73313 -3.1667,5.60561"
+           id="path4662-9-8-65"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2419.7417,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2417.4008,585.36218 -3.3883,5.47283"
+           id="path4662-9-4-7"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2424.8494,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2421.7336,588.17159 -3.6161,5.32576"
+           id="path4662-9-0-54"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2429.9573,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2429.7946,586.00329 -7.704,10.32666"
+           id="path4662-7-1"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2435.0652,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2429.7946,586.00329 -7.704,10.32666"
+           id="path4662-20"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2435.0652,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2430.0118,594.35366 -4.0931,4.97586"
+           id="path4662-9-01"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2440.1731,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2433.9196,597.73496 -4.3365,4.76139"
+           id="path4662-9-8-4"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2445.2809,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2437.6444,601.31242 -4.5822,4.51988"
+           id="path4662-9-4-6"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2450.3886,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2441.1648,605.0881 -4.8303,4.25131"
+           id="path4662-9-0-0"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2455.4965,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2449.5396,605.10799 -10.1614,7.91144"
+           id="path4662-7-7"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2460.6044,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2301.9948,556.88956 1.664,12.77523"
+           id="path4662-1"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2307.3692,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2307.9612,562.68275 0.6504,6.41059"
+           id="path4662-9-7"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2312.4771,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2313.1115,562.23287 0.4716,6.42754"
+           id="path4662-9-8-77"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2317.5849,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2318.2729,561.9253 0.2957,6.4384"
+           id="path4662-9-4-73"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2322.6926,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2323.4408,561.75774 0.1225,6.44319"
+           id="path4662-9-0-3"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2327.8005,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2328.6578,555.28595 -0.095,12.8839"
+           id="path4662-7-5"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2332.9084,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2275.7834,562.31605 3.5651,12.36297"
+           id="path4662-99"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2281.83,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2282.5472,567.14615 1.5867,6.23483"
+           id="path4662-9-81"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2286.9379,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2287.5686,565.9507 1.3939,6.28213"
+           id="path4662-9-8-8"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2292.0457,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2292.6255,564.90893 1.2038,6.32335"
+           id="path4662-9-4-2"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2297.1534,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2297.7133,564.01851 1.0164,6.3585"
+           id="path4662-9-0-6"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2302.2613,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2301.9948,556.88956 1.664,12.77523"
+           id="path4662-7-6"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2307.3692,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2250.6482,571.8947 5.6313,11.5831"
+           id="path4662-0"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2256.2908,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2258.1514,575.51331 2.6016,5.89185"
+           id="path4662-9-38"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2261.3987,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2262.9147,573.51105 2.3902,5.98047"
+           id="path4662-9-8-0"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2266.5065,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2267.7442,571.67729 2.1826,6.05649"
+           id="path4662-9-4-12"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2271.6142,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2272.63,570.00718 1.9812,6.12201"
+           id="path4662-9-0-50"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2276.7221,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2275.7834,562.31605 3.5651,12.36297"
+           id="path4662-7-9"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2281.83,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2227.5729,586.07497 7.844,10.21712"
+           id="path4662-4"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2230.7516,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2235.66,588.12641 3.6982,5.27188"
+           id="path4662-9-78"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2235.8595,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2239.9501,585.24991 3.4733,5.42021"
+           id="path4662-9-8-3"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2240.9673,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2244.3537,582.55255 3.2515,5.5557"
+           id="path4662-9-4-5"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2246.075,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2248.8615,580.032 3.0322,5.67947"
+           id="path4662-9-0-1"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2251.1829,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2250.6482,571.8947 5.6313,11.5831"
+           id="path4662-7-20"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2256.2908,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2207.9601,604.97466 9.948,8.1781"
+           id="path4662-16"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2205.2124,545.46229 0,12.87806" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2216.3083,605.15362 4.7725,4.31998"
+           id="path4662-9-40"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2210.3203,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2219.8623,601.40703 4.5665,4.53739"
+           id="path4662-9-8-61"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2215.4281,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2223.5852,597.82751 4.3562,4.74129"
+           id="path4662-9-4-8"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2220.5358,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2227.4664,594.41845 4.1413,4.93167"
+           id="path4662-9-0-9"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2225.6437,551.90135 0,6.439" />
+        <path
+           style="fill:none;stroke:#000000;stroke-width:0.90042925px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+           d="m 2227.5729,586.07497 7.844,10.21712"
+           id="path4662-7-8"
+           inkscape:connector-curvature="0"
+           inkscape:original-d="m 2230.7516,545.46229 0,12.87806" />
+      </g>
+    </g>
+    <g
+       id="g3220"
+       transform="translate(-196.07004,-425.99769)">
+      <g
+         id="g3196">
+        <path
+           inkscape:connector-curvature="0"
+           id="path3170"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 371.8461,471.78022 -2.7832,0 -0.334,1.89843 c 0.5547,-0.29686 1.0664,-0.4453 1.5352,-0.44531 0.375,10e-6 0.7255,0.0703 1.0517,0.21094 0.3262,0.14063 0.6123,0.33497 0.8584,0.58301 0.2461,0.24805 0.4395,0.54199 0.5801,0.88183 0.1406,0.33985 0.2109,0.70509 0.2109,1.09571 0,0.56641 -0.1269,1.08203 -0.3808,1.54687 -0.2539,0.46485 -0.6202,0.83399 -1.0987,1.10742 -0.4785,0.27344 -1.0302,0.41016 -1.6552,0.41016 -0.6993,0 -1.2666,-0.12891 -1.7022,-0.38672 -0.4355,-0.25781 -0.7441,-0.55371 -0.9258,-0.88769 -0.1816,-0.33399 -0.2724,-0.62598 -0.2724,-0.87598 0,-0.15234 0.063,-0.29687 0.1904,-0.43359 0.127,-0.13672 0.2861,-0.20508 0.4775,-0.20508 0.3282,0 0.5723,0.18945 0.7325,0.56836 0.1562,0.34765 0.3671,0.61816 0.6328,0.81152 0.2656,0.19336 0.5625,0.29004 0.8906,0.29004 0.3008,0 0.5644,-0.0781 0.791,-0.23438 0.2266,-0.15624 0.4014,-0.37109 0.5244,-0.64453 0.1231,-0.27343 0.1846,-0.58398 0.1846,-0.93164 0,-0.37499 -0.066,-0.69531 -0.1992,-0.96094 -0.1328,-0.26562 -0.3106,-0.46386 -0.5332,-0.59472 -0.2227,-0.13086 -0.4707,-0.19629 -0.7442,-0.19629 -0.3359,0 -0.5761,0.041 -0.7207,0.12305 -0.1445,0.082 -0.3525,0.22559 -0.624,0.43066 -0.2715,0.20508 -0.4951,0.30762 -0.6709,0.30762 -0.1914,0 -0.3613,-0.0693 -0.5098,-0.20801 -0.1484,-0.13867 -0.2226,-0.29589 -0.2226,-0.47168 0,-0.0195 0.021,-0.15234 0.064,-0.39844 l 0.4922,-2.80664 c 0.055,-0.33593 0.1563,-0.58007 0.3047,-0.73242 0.1485,-0.15234 0.3906,-0.22851 0.7266,-0.22852 l 3.0937,0 c 0.6094,1e-5 0.9141,0.23243 0.9141,0.69727 0,0.20313 -0.074,0.36719 -0.2227,0.49219 -0.1484,0.125 -0.3672,0.1875 -0.6562,0.1875 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3172"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 379.9789,474.7099 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,1e-5 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3165"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 395.705,475.8873 c 0.2657,-0.3164 0.5547,-0.55077 0.8672,-0.70312 0.3125,-0.15234 0.6621,-0.22851 1.0488,-0.22852 0.3711,10e-6 0.7139,0.0693 1.0284,0.20801 0.3144,0.13868 0.5898,0.33594 0.8261,0.5918 0.2364,0.25586 0.419,0.55762 0.5479,0.90527 0.1289,0.34766 0.1933,0.71094 0.1933,1.08984 0,0.55079 -0.1259,1.05079 -0.3779,1.5 -0.2519,0.44922 -0.6035,0.79981 -1.0547,1.05176 -0.4511,0.25195 -0.9619,0.37793 -1.5322,0.37793 -0.6562,0 -1.2227,-0.16016 -1.6992,-0.48047 -0.4766,-0.32031 -0.8408,-0.79394 -1.0928,-1.4209 -0.2519,-0.62695 -0.3779,-1.39355 -0.3779,-2.2998 0,-0.73828 0.076,-1.39843 0.2285,-1.98047 0.1523,-0.58203 0.3711,-1.06445 0.6562,-1.44727 0.2852,-0.3828 0.6309,-0.67186 1.0372,-0.86718 0.4062,-0.19531 0.8691,-0.29296 1.3886,-0.29297 0.5,10e-6 0.9405,0.0977 1.3213,0.29297 0.3809,0.19532 0.668,0.4375 0.8613,0.72656 0.1934,0.28907 0.2901,0.56641 0.2901,0.83203 0,0.16016 -0.061,0.30567 -0.1817,0.43652 -0.1211,0.13087 -0.2754,0.1963 -0.4628,0.19629 -0.1641,10e-6 -0.3165,-0.0518 -0.4571,-0.15527 -0.1406,-0.10351 -0.2441,-0.24706 -0.3105,-0.43067 -0.09,-0.23436 -0.2325,-0.42284 -0.4278,-0.56542 -0.1953,-0.14258 -0.4218,-0.21386 -0.6796,-0.21387 -0.2071,10e-6 -0.4131,0.0596 -0.6182,0.17871 -0.2051,0.11915 -0.3779,0.28028 -0.5186,0.4834 -0.2851,0.41407 -0.4531,1.15235 -0.5039,2.21484 z m 1.5821,3.63867 c 0.3945,0 0.7207,-0.16113 0.9785,-0.4834 0.2578,-0.32226 0.3867,-0.74511 0.3867,-1.26855 0,-0.35547 -0.061,-0.66113 -0.1816,-0.91699 -0.1211,-0.25586 -0.2872,-0.45117 -0.4981,-0.58594 -0.2109,-0.13476 -0.4434,-0.20214 -0.6973,-0.20215 -0.2422,10e-6 -0.4736,0.0645 -0.6943,0.19336 -0.2207,0.12891 -0.3984,0.31543 -0.5332,0.55957 -0.1348,0.24415 -0.2021,0.53028 -0.2021,0.8584 0,0.52735 0.1367,0.9668 0.4101,1.31836 0.2734,0.35156 0.6172,0.52734 1.0313,0.52734 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3167"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 407.2187,476.32089 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,1e-5 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,10e-6 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3160"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 423.0055,478.82111 3.9024,0 c 0.375,1e-5 0.6465,0.0586 0.8144,0.17578 0.168,0.1172 0.252,0.31056 0.252,0.58008 0,0.16407 -0.099,0.38087 -0.2959,0.65039 -0.1973,0.26954 -0.4219,0.56739 -0.6738,0.89356 -0.252,0.32618 -0.5118,0.73145 -0.7793,1.21582 -0.2676,0.48438 -0.5127,1.07617 -0.7354,1.77539 -0.094,0.3086 -0.1601,0.56445 -0.1992,0.76758 -0.039,0.20312 -0.082,0.4668 -0.1289,0.79101 -0.047,0.32422 -0.088,0.57227 -0.1231,0.74414 -0.082,0.39844 -0.1982,0.67481 -0.3486,0.8291 -0.1504,0.1543 -0.3506,0.23145 -0.6006,0.23145 -0.2383,0 -0.4297,-0.083 -0.5742,-0.24902 -0.1445,-0.16602 -0.2168,-0.41114 -0.2168,-0.73536 0,-0.24999 0.053,-0.58984 0.1582,-1.01953 0.1055,-0.42968 0.2774,-0.94433 0.5156,-1.54394 0.2383,-0.59961 0.5362,-1.21484 0.8936,-1.8457 0.3574,-0.63086 0.7822,-1.25879 1.2744,-1.88379 l -3.1348,0 c -0.3281,0 -0.5732,-0.0596 -0.7353,-0.17871 -0.1621,-0.11914 -0.2432,-0.30566 -0.2432,-0.55958 0,-0.26952 0.086,-0.44335 0.2578,-0.52148 0.1719,-0.0781 0.4121,-0.11718 0.7207,-0.11719 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3162"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 434.8239,483.11603 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,1e-5 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,10e-6 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3155"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 447.4209,492.81026 c 0,-0.39062 0.1065,-0.75878 0.3194,-1.10449 0.2129,-0.3457 0.5254,-0.62207 0.9375,-0.8291 0.4121,-0.20703 0.8935,-0.31054 1.4443,-0.31055 0.4648,10e-6 0.873,0.0606 1.2246,0.18164 0.3516,0.1211 0.6445,0.28809 0.8789,0.50098 0.2344,0.21289 0.4082,0.45313 0.5215,0.7207 0.1133,0.26758 0.1699,0.55176 0.1699,0.85254 0,0.38282 -0.099,0.72461 -0.2959,1.02539 -0.1972,0.30078 -0.4912,0.54688 -0.8818,0.73828 0.332,0.12891 0.6074,0.29786 0.8262,0.50684 0.2187,0.20898 0.3837,0.45117 0.4951,0.72656 0.1113,0.27539 0.167,0.58106 0.167,0.91699 0,0.49219 -0.1192,0.93848 -0.3574,1.33887 -0.2383,0.40039 -0.5879,0.71387 -1.0489,0.94043 -0.4609,0.22656 -1.0039,0.33984 -1.6289,0.33984 -0.6484,0 -1.2031,-0.11328 -1.664,-0.33984 -0.461,-0.22656 -0.8086,-0.53809 -1.043,-0.93457 -0.2344,-0.39649 -0.3516,-0.84082 -0.3516,-1.33301 0,-1.05078 0.4961,-1.77148 1.4883,-2.16211 -0.8008,-0.375 -1.2012,-0.96679 -1.2012,-1.77539 z m 4.2012,3.87891 c 0,-0.30469 -0.062,-0.57031 -0.1875,-0.79688 -0.125,-0.22656 -0.3008,-0.40039 -0.5273,-0.52148 -0.2266,-0.12109 -0.4805,-0.18164 -0.7618,-0.18164 -0.3984,0 -0.7324,0.13281 -1.0019,0.39843 -0.2695,0.26563 -0.4043,0.63672 -0.4043,1.11328 0,0.30469 0.064,0.57325 0.1904,0.80567 0.127,0.23242 0.2998,0.41211 0.5186,0.53906 0.2187,0.12695 0.4629,0.19043 0.7324,0.19043 0.2734,0 0.5195,-0.0644 0.7383,-0.19336 0.2187,-0.1289 0.3906,-0.31054 0.5156,-0.54492 0.125,-0.23437 0.1875,-0.5039 0.1875,-0.80859 z m -1.4648,-5.00391 c -0.3672,10e-6 -0.6631,0.11426 -0.8877,0.34277 -0.2246,0.22853 -0.3369,0.52247 -0.3369,0.88184 0,0.33204 0.1152,0.6084 0.3457,0.8291 0.2304,0.22071 0.5273,0.33106 0.8906,0.33105 0.1836,10e-6 0.3506,-0.0293 0.501,-0.0879 0.1503,-0.0586 0.2793,-0.13964 0.3867,-0.24316 0.1074,-0.10351 0.1904,-0.22656 0.249,-0.36914 0.059,-0.14257 0.088,-0.2998 0.088,-0.47168 0,-0.23046 -0.052,-0.43749 -0.1553,-0.62109 -0.1035,-0.18359 -0.249,-0.32812 -0.4365,-0.4336 -0.1875,-0.10546 -0.4024,-0.15819 -0.6445,-0.1582 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3157"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 460.3057,495.00752 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,1e-5 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3150"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 476.5619,510.65987 c -0.2578,0.30469 -0.5459,0.53418 -0.8642,0.68847 -0.3184,0.1543 -0.6709,0.23145 -1.0577,0.23145 -0.3671,0 -0.7099,-0.0713 -1.0283,-0.21387 -0.3183,-0.14257 -0.5937,-0.34179 -0.8261,-0.59766 -0.2325,-0.25585 -0.4112,-0.55468 -0.5362,-0.89648 -0.125,-0.34179 -0.1875,-0.70019 -0.1875,-1.0752 0,-0.40233 0.07,-0.78417 0.211,-1.1455 0.1406,-0.36132 0.3418,-0.6748 0.6035,-0.94043 0.2617,-0.26562 0.5732,-0.47265 0.9345,-0.6211 0.3614,-0.14843 0.7608,-0.22264 1.1983,-0.22265 0.5039,1e-5 0.9531,0.0918 1.3476,0.27539 0.3946,0.1836 0.7266,0.4502 0.9961,0.7998 0.2696,0.34962 0.4766,0.79005 0.6211,1.32129 0.1446,0.53126 0.2168,1.13282 0.2168,1.80469 0,0.75 -0.076,1.41114 -0.2285,1.9834 -0.1523,0.57227 -0.374,1.05273 -0.665,1.4414 -0.2911,0.38868 -0.6397,0.67774 -1.0459,0.86719 -0.4063,0.18945 -0.8672,0.28418 -1.3828,0.28418 -0.5079,0 -0.9493,-0.0967 -1.3243,-0.29004 -0.375,-0.19336 -0.6601,-0.43359 -0.8554,-0.7207 -0.1953,-0.28711 -0.293,-0.56348 -0.293,-0.8291 0,-0.16406 0.061,-0.31055 0.1816,-0.43946 0.1211,-0.1289 0.2754,-0.19335 0.4629,-0.19336 0.1719,1e-5 0.3262,0.0479 0.4629,0.14356 0.1367,0.0957 0.2403,0.23926 0.3106,0.43066 0.086,0.23438 0.2285,0.42286 0.4277,0.56543 0.1992,0.14258 0.4238,0.21387 0.6738,0.21387 0.2227,0 0.4336,-0.0566 0.6328,-0.16992 0.1993,-0.11328 0.3692,-0.27344 0.5098,-0.48047 0.2813,-0.41797 0.4492,-1.15625 0.5039,-2.21484 z m -0.1347,-1.79297 c -1e-4,-0.26562 -0.036,-0.51074 -0.1084,-0.73535 -0.072,-0.22461 -0.1739,-0.41894 -0.3047,-0.58301 -0.1309,-0.16406 -0.2871,-0.29296 -0.4688,-0.38672 -0.1816,-0.0937 -0.3799,-0.14062 -0.5947,-0.14063 -0.3711,1e-5 -0.6856,0.15919 -0.9434,0.47754 -0.2578,0.31837 -0.3867,0.73927 -0.3867,1.2627 0,0.51954 0.1289,0.9336 0.3867,1.24219 0.2578,0.30859 0.584,0.46289 0.9785,0.46289 0.2422,0 0.4737,-0.0635 0.6944,-0.19043 0.2207,-0.12695 0.4004,-0.31152 0.539,-0.55371 0.1387,-0.24219 0.208,-0.52734 0.2081,-0.85547 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3152"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 485.3627,510.29658 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,1e-5 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3143"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 495.8721,535.36624 0,-5.33203 c -0.9922,0.76172 -1.6601,1.14258 -2.0039,1.14258 -0.1641,0 -0.3096,-0.0654 -0.4365,-0.19629 -0.127,-0.13086 -0.1904,-0.28222 -0.1904,-0.4541 0,-0.19922 0.062,-0.3457 0.1875,-0.43946 0.125,-0.0937 0.3457,-0.21483 0.6621,-0.36328 0.4726,-0.22265 0.8506,-0.45702 1.1338,-0.70312 0.2832,-0.24609 0.5341,-0.52148 0.7529,-0.82617 0.2187,-0.30468 0.3613,-0.49218 0.4277,-0.5625 0.066,-0.0703 0.1914,-0.10546 0.375,-0.10547 0.207,1e-5 0.3731,0.0801 0.4981,0.24023 0.125,0.16017 0.1875,0.38087 0.1875,0.66211 l 0,6.70899 c 0,0.78515 -0.2676,1.17773 -0.8028,1.17773 -0.2383,0 -0.4297,-0.0801 -0.5742,-0.24023 -0.1445,-0.16016 -0.2168,-0.39649 -0.2168,-0.70899 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3145"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 506.1729,531.95608 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,1e-5 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3147"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 513.2979,531.95608 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,1e-5 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3138"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 341.6725,479.78964 0,-1.08984 -2.9414,0 c -0.3711,0 -0.6494,-0.084 -0.835,-0.25195 -0.1855,-0.16797 -0.2783,-0.39648 -0.2783,-0.68555 0,-0.0742 0.014,-0.14941 0.041,-0.22558 0.027,-0.0762 0.068,-0.15625 0.123,-0.24024 0.055,-0.084 0.1114,-0.16503 0.17,-0.24316 0.059,-0.0781 0.1308,-0.17383 0.2168,-0.28711 l 3.1054,-4.1543 c 0.2032,-0.27343 0.3701,-0.47167 0.501,-0.59473 0.1309,-0.12303 0.2881,-0.18456 0.4717,-0.18457 0.5937,1e-5 0.8906,0.33986 0.8906,1.01953 l 0,4.53516 0.252,0 c 0.3007,0 0.542,0.041 0.7236,0.12305 0.1816,0.082 0.2725,0.26172 0.2725,0.53906 0,0.22657 -0.074,0.3916 -0.2227,0.49512 -0.1484,0.10352 -0.3711,0.15527 -0.668,0.15527 l -0.3574,0 0,1.08984 c 0,0.30079 -0.066,0.52442 -0.1992,0.6709 -0.1328,0.14649 -0.3106,0.21973 -0.5332,0.21973 -0.2188,0 -0.3955,-0.0752 -0.5303,-0.22559 -0.1347,-0.15039 -0.2021,-0.37207 -0.2021,-0.66504 z m -2.5196,-2.40234 2.5196,0 0,-3.4043 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3140"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 351.1588,476.32089 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,1e-5 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,10e-6 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3133"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 313.5778,482.14338 c 0.3594,0 0.669,-0.10546 0.9287,-0.31641 0.2598,-0.21093 0.3897,-0.51366 0.3897,-0.9082 0,-0.30078 -0.1036,-0.55956 -0.3106,-0.77637 -0.207,-0.21679 -0.4863,-0.32519 -0.8379,-0.32519 -0.2383,0 -0.4345,0.0332 -0.5888,0.0996 -0.1543,0.0664 -0.2764,0.1543 -0.3662,0.26367 -0.09,0.10938 -0.1749,0.25 -0.2549,0.42187 -0.08,0.17188 -0.1534,0.33399 -0.2198,0.48633 -0.039,0.082 -0.1093,0.14649 -0.2109,0.19336 -0.1016,0.0469 -0.2187,0.0703 -0.3516,0.0703 -0.1562,10e-6 -0.2998,-0.0635 -0.4306,-0.19043 -0.1309,-0.12694 -0.1963,-0.29589 -0.1963,-0.50683 0,-0.20312 0.061,-0.41699 0.1846,-0.6416 0.123,-0.22461 0.3027,-0.43847 0.539,-0.64161 0.2363,-0.20311 0.5303,-0.3662 0.8819,-0.48925 0.3515,-0.12304 0.7441,-0.18457 1.1777,-0.18457 0.3789,0 0.7246,0.0518 1.0371,0.15527 0.3125,0.10352 0.584,0.25294 0.8145,0.44824 0.2304,0.19532 0.4042,0.42188 0.5214,0.67969 0.1172,0.25782 0.1758,0.53516 0.1758,0.83203 0,0.39063 -0.085,0.72559 -0.2549,1.00488 -0.1699,0.27931 -0.4131,0.55177 -0.7295,0.81739 0.3047,0.16406 0.5616,0.35156 0.7706,0.5625 0.2089,0.21094 0.3662,0.44434 0.4716,0.70019 0.1055,0.25586 0.1582,0.53223 0.1582,0.8291 0,0.35547 -0.071,0.69922 -0.2138,1.03125 -0.1426,0.33204 -0.3526,0.62793 -0.6299,0.8877 -0.2774,0.25976 -0.6065,0.46289 -0.9873,0.60937 -0.3809,0.14649 -0.8018,0.21973 -1.2627,0.21973 -0.4688,0 -0.8887,-0.084 -1.2598,-0.25195 -0.3711,-0.16797 -0.6767,-0.37793 -0.917,-0.62989 -0.2402,-0.25195 -0.4218,-0.51269 -0.5449,-0.78222 -0.123,-0.26953 -0.1846,-0.49219 -0.1846,-0.66797 0,-0.22656 0.073,-0.40918 0.2198,-0.54785 0.1464,-0.13867 0.3291,-0.20801 0.5478,-0.20801 0.1094,0 0.2149,0.0322 0.3164,0.0967 0.1016,0.0645 0.168,0.1416 0.1992,0.23144 0.2032,0.54298 0.4209,0.94629 0.6534,1.20997 0.2324,0.26367 0.5595,0.3955 0.9814,0.3955 0.2422,0 0.4756,-0.0596 0.7002,-0.17871 0.2246,-0.11914 0.4102,-0.29589 0.5566,-0.53027 0.1465,-0.23437 0.2198,-0.50586 0.2198,-0.81445 0,-0.45703 -0.125,-0.81543 -0.375,-1.0752 -0.25,-0.25976 -0.5977,-0.38964 -1.043,-0.38965 -0.078,10e-6 -0.1992,0.008 -0.3633,0.0234 -0.164,0.0156 -0.2695,0.0234 -0.3164,0.0234 -0.2148,0 -0.3808,-0.0537 -0.498,-0.16114 -0.1172,-0.10741 -0.1758,-0.25683 -0.1758,-0.44824 0,-0.18749 0.07,-0.33886 0.2109,-0.4541 0.1406,-0.11523 0.3496,-0.17285 0.627,-0.17285 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3135"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 323.9782,483.11603 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,1e-5 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,10e-6 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3128"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 286.2126,496.56351 3.0586,0 c 0.3047,0 0.5371,0.0625 0.6973,0.1875 0.1601,0.125 0.2402,0.29493 0.2402,0.50977 0,0.19141 -0.064,0.35351 -0.1904,0.48633 -0.127,0.13281 -0.3193,0.19922 -0.5771,0.19922 l -4.3125,0 c -0.293,0 -0.5215,-0.0811 -0.6856,-0.24317 -0.1641,-0.16211 -0.2461,-0.35254 -0.2461,-0.57129 0,-0.14062 0.053,-0.32714 0.1582,-0.55957 0.1055,-0.23242 0.2207,-0.41504 0.3457,-0.54785 0.5195,-0.53906 0.9883,-1.00097 1.4063,-1.38574 0.4179,-0.38476 0.7168,-0.63769 0.8965,-0.75879 0.3203,-0.22656 0.5869,-0.4541 0.7998,-0.68262 0.2128,-0.22851 0.375,-0.46288 0.4863,-0.70312 0.1113,-0.24023 0.167,-0.47558 0.167,-0.70606 0,-0.24999 -0.06,-0.47362 -0.1787,-0.6709 -0.1192,-0.19725 -0.2813,-0.35057 -0.4864,-0.45996 -0.205,-0.10936 -0.4287,-0.16405 -0.6709,-0.16406 -0.5117,10e-6 -0.914,0.22462 -1.207,0.67383 -0.039,0.0586 -0.1045,0.21876 -0.1963,0.48047 -0.092,0.26172 -0.1953,0.46289 -0.3105,0.60351 -0.1153,0.14063 -0.2842,0.21095 -0.5069,0.21094 -0.1953,10e-6 -0.3574,-0.0644 -0.4863,-0.19336 -0.1289,-0.1289 -0.1934,-0.30468 -0.1934,-0.52734 0,-0.26953 0.061,-0.55078 0.1817,-0.84375 0.1211,-0.29296 0.3017,-0.55859 0.542,-0.79688 0.2402,-0.23827 0.5449,-0.43065 0.914,-0.57715 0.3692,-0.14647 0.8018,-0.21971 1.2979,-0.21972 0.5976,1e-5 1.1074,0.0938 1.5293,0.28125 0.2734,0.12501 0.5137,0.29688 0.7207,0.51562 0.207,0.21876 0.3682,0.47169 0.4834,0.75879 0.1152,0.28712 0.1728,0.58497 0.1728,0.89356 0,0.48438 -0.1201,0.92481 -0.3603,1.32129 -0.2402,0.39648 -0.4854,0.70703 -0.7354,0.93164 -0.25,0.22461 -0.6689,0.57715 -1.2568,1.05761 -0.5879,0.48047 -0.9912,0.85352 -1.21,1.11914 -0.094,0.10547 -0.1894,0.23243 -0.2871,0.38086 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3130"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 297.2224,493.73343 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,1e-5 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3123"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 263.1386,514.13143 0,-5.33203 c -0.9922,0.76172 -1.6601,1.14258 -2.0039,1.14258 -0.1641,0 -0.3096,-0.0654 -0.4365,-0.19629 -0.127,-0.13086 -0.1904,-0.28222 -0.1904,-0.4541 0,-0.19922 0.062,-0.3457 0.1875,-0.43946 0.125,-0.0937 0.3457,-0.21483 0.6621,-0.36328 0.4726,-0.22265 0.8506,-0.45702 1.1338,-0.70312 0.2832,-0.24609 0.5341,-0.52148 0.7529,-0.82617 0.2187,-0.30468 0.3613,-0.49218 0.4277,-0.5625 0.066,-0.0703 0.1914,-0.10546 0.375,-0.10547 0.207,1e-5 0.3731,0.0801 0.4981,0.24023 0.125,0.16017 0.1875,0.38087 0.1875,0.66211 l 0,6.70899 c 0,0.78515 -0.2676,1.17773 -0.8028,1.17773 -0.2383,0 -0.4297,-0.0801 -0.5742,-0.24023 -0.1445,-0.16016 -0.2168,-0.39649 -0.2168,-0.70899 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3125"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 273.4394,510.72127 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,1e-5 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path3120"
+           style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:100%;font-family:'Arial Rounded MT Bold';-inkscape-font-specification:'Arial Rounded MT Bold,';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none"
+           d="m 244.408,533.10669 c 0,0.64063 -0.039,1.19141 -0.1172,1.65235 -0.078,0.46094 -0.2226,0.87891 -0.4336,1.2539 -0.2656,0.46094 -0.6094,0.81641 -1.0312,1.06641 -0.4219,0.25 -0.8907,0.375 -1.4063,0.375 -0.5937,0 -1.126,-0.16797 -1.5967,-0.50391 -0.4707,-0.33593 -0.8252,-0.80078 -1.0634,-1.39453 -0.1211,-0.32421 -0.21,-0.68261 -0.2666,-1.07519 -0.057,-0.39258 -0.085,-0.81738 -0.085,-1.27442 0,-0.58983 0.031,-1.12108 0.094,-1.59375 0.062,-0.47265 0.1601,-0.8789 0.2929,-1.21875 0.2305,-0.56249 0.5654,-0.9912 1.0049,-1.28613 0.4395,-0.29491 0.9639,-0.44237 1.5732,-0.44238 0.4024,10e-6 0.7676,0.0654 1.0957,0.19629 0.3282,0.13087 0.6163,0.32227 0.8643,0.57422 0.248,0.25196 0.458,0.56348 0.6299,0.93457 0.2969,0.64453 0.4453,1.55664 0.4453,2.73632 z m -1.6055,-0.11718 c 0,-0.71484 -0.043,-1.2998 -0.1289,-1.75489 -0.086,-0.45507 -0.2304,-0.79882 -0.4336,-1.03125 -0.2031,-0.23241 -0.4843,-0.34862 -0.8437,-0.34863 -0.5156,10e-6 -0.874,0.25977 -1.0752,0.7793 -0.2012,0.51954 -0.3018,1.32032 -0.3018,2.40234 0,0.73438 0.043,1.33594 0.1289,1.80469 0.086,0.46875 0.2305,0.82324 0.4336,1.06348 0.2032,0.24023 0.4785,0.36035 0.8262,0.36035 0.3594,0 0.6406,-0.125 0.8438,-0.375 0.2031,-0.25 0.3456,-0.60742 0.4277,-1.07227 0.082,-0.46484 0.123,-1.07421 0.123,-1.82812 z" />
+      </g>
+    </g>
+  </g>
+</svg>
diff --git a/Crow/Images/screenshot.png b/Crow/Images/screenshot.png
new file mode 100644 (file)
index 0000000..3540d6b
Binary files /dev/null and b/Crow/Images/screenshot.png differ
diff --git a/Crow/Images/screenshot2.png b/Crow/Images/screenshot2.png
new file mode 100644 (file)
index 0000000..46a7bec
Binary files /dev/null and b/Crow/Images/screenshot2.png differ
diff --git a/Crow/Templates/ArrowBut.template b/Crow/Templates/ArrowBut.template
new file mode 100755 (executable)
index 0000000..2d3bb29
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<Border Name="Content"
+       Background="vgradient|0:White|0.1:LightGrey|0.9:LightGrey|1:Black" Foreground="DarkGrey" 
+       MouseEnter="{Foreground=White}"
+       MouseLeave="{Foreground=DarkGrey}"
+       MouseDown="{Background=vgradient|0:Black|0.1:LightGrey|0.9:LightGrey|1:White}"
+       MouseUp="{Background=vgradient|0:White|0.1:LightGrey|0.9:LightGrey|1:Black}"
+       >
+</Border>
diff --git a/Crow/Templates/Button.template b/Crow/Templates/Button.template
new file mode 100755 (executable)
index 0000000..db8c31e
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<Border Background="{./Background}" MinimumSize="50,20" Name="Content" Focusable="true"
+       Foreground="Transparent" CornerRadius="{../CornerRadius}" BorderWidth="1"
+       MouseEnter="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black;caption.Foreground=White}"
+       MouseLeave="{Foreground=Transparent;caption.Foreground=LightGrey}"
+       MouseDown="{Foreground=vgradient|0:Black|0.05:Grey|0.85:Grey|1:White}"
+       MouseUp="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"                  
+       >
+       <Label Font="{./Font}" Name="caption" Margin="3" Foreground="LightGrey" Text="{./Caption}"/>
+</Border>
diff --git a/Crow/Templates/CheckBox.template b/Crow/Templates/CheckBox.template
new file mode 100755 (executable)
index 0000000..f24b50a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<HorizontalStack Style="Control" Background="{./Background}">
+       <Image Style="Icon" Path="#Crow.Icons.checkbox.svg"
+               SvgSub="{./IsChecked}"/>
+       <Label Font="{./Font}" Text="{./Caption}" Foreground="{./Foreground}"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Crow/Templates/CheckBox2.template b/Crow/Templates/CheckBox2.template
new file mode 100644 (file)
index 0000000..0fa0ffe
--- /dev/null
@@ -0,0 +1,7 @@
+<Border Foreground="Transparent" MouseEnter="{Foreground=Grey}" MouseLeave="{Foreground=Transparent}">
+       <Label Font="{./Font}" Text="{./Caption}"
+               Margin="1"
+               Background="{./Background}"
+               Foreground="{./Foreground}"
+               TextAlignment="Center"/>
+</Border>
\ No newline at end of file
diff --git a/Crow/Templates/ColorPicker.template b/Crow/Templates/ColorPicker.template
new file mode 100755 (executable)
index 0000000..fc7e5c5
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<Border Background="{./Background}"    Foreground="{./Foreground}"
+               CornerRadius="{./CornerRadius}" BorderWidth="1">
+               <HorizontalStack Spacing="0">
+                       <VerticalStack Margin="5">
+                               <SaturationValueSelector S="{²./S}" V="{²./V}" Focusable="true" Name="colorSelector" Margin="0"
+                                       Foreground="{../hueSelector.HueColor}"
+                                       Width="128" Height="128"/>
+                               <HueSelector Hue="{²./H}" Focusable="true" Name="hueSelector" Margin="0" Width="128" Height="20"/>
+                       </VerticalStack>
+                       <VerticalStack Margin="5" Spacing="1" Width="100">
+                               <Widget Width="34" Height="21" Background="{./SelectedColor}"/>
+                               <Label Focusable="true" Selectable="true" Text="{./SelectedColor}" />                           
+                               <HorizontalStack Height="Fit">
+                                       <Label Text="R" Width="Stretched" TextAlignment="Right"/>
+                                       <Spinner Style="ColorSpinner" Value="{²./R}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Height="Fit">
+                                       <Label Text="G" Width="Stretched" TextAlignment="Right"/>
+                                       <Spinner Style="ColorSpinner" Value="{²./G}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Height="Fit">
+                                       <Label Text="B" Width="Stretched" TextAlignment="Right"/>
+                                       <Spinner Style="ColorSpinner" Value="{²./B}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Height="Fit">
+                                       <Label Text="A" Width="Stretched" TextAlignment="Right"/>
+                                       <Spinner Style="ColorSpinner" Value="{²./A}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Height="Fit">
+                                       <Label Text="H" Width="Stretched" TextAlignment="Right"/>
+                                       <Spinner Style="HSVSpinner" Value="{²./H}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Height="Fit">
+                                       <Label Text="S" Width="Stretched" TextAlignment="Right"/>
+                                       <Spinner Style="HSVSpinner" Value="{²./S}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Height="Fit">
+                                       <Label Text="V" Width="Stretched" TextAlignment="Right"/>
+                                       <Spinner Style="HSVSpinner" Value="{²./V}"/>
+                               </HorizontalStack>
+                       </VerticalStack>
+               </HorizontalStack>
+</Border>
diff --git a/Crow/Templates/ComboBox.template b/Crow/Templates/ComboBox.template
new file mode 100755 (executable)
index 0000000..f08a839
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<Popper Caption="{./SelectedItem}" Name="popper" PopDirection="Bottom" Foreground="{./Foreground}" Background="{./Background}">
+       <Template>
+               <CheckBox Caption="{./Caption}" IsChecked="{²./IsPopped}" Foreground="{./Foreground}" Background="{./Background}">
+                       <Template>
+                               <Border CornerRadius="0" Foreground="LightGrey">
+                                       <HorizontalStack Margin="0" Spacing="1">
+                                               <TextBox MinimumSize="80,10" Margin="1" Foreground="Black" Background="White"
+                                                       Text="{./Caption}"/>
+                                               <Button Width="14" Height="14" Focusable="false"
+                                                       Template="#Crow.ArrowBut.template">
+                                                       <Image Margin="0"  Path="#Crow.Icons.updown.svg" SvgSub="down"/>
+                                               </Button>
+                                       </HorizontalStack>
+                               </Border>
+                       </Template>
+               </CheckBox>
+       </Template>
+       <Border Background="DimGrey" BorderWidth="1" Margin="1"
+               MinimumSize="{../../MinimumPopupSize}" Fit="true">
+               <Scroller Name="scroller1" Margin="2" 
+                       MaximumSize="0,200"
+                       HorizontalAlignment="Left">
+                       <VerticalStack
+                               Height="Fit" Name="ItemsContainer" Margin="0"
+                               HorizontalAlignment="Left"
+                               VerticalAlignment="Top"/>
+               </Scroller>
+       </Border>
+</Popper>
diff --git a/Crow/Templates/ContextMenu.template b/Crow/Templates/ContextMenu.template
new file mode 100644 (file)
index 0000000..7fc8dcc
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<MenuItem MinimumSize="20,20" Height="Fit" Width="160" Caption="Context Menu" Data="{ContextCommands}" Orientation="Vertical"
+       IsOpened ="true" Visible="{/IsOpened}" SelectionBackground="Transparent"
+       Background="Red">
+       <Template>
+               <HorizontalStack>
+                       <Border Background="DimGrey" Foreground="DimGrey" CornerRadius="5">
+                       <GenericStack Orientation="{./Orientation}" Name="ItemsContainer"
+                               Margin="2"/>
+                       </Border>
+               </HorizontalStack>
+       </Template>
+       <ItemTemplate>
+               <MenuItem Command="{}" Width="150" PopWidth="120" SelectionBackground="Transparent" IsEnabled="{CanExecute}">
+                       <Template>
+                               <Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
+                                       Foreground = "{./Foreground}" CanPop="{./HasChildren}" MouseDown="./onMI_Click"
+                                       IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}">
+                                       <Template>
+                                               <Border Name="border1"
+                                                               CornerRadius="2"
+                                                               MouseEnter="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"
+                                                               MouseLeave="{Foreground=Transparent}"
+                                                               MouseDown="{Foreground=vgradient|0:Black|0.05:Grey|0.85:Grey|1:White}"
+                                                               MouseUp="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"
+                                                               MinimumSize = "60,0"
+                                                               Foreground="Transparent"
+                                                               Background="{./Background}">
+                                                               <Label Text="{./Caption}"
+                                                                       Foreground="{./Foreground}"
+                                                                       Margin="3" HorizontalAlignment="Left"
+                                                                       Font="{./Font}" />
+                                               </Border>
+                                       </Template>
+                                       <Border Foreground="DimGrey" Width="{../PopWidth}" Height="{../PopHeight}" Background="DimGrey">
+                                               <VerticalStack Name="ItemsContainer"/>
+                                       </Border>
+                               </Popper>
+                       </Template>
+               </MenuItem>
+       </ItemTemplate>
+</MenuItem>
+
diff --git a/Crow/Templates/DefaultItem.template b/Crow/Templates/DefaultItem.template
new file mode 100755 (executable)
index 0000000..fc13ab4
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Container Fit="true" Margin="0" Focusable="true"
+               HorizontalAlignment="Left"
+               MouseEnter="{Background=SteelBlue}"
+               MouseLeave="{Background=Transparent}">
+       <Label Text="{}"/>
+</Container>
+
diff --git a/Crow/Templates/DirectoryView.template b/Crow/Templates/DirectoryView.template
new file mode 100755 (executable)
index 0000000..d219333
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<TreeView IsRoot="true" Name="treeView" Data="{./FileSystemEntries}" Background="{./Background}"
+               SelectedItemChanged="./onSelectedItemChanged">
+       <ItemTemplate DataType="System.IO.FileInfo">
+               <Border CornerRadius="2" Margin="0" Focusable="true"  Height="Fit" Width="Stretched" Foreground="Transparent"
+                               MouseEnter="{Foreground=DimGrey}"
+                               MouseLeave="{Foreground=Transparent}">
+                       <HorizontalStack>
+                               <Image Margin="1" Width="14" Height="14"
+                                       Path="#Crow.Icons.file.svg"/>
+                               <Label Text="{Name}" Width="Stretched"/>
+                       </HorizontalStack>
+               </Border>
+       </ItemTemplate>
+       <ItemTemplate DataType="System.IO.DirectoryInfo" Data="GetFileSystemInfos">
+               <Expandable Caption="{Name}" MouseDoubleClick="/onClickForExpand">
+                       <Template>
+                               <VerticalStack>
+                                       <Border CornerRadius="2" Margin="0" Height="Fit" MouseDoubleClick="./onClickForExpand"
+                                                       Foreground="Transparent"
+                                                       MouseEnter="{Foreground=DimGrey}"
+                                                       MouseLeave="{Foreground=Transparent}">
+                                               <HorizontalStack Spacing="1">
+                                                       <Image Margin="1" Width="9" Height="9" Focusable="true" MouseDown="./onClickForExpand"
+                                                               Path="{./Image}"
+                                                               Visible="{./IsExpandable}"
+                                                               SvgSub="{./IsExpanded}"
+                                                               MouseEnter="{Background=LightGrey}"
+                                                               MouseLeave="{Background=Transparent}"/>
+                                                       <Image Margin="1" Width="16" Height="16"
+                                                               Path="#Crow.Icons.folder.svg" SvgSub="{./IsExpanded}"/>
+                                                       <Label Text="{./Caption}"/>
+                                               </HorizontalStack>
+                                       </Border>
+                                       <Container Name="Content" Visible="false"/>
+                               </VerticalStack>
+                       </Template>
+                       <HorizontalStack Height="Fit">
+                               <Widget Width="12" Height="10"/>
+                               <VerticalStack Height="Fit" Name="ItemsContainer"/>
+                       </HorizontalStack>
+               </Expandable>
+       </ItemTemplate>
+</TreeView>
diff --git a/Crow/Templates/DockWindow.template b/Crow/Templates/DockWindow.template
new file mode 100755 (executable)
index 0000000..e62672b
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<!--<Widget Background="{./Background}"/>-->
+<Border BorderWidth="1" Foreground="Black" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+               <HorizontalStack Visible="{./IsDocked}" Height="Fit" Margin="1" Background="vgradient|0:0.3,0.5,0.8,0.9|1:0.1,0.1,0.1,0.9">
+                       <Label  Text="{./Caption}" TextAlignment="Left" Width="Stretched"
+                                        Foreground="White" />
+                       <Border CornerRadius="6" BorderWidth="1" Foreground="Transparent"  Height="10" Width="10"
+                               MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                               <Image Focusable="true" Name="Image" Margin="0" Path="#Crow.Icons.exit2.svg"
+                                        MouseClick="./butQuitPress"/>
+                       </Border>
+               </HorizontalStack>
+               <HorizontalStack Background="vgradient|0:0.5,0.6,0.5,0.5|1:0.2,0.3,0.3,0.7"
+                               Name="hs" Margin="0" Spacing="0" Height="Fit" Visible="{./IsFloating}">
+                       <Widget Width="5"/>
+                       <Image Margin="1" Width="10" Height="10" Path="{./Icon}"/>
+                       <Label Width="Stretched" Foreground="White" Margin="1" TextAlignment="Left" Text="{./Caption}" />
+                       <Border CornerRadius="6" BorderWidth="1" Foreground="Transparent"  Height="10" Width="10"
+                               MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                               <Image Focusable="true" Name="Image" Margin="0" Path="#Crow.Icons.exit2.svg"
+                                        MouseClick="./butQuitPress"/>
+                       </Border>
+                       <Widget Width="5"/>
+               </HorizontalStack>
+               <Container Name="Content" MinimumSize="50,50"/>
+       </VerticalStack>
+</Border>
diff --git a/Crow/Templates/Expandable.template b/Crow/Templates/Expandable.template
new file mode 100755 (executable)
index 0000000..e0ba29b
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<Border Style="ControlBorder" Foreground="{./Foreground}" Background="{./Background}">
+       <VerticalStack>
+               <HorizontalStack Spacing="1" Height="Fit" Focusable="true" MouseDoubleClick="./onClickForExpand">
+                       <Container Margin="1" Width="9" Height="9" MouseDown="./onClickForExpand"
+                                                                                                               MouseEnter="{Background=LightGrey}"
+                                                                                                               MouseLeave="{Background=Transparent}">
+                               <Image
+                                       Path="#Crow.Icons.expandable.svg"
+                                       Visible="{./IsExpandable}"
+                                       SvgSub="{./IsExpanded}"/>
+                       </Container>
+                       <Label Style="ControlCaption" Text="{./Caption}"/>
+               </HorizontalStack>
+               <Container Name="Content" Visible="false"/>
+       </VerticalStack>
+</Border>
diff --git a/Crow/Templates/FileDialog.template b/Crow/Templates/FileDialog.template
new file mode 100644 (file)
index 0000000..419e093
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="White" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+               <HorizontalStack Background="{./TitleBarBackground}"
+                               Name="hs" Margin="2" Spacing="0" Height="Fit">
+                       <Widget Width="5"/>
+                       <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                       <Label Width="Stretched" Foreground="{./TitleBarForeground}" Margin="1" TextAlignment="Center" Text="{./Caption}" />
+                       <Border CornerRadius="0" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                               MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                               <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Icons.exit2.svg"
+                                        MouseClick="./butQuitPress"/>
+                       </Border>
+                       <Widget Width="5"/>
+               </HorizontalStack>
+               <Container Name="Content" MinimumSize="50,50" Background="Jet">
+                       <VerticalStack Margin="1">
+                               <HorizontalStack Height="Fit">
+                                       <Button Fit="true" Caption="Up" MouseClick="./goUpDirClick">
+                                               <Image Margin="2" Width="14" Height="14"
+                                                       Path="#Crow.Icons.level-up.svg"/>
+                                       </Button>
+                                       <TextBox Style="TxtInFileDialog" Text="{²./CurrentDirectory}"/>
+                               </HorizontalStack>
+                               <DirectoryView ShowHidden="{²../cbShowHidden.IsChecked}" FileMask="{²../txtFileMask.Text}" ShowFiles="{²../cbShowFiles.IsChecked}" Name="fv" CurrentDirectory="{./CurrentDirectory}" SelectedItemChanged="./onFVSelectedItemChanged"
+                                               Width="100%" Margin="0" MouseDoubleClick="./onFileSelect">
+                                       <Template>
+                                               <ListBox ItemTemplate="#Crow.FileItems.template" Name="fileView" Data="{./FileSystemEntries}"
+                                                       SelectedItemChanged="./onSelectedItemChanged">
+                                                       <Template>
+                                                               <HorizontalStack>
+                                                                       <Scroller Name="scroller1">
+                                                                               <VerticalStack Height="Fit" VerticalAlignment="Top"
+                                                                                       Name="ItemsContainer" Margin="0" Spacing="1"/>
+                                                                       </Scroller>
+                                                                       <ScrollBar Name="scrollbar1" Orientation="Vertical"
+                                                                               Value="{²../scroller1.ScrollY}"        Maximum="{../scroller1.MaxScrollY}" 
+                                                                               CursorSize="{../scroller1.ChildHeightRatio}"
+                                                                               LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30"
+                                                                               Width="14" />
+                                                               </HorizontalStack>
+                                                       </Template>
+                                               </ListBox>
+                                       </Template>
+                               </DirectoryView>
+                               <HorizontalStack Height="Fit">
+                                       <TextBox Style="TxtInFileDialog" Text="{²./SelectedFile}"/>
+                                       <TextBox Style="TxtInFileDialog" Width="50" Name="txtFileMask" Text="{²./SearchPattern}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Margin="5" Fit="true" HorizontalAlignment="Right">
+                                       <CheckBox Style="CheckBoxAlt" Name="cbShowFiles" Caption="Show Files" IsChecked="{²./ShowFiles}"/>
+                                       <CheckBox Style="CheckBoxAlt" Name="cbShowHidden" Caption="Show Hidden" IsChecked="{²./ShowHidden}"/>
+                               </HorizontalStack>
+                               <HorizontalStack Fit="true" HorizontalAlignment="Right">
+                                       <Button Caption="Ok" MouseClick="./onFileSelect"/>
+                                       <Button Caption="Cancel" MouseClick="./onCancel"/>
+                               </HorizontalStack>
+                       </VerticalStack>
+               </Container>
+       </VerticalStack>
+</Border>
diff --git a/Crow/Templates/FileItems.template b/Crow/Templates/FileItems.template
new file mode 100644 (file)
index 0000000..fb95e29
--- /dev/null
@@ -0,0 +1,25 @@
+<ItemTemplate>
+       <Widget Height="16" Background="Red"/>
+</ItemTemplate>
+<ItemTemplate DataType="System.IO.FileInfo">
+       <HorizontalStack Focusable="true"  Height="Fit">
+               <Image Margin="2" Width="16" Height="16"
+                       Path="#Crow.Icons.file.svg"/>
+                       <Label Text="{Name}" Width="Stretched"
+                               MouseEnter="{Background=RoyalBlue}"
+                               MouseLeave="{Background=Transparent}"/>
+       </HorizontalStack>
+</ItemTemplate>
+<ItemTemplate DataType="System.IO.DirectoryInfo">
+       <Border Foreground="Transparent" Focusable="true" Height="Fit">
+               <HorizontalStack
+                               MouseEnter="{Background=RoyalBlue}"
+                               MouseLeave="{Background=Transparent}">
+                       <Image Margin="2" Width="16" Height="16"
+                               Path="#Crow.Icons.folder.svg"/>
+                       <Label Text="{Name}" Width="Stretched"/>
+                       <Label Text="{LastAccessTime}" />
+               </HorizontalStack>
+       </Border>
+</ItemTemplate>
+
diff --git a/Crow/Templates/GroupBox.template b/Crow/Templates/GroupBox.template
new file mode 100755 (executable)
index 0000000..0540b55
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Container Background="{./Background}">
+       <Group>
+               <VerticalStack Spacing="0">
+                       <Widget Height="6"/>
+                       <Border  CornerRadius="5" BorderWidth="1" Margin="10" Foreground="{./Foreground}">
+                               <Container Name="Content" Margin="0" MinimumSize="70,10"/>
+                       </Border>
+               </VerticalStack>
+               <Label Text="{./Caption}" VerticalAlignment="Top" Left="8"
+                       Background="Clear" Margin="1"/>
+       </Group>
+</Container>
\ No newline at end of file
diff --git a/Crow/Templates/HScrollBar.template b/Crow/Templates/HScrollBar.template
new file mode 100755 (executable)
index 0000000..a4ab641
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="{./Foreground}" Background="{./Background}">
+       <GenericStack Orientation="{./Orientation}" Spacing="0">
+               <Shape Style="HArrowBut" MouseDown="./onScrollBack"
+            Margin="1" Width="6" Size="10,10" Path="M 0.5,4.5 L 9.5,0.5 L 9.5,9.5 Z"/>
+               <Slider Name="Slider"                   
+                       Orientation="{./Orientation}"
+                       Value="{²./Value}"
+                       Maximum="{./Maximum}"
+                       CursorSize="{./CursorSize}"
+                       Height="{./HeightPolicy}" Width="{./WidthPolicy}"
+                       LargeIncrement="{./LargeIncrement}"
+                       SmallIncrement="{./SmallIncrement}"
+                       CursorColor="vgradient|0:Silver|1:Grey"
+            Background="Transparent"
+                       Foreground="{./Foreground}"/>
+               <Shape Style="HArrowBut" MouseDown="./onScrollForth"
+            Margin="1" Width="6" Size="10,10" Path="M 0.5,0.5 L 9.5,4.5 L 0.5,9.5 Z"/>
+       </GenericStack>
+</Border>
\ No newline at end of file
diff --git a/Crow/Templates/ListBox.template b/Crow/Templates/ListBox.template
new file mode 100755 (executable)
index 0000000..a1aea50
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Margin="1" MinimumSize="10,10">
+       <Scroller  Name="scroller1" Margin="1" >
+               <VerticalStack
+                       Height="Fit" Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+       </Scroller>
+</Border>
diff --git a/Crow/Templates/Menu.template b/Crow/Templates/Menu.template
new file mode 100644 (file)
index 0000000..99ae554
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<GenericStack Orientation="{./Orientation}" Name="ItemsContainer" Margin="0" Background="{./Background}"/>
diff --git a/Crow/Templates/MenuItem.template b/Crow/Templates/MenuItem.template
new file mode 100644 (file)
index 0000000..ae31c86
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<HorizontalStack>
+<Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
+       Foreground = "{./Foreground}" CanPop="{./HasChildren}"
+       IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}">
+       <Template>
+               <CheckBox IsChecked="{²./IsPopped}" Caption="{./Caption}" Background="{./Background}" Foreground="{./Foreground}">
+                       <Template>              
+                               <Border Name="border1"
+                                               MinimumSize = "60,0"
+                                               Foreground="Transparent"
+                                               Background="{./Background}">
+                                               <Label Text="{./Caption}"
+                                                       Foreground="{./Foreground}"
+                                                       Margin="2" HorizontalAlignment="Left"
+                                                       Font="{./Font}" />
+                               </Border>
+                       </Template>             
+               </CheckBox>
+       </Template>
+       <Border Foreground="DimGrey" Width="{../PopWidth}" Height="{../PopHeight}" Background="vgradient|0:DimGrey|1:Black">
+               <VerticalStack Name="ItemsContainer"/>
+       </Border>
+</Popper>
+<Widget Background="Green" Width="5" Height="5" Visible="{./AutomaticOpening}"/>
+</HorizontalStack>
diff --git a/Crow/Templates/MessageBox.template b/Crow/Templates/MessageBox.template
new file mode 100644 (file)
index 0000000..385bf82
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<Border        CornerRadius="0"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Background="{./Background}">
+               <Border BorderWidth="0" Foreground="White" Height="Fit" Width="Stretched" MinimumSize="200,0"
+                               Background="{./TitleBarBackground}">
+                       <HorizontalStack Name="hs" Margin="2" Spacing="1" Height="Fit" >
+                               <Widget Width="5" Height="5"/>
+                               <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                               <Label Width="Stretched" Foreground="{./TitleBarForeground}" Margin="1" TextAlignment="Center" Text="{./Caption}" />
+                               <Border CornerRadius="3" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Name="Image" Path="#Crow.Icons.exit2.svg"
+                                                MouseClick="./butQuitPress"/>
+                               </Border>
+                               <Widget Width="5" Height="5"/>
+                       </HorizontalStack>
+               </Border>
+               <HorizontalStack Margin="5" >
+                       <Image Name="Image" Width="50" Height="30" Path="{./MsgIcon}" />
+                       <Label Margin="5" Font="{./Font}" Text="{./Message}"                            
+                               TextAlignment="Center"
+                               Multiline="true" />             
+               </HorizontalStack>
+               <HorizontalStack Margin="4" Spacing="0" Width="Fit" Height="Fit" HorizontalAlignment="Right">
+                       <Button Width="Fit" Caption="{./OkMessage}" MouseClick="./onOkButtonClick" />
+                       <Button Width="Fit" Visible="{./NoButIsVisible}"
+                               Caption="{./NoMessage}" MouseClick="./onNoButtonClick" />
+                       <Button Width="Fit" Visible="{./CancelButIsVisible}"
+                               Caption="{./CancelMessage}" MouseClick="./onCancelButtonClick" />
+               </HorizontalStack>
+       </VerticalStack>
+</Border>
diff --git a/Crow/Templates/Popper.template b/Crow/Templates/Popper.template
new file mode 100755 (executable)
index 0000000..6b9bef9
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<CheckBox Caption="{./Caption}" IsChecked="{²./IsPopped}" Foreground="{./Foreground}" Background="{./Background}">
+       <Template>
+               <Border Style="ControlBorder" Foreground="{./Foreground}" Background="{./Background}" ForwardMouseEvents="true">
+                       <HorizontalStack Spacing="1">
+                               <Image Style="Icon" Margin="1" Width="9" Height="9"     
+                                       MouseEnter="{Background=White}" MouseLeave="{Background=Transparent}"
+                                       Background="{./Background}"
+                                       Path="#Crow.Icons.expandable.svg" SvgSub="{./IsChecked}"/>
+                               <Label Style="ControlCaption" Text="{./Caption}" />
+                       </HorizontalStack>
+               </Border>
+       </Template>
+</CheckBox>
diff --git a/Crow/Templates/RadioButton.template b/Crow/Templates/RadioButton.template
new file mode 100755 (executable)
index 0000000..8e97a78
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<HorizontalStack Style="Control" Background="{./Background}">
+       <Image Style="Icon" Path="#Crow.Icons.radiobutton.svg"
+               SvgSub="{./IsChecked}"/>
+       <Label Text="{./Caption}"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Crow/Templates/ScrollBar.template b/Crow/Templates/ScrollBar.template
new file mode 100755 (executable)
index 0000000..158671e
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="{./Foreground}" Background="{./Background}">
+       <GenericStack Orientation="{./Orientation}" Spacing="0">
+               <Shape Style="ArrowBut" MouseDown="./onScrollBack"
+            Margin="1" Height="6" Size="10,10" Path="M 4.5,0.5 L 9.5,9.5 L 0.5,9.5 Z"/>
+               <Slider Name="Slider"                   
+                       Orientation="{./Orientation}"
+                       Value="{²./Value}"
+                       Maximum="{./Maximum}"
+                       CursorSize="{./CursorSize}"
+                       Height="{./HeightPolicy}" Width="{./WidthPolicy}"
+                       LargeIncrement="{./LargeIncrement}"
+                       SmallIncrement="{./SmallIncrement}"
+                       CursorColor="hgradient|0:Silver|1:Grey"
+                       Foreground="{./Foreground}"
+            Background="Transparent"/>
+               <Shape Style="ArrowBut" MouseDown="./onScrollForth"
+             Margin="1" Height="6" Size="10,10" Path="M 0.5,0.5 L 9.5,0.5 L 4.5,9.5 Z"/>
+       </GenericStack>
+</Border>
\ No newline at end of file
diff --git a/Crow/Templates/ScrollingListBox.template b/Crow/Templates/ScrollingListBox.template
new file mode 100644 (file)
index 0000000..1e7304f
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Background="{./Background}">
+       <HorizontalStack Margin="1">
+               <Scroller Name="scroller1" 
+                               Margin="2">
+                       <VerticalStack Height="Fit" MinimumSize="10,10"
+                               Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+               </Scroller>
+               <ScrollBar Name="scrollbar1" Value="{²../scroller1.ScrollY}"
+                       LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30" CursorSize="{../scroller1.ChildHeightRatio}"
+                       Maximum="{../scroller1.MaxScrollY}" Orientation="Vertical" 
+                       Width="14" />
+       </HorizontalStack>
+</Border>
diff --git a/Crow/Templates/Slider.template b/Crow/Templates/Slider.template
new file mode 100755 (executable)
index 0000000..9c7bb70
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0"?>
diff --git a/Crow/Templates/Spinner.template b/Crow/Templates/Spinner.template
new file mode 100755 (executable)
index 0000000..4d992da
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<HorizontalStack MinimumSize="40,13" Name="hstack" Margin="0" Spacing="0">
+       <Border BorderWidth="1" Width="75%"  Background="White" 
+               Foreground="{./Foreground}" Margin="0">
+               <TextBox Foreground="{./Foreground}" Font="{./Font}" Width="Stretched"
+                       Text="{²./Value}" TextAlignment="Right" Margin="0"/>
+       </Border>
+       <VerticalStack MinimumSize="13,13" Width="25%" Height="Stretched" Spacing="0" Margin="0">
+               <Shape Style="ArrowBut" Size="11,11" Height="50%" MouseDown="./onUp" Path="M 5.5,0.5 L 10.5,6.5 L 0.5,6.5 Z"/>                  
+               <Shape Style="ArrowBut" Size="11,11" Height="50%" MouseDown="./onDown" Path="M 0.5,0.5 L 10.5,0.5 L 5.5,6.5 Z"/>                        
+       </VerticalStack>
+</HorizontalStack>
diff --git a/Crow/Templates/TabItem.template b/Crow/Templates/TabItem.template
new file mode 100644 (file)
index 0000000..b06c9e4
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<GenericStack Orientation="Vertical" Spacing="0"
+               Background="{./Background}"
+               MouseEnter="{/caption.Foreground=White}"
+               MouseLeave="{/caption.Foreground=Grey}">
+       <HorizontalStack Margin="2" Left="{./TabOffset}"
+               Name="TabTitle"
+               HorizontalAlignment="Left"
+               Height="{./TabHeight}"
+               Width="{./TabWidth}">
+               <Label Name="caption" Text="{./Caption}" Foreground="Grey"/>
+               <Border CornerRadius="5" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Icons.exit2.svg"
+                                MouseClick="./butCloseTabClick"/>
+               </Border>
+       </HorizontalStack>
+       <Container Name="Content"/>
+</GenericStack>
+
diff --git a/Crow/Templates/ToolWindow.template b/Crow/Templates/ToolWindow.template
new file mode 100755 (executable)
index 0000000..e5c9fe7
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="White" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+<!--           <Border Name="TitleBar" BorderWidth="1" Foreground="White" Width="{./WidthPolicy}" Height="Fit"
+                               Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9">-->
+                       <HorizontalStack Background="{./TitleBarBackground}"
+                                       Name="hs" Margin="2" Spacing="0" Height="Fit">
+                               <Widget Width="5"/>
+                               <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                               <Label Width="Stretched" Foreground="{./TitleBarForeground}" Margin="1" TextAlignment="Center" Text="{./Caption}" />
+                               <Border CornerRadius="6" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Icons.exit2.svg"
+                                                MouseClick="./butQuitPress"/>
+                               </Border>
+                               <Widget Width="5"/>
+                       </HorizontalStack>
+<!--           </Border>-->
+               <Container Name="Content" MinimumSize="50,50" Background="0.5,0.5,0.5,0.5"/>
+       </VerticalStack>
+</Border>
diff --git a/Crow/Templates/Tooltip.template b/Crow/Templates/Tooltip.template
new file mode 100644 (file)
index 0000000..277ac7c
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Border Fit="true" Foreground="DimGrey" Background="Khaki">
+       <Label Margin="3" Foreground="DimGrey" Multiline="true" Text="{Tooltip}"/>
+</Border>
diff --git a/Crow/Templates/TreeView.template b/Crow/Templates/TreeView.template
new file mode 100644 (file)
index 0000000..0f4d9eb
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<HorizontalStack>
+       <Scroller  Name="scroller1" Margin="1"
+               Background="{./Background}"
+               ScrollY="{../scrollbar1.Value}">
+               <VerticalStack
+                       Height="Fit" Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+       </Scroller>
+       <ScrollBar
+               Name="scrollbar1"
+               LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30"
+               CursorSize="{../scroller1.ChildHeightRatio}"
+               Value="{²../scroller1.ScrollY}"
+               Maximum="{../scroller1.MaxScrollY}" Orientation="Vertical"/>
+</HorizontalStack>
diff --git a/Crow/Templates/Window.template b/Crow/Templates/Window.template
new file mode 100755 (executable)
index 0000000..ce3cfae
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="Grey" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+<!--           <Border Name="TitleBar" BorderWidth="1" Foreground="White" Width="{./WidthPolicy}" Height="Fit"
+                               Background="vgradient|0:0.4,0.6,0.0,0.5|1:0.0,0.8,0.8,0.9">-->
+                       <HorizontalStack Background="{./TitleBarBackground}"
+                                       Name="hs" Margin="2" Spacing="0" Height="Fit">
+                               <Widget Width="5"/>
+                               <Image Margin="1" Width="12" Height="12" Path="{./Icon}"/>
+                               <Label Width="Stretched" Foreground="{./TitleBarForeground}" Margin="2" TextAlignment="Center" Text="{./Caption}" />
+                               <Border Visible="{./ShowMinimize}" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Icons.minimize.svg"
+                                                MouseClick="./onMinimized"/>
+                               </Border>
+                               <Border Visible="{./ShowNormal}" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Icons.normalize.svg"
+                                                MouseClick="./onUnmaximized"/>
+                               </Border>
+                               <Border Visible="{./ShowMaximize}" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Icons.maximize.svg"
+                                                MouseClick="./onMaximized"/>
+                               </Border>
+                               <Border BorderWidth="1" Foreground="Transparent"  Height="14" Width="14"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                                       <Image Focusable="true" Path="#Crow.Icons.exit2.svg"
+                                                MouseClick="./butQuitPress"/>
+                               </Border>
+                               <Widget Width="5"/>
+                       </HorizontalStack>
+<!--           </Border>-->
+               <Container Name="Content" MinimumSize="0,0" Background="0.5,0.5,0.5,0.5"/>
+       </VerticalStack>
+</Border>
diff --git a/Crow/Templates/imgItem.template b/Crow/Templates/imgItem.template
new file mode 100755 (executable)
index 0000000..9dbf23d
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+       <VerticalStack Width="0" Height="-1" Focusable="true"                   
+                       MouseEnter="{Background=RoyalBlue}"
+                       MouseLeave="{Background=Transparent}">
+               <Image Width="-1" Height="-1" Path="{FullName}" MaximumSize="80,80"/>
+               <Label Text="{Name}" Width="-1" Height="-1" Margin="0" MaximumSize="100,0"/>
+       </VerticalStack>
+
diff --git a/Crow/Templates/treeList.template b/Crow/Templates/treeList.template
new file mode 100755 (executable)
index 0000000..d47621a
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<VerticalStack
+       Height="Fit" Name="ItemsContainer"/>
diff --git a/Crow/crow.key b/Crow/crow.key
new file mode 100644 (file)
index 0000000..b69aa3e
Binary files /dev/null and b/Crow/crow.key differ
diff --git a/Crow/src/BmpPicture.cs b/Crow/src/BmpPicture.cs
new file mode 100644 (file)
index 0000000..51bf896
--- /dev/null
@@ -0,0 +1,146 @@
+//
+// BmpPicture.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using vkvg;
+
+namespace Crow
+{
+
+       /// <summary>
+       /// Derived from FILL for loading and drawing bitmaps in the interface
+       /// </summary>
+       public class BmpPicture : Picture
+       {
+               Surface imgSurface;
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of BmpPicture.
+               /// </summary>
+               public BmpPicture ()
+               {}
+               /// <summary>
+               /// Initializes a new instance of BmpPicture by loading the image pointed by the path argument
+               /// </summary>
+               /// <param name="path">image path, may be embedded</param>
+               public BmpPicture (string path) : base(path)
+               {
+                       Load ();
+               }
+               #endregion
+               /// <summary>
+               /// load the image for rendering from the path given as argument
+               /// </summary>
+               /// <param name="path">image path, may be embedded</param>
+               void Load ()
+               {
+                       //if (sharedResources.ContainsKey (Path)) {
+                       //      sharedPicture sp = sharedResources [Path];
+                       //      image = (byte[])sp.Data;
+                       //      Dimensions = sp.Dims;
+                       //      return;
+                       //}
+
+                       imgSurface = new Surface (Interface.CurrentInterface.dev, Path);
+                       Dimensions.Width = imgSurface.Width;
+                       Dimensions.Height = imgSurface.Height;
+                       //using (Stream stream = Interface.StaticGetStreamFromPath (Path)) {                            
+                       //      loadBitmap (new System.Drawing.Bitmap (stream));        
+                       //}
+                       //sharedResources [Path] = new sharedPicture (image, Dimensions);
+               }                       
+
+               #region implemented abstract members of Fill
+
+               public override void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle))
+               {
+                       float widthRatio = 1f;
+                       float heightRatio = 1f;
+
+                       if (Scaled){
+                               widthRatio = (float)bounds.Width / Dimensions.Width;
+                               heightRatio = (float)bounds.Height / Dimensions.Height;
+                       }
+
+                       if (KeepProportions) {
+                               if (widthRatio < heightRatio)
+                                       heightRatio = widthRatio;
+                               else
+                                       widthRatio = heightRatio;
+                       }
+
+                       using (Surface tmp = new Surface (Interface.CurrentInterface.dev, bounds.Width, bounds.Height)) {
+                               using (Context gr = new Context (tmp)) {
+                                       gr.Translate (bounds.Left, bounds.Top);
+                                       gr.Scale (widthRatio, heightRatio);
+                                       gr.Translate ((bounds.Width/widthRatio - Dimensions.Width)/2, (bounds.Height/heightRatio - Dimensions.Height)/2);
+                                       gr.SetSourceSurface (imgSurface, 0,0);
+                                       gr.Paint ();
+                               }
+                               ctx.SetSource (tmp);
+                       }                               
+               }
+               #endregion
+
+               /// <summary>
+               /// paint the image in the rectangle given in arguments according
+               /// to the Scale and keepProportion parameters.
+               /// </summary>
+               /// <param name="gr">drawing Backend context</param>
+               /// <param name="rect">bounds of the target surface to paint</param>
+               /// <param name="subPart">used for svg only</param>
+               public override void Paint (Context gr, Rectangle rect, string subPart = "")
+               {
+                       float widthRatio = 1f;
+                       float heightRatio = 1f;
+
+                       if (Scaled){
+                               widthRatio = (float)rect.Width / Dimensions.Width;
+                               heightRatio = (float)rect.Height / Dimensions.Height;
+                       }
+
+                       if (KeepProportions) {
+                               if (widthRatio < heightRatio)
+                                       heightRatio = widthRatio;
+                               else
+                                       widthRatio = heightRatio;
+                       }
+
+                       gr.Save ();
+
+                       gr.Translate (rect.Left,rect.Top);
+                       gr.Scale (widthRatio, heightRatio);
+                       gr.Translate ((rect.Width/widthRatio - Dimensions.Width)/2, (rect.Height/heightRatio - Dimensions.Height)/2);
+                       gr.SetSourceSurface (imgSurface, 0,0);
+                       gr.Paint ();
+
+                       gr.Restore ();
+               }
+       }
+}
+
diff --git a/Crow/src/BubblingMouseButtonEventArgs.cs b/Crow/src/BubblingMouseButtonEventArgs.cs
new file mode 100644 (file)
index 0000000..21f0ded
--- /dev/null
@@ -0,0 +1,43 @@
+//
+// BubblingMouseButtonEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       /// <summary>
+       /// Store focused widget while bubbling mouse down event to the top
+       /// </summary>
+       public class BubblingMouseButtonEventArg: MouseButtonEventArgs
+       {
+               public Widget Focused;
+               public BubblingMouseButtonEventArg(MouseButtonEventArgs mbe) : base(mbe){}
+               public BubblingMouseButtonEventArg(int x, int y, MouseButton button, bool pressed)
+                       : base (x,y,button,pressed){}
+
+       }
+}
+
diff --git a/Crow/src/Cairo/DrawingHelpers.cs b/Crow/src/Cairo/DrawingHelpers.cs
new file mode 100644 (file)
index 0000000..55849cd
--- /dev/null
@@ -0,0 +1,126 @@
+//
+// CairoHelpers.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using vkvg;
+
+namespace Crow {
+       public static class DrawingHelpers
+    {
+               public static T Clamp<T>(this T val, T min, T max) where T : IComparable<T>
+               {
+                   if (val.CompareTo(min) < 0) return min;
+                   else if(val.CompareTo(max) > 0) return max;
+                   else return val;
+               }
+               /// <summary>
+               /// Convert string to utf8 (extension method)
+               /// </summary>
+               /// <returns>byte array with utf8 encoding</returns>
+               public static byte[] ToUtf8(this String str)
+               {
+                       return System.Text.UTF8Encoding.UTF8.GetBytes (str);
+               }
+
+        public static double min(params double[] arr)
+        {
+            int minp = 0;
+            for (int i = 1; i < arr.Length; i++)
+                if (arr[i] < arr[minp])
+                    minp = i;
+
+            return arr[minp];
+        }
+               public static void CairoRectangle(Context gr, Rectangle r, double radius, double stroke = 0.0)
+               {
+                       if (radius > 0)
+                               DrawRoundedRectangle (gr, r, radius, stroke);
+                       else
+                               gr.Rectangle (r, stroke);
+               }
+               public static void CairoCircle(Context gr, Rectangle r)
+               {
+                       gr.Arc(r.X + r.Width/2, r.Y + r.Height/2, Math.Min(r.Width,r.Height)/2, 0, 2*Math.PI);
+               }
+               public static void DrawRoundedRectangle(Context gr, Rectangle r, double radius, double stroke = 0.0)
+        {
+                       if (stroke>0.0) {
+                               gr.LineWidth = stroke;
+                               double hsw = stroke / 2.0;
+                               DrawRoundedRectangle (gr, hsw + r.X, hsw + r.Y, (double)r.Width - stroke, (double)r.Height - stroke, radius);
+                               gr.Stroke ();
+                       }else
+                               DrawRoundedRectangle(gr, r.X, r.Y, r.Width, r.Height, radius);
+        }
+        public static void DrawRoundedRectangle(Context gr, double x, double y, double width, double height, double radius)
+        {            
+            if ((radius > height / 2) || (radius > width / 2))
+                radius = min(height / 2, width / 2);
+
+            gr.MoveTo(x, y + radius);
+            gr.Arc(x + radius, y + radius, radius, Math.PI, -Math.PI / 2);
+            gr.LineTo(x + width - radius, y);
+            gr.Arc(x + width - radius, y + radius, radius, -Math.PI / 2, 0);
+            gr.LineTo(x + width, y + height - radius);
+            gr.Arc(x + width - radius, y + height - radius, radius, 0, Math.PI / 2);
+            gr.LineTo(x + radius, y + height);
+            gr.Arc(x + radius, y + height - radius, radius, Math.PI / 2, Math.PI);
+            gr.ClosePath();
+
+        }
+        public static void StrokeRaisedRectangle(Context gr, Rectangle r, double width = 1)
+        {            
+            r.Inflate((int)-width / 2, (int)-width / 2);
+            gr.LineWidth = width;
+                       gr.SetSourceColor(Color.White);
+            gr.MoveTo(r.BottomLeft);
+            gr.LineTo(r.TopLeft);
+            gr.LineTo(r.TopRight);
+            gr.Stroke();
+
+                       gr.SetSourceColor(Color.DarkGrey);
+            gr.MoveTo(r.TopRight);
+            gr.LineTo(r.BottomRight);
+            gr.LineTo(r.BottomLeft);
+            gr.Stroke();
+        }
+        public static void StrokeLoweredRectangle(Context gr, Rectangle r, double width = 1)
+        {
+            r.Inflate((int)-width / 2, (int)-width / 2);
+            gr.LineWidth = width;
+                       gr.SetSourceColor(Color.DarkGrey);
+            gr.MoveTo(r.BottomLeft);
+            gr.LineTo(r.TopLeft);
+            gr.LineTo(r.TopRight);
+            gr.Stroke();
+                       gr.SetSourceColor(Color.White);
+            gr.MoveTo(r.TopRight);
+            gr.LineTo(r.BottomRight);
+            gr.LineTo(r.BottomLeft);
+            gr.Stroke();
+        }
+    }
+}
diff --git a/Crow/src/Colors.cs b/Crow/src/Colors.cs
new file mode 100644 (file)
index 0000000..7dea870
--- /dev/null
@@ -0,0 +1,480 @@
+//
+// Colors.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+using System.Reflection;
+using System.Diagnostics;
+
+
+
+namespace Crow
+{
+       /// <summary>
+       /// Universal Color structure
+       /// </summary>
+       public struct Color
+    {
+               #region CTOR
+               public Color(double _R, double _G, double _B, double _A = 1)
+               {
+                       A = _A.Clamp(0,1);
+                       R = _R.Clamp(0,1);
+                       G = _G.Clamp(0,1);
+                       B = _B.Clamp(0,1);
+                       predefinied = false;
+                       htmlCode = "";
+                       Name = "";
+               }
+               internal Color(double _R, double _G, double _B, double _A, string _name)
+               {
+                       A = _A;
+                       R = _R;
+                       G = _G;
+                       B = _B;
+                       predefinied = false;
+                       Name = _name;
+                       htmlCode = "";
+                       ColorDic.Add(_name,this);
+               }
+               internal Color(int _R, int _G, int _B, string _name, string _code)
+               {
+                       A = 1.0;
+                       R = _R / 255.0;
+                       G = _G / 255.0;
+                       B = _B / 255.0;
+                       Name = _name;
+                       htmlCode = _code;
+                       predefinied = true;
+                       ColorDic.Add(_name,this);
+               }
+               #endregion
+
+               /// <summary>
+               /// color names dictionary
+               /// </summary>
+               public static Dictionary<string, Color> ColorDic = new Dictionary<string, Color>();
+
+               public string Name;
+               public string htmlCode;
+               internal bool predefinied;
+
+               #region public fields
+        public double A;
+        public double R;
+        public double G;
+               public double B;
+               #endregion
+
+               #region Operators
+        public static implicit operator string(Color c)
+        {
+            return c.ToString();
+        }
+               public static implicit operator Color(string s)
+               {
+                       if (string.IsNullOrEmpty(s))
+                               return White;
+                       Color cc = default(Color);
+                       if (s.StartsWith ("#", StringComparison.Ordinal)) {
+                               cc.R = int.Parse (s.Substring (1, 2), System.Globalization.NumberStyles.HexNumber) / 255.0;
+                               cc.G = int.Parse (s.Substring (3, 2), System.Globalization.NumberStyles.HexNumber) / 255.0;
+                               cc.B = int.Parse (s.Substring (5, 2), System.Globalization.NumberStyles.HexNumber) / 255.0;
+                               if (s.Length > 7)
+                                       cc.A = int.Parse (s.Substring (7, 2), System.Globalization.NumberStyles.HexNumber) / 255.0;
+                               else
+                                       cc.A = 1.0;
+                               return cc;
+                       }
+
+                       if (char.IsLetter(s[0])){
+                               if (ColorDic.ContainsKey (s))
+                                       return ColorDic[s];
+                               throw new Exception ("Unknown color name: " + s);
+                       }
+
+                       string[] c = s.Split(new char[] { ',' });
+                                                       
+                       return new Color(
+                               double.Parse(c[0]),
+                               double.Parse(c[1]),
+                               double.Parse(c[2]),
+                               double.Parse(c[3]));
+               }
+
+               public static bool operator ==(Color left, Color right)
+               {
+                       if (left.predefinied & right.predefinied)
+                               return left.htmlCode == right.htmlCode;
+                       return left.A != right.A ? false :
+                               left.R != right.R ? false :
+                               left.G != right.G ? false :
+                               left.B != right.B ? false : true;
+               }
+               public static bool operator !=(Color left, Color right)
+               {
+                       if (left.predefinied & right.predefinied)
+                               return left.htmlCode != right.htmlCode;
+                       return left.A == right.A ? false :
+                               left.R == right.R ? false :
+                               left.G == right.G ? false :
+                               left.B == right.B ? false : true;
+
+               }
+               public static bool operator ==(Color c, string n)
+               {
+                       return n.StartsWith("#", StringComparison.Ordinal) ?
+                               string.Equals(c.HtmlCode, n, StringComparison.Ordinal) :
+                               string.Equals(c.Name, n, StringComparison.Ordinal);
+               }
+               public static bool operator !=(Color c, string n)
+               {
+                       return n.StartsWith("#", StringComparison.Ordinal) ?
+                               !string.Equals(c.HtmlCode, n, StringComparison.Ordinal) :
+                               !string.Equals(c.Name, n, StringComparison.Ordinal);
+               }
+               public static bool operator ==(string n, Color c)
+               {
+                       return string.Equals (c.Name, n, StringComparison.Ordinal);
+               }
+               public static bool operator !=(string n, Color c)
+               {
+                       return !string.Equals (c.Name, n, StringComparison.Ordinal);
+               }
+               public static Color operator *(Color c, Double f)
+               {
+                       return new Color(c.R,c.G,c.B,c.A * f);
+               }
+               public static Color operator +(Color c1, Color c2)
+               {
+                       return new Color(c1.R + c2.R,c1.G + c2.G,c1.B + c2.B,c1.A + c2.A);
+               }
+               public static Color operator -(Color c1, Color c2)
+               {
+                       return new Color(c1.R - c2.R,c1.G - c2.G,c1.B - c2.B,c1.A - c2.A);
+               }
+               #endregion
+
+               /// <summary>
+               /// compute the hue of the color
+               /// </summary>
+               public double Hue {
+                       get {
+                               double min = Math.Min (R, Math.Min (G, B));     //Min. value of RGB
+                               double max = Math.Max (R, Math.Max (G, B));     //Max. value of RGB
+                               double diff = max - min;                                                        //Delta RGB value
+
+                               if ( diff == 0 )//This is a grey, no chroma...
+                                       return 0;
+
+                               double h = 0.0, s = diff / max;
+
+                               double diffR = (((max - R) / 6.0) + (diff / 2.0)) / diff;
+                               double diffG = (((max - G) / 6.0) + (diff / 2.0)) / diff;
+                               double diffB = (((max - B) / 6.0) + (diff / 2.0)) / diff;
+
+                               if (R == max)
+                                       h = diffB - diffG;
+                               else if (G == max)
+                                       h = (1.0 / 3.0) + diffR - diffB;
+                               else if (B == max)
+                                       h = (2.0 / 3.0) + diffG - diffR;
+
+                               if (h < 0)
+                                       h += 1;
+                               if (h > 1)
+                                       h -= 1;
+
+                               return h;
+                       }
+               }
+               /// <summary>
+               /// compute the saturation of the color
+               /// </summary>
+               public double Saturation {
+                       get {
+                               return Math.Max (R, Math.Max (G, B));   //Max. value of RGB
+                       }
+               }
+               /// <summary>
+               /// compute the RGB intensity of the color
+               /// </summary>
+               /// <value>The value.</value>
+               public double Value {
+                       get {
+                               double min = Math.Min (R, Math.Min (G, B));     //Min. value of RGB
+                               double max = Math.Max (R, Math.Max (G, B));     //Max. value of RGB
+                               double diff = max - min;                                                        //Delta RGB value
+                               return diff == 0 ? 0 : diff / max;
+                       }
+               }
+               public string HtmlCode {
+                       get { 
+                               string tmp = "#" +
+                                       ((int)Math.Round (R * 255.0)).ToString ("X2") +
+                                       ((int)Math.Round (G * 255.0)).ToString ("X2") +
+                                       ((int)Math.Round (B * 255.0)).ToString ("X2");
+                               if (A < 1.0)
+                                       tmp += ((int)Math.Round(A * 255.0)).ToString ("X2");
+                               return tmp;
+                       }
+               }
+               public float[] floatArray
+               {
+                       get { return new float[]{ (float)R, (float)G, (float)B, (float)A }; }
+               }
+               /// <summary>
+               /// return a copy of the color with the alpha component modified
+               /// </summary>
+               /// <returns>new modified color</returns>
+               /// <param name="_A">normalized alpha component</param>
+               public Color AdjustAlpha(double _A)
+               {
+                       return new Color (this.R, this.G, this.B, _A);
+               }
+               public void ResetName(){
+                       Name = "";
+                       htmlCode = "";
+               }
+
+               #region Predefined colors
+        public static readonly Color Transparent = new Color(0, 0, 0, 0, "Transparent");
+               public static readonly Color Clear = new Color(-1, -1, -1, -1, "Clear");
+               public static readonly Color AliceBlue = new Color(240,248,255,"AliceBlue","#F0F8FF");
+               public static readonly Color AntiqueWhite = new Color(250,235,215,"AntiqueWhite","#FAEBD7");
+               public static readonly Color Aqua = new Color(0,255,255,"Aqua","#00FFFF");
+               public static readonly Color Aquamarine = new Color(127,255,212,"Aquamarine","#7FFFD4");
+               public static readonly Color Azure = new Color(240,255,255,"Azure","#F0FFFF");
+               public static readonly Color Beige = new Color(245,245,220,"Beige","#F5F5DC");
+               public static readonly Color Bisque = new Color(255,228,196,"Bisque","#FFE4C4");
+               public static readonly Color Black = new Color(0,0,0,"Black","#000000");
+               public static readonly Color BlanchedAlmond = new Color(255,235,205,"BlanchedAlmond","#FFEBCD");
+               public static readonly Color Blue = new Color(0,0,255,"Blue","#0000FF");
+               public static readonly Color BlueViolet = new Color(138,43,226,"BlueViolet","#8A2BE2");
+               public static readonly Color Brown = new Color(165,42,42,"Brown","#A52A2A");
+               public static readonly Color BurlyWood = new Color(222,184,135,"BurlyWood","#DEB887");
+               public static readonly Color CadetBlue = new Color(95,158,160,"CadetBlue","#5F9EA0");
+               public static readonly Color Chartreuse = new Color(127,255,0,"Chartreuse","#7FFF00");
+               public static readonly Color Chocolate = new Color(210,105,30,"Chocolate","#D2691E");
+               public static readonly Color Coral = new Color(255,127,80,"Coral","#FF7F50");
+               public static readonly Color CornflowerBlue = new Color(100,149,237,"CornflowerBlue","#6495ED");
+               public static readonly Color Cornsilk = new Color(255,248,220,"Cornsilk","#FFF8DC");
+               public static readonly Color Crimson = new Color(220,20,60,"Crimson","#DC143C");
+               public static readonly Color Cyan = new Color(0,255,255,"Cyan","#00FFFF");
+               public static readonly Color DarkBlue = new Color(0,0,139,"DarkBlue","#00008B");
+               public static readonly Color DarkCyan = new Color(0,139,139,"DarkCyan","#008B8B");
+               public static readonly Color DarkGoldenRod = new Color(184,134,11,"DarkGoldenRod","#B8860B");
+               public static readonly Color DarkGrey = new Color(169,169,169,"DarkGrey","#A9A9A9");
+               public static readonly Color DarkGreen = new Color(0,100,0,"DarkGreen","#006400");
+               public static readonly Color DarkKhaki = new Color(189,183,107,"DarkKhaki","#BDB76B");
+               public static readonly Color DarkMagenta = new Color(139,0,139,"DarkMagenta","#8B008B");
+               public static readonly Color DarkOliveGreen = new Color(85,107,47,"DarkOliveGreen","#556B2F");
+               public static readonly Color DarkOrange = new Color(255,140,0,"DarkOrange","#FF8C00");
+               public static readonly Color DarkOrchid = new Color(153,50,204,"DarkOrchid","#9932CC");
+               public static readonly Color DarkRed = new Color(139,0,0,"DarkRed","#8B0000");
+               public static readonly Color DarkSalmon = new Color(233,150,122,"DarkSalmon","#E9967A");
+               public static readonly Color DarkSeaGreen = new Color(143,188,143,"DarkSeaGreen","#8FBC8F");
+               public static readonly Color DarkSlateBlue = new Color(72,61,139,"DarkSlateBlue","#483D8B");
+               public static readonly Color DarkSlateGrey = new Color(47,79,79,"DarkSlateGrey","#2F4F4F");
+               public static readonly Color DarkTurquoise = new Color(0,206,209,"DarkTurquoise","#00CED1");
+               public static readonly Color DarkViolet = new Color(148,0,211,"DarkViolet","#9400D3");
+               public static readonly Color DeepPink = new Color(255,20,147,"DeepPink","#FF1493");
+               public static readonly Color DeepSkyBlue = new Color(0,191,255,"DeepSkyBlue","#00BFFF");
+               public static readonly Color DimGrey = new Color(105,105,105,"DimGrey","#696969");
+               public static readonly Color DodgerBlue = new Color(30,144,255,"DodgerBlue","#1E90FF");
+               public static readonly Color FireBrick = new Color(178,34,34,"FireBrick","#B22222");
+               public static readonly Color FloralWhite = new Color(255,250,240,"FloralWhite","#FFFAF0");
+               public static readonly Color ForestGreen = new Color(34,139,34,"ForestGreen","#228B22");
+               public static readonly Color Fuchsia = new Color(255,0,255,"Fuchsia","#FF00FF");
+               public static readonly Color Gainsboro = new Color(220,220,220,"Gainsboro","#DCDCDC");
+               public static readonly Color GhostWhite = new Color(248,248,255,"GhostWhite","#F8F8FF");
+               public static readonly Color Gold = new Color(255,215,0,"Gold","#FFD700");
+               public static readonly Color GoldenRod = new Color(218,165,32,"GoldenRod","#DAA520");
+               public static readonly Color Grey = new Color(128,128,128,"Grey","#808080");
+               public static readonly Color Green = new Color(0,128,0,"Green","#008000");
+               public static readonly Color GreenYellow = new Color(173,255,47,"GreenYellow","#ADFF2F");
+               public static readonly Color HoneyDew = new Color(240,255,240,"HoneyDew","#F0FFF0");
+               public static readonly Color HotPink = new Color(255,105,180,"HotPink","#FF69B4");
+               public static readonly Color IndianRed = new Color(205,92,92,"IndianRed","#CD5C5C");
+               public static readonly Color Indigo = new Color(75,0,130,"Indigo","#4B0082");
+               public static readonly Color Ivory = new Color(255,255,240,"Ivory","#FFFFF0");
+               public static readonly Color Jet = new Color(52,52,52,"Jet","#343434");
+               public static readonly Color Khaki = new Color(240,230,140,"Khaki","#F0E68C");
+               public static readonly Color Lavender = new Color(230,230,250,"Lavender","#E6E6FA");
+               public static readonly Color LavenderBlush = new Color(255,240,245,"LavenderBlush","#FFF0F5");
+               public static readonly Color LawnGreen = new Color(124,252,0,"LawnGreen","#7CFC00");
+               public static readonly Color LemonChiffon = new Color(255,250,205,"LemonChiffon","#FFFACD");
+               public static readonly Color LightBlue = new Color(173,216,230,"LightBlue","#ADD8E6");
+               public static readonly Color LightCoral = new Color(240,128,128,"LightCoral","#F08080");
+               public static readonly Color LightCyan = new Color(224,255,255,"LightCyan","#E0FFFF");
+               public static readonly Color LightGoldenRodYellow = new Color(250,250,210,"LightGoldenRodYellow","#FAFAD2");
+               public static readonly Color LightGrey = new Color(211,211,211,"LightGrey","#D3D3D3");
+               public static readonly Color LightGreen = new Color(144,238,144,"LightGreen","#90EE90");
+               public static readonly Color LightPink = new Color(255,182,193,"LightPink","#FFB6C1");
+               public static readonly Color LightSalmon = new Color(255,160,122,"LightSalmon","#FFA07A");
+               public static readonly Color LightSeaGreen = new Color(32,178,170,"LightSeaGreen","#20B2AA");
+               public static readonly Color LightSkyBlue = new Color(135,206,250,"LightSkyBlue","#87CEFA");
+               public static readonly Color LightSlateGrey = new Color(119,136,153,"LightSlateGrey","#778899");
+               public static readonly Color LightSteelBlue = new Color(176,196,222,"LightSteelBlue","#B0C4DE");
+               public static readonly Color LightYellow = new Color(255,255,224,"LightYellow","#FFFFE0");
+               public static readonly Color Lime = new Color(0,255,0,"Lime","#00FF00");
+               public static readonly Color LimeGreen = new Color(50,205,50,"LimeGreen","#32CD32");
+               public static readonly Color Linen = new Color(250,240,230,"Linen","#FAF0E6");
+               public static readonly Color Magenta = new Color(255,0,255,"Magenta","#FF00FF");
+               public static readonly Color Maroon = new Color(128,0,0,"Maroon","#800000");
+               public static readonly Color MediumAquaMarine = new Color(102,205,170,"MediumAquaMarine","#66CDAA");
+               public static readonly Color MediumBlue = new Color(0,0,205,"MediumBlue","#0000CD");
+               public static readonly Color MediumOrchid = new Color(186,85,211,"MediumOrchid","#BA55D3");
+               public static readonly Color MediumPurple = new Color(147,112,219,"MediumPurple","#9370DB");
+               public static readonly Color MediumSeaGreen = new Color(60,179,113,"MediumSeaGreen","#3CB371");
+               public static readonly Color MediumSlateBlue = new Color(123,104,238,"MediumSlateBlue","#7B68EE");
+               public static readonly Color MediumSpringGreen = new Color(0,250,154,"MediumSpringGreen","#00FA9A");
+               public static readonly Color MediumTurquoise = new Color(72,209,204,"MediumTurquoise","#48D1CC");
+               public static readonly Color MediumVioletRed = new Color(199,21,133,"MediumVioletRed","#C71585");
+               public static readonly Color MidnightBlue = new Color(25,25,112,"MidnightBlue","#191970");
+               public static readonly Color MintCream = new Color(245,255,250,"MintCream","#F5FFFA");
+               public static readonly Color MistyRose = new Color(255,228,225,"MistyRose","#FFE4E1");
+               public static readonly Color Moccasin = new Color(255,228,181,"Moccasin","#FFE4B5");
+               public static readonly Color NavajoWhite = new Color(255,222,173,"NavajoWhite","#FFDEAD");
+               public static readonly Color Navy = new Color(0,0,128,"Navy","#000080");
+               public static readonly Color OldLace = new Color(253,245,230,"OldLace","#FDF5E6");
+               public static readonly Color Olive = new Color(128,128,0,"Olive","#808000");
+               public static readonly Color OliveDrab = new Color(107,142,35,"OliveDrab","#6B8E23");
+               public static readonly Color Onyx = new Color(53,56,57,"Onyx","#353839");
+               public static readonly Color Orange = new Color(255,165,0,"Orange","#FFA500");
+               public static readonly Color OrangeRed = new Color(255,69,0,"OrangeRed","#FF4500");
+               public static readonly Color Orchid = new Color(218,112,214,"Orchid","#DA70D6");
+               public static readonly Color PaleGoldenRod = new Color(238,232,170,"PaleGoldenRod","#EEE8AA");
+               public static readonly Color PaleGreen = new Color(152,251,152,"PaleGreen","#98FB98");
+               public static readonly Color PaleTurquoise = new Color(175,238,238,"PaleTurquoise","#AFEEEE");
+               public static readonly Color PaleVioletRed = new Color(219,112,147,"PaleVioletRed","#DB7093");
+               public static readonly Color PapayaWhip = new Color(255,239,213,"PapayaWhip","#FFEFD5");
+               public static readonly Color PeachPuff = new Color(255,218,185,"PeachPuff","#FFDAB9");
+               public static readonly Color Peru = new Color(205,133,63,"Peru","#CD853F");
+               public static readonly Color Pink = new Color(255,192,203,"Pink","#FFC0CB");
+               public static readonly Color Plum = new Color(221,160,221,"Plum","#DDA0DD");
+               public static readonly Color PowderBlue = new Color(176,224,230,"PowderBlue","#B0E0E6");
+               public static readonly Color Purple = new Color(128,0,128,"Purple","#800080");
+               public static readonly Color RebeccaPurple = new Color(102,51,153,"RebeccaPurple","#663399");
+               public static readonly Color Red = new Color(255,0,0,"Red","#FF0000");
+               public static readonly Color RosyBrown = new Color(188,143,143,"RosyBrown","#BC8F8F");
+               public static readonly Color RoyalBlue = new Color(65,105,225,"RoyalBlue","#4169E1");
+               public static readonly Color SaddleBrown = new Color(139,69,19,"SaddleBrown","#8B4513");
+               public static readonly Color Salmon = new Color(250,128,114,"Salmon","#FA8072");
+               public static readonly Color SandyBrown = new Color(244,164,96,"SandyBrown","#F4A460");
+               public static readonly Color SeaGreen = new Color(46,139,87,"SeaGreen","#2E8B57");
+               public static readonly Color SeaShell = new Color(255,245,238,"SeaShell","#FFF5EE");
+               public static readonly Color Sienna = new Color(160,82,45,"Sienna","#A0522D");
+               public static readonly Color Silver = new Color(192,192,192,"Silver","#C0C0C0");
+               public static readonly Color SkyBlue = new Color(135,206,235,"SkyBlue","#87CEEB");
+               public static readonly Color SlateBlue = new Color(106,90,205,"SlateBlue","#6A5ACD");
+               public static readonly Color SlateGrey = new Color(112,128,144,"SlateGrey","#708090");
+               public static readonly Color Snow = new Color(255,250,250,"Snow","#FFFAFA");
+               public static readonly Color SpringGreen = new Color(0,255,127,"SpringGreen","#00FF7F");
+               public static readonly Color SteelBlue = new Color(70,130,180,"SteelBlue","#4682B4");
+               public static readonly Color Tan = new Color(210,180,140,"Tan","#D2B48C");
+               public static readonly Color Teal = new Color(0,128,128,"Teal","#008080");
+               public static readonly Color Thistle = new Color(216,191,216,"Thistle","#D8BFD8");
+               public static readonly Color Tomato = new Color(255,99,71,"Tomato","#FF6347");
+               public static readonly Color Turquoise = new Color(64,224,208,"Turquoise","#40E0D0");
+               public static readonly Color Violet = new Color(238,130,238,"Violet","#EE82EE");
+               public static readonly Color Wheat = new Color(245,222,179,"Wheat","#F5DEB3");
+               public static readonly Color White = new Color(255,255,255,"White","#FFFFFF");
+               public static readonly Color WhiteSmoke = new Color(245,245,245,"WhiteSmoke","#F5F5F5");
+               public static readonly Color Yellow = new Color(255,255,0,"Yellow","#FFFF00");
+               public static readonly Color YellowGreen = new Color(154,205,50,"YellowGreen","#9ACD32");
+
+               #endregion
+
+               public override int GetHashCode ()
+               {
+                       unchecked // Overflow is fine, just wrap
+                       {
+                               int hash = 17;
+                               // Suitable nullity checks etc, of course :)
+                               hash = hash * 23 + A.GetHashCode();
+                               hash = hash * 23 + R.GetHashCode();
+                               hash = hash * 23 + G.GetHashCode();
+                               hash = hash * 23 + B.GetHashCode();
+                               return hash;
+                       }
+               }
+               public override bool Equals (object obj)
+               {
+                       return (obj == null || obj.GetType() != typeof(Color)) ?
+                               false :
+                               this == (Color)obj;
+               }
+               public override string ToString()
+               {
+                       if (!string.IsNullOrEmpty(Name))
+                               return Name;
+                       if (!string.IsNullOrEmpty (htmlCode))
+                               return htmlCode;
+                       string hc = HtmlCode;
+                       Color pc = ColorDic.Values.FirstOrDefault (c => c.htmlCode == hc);
+                       return pc.predefinied ? pc.Name : hc;
+               }
+
+        public static object Parse(string s)
+        {
+            return (Color)s;
+        }
+               public static Color FromHSV(double _h, double _v = 1.0, double _s = 1.0, double _alpha = 1.0){
+                       Color c = Color.Black;
+                       c.ResetName ();
+                       c.A = _alpha;
+                       if (_s == 0) {//HSV from 0 to 1
+                               c.R = _v;
+                               c.G = _v;
+                               c.B = _v;
+                       }else{
+                               double var_h = _h * 6.0;
+
+                               if (var_h == 6.0)
+                                       var_h = 0;      //H must be < 1
+                               double var_i = Math.Floor( var_h );     //Or ... var_i = floor( var_h )
+                               double var_1 = _v * ( 1.0 - _s );
+                               double var_2 = _v * (1.0 - _s * (var_h - var_i));
+                               double var_3 = _v * (1.0 - _s * (1.0 - (var_h - var_i)));
+
+                               if (var_i == 0.0) {
+                                       c.R = _v;
+                                       c.G = var_3;
+                                       c.B = var_1;
+                               }else if ( var_i == 1.0 ) { c.R = var_2 ; c.G = _v     ; c.B = var_1; }
+                               else if ( var_i == 2 ) { c.R = var_1 ; c.G = _v     ; c.B = var_3; }
+                               else if ( var_i == 3 ) { c.R = var_1 ; c.G = var_2 ; c.B = _v;     }
+                               else if ( var_i == 4 ) { c.R = var_3 ; c.G = var_1 ; c.B = _v;    }
+                               else                   { c.R = _v     ; c.G = var_1 ; c.B = var_2; }
+                       }
+                       return c;
+               }
+    }
+}
diff --git a/Crow/src/Command.cs b/Crow/src/Command.cs
new file mode 100644 (file)
index 0000000..5d5f85e
--- /dev/null
@@ -0,0 +1,120 @@
+//
+// Command.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// helper class to bind in one step icon, caption, action, and validity tests to a controls 
+       /// </summary>
+       public class Command : IValueChange
+       {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of Command with the action pass as argument.
+               /// </summary>
+               /// <param name="_executeAction">action to excecute when command is triggered</param>
+               public Command (Action _executeAction)
+               {
+                       execute = _executeAction;
+               }
+               #endregion
+
+               Action execute;
+
+               string caption;
+               Picture icon;
+               bool canExecute = true;
+
+               #region Public properties
+               /// <summary>
+               /// if true, action defined in this command may be executed,
+               /// </summary>
+               [DefaultValue(true)]
+               public virtual bool CanExecute {
+                       get { return canExecute; }
+                       set {
+                               if (canExecute == value)
+                                       return;
+                               canExecute = value;
+                               NotifyValueChanged ("CanExecute", canExecute);
+                       }
+               }
+               /// <summary>
+               /// label to display in the bound control
+               /// </summary>
+               [DefaultValue("Unamed Command")]
+               public virtual string Caption {
+                       get { return caption; }
+                       set {
+                               if (caption == value)
+                                       return;
+                               caption = value;
+                               NotifyValueChanged ("Caption", caption);
+
+                       }
+               }
+               /// <summary>
+               /// Icon to display in the bound control
+               /// </summary>
+               
+               public Picture Icon {
+                       get { return icon; }
+                       set {
+                               if (icon == value)
+                                       return;
+                               icon = value;
+                               NotifyValueChanged ("Icon", icon);
+                       }
+               }
+               #endregion
+
+               /// <summary>
+               /// trigger the execution of the command
+               /// </summary>
+               public void Execute(){
+                       if (execute != null && CanExecute)
+                               execute ();
+               }
+               internal void raiseAllValuesChanged(){
+                       NotifyValueChanged ("CanExecute", canExecute);
+                       NotifyValueChanged ("Icon", icon);
+                       NotifyValueChanged ("Caption", caption);
+               }
+
+       }
+}
diff --git a/Crow/src/CompilerServices/CompilerServices.cs b/Crow/src/CompilerServices/CompilerServices.cs
new file mode 100644 (file)
index 0000000..b8a726d
--- /dev/null
@@ -0,0 +1,1058 @@
+//
+// CompilerServices.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Reflection.Emit;
+using System.Reflection;
+using System.Diagnostics;
+using System.Linq;
+using System.Collections.Generic;
+using System.Runtime.CompilerServices;
+using System.Xml;
+using Crow.IML;
+using System.Text;
+
+namespace Crow.IML
+{
+       public static class CompilerServices
+       {
+               /// <summary>
+               /// known types cache, prevent rewalking all the assemblies of the domain
+               /// the key is the type simple name
+               /// </summary>
+               internal static Dictionary<string, Type> knownTypes = new Dictionary<string, Type> ();
+               /// <summary>
+               /// known extension methods.
+               /// key is type dot memberName.
+               /// </summary>
+               internal static Dictionary<string, MethodInfo> knownExtMethods = new Dictionary<string, MethodInfo> ();
+
+               internal static MethodInfo stringEquals = typeof (string).GetMethod("Equals", new Type [3] { typeof (string), typeof (string), typeof (StringComparison) });
+               internal static MethodInfo miObjToString = typeof(object).GetMethod("ToString");
+               internal static MethodInfo miGetType = typeof(object).GetMethod("GetType");
+               internal static MethodInfo miParseEnum = typeof(Enum).GetMethod("Parse", BindingFlags.Static | BindingFlags.Public,
+                       Type.DefaultBinder, new Type [] {typeof (Type), typeof (string), typeof (bool)}, null);
+
+               internal static MethodInfo miGetTypeFromHandle = typeof(Type).GetMethod("GetTypeFromHandle");
+               internal static MethodInfo miGetEvent = typeof(Type).GetMethod("GetEvent", new Type[] {typeof(string)});
+
+               internal static MethodInfo miMIInvoke = typeof(MethodInfo).GetMethod ("Invoke", new Type[] {
+                       typeof(object),
+                       typeof(object[])
+               });
+
+               internal static MethodInfo miCreateBoundDel = typeof(Delegate).GetMethod ("CreateDelegate", new Type[] { typeof(Type), typeof(object), typeof(MethodInfo) });//create bound delegate
+               internal static MethodInfo miGetColCount = typeof(System.Collections.ICollection).GetProperty("Count").GetGetMethod();
+               internal static MethodInfo miGetDelegateListItem = typeof(List<Delegate>).GetMethod("get_Item", new Type[] { typeof(Int32) });
+
+               internal static MethodInfo miCompileDynEventHandler = typeof(CompilerServices).GetMethod ("compileDynEventHandler", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miRemEvtHdlByName = typeof(CompilerServices).GetMethod("removeEventHandlerByName", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miRemEvtHdlByTarget = typeof(CompilerServices).GetMethod("removeEventHandlerByTarget", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miGetMethInfoWithRefx = typeof(CompilerServices).GetMethod ("getMethodInfoWithReflexion", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miGetMembIinfoWithRefx = typeof(CompilerServices).GetMethod("getMemberInfoWithReflexion", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miSetValWithRefx = typeof(CompilerServices).GetMethod("setValueWithReflexion", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miGetValWithRefx = typeof(CompilerServices).GetMethod("getValueWithReflexion", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miCreateDel = typeof(CompilerServices).GetMethod ("createDel", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miGetImplOp = typeof(CompilerServices).GetMethod ("getImplicitOp", BindingFlags.Static | BindingFlags.NonPublic);
+               internal static MethodInfo miGetDataTypeAndFetch = typeof(CompilerServices).GetMethod("getDataTypeAndFetch", BindingFlags.Static | BindingFlags.NonPublic);
+
+
+               internal static MethodInfo miGoUpLevels = typeof(CompilerServices).GetMethod("goUpNbLevels", BindingFlags.Static | BindingFlags.NonPublic);
+
+               internal static FieldInfo fiCachedDel = typeof(Instantiator).GetField("cachedDelegates", BindingFlags.Instance | BindingFlags.NonPublic);
+               internal static FieldInfo fiTemplateBinding = typeof(Instantiator).GetField("templateBinding", BindingFlags.Instance | BindingFlags.NonPublic);
+               internal static MethodInfo miDSChangeEmitHelper = typeof(Instantiator).GetMethod("dataSourceChangedEmitHelper", BindingFlags.Instance | BindingFlags.NonPublic);
+               internal static MethodInfo miDSReverseBinding = typeof(Instantiator).GetMethod("dataSourceReverseBinding", BindingFlags.Static | BindingFlags.NonPublic);
+
+               internal static FieldInfo miSetCurIface = typeof(Widget).GetField ("IFace", BindingFlags.Public | BindingFlags.Instance);
+               internal static MethodInfo miFindByName = typeof (Widget).GetMethod ("FindByName");
+               internal static MethodInfo miGetGObjItem = typeof(List<Widget>).GetMethod("get_Item", new Type[] { typeof(Int32) });
+               internal static MethodInfo miLoadDefaultVals = typeof (Widget).GetMethod ("loadDefaultValues");
+               internal static PropertyInfo piStyle = typeof (Widget).GetProperty ("Style");
+               internal static MethodInfo miGetLogicalParent = typeof(Widget).GetProperty("LogicalParent").GetGetMethod();
+               internal static MethodInfo miGetDataSource = typeof(Widget).GetProperty("DataSource").GetGetMethod ();
+               internal static EventInfo eiLogicalParentChanged = typeof(Widget).GetEvent("LogicalParentChanged");
+
+               internal static MethodInfo miIFaceLoad = typeof(Interface).GetMethod ("CreateInstance", BindingFlags.Instance | BindingFlags.Public);
+               internal static MethodInfo miIFaceCreateTemplateInst = typeof (Interface).GetMethod ("CreateTemplateInstance", BindingFlags.Instance | BindingFlags.Public);
+               internal static MethodInfo miGetITemp = typeof(Interface).GetMethod ("GetItemTemplate", BindingFlags.Instance | BindingFlags.Public);
+
+               internal static MethodInfo miAddITemp = typeof(Dictionary<string, ItemTemplate>).GetMethod ("set_Item", new Type[] { typeof(string), typeof(ItemTemplate) });
+               internal static MethodInfo miGetITempFromDic = typeof(Dictionary<string, ItemTemplate>).GetMethod ("get_Item", new Type[] { typeof(string) });
+               internal static FieldInfo fldItemTemplates = typeof(TemplatedGroup).GetField("ItemTemplates");
+               internal static MethodInfo miLoadPage = typeof(TemplatedGroup).GetMethod ("loadPage", BindingFlags.Instance | BindingFlags.NonPublic| BindingFlags.Public);
+               internal static MethodInfo miIsAlreadyExpanded = typeof(TemplatedGroup).GetMethod("emitHelperIsAlreadyExpanded", BindingFlags.Instance | BindingFlags.NonPublic);
+               
+               internal static MethodInfo miCreateExpDel = typeof(ItemTemplate).GetMethod ("CreateExpandDelegate");
+               internal static FieldInfo fiFetchMethodName = typeof(ItemTemplate).GetField("fetchMethodName", BindingFlags.Instance | BindingFlags.NonPublic);
+
+               #if DESIGN_MODE
+               internal static MethodInfo miDicStrStrAdd = typeof(Dictionary<string, string>).GetMethod ("set_Item", new Type[] { typeof(string), typeof(string) });
+               #endif
+
+               #region tree handling methods
+               internal static FieldInfo fiChild = typeof(PrivateContainer).GetField ("child", BindingFlags.Instance | BindingFlags.NonPublic);
+               internal static MethodInfo miSetChild = typeof (Container).GetMethod ("SetChild");
+               internal static MethodInfo miAddChild = typeof (Group).GetMethod ("AddChild");
+               internal static FieldInfo fiChildren = typeof(Group).GetField ("children", BindingFlags.Instance | BindingFlags.NonPublic);
+               internal static MethodInfo miLoadTmp = typeof (TemplatedControl).GetMethod ("loadTemplate", BindingFlags.Instance | BindingFlags.NonPublic);
+               internal static PropertyInfo piContent = typeof(TemplatedContainer).GetProperty ("Content");
+               internal static MethodInfo miAddItem = typeof (TemplatedGroup).GetMethod ("AddItem", BindingFlags.Instance | BindingFlags.Public);
+               internal static MethodInfo miGetItems = typeof(TemplatedGroup).GetProperty ("Items").GetGetMethod ();
+               #endregion
+
+               #region ValueChange & DSChange Reflexion member info
+               internal static EventInfo eiValueChange = typeof (IValueChange).GetEvent ("ValueChanged");
+               internal static MethodInfo miInvokeValueChange = eiValueChange.EventHandlerType.GetMethod ("Invoke");
+               internal static Type [] argsBoundValueChange = { typeof (object), typeof (object), miInvokeValueChange.GetParameters () [1].ParameterType };
+               internal static Type [] argsValueChange = { typeof (object), miInvokeValueChange.GetParameters () [1].ParameterType };
+               internal static FieldInfo fiVCNewValue = typeof (ValueChangeEventArgs).GetField ("NewValue");
+               internal static FieldInfo fiVCMbName = typeof (ValueChangeEventArgs).GetField ("MemberName");
+               internal static MethodInfo miValueChangeAdd = eiValueChange.GetAddMethod ();
+
+               internal static EventInfo eiDSChange = typeof (Widget).GetEvent ("DataSourceChanged");
+               internal static MethodInfo miInvokeDSChange = eiDSChange.EventHandlerType.GetMethod ("Invoke");
+               internal static Type [] argsBoundDSChange = {typeof (object), typeof (object), miInvokeDSChange.GetParameters () [1].ParameterType };
+               internal static FieldInfo fiDSCNewDS = typeof (DataSourceChangeEventArgs).GetField ("NewDataSource");
+               internal static FieldInfo fiDSCOldDS = typeof (DataSourceChangeEventArgs).GetField ("OldDataSource");
+               internal static Type ehTypeDSChange = eiDSChange.EventHandlerType;
+               #endregion
+
+               /// <summary>
+               /// Loc0 is the current graphic object and arg2 of loader is the current interface
+               /// </summary>
+               /// <param name="il">Il.</param>
+               public static void emitSetCurInterface(ILGenerator il){
+                       il.Emit (OpCodes.Ldloc_0);
+                       il.Emit (OpCodes.Ldarg_1);
+                       il.Emit (OpCodes.Stfld, miSetCurIface);
+               }
+
+               public static void EmitSetValue(ILGenerator il, PropertyInfo pi, object val){
+                       il.Emit (OpCodes.Ldloc_0);
+
+                       if (val == null) {
+                               il.Emit (OpCodes.Ldnull);
+                               il.Emit (OpCodes.Callvirt, pi.GetSetMethod ());
+                               return;
+                       }
+                       Type dvType = val.GetType ();
+
+            if (dvType.IsValueType) {
+                               if (pi.PropertyType.IsValueType) {
+                    if (pi.PropertyType.IsEnum) {
+                                               if (pi.PropertyType != dvType)
+                                                       throw new Exception ("Enum mismatch in default values: " + pi.PropertyType.FullName);
+                                               il.Emit (OpCodes.Ldc_I4, Convert.ToInt32 (val));
+                                       } else {
+                                               switch (Type.GetTypeCode (dvType)) {
+                                               case TypeCode.Boolean:
+                                                       if ((bool)val == true)
+                                                               il.Emit (OpCodes.Ldc_I4_1);
+                                                       else
+                                                               il.Emit (OpCodes.Ldc_I4_0);
+                                                       break;
+//                                             case TypeCode.Empty:
+//                                                     break;
+//                                             case TypeCode.Object:
+//                                                     break;
+//                                             case TypeCode.DBNull:
+//                                                     break;
+//                                             case TypeCode.SByte:
+//                                                     break;
+//                                             case TypeCode.Decimal:
+//                                                     break;
+//                                             case TypeCode.DateTime:
+//                                                     break;
+                                               case TypeCode.Char:
+                                                       il.Emit (OpCodes.Ldc_I4, Convert.ToChar (val));
+                                                       break;
+                                               case TypeCode.Byte:
+                                               case TypeCode.Int16:
+                                               case TypeCode.Int32:
+                                                       il.Emit (OpCodes.Ldc_I4, Convert.ToInt32 (val));
+                                                       break;
+                                               case TypeCode.UInt16:
+                                               case TypeCode.UInt32:
+                                                       il.Emit (OpCodes.Ldc_I4, Convert.ToUInt32 (val));
+                                                       break;
+                                               case TypeCode.Int64:
+                                                       il.Emit (OpCodes.Ldc_I8, Convert.ToInt64 (val));
+                                                       break;
+                                               case TypeCode.UInt64:
+                                                       il.Emit (OpCodes.Ldc_I8, Convert.ToUInt64 (val));
+                                                       break;
+                                               case TypeCode.Single:
+                                                       il.Emit (OpCodes.Ldc_R4, Convert.ToSingle (val));
+                                                       break;
+                                               case TypeCode.Double:
+                                                       il.Emit (OpCodes.Ldc_R8, Convert.ToDouble (val));
+                                                       break;
+                                               case TypeCode.String:
+                                                       il.Emit (OpCodes.Ldstr, Convert.ToString (val));
+                                                       break;
+                                               default:
+                                                       il.Emit (OpCodes.Pop);
+                                                       return;
+                                               }
+                                       }
+                               } else
+                                       throw new Exception ("Expecting valuetype in default values for: " + pi.Name);
+                       }else{
+                               //surely a class or struct
+                               if (dvType != typeof(string))
+                                       throw new Exception ("Expecting String in default values for: " + pi.Name);
+                               if (pi.PropertyType == typeof(string))
+                                       il.Emit (OpCodes.Ldstr, Convert.ToString (val));
+                               else if (pi.PropertyType.IsEnum) {
+                                       //load type of enum
+                                       il.Emit(OpCodes.Ldtoken, pi.PropertyType);
+                                       il.Emit(OpCodes.Call, CompilerServices.miGetTypeFromHandle);
+                                       //load enum value name
+                                       il.Emit (OpCodes.Ldstr, Convert.ToString (val));//TODO:implement here string format?
+                                       //load false
+                                       il.Emit (OpCodes.Ldc_I4_0);
+                                       il.Emit (OpCodes.Call, CompilerServices.miParseEnum);
+
+                                       if (CompilerServices.miParseEnum.ReturnType != pi.PropertyType)
+                                               il.Emit (OpCodes.Unbox_Any, pi.PropertyType);
+                               } else {
+                                       MethodInfo miParse = pi.PropertyType.GetMethod
+                                               ("Parse", BindingFlags.Static | BindingFlags.Public,
+                                                       Type.DefaultBinder, new Type [] {typeof (string)},null);
+                                       if (miParse == null)
+                                               throw new Exception ("no Parse method found for: " + pi.PropertyType.FullName);
+
+                                       il.Emit (OpCodes.Ldstr, Convert.ToString (val));//TODO:is this convert required?
+                                       il.Emit (OpCodes.Call, miParse);
+
+                                       if (miParse.ReturnType != pi.PropertyType)
+                                               il.Emit (OpCodes.Unbox_Any, pi.PropertyType);
+                               }
+                       }
+            il.Emit (OpCodes.Callvirt, pi.GetSetMethod ());
+               }
+
+               #region conversions
+
+               internal static MethodInfo GetConvertMethod (Type targetType)
+               {
+                       string name;
+
+                       if (targetType == typeof (bool))
+                               name = "ToBoolean";
+                       else if (targetType == typeof (byte))
+                               name = "ToByte";
+                       else if (targetType == typeof (short))
+                               name = "ToInt16";
+                       else if (targetType == typeof (int))
+                               name = "ToInt32";
+                       else if (targetType == typeof (long))
+                               name = "ToInt64";
+                       else if (targetType == typeof (double))
+                               name = "ToDouble";
+                       else if (targetType == typeof (float))
+                               name = "ToSingle";
+                       else if (targetType == typeof (string))
+                               return typeof (object).GetMethod ("ToString", Type.EmptyTypes);
+                       else //try to find implicit convertion
+                               throw new NotImplementedException (string.Format ("Conversion to {0} is not implemented.", targetType.Name));
+
+                       return typeof (Convert).GetMethod (name, BindingFlags.Static | BindingFlags.Public, null, new Type [] { typeof (object) }, null);
+               }
+               #endregion
+
+               #region Reflexion helpers
+               static MemberInfo getMemberInfoWithReflexion(object instance, string member){
+            Type t = instance.GetType();
+#if DEBUG_BINDING_FUNC_CALLS
+                       Console.WriteLine ($"getMemberInfoWithReflexion ({instance},{member}); type:{t}");
+#endif
+            MemberInfo mi = t.GetMember (member)?.FirstOrDefault();
+                       if (mi == null)
+                               mi = CompilerServices.SearchExtMethod (t, member);
+                       return mi;
+               }
+               static MethodInfo getMethodInfoWithReflexion(object instance, string method){
+#if DEBUG_BINDING_FUNC_CALLS
+            Console.WriteLine ($"getMethodInfoWithReflexion ({instance},{method}); type:{instance.GetType ()}");
+#endif
+            return instance.GetType ().GetMethod (method, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
+               }
+               /// <summary>
+               /// set value, convert if required
+               /// </summary>
+               /// <param name="dest">Destination instance</param>
+               /// <param name="value">Value</param>
+               /// <param name="destMember">Destination member</param>
+               static void setValueWithReflexion(object dest, object value, string destMember){
+#if DEBUG_BINDING_FUNC_CALLS
+            Console.WriteLine ($"setValueWithReflexion (dest:{dest},value:{value},member:{destMember});");
+#endif
+            Type destType = null;
+                       Type origType = null;
+                       object convertedVal = null;
+
+                       MemberInfo miDest = getMemberInfoWithReflexion (dest, destMember);
+
+                       if (miDest == null) {
+                               Debug.WriteLine ("Reverse template binding error: " + destMember + " not found in " + dest);
+                               return;
+                       }
+
+                       if (miDest.MemberType == MemberTypes.Property)
+                               destType =(miDest as PropertyInfo).PropertyType;
+                       else if (miDest.MemberType == MemberTypes.Field)
+                               destType =(miDest as FieldInfo).FieldType;
+
+                       try {
+                               if (value != null) {
+                                       if (destType == typeof (object))//TODO: check that test of destType is not causing problems
+                                               convertedVal = value;
+                                       else {
+                                               origType = value.GetType ();
+                                               if (destType.IsAssignableFrom (origType))
+                                                       convertedVal = Convert.ChangeType (value, destType);
+                                               else if (origType == typeof(string) & destType.IsPrimitive)
+                                                       convertedVal = Convert.ChangeType(value, destType);
+                                               else if (origType.IsPrimitive & destType.IsPrimitive)
+                                                       convertedVal = GetConvertMethod (destType).Invoke (null, new Object[] { value });
+                                               else
+                                                       convertedVal = getImplicitOp (origType, destType).Invoke (value, null);
+                                       }
+                               }
+                       } catch (Exception ex) {
+                               Debug.WriteLine (ex.ToString ());
+                               return;
+                       }
+
+                       if (miDest.MemberType == MemberTypes.Property)
+                               (miDest as PropertyInfo).SetValue (dest, convertedVal);
+                       else if (miDest.MemberType == MemberTypes.Field)
+                               (miDest as FieldInfo).SetValue (dest, convertedVal);
+               }
+               /// <summary>
+               /// Gets value with reflexion, return empty string ("") for string and object and return
+               /// default value for valueType data.
+               /// </summary>
+               static object getValueWithReflexion(object instance, MemberInfo mi){
+#if DEBUG_BINDING_FUNC_CALLS
+            Console.WriteLine ($"getValueWithReflexion ({instance},{mi});");
+#endif
+            object tmp = null;
+                       Type dstType = null;
+                       if (mi == null)
+                               return null;
+                       try {
+                               if (mi.MemberType == MemberTypes.Property) {
+                                       PropertyInfo pi = mi as PropertyInfo;
+                                       tmp = pi.GetValue (instance);
+                                       dstType = pi.PropertyType;
+                               }else if (mi.MemberType == MemberTypes.Field) {
+                                       FieldInfo fi = mi as FieldInfo;
+                                       tmp = fi.GetValue (instance);
+                                       dstType = fi.FieldType;
+                               }else if (mi.MemberType == MemberTypes.Method) {
+                                       MethodInfo gi = mi as MethodInfo;
+                                       if (gi.IsStatic)
+                                               tmp = gi.Invoke(null, new object[] {instance});
+                                       else
+                                               tmp = gi.Invoke(instance, null);
+                                       dstType = gi.ReturnType;
+                               }
+                               if (tmp != null)
+                                       return tmp;
+                               if (dstType == typeof(string) || dstType == typeof (object))//TODO:object should be allowed to return null and not ""
+                                       return "";
+                               if (dstType.IsValueType)
+                                       return Activator.CreateInstance (dstType);                              
+                       } catch (Exception ex) {
+                               Debug.WriteLine (ex.ToString ());
+                               return "";
+                       }
+
+                       return null;
+               }
+               internal static MethodInfo SearchExtMethod (Type t, string methodName)
+               {
+                       string key = t.Name + "." + methodName;
+                       if (knownExtMethods.ContainsKey (key))
+                               return knownExtMethods [key];
+
+                       //Console.WriteLine ($"*** search extension method: {t};{methodName} => key={key}");
+
+                       MethodInfo mi = null;
+                       mi = GetExtensionMethods (Assembly.GetEntryAssembly (), t, methodName);
+                       if (mi == null)
+                               mi = GetExtensionMethods (t.Module.Assembly, t, methodName);
+
+                       //add key even if mi is null to prevent searching again and again for propertyless bindings
+                       knownExtMethods.Add (key, mi);
+                       return mi;
+               }
+
+               public static MethodInfo GetExtensionMethods (Assembly assembly, Type extendedType, string methodName)
+               {
+                       foreach (Type t in assembly.GetTypes ().Where
+                                       (ty => ty.IsDefined (typeof (ExtensionAttribute), false))) {
+                               foreach (MethodInfo mi in t.GetMethods 
+                                       (BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).Where
+                                               (m=> m.Name == methodName && m.IsDefined (typeof (ExtensionAttribute), false) &&
+                                                m.GetParameters ().Length == 1)) {
+                                       Type curType = extendedType;
+                                       while (curType != null) {
+                                               if (mi.GetParameters () [0].ParameterType == curType)
+                                                       return mi;
+                                               curType = curType.BaseType;
+                                       }                                               
+                               }
+                       
+                       }
+                       return null;
+               }
+               /// <summary>
+               /// retrieve event handler in class or ancestors
+               /// </summary>
+               static FieldInfo getEventHandlerField (Type type, string eventName)
+               {
+                       FieldInfo fi;
+                       Type ty = type;
+                       do {
+                               fi = ty.GetField (eventName,
+                                       BindingFlags.NonPublic |
+                                       BindingFlags.Instance |
+                                       BindingFlags.GetField);
+                               ty = ty.BaseType;
+                               if (ty == null)
+                                       break;
+                       } while (fi == null);
+                       return fi;
+               }
+               /// <summary>
+               /// search for an implicit conversion method in origine or destination classes
+               /// </summary>
+               static MethodInfo getImplicitOp(Type origType, Type dstType){
+                       foreach(MethodInfo mi in origType.GetMethods(BindingFlags.Public|BindingFlags.Static)){
+                               if (mi.Name == "op_Implicit") {
+                                       if (mi.ReturnType == dstType && mi.GetParameters ().FirstOrDefault ().ParameterType == origType)
+                                               return mi;
+                               }
+                       }
+                       foreach(MethodInfo mi in dstType.GetMethods(BindingFlags.Public|BindingFlags.Static)){
+                               if (mi.Name == "op_Implicit") {
+                                       if (mi.ReturnType == dstType && mi.GetParameters ().FirstOrDefault ().ParameterType == origType)
+                                               return mi;
+                               }
+                       }
+                       return null;
+               }
+#endregion
+
+               /// <summary>
+               /// Emits tree parsing command to fetch dest instance starting from orig node
+               /// </summary>
+               internal static void emitGetInstance (ILGenerator il, NodeAddress orig, NodeAddress dest){
+                       int ptr = 0;
+                       while (orig [ptr] == dest [ptr]) {
+                               ptr++;
+                               if (ptr == orig.Count || ptr == dest.Count)
+                                       break;
+                       }
+                       for (int i = 0; i < orig.Count - ptr; i++)
+                               il.Emit (OpCodes.Callvirt, CompilerServices.miGetLogicalParent);
+                       while (ptr < dest.Count) {
+                               emitGetChild (il, dest [ptr-1].CrowType, dest [ptr].Index);
+                               ptr++;
+                       }
+               }
+               /// <summary>
+               /// Emits tree parsing commands to get child starting at root node
+               /// </summary>
+               /// <param name="il">MSIL generator</param>
+               /// <param name="dest">Absolute Node Address of the instance to get</param>
+               internal static void emitGetInstance (ILGenerator il, NodeAddress dest){
+                       if (dest == null)
+                               return;
+                       for (int i = 0; i < dest.Count - 1; i++)
+                               emitGetChild (il, dest [i].CrowType, dest [i + 1].Index);
+               }
+               /// <summary>
+               /// Emits msil to fetch chil instance of current GraphicObject on the stack
+               /// </summary>
+               /// <param name="il">Il generator</param>
+               /// <param name="parentType">Parent type</param>
+               /// <param name="index">Index of child, -1 for template root</param>
+               internal static void emitGetChild(ILGenerator il, Type parentType, int index){
+                       if (typeof (Group).IsAssignableFrom (parentType)) {
+                               il.Emit (OpCodes.Ldfld, fiChildren);
+                               il.Emit(OpCodes.Ldc_I4, index);
+                               il.Emit (OpCodes.Callvirt, miGetGObjItem);
+                               return;
+                       }
+                       if (typeof(Container).IsAssignableFrom (parentType) || index < 0) {
+                               il.Emit (OpCodes.Ldfld, fiChild);
+                               return;
+                       }
+                       if (typeof(TemplatedContainer).IsAssignableFrom (parentType)) {
+                               il.Emit (OpCodes.Callvirt, piContent.GetGetMethod());
+                               return;
+                       }
+                       if (typeof(TemplatedGroup).IsAssignableFrom (parentType)) {
+                               il.Emit (OpCodes.Callvirt, miGetItems);
+                               il.Emit(OpCodes.Ldc_I4, index);
+                               il.Emit (OpCodes.Callvirt, miGetGObjItem);
+                               return;
+                       }
+               }
+
+               /// <summary>
+               /// Emit MSIL for conversion from orig type to dest type
+               /// </summary>
+               internal static void emitConvert(ILGenerator il, Type origType, Type destType){
+                       if (destType == typeof(object))
+                               return;
+                       if (destType == typeof (string)) {
+                               System.Reflection.Emit.Label emitNullStr = il.DefineLabel ();
+                               System.Reflection.Emit.Label endConvert = il.DefineLabel ();
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, emitNullStr);
+                               il.Emit (OpCodes.Callvirt, CompilerServices.miObjToString);
+                               il.Emit (OpCodes.Br, endConvert);
+                               il.MarkLabel (emitNullStr);
+                               il.Emit (OpCodes.Pop);//remove null string from stack
+                               il.Emit (OpCodes.Ldstr, "");//replace with empty string
+                               il.MarkLabel (endConvert);
+                       }else if ((origType.IsEnum || origType == typeof(Enum)) && destType.IsEnum) {
+                               il.Emit (OpCodes.Unbox_Any, destType);
+                               return;
+                       }else if (origType.IsValueType) {
+                               if (destType != origType) {
+                                       MethodInfo miIO = getImplicitOp (origType, destType);
+                    if (miIO != null)
+                    {
+                        System.Reflection.Emit.Label emitCreateDefault = il.DefineLabel();
+                        System.Reflection.Emit.Label emitContinue = il.DefineLabel();
+                        LocalBuilder lbStruct = il.DeclareLocal(origType);
+                        il.Emit(OpCodes.Dup);
+                        il.Emit(OpCodes.Brfalse, emitCreateDefault);
+                        il.Emit(OpCodes.Unbox_Any, origType);
+                        il.Emit(OpCodes.Br, emitContinue);
+                        il.MarkLabel(emitCreateDefault);
+                        il.Emit(OpCodes.Pop);//pop null value
+                        il.Emit(OpCodes.Ldloca, lbStruct);
+                        il.Emit(OpCodes.Initobj, origType);
+                        il.Emit(OpCodes.Ldloc, lbStruct);
+                        il.MarkLabel(emitContinue);
+                        il.Emit(OpCodes.Call, miIO);
+                    }
+                    else
+                    {
+                        MethodInfo miconv = CompilerServices.GetConvertMethod(destType);
+                        if (miconv.IsStatic)
+                            il.Emit(OpCodes.Call, miconv);
+                        else
+                            il.Emit(OpCodes.Callvirt, miconv);
+                    }
+                               }else
+                                       il.Emit (OpCodes.Unbox_Any, destType);//TODO:double check this
+                       } else {
+                               if (destType.IsAssignableFrom(origType))
+                                       il.Emit (OpCodes.Castclass, destType);
+                               else {
+                                       //implicit conversion can't be defined from or to object base class,
+                                       //so we will check if object underlying type is one of the implicit converter of destType
+                                       if (origType == typeof(object)) {//test all implicit converter to destType on obj
+                                               System.Reflection.Emit.Label emitTestNextImpOp;
+                                               System.Reflection.Emit.Label emitImpOpFound = il.DefineLabel ();
+                                               foreach (MethodInfo mi in destType.GetMethods(BindingFlags.Public|BindingFlags.Static)) {
+                                                       if (mi.Name == "op_Implicit") {
+                                                               if (mi.GetParameters () [0].ParameterType == destType)
+                                                                       continue;
+                                                               emitTestNextImpOp = il.DefineLabel ();
+                                                               il.Emit (OpCodes.Dup);
+                                                               il.Emit (OpCodes.Isinst, mi.GetParameters () [0].ParameterType);
+                                                               il.Emit (OpCodes.Brfalse, emitTestNextImpOp);
+                                                               if (mi.GetParameters () [0].ParameterType.IsValueType)
+                                                                       il.Emit (OpCodes.Unbox_Any, mi.GetParameters () [0].ParameterType);
+                                                               else
+                                                                       il.Emit (OpCodes.Isinst, mi.GetParameters () [0].ParameterType);
+
+                                                               il.Emit (OpCodes.Call, mi);
+                                                               il.Emit (OpCodes.Br, emitImpOpFound);
+
+                                                               il.MarkLabel (emitTestNextImpOp);
+                                                       }
+                                               }
+                                               //il.Emit (OpCodes.Br, emitImpOpNotFound);
+                                               il.MarkLabel (emitImpOpFound);
+                                       } else {//search both orig and dest types for implicit operators
+                                               MethodInfo miIO = getImplicitOp (origType, destType);
+                                               if (miIO != null)
+                                                       il.Emit (OpCodes.Call, miIO);
+                                       }
+                               }
+                       }
+               }
+               /// <summary>
+               /// check type of current object on the stack and convert to dest type,
+               /// use loc_0 so store it as object!!!
+               /// </summary>
+               internal static void emitConvert(ILGenerator il, Type dstType){
+                       System.Reflection.Emit.Label endConvert = il.DefineLabel ();
+                       System.Reflection.Emit.Label convert = il.DefineLabel ();
+
+                       il.Emit (OpCodes.Dup);
+                       il.Emit (OpCodes.Isinst, dstType);
+                       il.Emit (OpCodes.Brfalse, convert);
+
+                       if (dstType.IsValueType)
+                               il.Emit (OpCodes.Unbox_Any, dstType);
+                       else
+                               il.Emit (OpCodes.Isinst, dstType);
+                       il.Emit (OpCodes.Br, endConvert);
+
+                       il.MarkLabel (convert);
+
+                       if (dstType == typeof(string)) {
+                               System.Reflection.Emit.Label emitNullStr = il.DefineLabel ();
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, emitNullStr);
+                               il.Emit (OpCodes.Callvirt, CompilerServices.miObjToString);
+                               il.Emit (OpCodes.Br, endConvert);
+                               il.MarkLabel (emitNullStr);
+                               il.Emit (OpCodes.Pop);//remove null string from stack
+                               il.Emit (OpCodes.Ldstr, "");//replace with empty string
+                       } else if (dstType.IsPrimitive) {
+                //il.Emit (OpCodes.Unbox_Any, dstType);
+                MethodInfo miconv = CompilerServices.GetConvertMethod(dstType);
+                if (miconv.IsStatic)
+                    il.Emit(OpCodes.Call, miconv);
+                else
+                    il.Emit(OpCodes.Callvirt, miconv);
+                       } else if (dstType.IsValueType) {
+                               il.Emit (OpCodes.Unbox_Any, dstType);
+                       } else{
+                               il.Emit (OpCodes.Stloc_0); //save orig value in loc0
+                               //first check if not null
+                               il.Emit (OpCodes.Ldloc_0);
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, endConvert);
+                               il.Emit (OpCodes.Callvirt, miGetType);
+                               il.Emit (OpCodes.Ldtoken, dstType);//push destination property type for testing
+                               il.Emit (OpCodes.Call, CompilerServices.miGetTypeFromHandle);
+                               il.Emit (OpCodes.Call, miGetImplOp);
+                               il.Emit (OpCodes.Dup);
+                               convert = il.DefineLabel ();
+                               il.Emit (OpCodes.Brtrue, convert);
+                               il.Emit (OpCodes.Pop);
+                               il.Emit (OpCodes.Ldloc_0);
+                               il.Emit (OpCodes.Isinst, dstType);
+                               il.Emit (OpCodes.Br, endConvert);
+
+                               il.MarkLabel (convert);
+                               il.Emit (OpCodes.Ldnull);//null instance for invoke
+                               il.Emit (OpCodes.Ldc_I4_1);
+                               il.Emit(OpCodes.Newarr, typeof (object));
+                               il.Emit (OpCodes.Dup);//duplicate the array ref
+                               il.Emit (OpCodes.Ldc_I4_0);//push the index 0
+                               il.Emit (OpCodes.Ldloc_0);//push the orig value to convert
+                               il.Emit (OpCodes.Stelem, typeof (object));//set the array element at index 0
+                               il.Emit (OpCodes.Callvirt, miMIInvoke);
+                       }
+
+                       il.MarkLabel (endConvert);
+               }
+
+               /// <summary>
+               /// Removes delegate from event handler by name
+               /// </summary>
+               static void removeEventHandlerByName(object instance, string eventName, string delegateName){
+                       Type t = instance.GetType ();
+                       FieldInfo fiEvt = getEventHandlerField (t, eventName);
+                       if (fiEvt == null) {
+#if DEBUG_BINDING
+                               Debug.WriteLine ("RemoveHandlerByName: Event '" + eventName + "' not found in " + instance);
+#endif
+                               return;
+                       }
+                       EventInfo eiEvt = t.GetEvent (eventName);
+                       MulticastDelegate multiDel = fiEvt.GetValue (instance) as MulticastDelegate;
+                       if (multiDel != null) {
+                               foreach (Delegate d in multiDel.GetInvocationList()) {
+                                       if (d.Method.Name == delegateName) {
+                                               eiEvt.RemoveEventHandler (instance, d);
+#if DEBUG_BINDING
+                                               Debug.WriteLine ("\t{0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName);
+#endif
+                                       }
+                               }
+                       }
+               }
+               /// <summary>
+               /// Removes delegate from event handler by searching for the object they are bond to
+               /// </summary>
+               static void removeEventHandlerByTarget(object instance, string eventName, object target){
+                       Type t = instance.GetType ();
+                       FieldInfo fiEvt = getEventHandlerField (t, eventName);
+                       EventInfo eiEvt = t.GetEvent (eventName);
+                       MulticastDelegate multiDel = fiEvt.GetValue (instance) as MulticastDelegate;
+                       if (multiDel != null) {
+                               foreach (Delegate d in multiDel.GetInvocationList()) {
+                                       if (d.Target == target) {
+                                               eiEvt.RemoveEventHandler (instance, d);
+#if DEBUG_BINDING
+                                               Debug.WriteLine ("\t{0} handler removed in {1} for: {2}", d.Method.Name,instance, eventName);
+#endif
+                                       }
+                               }
+                       }
+               }
+               /// <summary>
+               /// create delegate helper
+               /// </summary>
+               static Delegate createDel(object instance, Type eventType, string method){
+                       Type t = instance.GetType ();
+                       MethodInfo mi = t.GetMethod (method, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
+                       if (mi == null) {
+                               Debug.WriteLine ("Handler Method '{0}' not found in '{1}'", method, t);
+                               return null;
+                       }
+                       return Delegate.CreateDelegate (eventType, instance, mi);
+               }
+
+               internal static Delegate compileDynEventHandler(EventInfo sourceEvent, string expression, NodeAddress currentNode = null){
+#if DEBUG_BINDING
+                       Debug.WriteLine ("\tCompile Event {0}: {1}", sourceEvent.Name, expression);
+#endif
+
+                       Type lopType = null;
+
+                       if (currentNode == null)
+                               lopType = sourceEvent.DeclaringType;
+                       else
+                               lopType = currentNode.NodeType;
+
+#region Retrieve EventHandler parameter type
+                       MethodInfo evtInvoke = sourceEvent.EventHandlerType.GetMethod ("Invoke");
+                       ParameterInfo [] evtParams = evtInvoke.GetParameters ();
+                       Type handlerArgsType = evtParams [1].ParameterType;
+#endregion
+
+                       Type [] args = { typeof (object), handlerArgsType };
+                       DynamicMethod dm = new DynamicMethod ("dyn_eventHandler",
+                               typeof(void),
+                               args, true);
+                       ILGenerator il = dm.GetILGenerator (256);
+                       il.Emit (OpCodes.Nop);
+
+                       string [] srcLines = expression.Trim ().Split (new char [] { ';' });
+
+                       foreach (string srcLine in srcLines) {
+                               if (string.IsNullOrEmpty (srcLine))
+                                       continue;
+                               string [] operandes = srcLine.Trim ().Split (new char [] { '=' });
+                               if (operandes.Length != 2) //not an affectation
+                                       throw new NotSupportedException ();
+
+                               System.Reflection.Emit.Label cancel = il.DefineLabel ();
+                               System.Reflection.Emit.Label cancelFinalSet = il.DefineLabel ();
+                               System.Reflection.Emit.Label success = il.DefineLabel ();
+
+                               BindingMember lop = new BindingMember (operandes [0].Trim ());
+                               BindingMember rop = new BindingMember (operandes [1].Trim ());
+
+                               il.Emit (OpCodes.Ldarg_0);  //load sender ref onto the stack, the current node
+
+#region Left operande
+                               PropertyInfo lopPI = null;
+
+                               //in dyn handler, no datasource binding, so single name in expression are also handled as current node property
+                               if (lop.IsSingleName)
+                                       lopPI = lopType.GetProperty (lop.Tokens [0]);
+                               else if (lop.IsCurrentNodeProperty)
+                                       lopPI = lopType.GetProperty (lop.Tokens [1]);
+                               else
+                                       lop.emitGetTarget (il, cancel);
+#endregion
+
+#region RIGHT OPERANDES
+                               if (rop.IsStringConstant){
+                                       il.Emit (OpCodes.Ldstr, rop.Tokens[0]);
+                                       lop.emitSetProperty (il);
+                               }else if (rop.IsSingleName && rop.Tokens[0] == "this"){
+                                       il.Emit (OpCodes.Ldarg_0);  //load sender ref onto the stack, the current node
+                                       lop.emitSetProperty (il);
+                               }else if (rop.LevelsUp ==0 && !string.IsNullOrEmpty(rop.Tokens[0])) {//parsable constant depending on lop type
+                                       //if left operand is member of current node, it's easy to fetch type, else we should use reflexion in msil
+                                       if (lopPI == null){//accept GraphicObj members, but it's restricive
+                                               //TODO: we should get the parse method by reflexion, or something else
+                                               lopPI = typeof(Widget).GetProperty (lop.Tokens [lop.Tokens.Length-1]);
+                                               if (lopPI == null)
+                                                       throw new NotSupportedException ();
+                                       }
+
+                                       MethodInfo lopParseMi = CompilerServices.miParseEnum;
+                                       if (lopPI.PropertyType.IsEnum){
+                                               //load type of enum
+                                               il.Emit(OpCodes.Ldtoken, lopPI.PropertyType);
+                                               il.Emit(OpCodes.Call, CompilerServices.miGetTypeFromHandle);
+                                               //load enum value name
+                                               il.Emit (OpCodes.Ldstr, operandes [1].Trim ());
+                                               //load false
+                                               il.Emit (OpCodes.Ldc_I4_0);
+                                       }else{
+                                               lopParseMi = lopPI.PropertyType.GetMethod ("Parse");
+                                               if (lopParseMi == null)
+                                                       throw new Exception (string.Format
+                                                               ("IML: no static 'Parse' method found in: {0}", lopPI.PropertyType.Name));
+
+                                               il.Emit (OpCodes.Ldstr, operandes [1].Trim ());
+                                       }
+                    if (lopParseMi.IsStatic)
+                                           il.Emit (OpCodes.Call, lopParseMi);
+                    else
+                        il.Emit(OpCodes.Callvirt, lopParseMi);
+                    //il.Emit (OpCodes.Unbox_Any, lopPI.PropertyType);
+                    //emit left operand assignment
+                    il.Emit (OpCodes.Callvirt, lopPI.GetSetMethod());
+                               } else {//tree parsing and propert gets
+                                       il.Emit (OpCodes.Ldarg_0);  //load sender ref onto the stack, the current node
+
+                                       rop.emitGetTarget (il, cancelFinalSet);
+                                       rop.emitGetProperty (il, cancelFinalSet);
+                                       lop.emitSetProperty (il);
+                               }
+#endregion
+
+                               il.Emit (OpCodes.Br, success);
+
+                               il.MarkLabel (cancelFinalSet);
+                               il.Emit (OpCodes.Pop);  //pop null MemberInfo on the stack causing cancelation
+                               il.MarkLabel (cancel);
+                               il.Emit (OpCodes.Pop);  //pop null instance on the stack causing cancelation
+                               il.MarkLabel (success);
+                       }
+
+                       il.Emit (OpCodes.Ret);
+
+                       return dm.CreateDelegate (sourceEvent.EventHandlerType);
+               }
+
+               /// <summary>
+               /// MSIL helper, go n levels up
+               /// </summary>
+               /// <returns><c>true</c>, if logical parents are not null</returns>
+               /// <param name="instance">Start Instance</param>
+               /// <param name="levelCount">Levels to go upward</param>
+               internal static ILayoutable goUpNbLevels(ILayoutable instance, int levelCount){
+                       ILayoutable tmp = instance;
+                       int i = 0;
+                       while (tmp != null && i < levelCount) {
+                               tmp = tmp.LogicalParent;
+                               i++;
+                       }
+                       return tmp;
+               }
+               /// <summary>
+               /// Splits expression on semicolon but ignore those between accolades
+               /// </summary>
+               internal static string[] splitOnSemiColumnOutsideAccolades (string expression){
+                       List<String> exps = new List<string>();
+                       int accCount = 0;
+                       int expPtr = 0;
+                       for (int c = 0; c < expression.Length; c++) {
+                               switch (expression[c]){
+                               case '{':
+                                       accCount++;
+                                       break;
+                               case '}':
+                                       accCount--;
+                                       break;
+                               case ';':
+                                       if (accCount > 0)
+                                               break;
+                                       exps.Add(expression.Substring(expPtr, c - expPtr - 1));
+                                       expPtr = c + 1;
+                                       break;
+                               }
+                       }
+                       if (exps.Count == 0)
+                               exps.Add(expression);
+                       return exps.ToArray ();
+               }
+               /// <summary>
+               /// Try to get the type named strDataType, search first in crow assembly then in
+               /// entry assembly.
+               /// </summary>
+               /// <returns>the corresponding type object if found</returns>
+               /// <param name="strDataType">type name</param>
+               internal static Type getTypeFromName (string strDataType){
+                       if (knownTypes.ContainsKey (strDataType))
+                               return knownTypes [strDataType];
+                       Type dataType = Type.GetType(strDataType);
+                       if (dataType != null) {
+                               knownTypes.Add (strDataType, dataType);
+                               return dataType;
+                       }
+                       foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies ()) {
+                               if (a.IsDynamic)
+                                       continue;
+                               foreach (Type expT in a.GetExportedTypes ()) {
+                                       if (expT.Name != strDataType)
+                                               continue;
+                                       knownTypes.Add (strDataType, expT);
+                                       return expT;
+                               }
+                       }
+                       knownTypes.Add (strDataType, null);
+                       return null;
+               }
+
+               //get value from member of object
+               internal static object getDataTypeAndFetch (object data, string fetchMethod){
+                       Type dataType = data.GetType();
+                       //Console.WriteLine ($"get data type and fetch {data}.{fetchMethod}");
+                       MethodInfo miGetDatas = dataType.GetMethod (fetchMethod, new Type[] {});
+                       if (miGetDatas == null)
+                               miGetDatas = CompilerServices.SearchExtMethod (dataType, fetchMethod);
+
+                       if (miGetDatas == null) {//in last resort, search among properties
+                               PropertyInfo piDatas = dataType.GetProperty (fetchMethod);
+                               if (piDatas == null) {
+                                       FieldInfo fiDatas = dataType.GetField (fetchMethod);
+                                       if (fiDatas == null)//and among fields
+                                               throw new Exception ("Fetch data member not found in ItemTemplate: " + fetchMethod);
+                                       return fiDatas.GetValue (data);
+                               }
+                               miGetDatas = piDatas.GetGetMethod ();
+                               if (miGetDatas == null)
+                                       throw new Exception ("Read only property for fetching data in ItemTemplate: " + fetchMethod);
+                       }
+                       return miGetDatas.IsStatic ?
+                               miGetDatas.Invoke (null, new object [] { data }) : miGetDatas.Invoke (data, null);
+               }
+               //TODO:memberinfo found here must be cached
+               internal static object getValue (Type dataType, object data, string member)
+               {
+                       //Console.WriteLine ($"get value: {dataType} ; {data} ; {member}");
+
+                       MethodInfo miGetDatas = dataType.GetMethod (member, new Type [] { });
+                       if (miGetDatas != null)
+                               return miGetDatas.Invoke (data, null);
+                       MemberInfo mbi = dataType.GetMember (member).FirstOrDefault ();
+                       if (mbi == null) {
+                               MethodInfo miExt = CompilerServices.SearchExtMethod (dataType, member);
+                               if (miExt == null)//and among fields
+                                       throw new Exception ($"member {member} not found in {dataType}");
+                               return miExt.Invoke (null, new object [] { data });
+                       }
+                       if (mbi.MemberType == MemberTypes.Property) {
+                               miGetDatas = (mbi as PropertyInfo)?.GetGetMethod ();
+                               if (miGetDatas == null)
+                                       throw new Exception ($"no getter found for property {member} in {dataType}");
+                               return miGetDatas.Invoke (data, null);
+                       }
+
+                       FieldInfo fi = mbi as FieldInfo;
+                       if (fi == null)
+                               throw new Exception ($"member {member} not found in {dataType}");
+
+                       return fi.GetValue (data);
+               }
+               internal static MemberInfo GetMemberInfo (Type dataType, string member, out Type returnType)
+               {
+                       MethodInfo miGetDatas = dataType.GetMethod (member, new Type [] { });
+                       if (miGetDatas != null) {
+                               returnType = miGetDatas.ReturnType;
+                               return miGetDatas;
+                       }
+
+                       MemberInfo mbi = dataType.GetMember (member).FirstOrDefault ();
+                       if (mbi == null)
+                               miGetDatas = CompilerServices.SearchExtMethod (dataType, member);
+                       else {
+                               if (mbi is FieldInfo) {
+                                       FieldInfo fi = mbi as FieldInfo;
+                                       returnType = fi.FieldType;
+                                       return mbi;
+                               }
+                               if (mbi.MemberType == MemberTypes.Property)
+                                       miGetDatas = (mbi as PropertyInfo).GetGetMethod ();
+                               else
+                                       miGetDatas = mbi as MethodInfo;
+                       }
+                       returnType = miGetDatas?.ReturnType;
+                       return miGetDatas;
+
+               }
+               internal static void emitGetMemberValue (ILGenerator il, Type dataType, MemberInfo mi)
+               {
+                       switch (mi.MemberType) {
+                       case MemberTypes.Method:
+                               MethodInfo mim = mi as MethodInfo;
+                               if (mim.IsStatic)
+                                       il.Emit (OpCodes.Call, mim);
+                               else
+                                       il.Emit (OpCodes.Callvirt, mim);
+                               break;
+                       case MemberTypes.Field:
+                               il.Emit (OpCodes.Ldfld, mi as FieldInfo);
+                               break;
+                       }
+               }
+               //object is already on the stack
+               internal static void emitGetMemberValue (ILGenerator il, Type dataType, string member)
+               {
+                       MethodInfo miGetDatas = dataType.GetMethod (member, new Type [] { });
+                       if (miGetDatas != null) {
+                               il.Emit (OpCodes.Callvirt, miGetDatas);
+                               return;
+                       }
+                       MemberInfo mbi = dataType.GetMember (member).FirstOrDefault ();
+                       if (mbi == null) {
+                               MethodInfo miExt = CompilerServices.SearchExtMethod (dataType, member);
+                               if (miExt == null)//and among fields
+                                       throw new Exception ($"member {member} not found in {dataType}");
+                               il.Emit (OpCodes.Call, miExt);
+                               return;
+                       }
+                       if (mbi.MemberType == MemberTypes.Property) {
+                               miGetDatas = (mbi as PropertyInfo)?.GetGetMethod ();
+                               if (miGetDatas == null)
+                                       throw new Exception ($"no getter found for property {member} in {dataType}");
+                               il.Emit (OpCodes.Callvirt, miGetDatas);
+                               return;
+                       }
+
+                       FieldInfo fi = mbi as FieldInfo;
+                       if (fi == null)
+                               throw new Exception ($"member {member} not found in {dataType}");
+
+                       il.Emit (OpCodes.Ldfld, fi);
+               }
+       }
+}
+
diff --git a/Crow/src/Configuration.cs b/Crow/src/Configuration.cs
new file mode 100644 (file)
index 0000000..b8112be
--- /dev/null
@@ -0,0 +1,203 @@
+//
+// Configuration.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Reflection;
+using System.IO;
+using System.Collections.Generic;
+using System.Threading;
+using System.Linq;
+
+namespace Crow
+{
+       /// <summary>
+       /// single element of configuration
+       /// </summary>
+       public class ConfigItem {
+               Type type;
+               internal object curVal;
+               bool parsingNeeded = false;
+               public ConfigItem(object newVal){
+                       curVal = newVal;
+               }
+               public ConfigItem(string newVal){
+                       curVal = newVal;
+                       parsingNeeded = true;
+               }
+               public T GetValue<T>(){
+                       if (type == null)
+                               type = typeof(T);
+                       if (parsingNeeded) {
+                               MethodInfo miParse = type.GetMethod ("Parse", new Type[] {typeof(string)});
+                               if (miParse != null)
+                                       curVal = miParse.Invoke (null, new object[]{ curVal });
+                               parsingNeeded = false;
+                       }
+                       return (T)Convert.ChangeType (curVal, type);
+               }
+               public void Set(object value){
+                       curVal = value;
+               }
+       }
+       /// <summary>
+       /// Application wide Configuration store utility
+       /// 
+       /// configuration files are automatically stored in **_user/.config/appname/app.config_** on close and every minutes
+       /// if some items have changed.
+       /// New items are automaticaly added on first use. Configuration class expose one templated Get and one Templated Set, so
+       /// creating, storing and retrieving config items is simple as:
+       /// 
+       /// ```csharp\n
+       ///     //storing\n
+       ///     Configuration.Global.Set ("Option1", 42);\n
+       ///     //loading\n
+       ///     int op1 = Configuration.Global.Get<int> ("Option1");\n
+       /// ```\n
+       /// </summary>
+       /// 
+       /// **.config**  file are simple text files with per line, a key/value pair of the form `option=value`. Keys have to be unique
+       /// in the application scope.
+       /// 
+       /// When running the application for the first time, some default options may be necessary. Their can be defined
+       /// in a special embedded resource text file with the key '**appname.default.config**'
+       public class Configuration
+       {
+               volatile bool isDirty = false;
+               string configPath;
+               Dictionary<string, ConfigItem> items = new Dictionary<string, ConfigItem> ();
+               static Configuration  globalConfig;
+
+               public static Configuration Global { get { return globalConfig; } }
+
+               public Configuration (string path, Stream defaultConf = null) {
+                       configPath = path;
+                       if (File.Exists (configPath)) {
+                               using (Stream s = new FileStream (configPath, FileMode.Open))
+                                       load (s);
+                               
+                       } else if (defaultConf != null) {                               
+                               load (defaultConf);
+                       }
+                       startSavingThread ();
+               }
+
+               static Configuration ()
+               {
+                       string configRoot =
+                               Path.Combine(
+                    
+                                       Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
+                                       ".config");
+
+                       Assembly a = Assembly.GetEntryAssembly ();
+                       string appName = a.GetName().Name;
+                       string globalConfigPath = Path.Combine (configRoot, appName);
+
+                       if (!Directory.Exists (globalConfigPath))
+                               Directory.CreateDirectory (globalConfigPath);
+
+                       globalConfigPath = Path.Combine (globalConfigPath, "global.config");
+
+                       string defaultConfigResID = appName + ".default.config";
+                       foreach (string resIds in a.GetManifestResourceNames()) {
+                               if (string.Equals (defaultConfigResID, resIds, StringComparison.OrdinalIgnoreCase)) {
+                               using (Stream s = a.GetManifestResourceStream (defaultConfigResID))
+                                       globalConfig = new Configuration (globalConfigPath, s);
+                                       return;
+                               }
+                       }
+                       globalConfig = new Configuration (globalConfigPath);
+               }
+
+               public string[] Names {
+                       get {
+                               return items.Keys.ToArray ();
+                       }
+               }
+
+               void startSavingThread(){
+                       Thread t = new Thread (savingThread);
+                       t.IsBackground = true;
+                       t.Start ();
+               }
+               void savingThread(){
+                       while(true){
+                               if (isDirty)
+                                       Save ();                                
+                               Thread.Sleep (100);
+                       }
+               }
+               /// <summary>
+               /// retrive the value of the configuration key given in parameter
+               /// </summary>
+               /// <param name="key">option name</param>
+               public T Get<T>(string key)
+               {
+                       return !items.ContainsKey (key) ? default(T) : items [key].GetValue<T> ();
+               }
+               /// <summary>
+               /// store the value of the configuration key given in parameter
+               /// </summary>
+               /// <param name="key">option name</param>
+               /// <param name="value">value for that option</param>
+               public void Set<T>(string key, T value)
+               {
+                       if (!items.ContainsKey (key)) {
+                               lock(items)
+                                       items[key] = new ConfigItem (value);
+                       }else
+                               items[key].Set (value);
+                       isDirty = true;
+               }
+               public void Save(){
+                       using (Stream s = new FileStream(configPath,FileMode.Create)){
+                               using (StreamWriter sw = new StreamWriter (s)) {
+                                       lock (items) {
+                                               foreach (string key in items.Keys) {
+                                                       if (items [key].curVal != null)
+                                                               sw.WriteLine (key + "=" + (string)items [key].curVal.ToString ());
+                                               }
+                                       }
+                               }
+                       }
+                       isDirty = false;
+               }
+               void load(Stream s){
+                       using (StreamReader sr = new StreamReader (s)) {
+                               while (!sr.EndOfStream) {
+                                       string l = sr.ReadLine();
+                                       if (string.IsNullOrEmpty (l.Trim ()))
+                                               continue;
+                                       string[] tmp = l.Trim ().Split ('=');
+                                       if (tmp.Length != 2)
+                                               continue;
+                                       items[tmp [0].Trim ()] = new ConfigItem(tmp [1].Trim ());
+                               }
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/CrowThread.cs b/Crow/src/CrowThread.cs
new file mode 100644 (file)
index 0000000..5c5ceef
--- /dev/null
@@ -0,0 +1,65 @@
+//
+// CrowThread.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Threading;
+
+namespace Crow
+{
+       /// <summary>
+       /// Thread monitored by current interface with Finished event when state==Stopped
+       /// </summary>
+       public class CrowThread {
+               public bool cancelRequested = false;
+               Thread thread;
+               public event EventHandler Finished;
+               public Widget Host;
+               public CrowThread (Widget host, ThreadStart start){
+                       thread = new Thread (start);
+                       thread.IsBackground = true;
+                       Host = host;
+                       lock (Host.IFace.CrowThreads)
+                               Host.IFace.CrowThreads.Add (this);
+               }
+               public void CheckState(){
+                       if (thread.ThreadState != ThreadState.Stopped)
+                               return;
+                       Finished.Raise (Host, null);
+                       lock (Host.IFace.CrowThreads)
+                               Host.IFace.CrowThreads.Remove (this);
+               }
+               public void Start() { thread.Start();}
+               public void Cancel(){
+                       if (thread.IsAlive & !cancelRequested){
+                               cancelRequested = true;
+                               thread.Join ();
+                       }
+                       lock (Host.IFace.CrowThreads)
+                               Host.IFace.CrowThreads.Remove (this);
+               }
+       }
+}
+
diff --git a/Crow/src/DragDropEventArgs.cs b/Crow/src/DragDropEventArgs.cs
new file mode 100644 (file)
index 0000000..b79c366
--- /dev/null
@@ -0,0 +1,55 @@
+//
+// LayoutingEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       public class DragDropEventArgs: EventArgs
+       {
+               /// <summary>
+               /// Source of the drag and drop operation
+               /// </summary>
+               public Widget DragSource;
+               /// <summary>
+               /// Target of the drag and drop operation
+               /// </summary>
+               public Widget DropTarget;
+
+               //public DragDropEventArgs (GraphicObject source, GraphicObject target = null) : base()
+               public DragDropEventArgs (Widget source = null, Widget target = null) : base()
+               {
+                       DragSource = source;
+                       DropTarget = target;
+               }
+
+               public override string ToString ()
+               {
+                       return string.Format ("{0} => {1}", DragSource,DropTarget);
+               }
+       }
+}
+
diff --git a/Crow/src/DynAttribute.cs b/Crow/src/DynAttribute.cs
new file mode 100644 (file)
index 0000000..aa9b5ce
--- /dev/null
@@ -0,0 +1,40 @@
+//
+// DynAttribute.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Crow
+{
+       public class DynAttribute
+    {
+        public Widget Source;
+        public string MemberName;
+        public String Value;
+    }
+}
diff --git a/Crow/src/Enums.cs b/Crow/src/Enums.cs
new file mode 100644 (file)
index 0000000..8b90d6e
--- /dev/null
@@ -0,0 +1,65 @@
+//
+// Enums.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Crow
+{
+    public enum Orientation
+    {
+        Horizontal,
+        Vertical
+    }
+
+       public enum Alignment 
+    {
+        Top = 0x01,
+        Left = 0x02,
+               TopLeft = 0x03,
+               Right = 0x04,
+               TopRight = 0x05,
+               Bottom = 0x08,
+        BottomLeft = 0x0a,
+        BottomRight = 0x0c,
+               Center = 0x10,
+               Undefined = 0x40
+    }
+    public enum HorizontalAlignment
+    {
+        Left,
+        Right,
+        Center,
+    }
+    public enum VerticalAlignment
+    {
+        Top,
+        Bottom,
+        Center,
+    }
+}
diff --git a/Crow/src/ExtensionsMethods.cs b/Crow/src/ExtensionsMethods.cs
new file mode 100644 (file)
index 0000000..ec97595
--- /dev/null
@@ -0,0 +1,224 @@
+//
+// ExtensionsMethods.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Linq.Expressions;
+using vkvg;
+
+namespace Crow
+{
+       public static class ExtensionsMethods
+       {
+               #region Cairo extensions
+
+               public static void Rectangle(this Context ctx, Rectangle r, double stroke = 0.0)
+               {
+                       if (stroke > 0.0) {
+                               ctx.LineWidth = stroke;
+                               double shw = stroke / 2.0;
+                               ctx.Rectangle (r.X + shw, r.Y + shw, r.Width - stroke, r.Height - stroke);
+                               ctx.Stroke ();
+                       }else
+                               ctx.Rectangle (r.X, r.Y, r.Width, r.Height);
+               }
+               public static double GetLength(this Point p){
+                       return Math.Sqrt (Math.Pow (p.X, 2) + Math.Pow (p.Y, 2));
+               }
+               public static Point GetPerp(this Point p){
+                       return new Point(-p.Y, p.X);
+               }
+               //public static Point GetNormalized(this Point p){
+               //      double length = p.GetLength();
+               //      p.X /= length;
+               //      p.Y /= length;
+               //      return p;
+               //}
+               //public static Point Substract(this Point p1, Point p2){
+               //      return new Point(p1.X - p2.X, p1.Y - p2.Y);
+               //}
+               //public static Point Divide(this Point p1, double d){
+               //      return new Point(p1.X / d, p1.Y / d);
+               //}
+               //public static Point Add(this Point p1, Point p2){
+               //      return new Point(p1.X + p2.X, p1.Y + p2.Y);
+               //}
+               //public static Point Multiply(this Point p1, double v){
+               //      return new Point(p1.X * v, p1.Y * v);
+               //}
+               //public static void DrawCote(this Context ctx, Point p1, Point p2,
+               //      double stroke = 1.0, bool fill = false, double arrowWidth = 3.0, double arrowLength = 7.0)
+               //{                     
+               //      Point vDir = p2.Substract(p1);
+               //      vDir = vDir.GetNormalized ();
+               //      Point vPerp = vDir.GetPerp ();
+
+               //      Point pA0 = p1.Add(vDir.Multiply(arrowLength));
+               //      Point pA1 = p2.Substract(vDir.Multiply(arrowLength));
+
+               //      Point vA = vPerp.Multiply (arrowWidth);
+
+               //      ctx.MoveTo (p1);
+               //      ctx.LineTo (pA0.Add (vA));
+               //      if (fill)
+               //              ctx.LineTo (pA0.Substract (vA));
+               //      else
+               //              ctx.MoveTo (pA0.Substract (vA));
+                       
+               //      ctx.LineTo (p1);
+
+               //      ctx.MoveTo (p2);
+               //      ctx.LineTo (pA1.Add (vA));
+               //      if (fill)
+               //              ctx.LineTo (pA1.Substract (vA));
+               //      else
+               //              ctx.MoveTo (pA1.Substract (vA));
+               //      ctx.LineTo (p2);
+
+               //      if (fill)
+               //              ctx.Fill ();
+
+               //      ctx.MoveTo (p1);
+               //      ctx.LineTo (p2);
+               //      ctx.LineWidth = stroke;
+               //      ctx.Stroke ();
+               //}
+               //public static void DrawCoteInverse(this Context ctx, Point p1, Point p2,
+               //      double stroke = 1.0, bool fill = false, double arrowWidth = 3.0, double arrowLength = 7.0)
+               //{                     
+               //      Point vDir = p2.Substract(p1);
+               //      vDir = vDir.GetNormalized ();
+               //      Point vPerp = vDir.GetPerp ();
+
+               //      Point pA0 = p1.Add(vDir.Multiply(arrowLength));
+               //      Point pA1 = p2.Substract(vDir.Multiply(arrowLength));
+
+               //      Point vA = vPerp.Multiply (arrowWidth);
+
+               //      ctx.MoveTo (p1.Add (vA));
+               //      ctx.LineTo (pA0);
+               //      ctx.LineTo (p1.Substract (vA));
+               //      if (fill)
+               //              ctx.LineTo (p1.Add (vA));
+
+               //      ctx.MoveTo (p2.Add (vA));
+               //      ctx.LineTo (pA1);
+               //      ctx.LineTo (p2.Substract (vA));
+
+               //      if (fill) {
+               //              ctx.LineTo (p2.Add (vA));
+               //              ctx.Fill ();
+               //      }
+
+               //      ctx.MoveTo (pA0);
+               //      ctx.LineTo (pA1);
+               //      ctx.LineWidth = stroke;
+               //      ctx.Stroke ();
+               //}
+               //public static void DrawCoteFixed(this Context ctx, Point p1, Point p2,
+               //      double stroke = 1.0, double coteWidth = 3.0)
+               //{                     
+               //      Point vDir = p2.Substract(p1);
+               //      vDir = vDir.GetNormalized ();
+               //      Point vPerp = vDir.GetPerp ();
+               //      Point vA = vPerp.Multiply (coteWidth);
+
+               //      ctx.MoveTo (p1.Add (vA));
+               //      ctx.LineTo (p1.Substract (vA));
+               //      ctx.MoveTo (p2.Add (vA));
+               //      ctx.LineTo (p2.Substract (vA));
+               //      ctx.MoveTo (p1);
+               //      ctx.LineTo (p2);
+               //      ctx.LineWidth = stroke;
+               //      ctx.Stroke ();
+               //}
+
+               public static void SetSourceColor(this Context ctx, Color c)
+               {
+                       ctx.SetSource(c.R,c.G,c.B,c.A);
+               }
+               public static void SetSourceColor(this Context ctx, double r, double g, double b, double a)
+               {
+                       ctx.SetSource((float)r,(float)g,(float)g,(float)a);
+               }
+               public static void AddColorStop(this Gradient grad, double offset, Color c)
+               {
+                       grad.AddColorStop (offset, c);
+               }
+               #endregion
+
+               public static Orientation GetOrientation(this Alignment a){
+                       return (a==Alignment.Left) ||(a==Alignment.Right) ? Orientation.Horizontal : Orientation.Vertical;
+               }
+               public static Alignment GetOpposite(this Alignment a){
+                       switch (a) {
+                       case Alignment.Left:
+                               return Alignment.Right;
+                       case Alignment.Right:
+                               return Alignment.Left;
+                       case Alignment.Top:
+                               return Alignment.Bottom;
+                       case Alignment.Bottom:
+                               return Alignment.Top;
+                       case Alignment.TopLeft:
+                               return Alignment.BottomRight;
+                       case Alignment.TopRight:
+                               return Alignment.BottomLeft;
+                       case Alignment.BottomLeft:
+                               return Alignment.TopRight;
+                       case Alignment.BottomRight:
+                               return Alignment.TopLeft;                       
+                       }
+                       return Alignment.Center;
+               }
+               public static void Raise(this EventHandler handler, object sender, EventArgs e)
+               {
+                       handler?.Invoke (sender, e);
+               }
+               public static void Raise<T>(this EventHandler<T> handler, object sender, T e)
+               {
+                       handler?.Invoke (sender, e);
+               }
+               public static byte[] GetBytes(this string str)
+               {
+                       byte[] bytes = new byte[str.Length * sizeof(char)];
+                       System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
+                       return bytes;
+               }
+               public static bool IsWhiteSpaceOrNewLine (this char c)
+               {
+                       return c == '\t' || c == '\r' || c == '\n' || char.IsWhiteSpace (c);
+               }
+               public static object GetDefaultValue(this object obj)
+               {                       
+                       Type t = obj.GetType ();
+                       if (t.IsValueType)
+                               return Activator.CreateInstance (t);
+                       
+                       return null;
+               }
+       }
+}
+
diff --git a/Crow/src/Fill/Fill.cs b/Crow/src/Fill/Fill.cs
new file mode 100644 (file)
index 0000000..e3a1767
--- /dev/null
@@ -0,0 +1,70 @@
+//
+// Fill.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using vkvg;
+
+namespace Crow
+{
+       /// <summary>
+       /// base class for drawing content to paint on backend
+       /// </summary>
+       public abstract class Fill
+       {
+               /// <summary>
+               /// set content of fill as source for drawing operations on the backend context
+               /// </summary>
+               /// <param name="ctx">backend context</param>
+               /// <param name="bounds">paint operation bounding box, unused for SolidColor</param>
+               public abstract void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle));
+               public static object Parse (string s){
+                       if (string.IsNullOrEmpty (s))
+                               return null;
+                       if (s.Substring (1).StartsWith ("gradient", StringComparison.Ordinal))
+                               return (Gradient)Gradient.Parse (s);
+                       if (s.EndsWith (".svg", true, System.Globalization.CultureInfo.InvariantCulture))
+                               return Parse (s);
+                       if (s.EndsWith (".png", true, System.Globalization.CultureInfo.InvariantCulture) ||
+                           s.EndsWith (".jpg", true, System.Globalization.CultureInfo.InvariantCulture) ||
+                           s.EndsWith (".jpeg", true, System.Globalization.CultureInfo.InvariantCulture) ||
+                           s.EndsWith (".bmp", true, System.Globalization.CultureInfo.InvariantCulture) ||
+                           s.EndsWith (".gif", true, System.Globalization.CultureInfo.InvariantCulture))
+                               return Parse (s);
+                       
+                       return (SolidColor)SolidColor.Parse (s);
+               }
+               public static implicit operator Color(Fill c){
+                       SolidColor sc = c as SolidColor;
+                       return sc == null ? default(Color) : sc.color;
+               }
+               public static implicit operator Fill(Color c){
+                       return new SolidColor (c);
+               }
+
+       }
+}
+
diff --git a/Crow/src/Font.cs b/Crow/src/Font.cs
new file mode 100644 (file)
index 0000000..16aab07
--- /dev/null
@@ -0,0 +1,125 @@
+//
+// Font.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using vkvg;
+
+namespace Crow
+{
+       public enum FontStyle
+       {
+               Normal,
+               Bold,
+               Italic,
+               Underlined
+       }
+       public class Font
+       {
+               #region CTOR
+               public Font ()
+               {
+               }
+               #endregion
+
+               string _name = "sans";
+               int _size = 10;
+               FontStyle _style = FontStyle.Normal;
+
+               public string Name {
+                       get { return _name; }
+                       set { _name = value; }
+               }
+               public int Size {
+                       get { return _size; }
+                       set { _size = value; }
+               }
+               public FontStyle Style {
+                       get { return _style; }
+                       set { _style = value; }
+               }
+
+               public FontSlant Slant {
+                       get{ 
+                               switch (Style) {
+                               case FontStyle.Italic:
+                                       return FontSlant.Italic;
+                               default:
+                                       return FontSlant.Normal;
+                               }
+                       }
+               }
+               public FontWeight Wheight {
+                       get{ 
+                               switch (Style) {
+                               case FontStyle.Bold:
+                                       return FontWeight.Bold;
+                               default:
+                                       return FontWeight.Normal;
+                               }                       
+                       }
+               }
+
+               #region Operators
+               public static implicit operator string(Font c)
+               {
+                       return c.ToString();
+               }
+               public static implicit operator Font(string s)
+               {
+                       Font f = new Font ();
+
+                       if (!string.IsNullOrEmpty (s)) {
+                               string[] c = s.TrimStart().TrimEnd().Split (new char[] { ',' });
+
+                               if (c.Length == 2)
+                                       f.Size = int.Parse (c [1].TrimStart());
+
+                               string[] n = c [0].TrimEnd().Split (new char[] { ' ' });
+
+                               f.Name = n [0];
+
+                               if (n.Length > 1)
+                                       f.Style = (FontStyle)Enum.Parse (typeof(FontStyle), n[n.Length-1], true);
+                       }
+
+                       return f;
+               }
+               #endregion
+
+               public override string ToString()
+               {
+
+                       return (_style == FontStyle.Normal) ? $"{_name},{_size}" : $"{_name} {_style},{_size}";
+
+               }
+
+               public static object Parse(string s)
+               {
+                       return (Font)s;
+               }
+       }
+}
+
diff --git a/Crow/src/Gradient.cs b/Crow/src/Gradient.cs
new file mode 100644 (file)
index 0000000..64bd30e
--- /dev/null
@@ -0,0 +1,142 @@
+//
+// Gradient.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using vkvg;
+
+namespace Crow
+{
+       public class Gradient : Fill
+       {
+               public enum Type
+               {
+                       Vertical,
+                       Horizontal,
+                       Oblic,
+                       Radial
+               }
+
+               public class ColorStop
+               {
+                       public double Offset;
+                       public Color Color;
+
+                       public ColorStop(double offset, Color color){ 
+                               Offset = offset;
+                               Color = color;
+                       }
+                       public static object Parse(string s)
+                       {
+                               if (string.IsNullOrEmpty (s))
+                                       return null;
+                               
+                               string[] parts = s.Trim ().Split (':');
+
+                               if (parts.Length > 2)
+                                       throw new Exception ("too many parameters in color stop: " + s);
+                               
+                               if (parts.Length == 2)
+                                       return new ColorStop (double.Parse (parts [0]), (Color)parts [1]);
+
+                               return new ColorStop (-1, (Color)parts [0]);
+                       }
+               }
+
+               public Gradient.Type GradientType = Type.Vertical;
+//             public double x0;
+//             public double y0;
+//             public double x1;
+//             public double y1;
+//             public double Radius1;
+//             public double Radius2;
+               public List<ColorStop> Stops = new List<ColorStop>();
+               public Gradient(Gradient.Type _type)
+               {
+                       GradientType = _type;
+               }
+
+               #region implemented abstract members of Fill
+
+               public override void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle))
+               {
+                       Pattern grad = null;
+                       switch (GradientType) {
+                       case Type.Vertical:
+                               grad = Pattern.CreateLinearGradient (bounds.Left, bounds.Top, bounds.Left, bounds.Bottom);
+                               break;
+                       case Type.Horizontal:
+                               grad = Pattern.CreateLinearGradient (bounds.Left, bounds.Top, bounds.Right, bounds.Top);
+                               break;
+                       case Type.Oblic:
+                               grad = Pattern.CreateLinearGradient (bounds.Left, bounds.Top, bounds.Right, bounds.Bottom);
+                               break;
+                       case Type.Radial:
+                               throw new NotImplementedException ();
+                       }
+
+                       foreach (ColorStop cs in Stops) {
+                               if (cs == null)
+                                       continue;
+                               grad.AddColorStop ((float)cs.Offset, cs.Color);
+                       }
+                       
+                       ctx.SetSource (grad);
+                       grad.Dispose ();
+               }
+               #endregion
+
+               public static object Parse(string s)
+               {
+                       if (string.IsNullOrEmpty (s))
+                               return Color.White;
+
+                       Crow.Gradient tmp;
+
+                       string[] stops = s.Trim ().Split ('|');
+
+                       switch (stops[0].Trim()) {
+                       case "vgradient":
+                               tmp = new Gradient (Type.Vertical);
+                               break;
+                       case "hgradient":
+                               tmp = new Gradient (Type.Horizontal);
+                               break;
+                       case "ogradient":
+                               tmp = new Gradient (Type.Oblic);
+                               break;
+                       default:
+                               throw new Exception ("Unknown gradient type: " + stops [0]);
+                       }
+
+                       for (int i = 1; i < stops.Length; i++)
+                               tmp.Stops.Add((ColorStop)ColorStop.Parse(stops[i]));
+
+                       return tmp;
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Border.cs b/Crow/src/GraphicObjects/Border.cs
new file mode 100644 (file)
index 0000000..142e54b
--- /dev/null
@@ -0,0 +1,273 @@
+//
+// Border.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
+using vkvg;
+
+namespace Crow
+{
+       /// <summary>
+       /// provide an easy way to get 3d border for buttons
+       /// </summary>
+       public enum BorderStyle {
+               Normal,
+               Raised,
+               Sunken
+       };
+
+       /// <summary>
+       /// simple container with border
+       /// </summary>
+       public class Border : Container
+       {
+               #region CTOR
+               protected Border () : base(){}
+               public Border (Interface iface) : base(iface){}
+               #endregion
+
+               #region private fields
+               int _borderWidth;
+               BorderStyle _borderStyle;
+               Fill raisedColor = Color.Grey;
+               Fill sunkenColor = Color.DimGrey;
+               #endregion
+
+               #region public properties
+               /// <summary>
+               /// use to define the colors of the 3d border
+               /// </summary>
+               
+               public virtual Fill RaisedColor {
+                       get { return raisedColor; }
+                       set {
+                               if (raisedColor == value)
+                                       return;
+                               raisedColor = value;
+                               NotifyValueChanged ("RaisedColor", raisedColor);
+                               RegisterForRedraw ();
+                       }
+               }
+               /// <summary>
+               /// use to define the colors of the 3d border
+               /// </summary>
+               
+               public virtual Fill SunkenColor {
+                       get { return sunkenColor; }
+                       set {
+                               if (sunkenColor == value)
+                                       return;
+                               sunkenColor = value;
+                               NotifyValueChanged ("SunkenColor", sunkenColor);
+                               RegisterForRedraw ();
+                       }
+               }
+               /// <summary>
+               /// border width in pixels
+               /// </summary>
+               [DefaultValue(1)]
+               public virtual int BorderWidth {
+                       get { return _borderWidth; }
+                       set {
+                               _borderWidth = value;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>
+               /// allow 3d border effects
+               /// </summary>
+               [DefaultValue(BorderStyle.Normal)]
+               public virtual BorderStyle BorderStyle {
+                       get { return _borderStyle; }
+                       set {
+                               if (_borderStyle == value)
+                                       return;
+                               _borderStyle = value;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               #endregion
+
+               #region GraphicObject override
+               [XmlIgnore]public override Rectangle ClientRectangle {
+                       get {
+                               Rectangle cb = base.ClientRectangle;
+                               cb.Inflate (- BorderWidth);
+                               return cb;
+                       }
+               }
+
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       int tmp = base.measureRawSize (lt);
+                       return tmp < 0 ? tmp : tmp + 2 * BorderWidth;
+               }
+               protected override void onDraw (Context gr)
+               {
+                       drawborder2 (gr);
+
+                       gr.Save ();
+                       if (ClipToClientRect) {
+                               //clip to client zone
+                               DrawingHelpers.CairoRectangle (gr, ClientRectangle,Math.Max(0.0, CornerRadius-Margin));
+                               gr.Clip ();
+                       }
+
+                       if (child != null)
+                               child.Paint (ref gr);
+                       gr.Restore ();
+               }
+               void drawborder2(Context gr){
+                       Rectangle rBack = new Rectangle (Slot.Size);
+
+                       //rBack.Inflate (-Margin);
+                       //                      if (BorderWidth > 0)
+                       //                              rBack.Inflate (-BorderWidth / 2);
+
+                       Background.SetAsSource (gr, rBack);
+                       DrawingHelpers.CairoRectangle(gr, rBack, CornerRadius);
+                       gr.Fill ();
+
+
+                       if (BorderStyle == BorderStyle.Normal) {
+                               if (BorderWidth > 0) {
+                                       Foreground.SetAsSource (gr, rBack);
+                                       DrawingHelpers.CairoRectangle (gr, rBack, CornerRadius, BorderWidth);
+                               }
+                       } else {
+                               gr.LineWidth = 1.0;
+                               if (CornerRadius > 0.0) {
+                                       double radius = CornerRadius;
+                                       if ((radius > rBack.Height / 2.0) || (radius > rBack.Width / 2.0))
+                                               radius = Math.Min (rBack.Height / 2.0, rBack.Width / 2.0);
+                                       gr.SetSourceColor (sunkenColor);
+                                       gr.MoveTo (0.5 + rBack.Left, -0.5 + rBack.Bottom - radius);
+                                       gr.ArcNegative (0.5 + rBack.Left + radius, -0.5 + rBack.Bottom - radius, radius, Math.PI, Math.PI * 0.75);
+                                       gr.MoveTo (0.5 + rBack.Left, -0.5 + rBack.Bottom - radius);
+                                       gr.LineTo (0.5 + rBack.Left, 0.5 + rBack.Top + radius);
+                                       gr.Arc (0.5 + rBack.Left + radius, 0.5 + rBack.Top + radius, radius, Math.PI, Math.PI * 1.5);
+                                       gr.LineTo (-0.5 + rBack.Right - radius, 0.5 + rBack.Top);
+                                       gr.Arc (-0.5 + rBack.Right - radius, 0.5 + rBack.Top + radius, radius, Math.PI * 1.5, Math.PI * 1.75);
+                                       gr.Stroke ();
+                                       if (BorderStyle == BorderStyle.Raised) {
+                                               gr.MoveTo (-1.5 + rBack.Right, 1.5 + rBack.Top + radius);
+                                               gr.ArcNegative (-0.5 + rBack.Right - radius, 0.5 + rBack.Top + radius, radius - 1.0, 0, -Math.PI * 0.25);
+                                               gr.MoveTo (-1.5 + rBack.Right, 1.5 + rBack.Top + radius);
+                                               gr.LineTo (-1.5 + rBack.Right, -1.5 + rBack.Bottom - radius);
+                                               gr.Arc (-0.5 + rBack.Right - radius, -0.5 + rBack.Bottom - radius, radius - 1.0, 0, Math.PI / 2.0);
+                                               gr.LineTo (1.5 + rBack.Left + radius, -1.5 + rBack.Bottom);
+                                               gr.Arc (0.5 + rBack.Left + radius, -0.5 + rBack.Bottom - radius, radius - 1.0, Math.PI / 2.0, Math.PI * 0.75);
+                                               gr.Stroke ();
+
+                                               gr.SetSourceColor (raisedColor);
+                                               gr.MoveTo (1.5 + rBack.Left, -1.5 + rBack.Bottom - radius);
+                                               gr.ArcNegative (0.5 + rBack.Left + radius, -0.5 + rBack.Bottom - radius, radius - 1.0, Math.PI, Math.PI * 0.75);
+                                               gr.MoveTo (1.5 + rBack.Left, -1.5 + rBack.Bottom - radius);
+                                               gr.LineTo (1.5 + rBack.Left, 1.5 + rBack.Top + radius);
+                                               gr.Arc (0.5 + rBack.Left + radius, 0.5 + rBack.Top + radius, radius - 1.0, Math.PI, Math.PI * 1.5);
+                                               gr.LineTo (-1.5 + rBack.Right - radius, 1.5 + rBack.Top);
+                                               gr.Arc (-0.5 + rBack.Right - radius, 0.5 + rBack.Top + radius, radius - 1.0, Math.PI * 1.5, Math.PI * 1.75);
+                                       } else {
+                                               gr.Stroke ();
+                                               gr.SetSourceColor (raisedColor);
+                                       }
+                                       gr.MoveTo (-0.5 + rBack.Right, 0.5 + rBack.Top + radius);
+                                       gr.ArcNegative (-0.5 + rBack.Right - radius, 0.5 + rBack.Top + radius, radius, 0, -Math.PI * 0.25);
+                                       gr.MoveTo (-0.5 + rBack.Right, 0.5 + rBack.Top + radius);
+                                       gr.LineTo (-0.5 + rBack.Right, -0.5 + rBack.Bottom - radius);
+                                       gr.Arc (-0.5 + rBack.Right - radius, -0.5 + rBack.Bottom - radius, radius, 0, Math.PI / 2.0);
+                                       gr.LineTo (0.5 + rBack.Left + radius, -0.5 + rBack.Bottom);
+                                       gr.Arc (0.5 + rBack.Left + radius, -0.5 + rBack.Bottom - radius, radius, Math.PI / 2.0, Math.PI * 0.75);
+                                       gr.Stroke ();
+                               } else {
+                                       gr.SetSourceColor (sunkenColor);
+                                       gr.MoveTo (0.5 + rBack.Left, rBack.Bottom);
+                                       gr.LineTo (0.5 + rBack.Left, 0.5 + rBack.Y);
+                                       gr.LineTo (rBack.Right, 0.5 + rBack.Y);
+                                       if (BorderStyle == BorderStyle.Raised) {
+                                               gr.MoveTo (-1.5 + rBack.Right, 2.0 + rBack.Y);
+                                               gr.LineTo (-1.5 + rBack.Right, -1.5 + rBack.Bottom);
+                                               gr.LineTo (2.0 + rBack.Left, -1.5 + rBack.Bottom);
+                                               gr.Stroke ();
+                                               gr.SetSourceColor (raisedColor);
+                                               gr.MoveTo (1.5 + rBack.Left, -1.0 + rBack.Bottom);
+                                               gr.LineTo (1.5 + rBack.Left, 1.5 + rBack.Y);
+                                               gr.LineTo (rBack.Right, 1.5 + rBack.Y);
+                                       } else {
+                                               gr.Stroke ();
+                                               gr.SetSourceColor (raisedColor);
+                                       }
+                                       gr.MoveTo (-0.5 + rBack.Right, 1.5 + rBack.Y);
+                                       gr.LineTo (-0.5 + rBack.Right, -0.5 + rBack.Bottom);
+                                       gr.LineTo (1.0 + rBack.Left, -0.5 + rBack.Bottom);
+                                       gr.Stroke ();
+                               }
+                       }
+               }
+               void drawborder1(Context gr){
+                       Rectangle rBack = new Rectangle (Slot.Size);
+
+                       //rBack.Inflate (-Margin);
+                       //                      if (BorderWidth > 0)
+                       //                              rBack.Inflate (-BorderWidth / 2);
+
+                       Background.SetAsSource (gr, rBack);
+                       DrawingHelpers.CairoRectangle(gr, rBack, CornerRadius);
+                       gr.Fill ();
+
+                       double bw = _borderWidth;
+                       double crad = CornerRadius;
+
+                       if (bw > 0) {
+                               if (BorderStyle == BorderStyle.Normal)
+                                       Foreground.SetAsSource (gr, rBack);
+                               else {
+                                       if (BorderStyle == BorderStyle.Sunken)
+                                               gr.SetSourceColor (raisedColor);
+                                       else
+                                               gr.SetSourceColor (sunkenColor);
+
+                                       DrawingHelpers.CairoRectangle (gr, rBack, crad, bw);
+
+                                       if (BorderStyle == BorderStyle.Sunken)
+                                               gr.SetSourceColor (sunkenColor);
+                                       else
+                                               gr.SetSourceColor (raisedColor);
+
+                                       bw /= 2.0;
+                                       rBack.Width -= (int)Math.Round(bw);
+                                       rBack.Height -= (int)Math.Round(bw);
+                               }
+
+                               DrawingHelpers.CairoRectangle (gr, rBack, crad, bw);
+                       }
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Button.cs b/Crow/src/GraphicObjects/Button.cs
new file mode 100644 (file)
index 0000000..50f9823
--- /dev/null
@@ -0,0 +1,108 @@
+//
+// Button.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+//using OpenTK.Graphics.OpenGL;
+
+using System.Diagnostics;
+
+using System.Xml.Serialization;
+using vkvg;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated button control
+       /// </summary>
+    public class Button : TemplatedContainer
+    {
+               #region CTOR
+               protected Button() : base() {}
+               public Button (Interface iface) : base(iface){}
+               #endregion
+
+               string image;
+               bool isPressed;
+
+               public event EventHandler Pressed;
+               public event EventHandler Released;
+
+               #region GraphicObject Overrides
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       IsPressed = true;
+
+                       base.onMouseDown (sender, e);
+
+                       //TODO:remove
+                       NotifyValueChanged ("State", "pressed");
+               }
+               public override void onMouseUp (object sender, MouseButtonEventArgs e)
+               {
+                       IsPressed = false;
+
+                       base.onMouseUp (sender, e);
+
+                       //TODO:remove
+                       NotifyValueChanged ("State", "normal");
+               }
+               #endregion
+
+               [DefaultValue("#Crow.Images.button.svg")]
+               public string Image {
+                       get { return image; }
+                       set {
+                               if (image == value)
+                                       return;
+                               image = value;
+                               NotifyValueChanged ("Image", image);
+                       }
+               }
+               [DefaultValue(false)]
+               public bool IsPressed
+               {
+                       get { return isPressed; }
+                       set
+                       {
+                               if (isPressed == value)
+                                       return;
+
+                               isPressed = value;
+
+                               NotifyValueChanged ("IsPressed", isPressed);
+
+                               if (isPressed)
+                                       Pressed.Raise (this, null);
+                               else
+                                       Released.Raise (this, null);
+                       }
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/CheckBox.cs b/Crow/src/GraphicObjects/CheckBox.cs
new file mode 100644 (file)
index 0000000..4860d60
--- /dev/null
@@ -0,0 +1,74 @@
+//
+// CheckBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.ComponentModel;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated checkbox control
+       /// </summary>
+       public class CheckBox : TemplatedControl
+       {
+               #region CTOR
+               protected CheckBox() : base(){}
+               public CheckBox (Interface iface) : base(iface){}
+               #endregion
+
+               bool isChecked;
+
+               public event EventHandler Checked;
+               public event EventHandler Unchecked;
+
+               [DefaultValue(false)]
+               public bool IsChecked
+               {
+                       get { return isChecked; }
+                       set
+                       {
+                               if (isChecked == value)
+                                       return;
+
+                               isChecked = value;
+
+                               NotifyValueChanged ("IsChecked", value);
+
+                               if (isChecked)
+                                       Checked.Raise (this, null);
+                               else
+                                       Unchecked.Raise (this, null);
+                       }
+               }
+
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       IsChecked = !IsChecked;
+                       base.onMouseDown (sender, e);
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/ColorPicker.cs b/Crow/src/GraphicObjects/ColorPicker.cs
new file mode 100644 (file)
index 0000000..dd45023
--- /dev/null
@@ -0,0 +1,228 @@
+//
+// ColorPicker.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated color selector control
+       /// </summary>
+       public class ColorPicker : TemplatedControl
+       {
+               #region CTOR
+               protected ColorPicker() : base(){}
+               public ColorPicker (Interface iface) : base(iface){}
+               #endregion
+
+               const double div = 255.0;
+               const double colDiv = 1.0 / div;
+
+               Color curColor;
+               double h,s,v;
+
+               
+               public virtual double R {
+                       get { return Math.Round(curColor.R * div); }
+                       set {
+                               if (R == value)
+                                       return;
+                               curColor.R = value * colDiv;
+                               NotifyValueChanged ("R", R);
+                               hsvFromRGB ();
+                               notifyCurColorHasChanged ();
+                       }
+               }
+               
+               public virtual double G {
+                       get { return Math.Round(curColor.G * div); }
+                       set {
+                               if (G == value)
+                                       return;
+                               curColor.G = value * colDiv;
+                               NotifyValueChanged ("G", G);
+                               notifyCurColorHasChanged ();
+                               hsvFromRGB ();
+                       }
+               }
+               
+               public virtual double B {
+                       get { return Math.Round(curColor.B * div); }
+                       set {
+                               if (B == value)
+                                       return;
+                               curColor.B = value * colDiv;
+                               NotifyValueChanged ("B", B);
+                               notifyCurColorHasChanged ();
+                               hsvFromRGB ();
+                       }
+               }
+               
+               public virtual double A {
+                       get { return Math.Round(curColor.A * div); }
+                       set {
+                               if (A == value)
+                                       return;
+                               curColor.A = value * colDiv;
+                               NotifyValueChanged ("A", A);
+                               notifyCurColorHasChanged ();
+                               hsvFromRGB ();
+                       }
+               }
+               
+               public virtual double H {
+                       get { return Math.Round (h, 3); }
+                       set {
+                               if (H == value)
+                                       return;
+                               h = value;
+                               NotifyValueChanged ("H", H);
+                               rgbFromHSV ();
+                       }
+               }
+               
+               public virtual double S {
+                       get { return Math.Round (s, 2); }
+                       set {
+                               if (s == value)
+                                       return;
+                               s = value;
+                               NotifyValueChanged ("S", S);
+                               rgbFromHSV ();
+                       }
+               }
+               
+               public virtual double V {
+                       get { return Math.Round (v, 2); }
+                       set {
+                               if (v == value)
+                                       return;
+                               v = value;
+                               NotifyValueChanged ("V", V);
+                               rgbFromHSV ();
+                       }
+               }
+
+               
+               public virtual Fill SelectedColor {
+                       get { return new SolidColor(curColor); }
+                       set {
+                               if (value == null)
+                                       curColor = default(Color);
+                               else if (value is SolidColor) {
+                                       Color c = (value as SolidColor).color;
+                                       if (curColor == c)
+                                               return;
+                                       curColor = c;
+                               }
+                               notifyCurColorHasChanged ();
+                               notifyRGBAHasChanged ();
+                               hsvFromRGB ();
+                       }
+               }
+               
+               public virtual Color SelectedRawColor {
+                       get { return curColor; }
+                       set {
+                               if (curColor == value)
+                                       return;
+                               curColor = value;
+                               notifyCurColorHasChanged ();
+                               notifyRGBAHasChanged ();
+                               hsvFromRGB ();
+                       }
+               }
+               void notifyCurColorHasChanged(){
+                       NotifyValueChanged ("SelectedColor", SelectedColor);
+                       NotifyValueChanged ("SelectedRawColor", curColor);
+                       string n = curColor.ToString ();
+                       if (char.IsLetter(n[0]))
+                               NotifyValueChanged ("SelectedColorName", n);
+                       else
+                               NotifyValueChanged ("SelectedColorName", "-");
+                       string tmp = ((int)Math.Round (R)).ToString ("X2") +
+                                    ((int)Math.Round (G)).ToString ("X2") +
+                                    ((int)Math.Round (B)).ToString ("X2");
+                       if (curColor.A < 1.0)
+                               tmp += ((int)Math.Round (A)).ToString ("X2");
+                       NotifyValueChanged ("HexColor", tmp);
+               }
+               void notifyRGBAHasChanged(){
+                       NotifyValueChanged ("R", R);
+                       NotifyValueChanged ("G", G);
+                       NotifyValueChanged ("B", B);
+                       NotifyValueChanged ("A", A);
+               }
+               void notifyHSVHasChanged(){
+                       NotifyValueChanged ("H", H);
+                       NotifyValueChanged ("S", S);
+                       NotifyValueChanged ("V", V);
+               }
+               void hsvFromRGB(){
+                       Color c = curColor;
+                       c.ResetName ();
+                       double min = Math.Min (c.R, Math.Min (c.G, c.B));       //Min. value of RGB
+                       double max = Math.Max (c.R, Math.Max (c.G, c.B));       //Max. value of RGB
+                       double diff = max - min;                                                        //Delta RGB value
+
+                       v = max;
+
+                       if ( diff == 0 )//This is a gray, no chroma...
+                       {
+                               h = 0;
+                               s = 0;
+                       }else{//Chromatic data...
+                               s = diff / max;
+
+                               double diffR = (((max - c.R) / 6.0) + (diff / 2.0)) / diff;
+                               double diffG = (((max - c.G) / 6.0) + (diff / 2.0)) / diff;
+                               double diffB = (((max - c.B) / 6.0) + (diff / 2.0)) / diff;
+
+                               if (c.R == max)
+                                       h = diffB - diffG;
+                               else if (c.G == max)
+                                       h = (1.0 / 3.0) + diffR - diffB;
+                               else if (c.B == max)
+                                       h = (2.0 / 3.0) + diffG - diffR;
+
+                               if (h < 0)
+                                       h += 1;
+                               if (h > 1)
+                                       h -= 1;
+
+                       }
+                       notifyHSVHasChanged ();
+               }
+               void rgbFromHSV(){
+                       curColor = Color.FromHSV (h, v, s, curColor.A);
+                       notifyCurColorHasChanged ();
+                       notifyRGBAHasChanged ();
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/ColorSelector.cs b/Crow/src/GraphicObjects/ColorSelector.cs
new file mode 100644 (file)
index 0000000..7ef037e
--- /dev/null
@@ -0,0 +1,74 @@
+//
+// ColorSelector.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// simple squarred rgb color selector
+       /// </summary>
+       [DesignIgnore]
+       public class ColorSelector : Widget
+       {
+               #region CTOR
+               protected ColorSelector() : base(){}
+               public ColorSelector (Interface iface) : base(iface){}
+               #endregion
+
+               const double div = 255.0;
+               const double colDiv = 1.0 / div;
+               protected Point mousePos;
+
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+                       if (IFace.Mouse.LeftButton == ButtonState.Released)
+                               return;
+                       updateMouseLocalPos (e.Position);
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+                       if (e.Button == MouseButton.Left)
+                               updateMouseLocalPos (e.Position);
+               }
+
+               protected virtual void updateMouseLocalPos(Point mPos){
+                       Rectangle r = ScreenCoordinates (Slot);
+                       Rectangle cb = ClientRectangle;
+                       mousePos = mPos - r.Position;
+
+                       mousePos.X = Math.Max(cb.X, mousePos.X);
+                       mousePos.X = Math.Min(cb.Right, mousePos.X);
+                       mousePos.Y = Math.Max(cb.Y, mousePos.Y);
+                       mousePos.Y = Math.Min(cb.Bottom, mousePos.Y);
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/ComboBox.cs b/Crow/src/GraphicObjects/ComboBox.cs
new file mode 100644 (file)
index 0000000..6122705
--- /dev/null
@@ -0,0 +1,59 @@
+//
+// ComboBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated control for selecting value in a pop up list
+       /// </summary>
+       public class ComboBox : ListBox
+    {
+               #region CTOR
+               protected ComboBox() : base(){}
+               public ComboBox (Interface iface) : base(iface){}
+               #endregion
+
+               Size minimumPopupSize = "10,10";
+               [XmlIgnore]public Size MinimumPopupSize{
+                       get { return minimumPopupSize; }
+                       set {
+                               minimumPopupSize = value;
+                               NotifyValueChanged ("MinimumPopupSize", minimumPopupSize);
+                       }
+               }
+
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       if (layoutType == LayoutingType.Width)
+                               MinimumPopupSize = new Size (this.Slot.Width, minimumPopupSize.Height);                 
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/Container.cs b/Crow/src/GraphicObjects/Container.cs
new file mode 100644 (file)
index 0000000..8bff810
--- /dev/null
@@ -0,0 +1,72 @@
+//
+// Container.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.Reflection;
+using System.ComponentModel;
+using System.Linq;
+using System.Threading;
+
+namespace Crow
+{
+       /// <summary>
+       /// simple container accepting one child
+       /// </summary>
+    public class Container : PrivateContainer
+    {
+               #if DESIGN_MODE
+               public override void getIML (System.Xml.XmlDocument doc, System.Xml.XmlNode parentElem)
+               {
+                       if (this.design_isTGItem)
+                               return;
+                       base.getIML (doc, parentElem);
+                       if (child == null)
+                               return;
+                       child.getIML (doc, parentElem.LastChild);
+               }
+               #endif
+
+               #region CTOR
+               protected Container() : base(){}
+               public Container (Interface iface) : base(iface){}
+               #endregion
+
+               [XmlIgnore]public Widget Child {
+                       get { return child; }
+                       set { base.SetChild(value); }
+               }
+               /// <summary>
+               /// override this to handle specific steps in child addition in derived class,
+               /// and don't forget to call the base.SetChild
+               /// </summary>
+               public virtual void SetChild(Widget _child)
+               {
+                       base.SetChild (_child);
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/DataSourceChangeEventArgs.cs b/Crow/src/GraphicObjects/DataSourceChangeEventArgs.cs
new file mode 100644 (file)
index 0000000..a251935
--- /dev/null
@@ -0,0 +1,46 @@
+//
+// DataSourceChangeEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow
+{
+       public class DataSourceChangeEventArgs : EventArgs
+       {
+               public object OldDataSource;
+               public object NewDataSource;
+
+               public DataSourceChangeEventArgs (object oldDataSource, object newDataSource) : base()
+               {
+                       OldDataSource = oldDataSource;
+                       NewDataSource = newDataSource;
+               }
+               public override string ToString ()
+               {
+                       return string.Format ("DSChangeEA: {0} => {1}", OldDataSource, NewDataSource);
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/DirectoryView.cs b/Crow/src/GraphicObjects/DirectoryView.cs
new file mode 100644 (file)
index 0000000..b021789
--- /dev/null
@@ -0,0 +1,136 @@
+//
+// DirectoryView.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.IO;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated directory viewer
+       /// </summary>
+       public class DirectoryView : TemplatedControl
+       {
+               #region CTOR
+               protected DirectoryView() : base(){}
+               public DirectoryView (Interface iface) : base(iface){}
+               #endregion
+
+               #region events
+               public event EventHandler<SelectionChangeEventArgs> SelectedItemChanged;
+               #endregion
+
+               string currentDirectory = "/";
+               bool showFiles, showHidden;
+               string fileMask = "*.*";
+
+               object _selectedItem;
+               [XmlIgnore]public object SelectedItem {
+                       get {
+                               return _selectedItem;
+                       }
+                       set { 
+                               if (value == _selectedItem)
+                                       return;
+                               _selectedItem = value;
+                               NotifyValueChanged ("SelectedItem", _selectedItem);
+                       }
+               }
+               [DefaultValue(true)]
+               public virtual bool ShowFiles {
+                       get { return showFiles; }
+                       set {
+                               if (showFiles == value)
+                                       return;
+                               showFiles = value;
+                               NotifyValueChanged ("ShowFiles", showFiles);
+                               NotifyValueChanged ("FileSystemEntries", FileSystemEntries);
+                       }
+               }
+               [DefaultValue(false)]
+               public virtual bool ShowHidden {
+                       get { return showHidden; }
+                       set {
+                               if (showHidden == value)
+                                       return;
+                               showHidden = value;
+                               NotifyValueChanged ("ShowHidden", showHidden);
+                               NotifyValueChanged ("FileSystemEntries", FileSystemEntries);
+                       }
+               }
+               [DefaultValue("*.*")]
+               public virtual string FileMask {
+                       get { return fileMask; }
+                       set {
+                               if (fileMask == value)
+                                       return;
+                               fileMask = value;
+                               NotifyValueChanged ("FileMask", fileMask);
+                               NotifyValueChanged ("FileSystemEntries", FileSystemEntries);
+                       }
+               }
+               [DefaultValue("/")]
+               public virtual string CurrentDirectory {
+                       get { return currentDirectory; }
+                       set {
+                               if (currentDirectory == value)
+                                       return;
+                               currentDirectory = value;
+                               NotifyValueChanged ("CurrentDirectory", currentDirectory);
+                               NotifyValueChanged ("FileSystemEntries", FileSystemEntries);
+                       }
+               }
+               [XmlIgnore]public FileSystemInfo[] FileSystemEntries {
+                       get {
+                               try {
+                                       if (string.IsNullOrEmpty(CurrentDirectory))
+                                               return null;
+                                       DirectoryInfo di = new DirectoryInfo(CurrentDirectory);
+                                       List<FileSystemInfo> fi = new List<FileSystemInfo> (di.GetDirectories());
+                                       if (showFiles && !string.IsNullOrEmpty(fileMask))
+                                               fi.AddRange(di.GetFiles(fileMask));
+                                       return showHidden ?
+                                               fi.ToArray() :
+                                               fi.Where(f=>!f.Attributes.HasFlag (FileAttributes.Hidden)).ToArray();
+                               } catch (Exception ex) {
+                                       Console.WriteLine (ex.ToString ());
+                                       return null;
+                               }
+                       }
+               }
+               public void onSelectedItemChanged (object sender, SelectionChangeEventArgs e){
+                       if (e.NewValue == SelectedItem)
+                               return;
+                       SelectedItem = e.NewValue;
+                       SelectedItemChanged.Raise (this, e);
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/DockStack.cs b/Crow/src/GraphicObjects/DockStack.cs
new file mode 100644 (file)
index 0000000..181501c
--- /dev/null
@@ -0,0 +1,474 @@
+//
+// DockStack.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow.IML;
+using System.Linq;
+using System.Text;
+using System.IO;
+using vkvg;
+
+namespace Crow
+{
+       [DesignIgnore]
+       public class DockStack : GenericStack
+       {               
+               #region CTor
+               public DockStack ()     {}
+               public DockStack (Interface iface) : base (iface) {}
+               #endregion
+
+               /*static int color = 10;
+
+               protected override void onInitialized (object sender, EventArgs e)
+               {
+                       base.onInitialized (sender, e);
+                       Background = Color.ColorDic.Values.ToList()[color++];
+               }*/
+               public override void AddChild (Widget g)
+               {
+                       base.AddChild (g);
+                       if (localLogicalParentIsNull)
+                               g.LogicalParent = this;
+                       else
+                               g.LogicalParent = this.LogicalParent;
+               }
+               public override void InsertChild (int idx, Widget g)
+               {
+                       base.InsertChild (idx, g);
+                       g.LogicalParent = this.LogicalParent;
+               }
+
+               public override bool PointIsIn (ref Point m)
+               {                       
+                       if (!base.PointIsIn(ref m))
+                               return false;
+
+                       Group p = Parent as Group;
+                       if (p != null) {
+                               childrenRWLock.EnterReadLock ();
+                               for (int i = p.Children.Count - 1; i >= 0; i--) {
+                                       if (p.Children [i] == this)
+                                               break;
+                                       if (p.Children [i].IsDragged)
+                                               continue;
+                                       if (p.Children [i].Slot.ContainsOrIsEqual (m)) {
+                                               childrenRWLock.ExitReadLock ();
+                                               return false;
+                                       }
+                               }
+                               childrenRWLock.ExitReadLock ();
+                       }
+
+                       return Slot.ContainsOrIsEqual(m);
+               }
+
+//             public override void OnLayoutChanges (LayoutingType layoutType)
+//             {
+//                     base.OnLayoutChanges (layoutType);
+//
+//                     if ((layoutType & LayoutingType.Sizing) > 0)
+//                             computeRects();                 
+//             }
+
+               Rectangle rIn = default(Rectangle);
+               double dockThresh = 0.2;
+               Widget focusedChild;
+               internal Widget stretchedChild;
+
+               void getFocusedChild (Point lm) {
+                       Rectangle cb = ClientRectangle;
+
+                       childrenRWLock.EnterReadLock ();
+                       foreach (Widget c in Children) {
+                               Rectangle bounds = c.Slot + cb.Position;
+                               if (!bounds.ContainsOrIsEqual (lm))
+                                       continue;
+                               rIn = bounds;
+                               focusedChild = c;
+                               break;
+                       }
+                       childrenRWLock.ExitReadLock ();                 
+               }
+
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       if (IsDropTarget) {                             
+                               DockWindow dw = IFace.DragAndDropOperation.DragSource as DockWindow;
+                               if (dw == null || dw.IsDocked) {
+                                       base.onMouseMove (sender, e);
+                                       return;
+                               }
+
+                               Alignment curDockPos = dw.DockingPosition;
+                               dw.DockingPosition = Alignment.Undefined;
+
+                               Rectangle cb = ClientRectangle;
+                               Point lm = ScreenPointToLocal (e.Position);
+
+                               if (Children.Count == 0) {
+                                       Rectangle r = cb;
+                                       r.Inflate (r.Width / -5, r.Height / -5);
+                                       if (r.ContainsOrIsEqual(lm))
+                                               dw.DockingPosition = Alignment.Center;
+                               } else {
+                                       rIn = cb;
+
+                                       if (Orientation == Orientation.Horizontal || Children.Count == 1) {
+                                               if (lm.Y > cb.Top + cb.Height / 3 && lm.Y < cb.Bottom - cb.Height / 3) {
+                                                       if (lm.X < cb.Left + cb.Width / 3)
+                                                               dw.DockingPosition = Alignment.Left;
+                                                       else if (lm.X > cb.Right - cb.Width / 3)
+                                                               dw.DockingPosition = Alignment.Right;                                                   
+                                               } else {
+                                                       getFocusedChild (lm);
+                                                       if (focusedChild != null) {
+                                                               if (lm.Y < rIn.Top + rIn.Height / 3)
+                                                                       dw.DockingPosition = Alignment.Top;
+                                                               else if (lm.Y > rIn.Bottom - rIn.Height / 3)
+                                                                       dw.DockingPosition = Alignment.Bottom;                                                                          
+                                                       }
+                                               }
+                                       }
+                                       if (Orientation == Orientation.Vertical || Children.Count == 1) {
+                                               if (lm.X > cb.Left + cb.Width / 3 && lm.X < cb.Right - cb.Width / 3) {
+                                                       if (lm.Y < cb.Top + cb.Height / 3)
+                                                               dw.DockingPosition = Alignment.Top;
+                                                       else if (lm.Y > cb.Bottom - cb.Height / 3)
+                                                               dw.DockingPosition = Alignment.Bottom;                                                  
+                                               } else {
+                                                       getFocusedChild (lm);
+                                                       if (focusedChild != null) {
+                                                               if (lm.X < rIn.Left + rIn.Width / 3)
+                                                                       dw.DockingPosition = Alignment.Left;
+                                                               else if (lm.X > rIn.Right - rIn.Width / 3)
+                                                                       dw.DockingPosition = Alignment.Right;                                                                           
+                                                       }
+                                               }
+                                       }
+                               }
+
+                               if (curDockPos != dw.DockingPosition)
+                                       RegisterForGraphicUpdate ();
+                       }
+                       base.onMouseMove (sender, e);
+               }
+
+               protected override void onDragEnter (object sender, DragDropEventArgs e)
+               {
+                       base.onDragEnter (sender, e);
+                       RegisterForGraphicUpdate ();
+               }
+               protected override void onDragLeave (object sender, DragDropEventArgs e)
+               {
+                       DockWindow dw = e.DragSource as DockWindow;
+                       //if (dw != null)
+                       //      dw.DockingPosition = Alignment.Undefined;
+                       base.onDragLeave (sender, e);
+                       RegisterForGraphicUpdate ();
+               }
+
+               protected override void onDraw (Context gr)
+               {
+                       gr.Save ();
+
+                       Rectangle rBack = new Rectangle (Slot.Size);
+
+                       Background.SetAsSource (gr, rBack);
+                       DrawingHelpers.CairoRectangle (gr, rBack, CornerRadius);
+                       gr.Fill ();
+
+                       if (ClipToClientRect) {
+                               //clip to client zone
+                               DrawingHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                               gr.Clip ();
+                       }
+
+                       childrenRWLock.EnterReadLock ();
+
+                       foreach (Widget g in Children)
+                               g.Paint (ref gr);                       
+
+                       childrenRWLock.ExitReadLock ();
+
+
+                       if (!IsDropTarget) {
+                               gr.Restore ();
+                               return;
+                       }
+
+                       DockWindow dw = IFace.DragAndDropOperation.DragSource as DockWindow;
+                       if (dw == null)
+                               return;
+                       if (!dw.IsDocked) {
+                               Rectangle cb = ClientRectangle;
+                               double minDim = Math.Min (cb.Width, cb.Height);
+
+                               Rectangle r = rIn;
+                               if (Children.Count <= 1 || dw.DockingPosition.GetOrientation()==Orientation )
+                                       r = cb;
+
+                               switch (dw.DockingPosition) {
+                               case Alignment.Top:
+                                       gr.Rectangle (r.Left, r.Top, r.Width, r.Height * dockThresh);
+                                       break;
+                               case Alignment.Bottom:
+                                       gr.Rectangle (r.Left, r.Bottom - r.Height * dockThresh, r.Width, r.Height * dockThresh);
+                                       break;
+                               case Alignment.Left:
+                                       gr.Rectangle (r.Left, r.Top, r.Width * dockThresh, r.Height);
+                                       break;
+                               case Alignment.Right:
+                                       gr.Rectangle (r.Right - r.Width * dockThresh, r.Top, r.Width * dockThresh, r.Height);
+                                       break;
+                               case Alignment.Center:
+                                       r.Inflate ((int)Math.Ceiling (Math.Min (r.Width, r.Height) * -0.05));
+                                       gr.Rectangle (r);
+                                       break;
+                               }
+                               gr.LineWidth = 1;
+                               gr.SetSourceColor (0.4, 0.4, 0.9, 0.4);
+                               gr.FillPreserve ();
+                               gr.SetSourceColor (0.9, 0.9, 1.0, 0.8);
+                               gr.Stroke ();
+                       }
+                       gr.Restore ();  
+               }
+                       
+               public void Dock(DockWindow dw){
+                       DockStack activeStack = this;
+
+                       if (Children.Count == 1) {
+                               Orientation = dw.DockingPosition.GetOrientation ();
+                               if (Children [0] is DockWindow) {
+                                       (Children [0] as DockWindow).DockingPosition = dw.DockingPosition.GetOpposite ();
+                               }
+                       } else if (Children.Count > 0 && dw.DockingPosition.GetOrientation () != Orientation) {
+                               activeStack = new DockStack (IFace);
+                               activeStack.Orientation = dw.DockingPosition.GetOrientation ();
+                               activeStack.Width = focusedChild.Width;
+                               activeStack.Height = focusedChild.Height;
+                               int idx = Children.IndexOf (focusedChild);
+                               RemoveChild (focusedChild);
+                               focusedChild.Height = Measure.Stretched;
+                               focusedChild.Width = Measure.Stretched;
+                               InsertChild (idx, activeStack);
+                               activeStack.AddChild (focusedChild);
+                               activeStack.stretchedChild = focusedChild;
+                               if (focusedChild is DockWindow)
+                                       (focusedChild as DockWindow).DockingPosition = dw.DockingPosition.GetOpposite ();
+                               focusedChild = null;
+                       }
+
+                       Rectangle r = ClientRectangle;
+                       int vTreshold = (int)(r.Height * dockThresh);
+                       int hTreshold = (int)(r.Width * dockThresh);
+
+                       Console.WriteLine ("Docking {0} as {2} in {1}", dw.Name, activeStack.Name, dw.DockingPosition);
+                       switch (dw.DockingPosition) {
+                       case Alignment.Top:                                             
+                               dw.Height = vTreshold;
+                               dw.Width = Measure.Stretched;
+                               activeStack.InsertChild (0, dw);
+                               activeStack.InsertChild (1, new Splitter(IFace));
+                               break;
+                       case Alignment.Bottom:
+                               dw.Height = vTreshold;
+                               dw.Width = Measure.Stretched;
+                               activeStack.AddChild (new Splitter(IFace));
+                               activeStack.AddChild (dw);
+                               break;
+                       case Alignment.Left:
+                               dw.Width = hTreshold;
+                               dw.Height = Measure.Stretched;
+                               activeStack.InsertChild (0, dw);
+                               activeStack.InsertChild (1, new Splitter(IFace));
+                               break;
+                       case Alignment.Right:
+                               dw.Width = hTreshold;
+                               dw.Height = Measure.Stretched;
+                               activeStack.AddChild (new Splitter(IFace));
+                               activeStack.AddChild (dw);
+                               break;
+                       case Alignment.Center:
+                               dw.Width = dw.Height = Measure.Stretched;
+                               AddChild (dw);
+                               stretchedChild = dw;
+                               break;
+                       }
+               }
+               public void Undock (DockWindow dw){                     
+                       int idx = Children.IndexOf(dw);
+
+                       Console.WriteLine ("undocking child index: {0} ; name={1}; pos:{2} ; childcount:{3}",idx, dw.Name, dw.DockingPosition, Children.Count);
+
+                       RemoveChild(dw);
+
+                       if (Children.Count == 0)
+                               return;
+                       
+                       if (dw.DockingPosition == Alignment.Left || dw.DockingPosition == Alignment.Top) {                              
+                               RemoveChild (idx);
+                               if (stretchedChild == dw) {
+                                       stretchedChild = Children [idx];
+                                       stretchedChild.Width = stretchedChild.Height = Measure.Stretched;
+                               }
+                       } else {
+                               RemoveChild (idx - 1);
+                               if (stretchedChild == dw) {
+                                       stretchedChild = Children [idx-2];
+                                       stretchedChild.Width = stretchedChild.Height = Measure.Stretched;
+                               }
+                       }
+
+                       if (Children.Count == 1) {
+                               DockStack dsp = Parent as DockStack;
+                               if (dsp == null) {
+                                       Children [0].Width = Children [0].Height = Measure.Stretched;
+                                       return;
+                               }                               
+                               //remove level and move remaining obj to level above
+                               Widget g = Children [0];
+                               RemoveChild (g);
+                               idx = dsp.Children.IndexOf (this);
+                               dsp.RemoveChild (this);
+                               dsp.InsertChild (idx, g);
+                               g.Width = this.Width;
+                               g.Height = this.Height;
+                               if (dsp.stretchedChild == this)
+                                       dsp.stretchedChild = g;
+                               dsp.checkAlignments ();
+                       } else
+                               checkAlignments ();
+               }
+
+               internal void checkAlignments () {
+                       DockWindow dw = Children[0] as DockWindow;
+                       if (dw != null)
+                               dw.DockingPosition = (Orientation == Orientation.Horizontal ? Alignment.Left : Alignment.Top);
+                       dw = Children[Children.Count - 1] as DockWindow;
+                       if (dw != null)
+                               dw.DockingPosition = (Orientation == Orientation.Horizontal ? Alignment.Right : Alignment.Bottom);
+               }
+
+               //read next value in config string until next ';'
+               string getConfAttrib (string conf, ref int i) {
+                       int nextI = conf.Substring (i).IndexOf (';');
+                       string tmp = conf.Substring (i, nextI);
+                       i += nextI + 1;
+                       return tmp;
+               }
+               /// <summary>
+               /// Imports the config.
+               /// </summary>
+               /// <param name="conf">Conf.</param>
+               /// <param name="dataSource">Data source for the docked windows</param>
+               public void ImportConfig (string conf, object dataSource = null) {
+                       lock (IFace.UpdateMutex) {
+                               ClearChildren ();
+                               stretchedChild = null;
+                               int i = 0;
+                               Orientation = (Orientation)Enum.Parse (typeof(Orientation), getConfAttrib (conf, ref i));
+                               importConfig (conf, ref i, dataSource);
+                       }
+               }
+               public string ExportConfig () {
+                       return Orientation.ToString() + ";" + exportConfig();
+               }
+               void importConfig (string conf, ref int i, object dataSource) {                                         
+                       if (conf [i++] != '(')
+                               return;                 
+                       while (i < conf.Length - 4) {
+                               string sc = conf.Substring (i, 4);
+                               i += 4;
+                               switch (sc) {
+                               case "WIN;":
+                                       DockWindow dw = null;
+                                       string wName = getConfAttrib (conf, ref i);
+                                       try {
+                                               dw = IFace.CreateInstance (wName) as DockWindow;        
+                                       } catch {
+                                               dw = new DockWindow (IFace);
+                                       }
+
+                                       dw.Name = wName;
+                                       dw.Width = Measure.Parse (getConfAttrib (conf, ref i));
+                                       dw.Height = Measure.Parse (getConfAttrib (conf, ref i));
+                                       dw.DockingPosition = (Alignment)Enum.Parse (typeof(Alignment), getConfAttrib (conf, ref i));
+                                       dw.savedSlot = Rectangle.Parse (getConfAttrib (conf, ref i));
+                                       dw.wasResizable = Boolean.Parse (getConfAttrib (conf, ref i));
+
+                                       dw.IsDocked = true;
+                                       dw.DataSource = dataSource;
+                                       this.AddChild (dw);
+
+                                       break;
+                               case "STK;":
+                                       DockStack ds = new DockStack (IFace);
+                                       ds.Width = Measure.Parse (getConfAttrib (conf, ref i));
+                                       ds.Height = Measure.Parse (getConfAttrib (conf, ref i));
+                                       ds.Orientation = (Orientation)Enum.Parse (typeof(Orientation), getConfAttrib (conf, ref i));
+
+                                       this.AddChild (ds);
+
+                                       ds.importConfig (conf, ref i, dataSource);
+                                       break;
+                               case "SPL;":
+                                       Splitter sp = new Splitter (IFace);
+                                       sp.Width = Measure.Parse (getConfAttrib (conf, ref i));
+                                       sp.Height = Measure.Parse (getConfAttrib (conf, ref i));
+                                       sp.Thickness = int.Parse (getConfAttrib (conf, ref i));
+                                       this.AddChild (sp);
+                                       break;
+                               }
+                               char nextC = conf [i++];
+                               if (nextC == ')')
+                                       break;
+                       }
+               }
+               string exportConfig () {
+                       StringBuilder tmp = new StringBuilder("(");
+
+                       for (int i = 0; i < Children.Count; i++) {
+                               if (Children [i] is DockWindow) {
+                                       DockWindow dw = Children [i] as DockWindow;
+                                       tmp.Append (string.Format("WIN;{0};{1};{2};{3};{4};{5};",dw.Name, dw.Width, dw.Height, dw.DockingPosition, dw.savedSlot, dw.wasResizable));
+                               } else if (Children [i] is DockStack) {
+                                       DockStack ds = Children [i] as DockStack;
+                                       tmp.Append (string.Format("STK;{0};{1};{2};{3}", ds.Width, ds.Height, ds.Orientation, ds.exportConfig()));
+                               } else if (Children [i] is Splitter) {
+                                       Splitter sp = Children [i] as Splitter;
+                                       tmp.Append (string.Format("SPL;{0};{1};{2};", sp.Width, sp.Height, sp.Thickness));
+                               }                                       
+                               if (i < Children.Count - 1)
+                                       tmp.Append ("|");                               
+                       }
+
+                       tmp.Append (")");
+                       return tmp.ToString ();
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/DockWindow.cs b/Crow/src/GraphicObjects/DockWindow.cs
new file mode 100644 (file)
index 0000000..e368db5
--- /dev/null
@@ -0,0 +1,173 @@
+//
+// DockingView.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+       public class DockWindow : Window
+       {
+               #region CTOR
+               public DockWindow () {}
+               public DockWindow (Interface iface) : base (iface) {}
+               #endregion
+
+               int undockThreshold = 10;
+               bool isDocked = false;
+               Alignment docking = Alignment.Undefined;
+
+               Point undockingMousePosOrig; //mouse pos when docking was donne, use for undocking on mouse move
+               internal Rectangle savedSlot;   //last undocked slot recalled when view is undocked
+               internal bool wasResizable;
+
+               public bool IsDocked {
+                       get { return isDocked; }
+                       set {
+                               if (isDocked == value)
+                                       return;
+                               isDocked = value;
+                               NotifyValueChanged ("IsDocked", isDocked);
+                               NotifyValueChanged ("IsFloating", !isDocked);
+                       }
+               }
+               [XmlIgnore] public bool IsFloating { get { return !isDocked; }}
+
+               public Alignment DockingPosition {
+                       get { return docking; }
+                       set {
+                               if (docking == value)
+                                       return;
+                               docking = value;
+                               NotifyValueChanged ("DockingPosition", DockingPosition);
+                       }
+               }
+               public override bool PointIsIn (ref Point m)
+               {                       
+                       if (!base.PointIsIn(ref m))
+                               return false;
+
+                       Group p = Parent as Group;
+                       if (p != null) {
+                               lock (p.Children) {
+                                       for (int i = p.Children.Count - 1; i >= 0; i--) {
+                                               if (p.Children [i] == this)
+                                                       break;
+                                               if (p.Children [i].IsDragged)
+                                                       continue;
+                                               if (p.Children [i].Slot.ContainsOrIsEqual (m)) {                                                
+                                                       return false;
+                                               }
+                                       }
+                               }
+                       }
+                       return Slot.ContainsOrIsEqual(m);
+               }
+
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+//                     if (this.HasFocus && e.Mouse.IsButtonDown (MouseButton.Left) && IsDocked) {
+//                             if (Math.Abs (e.Position.X - undockingMousePosOrig.X) > 10 ||
+//                                 Math.Abs (e.Position.X - undockingMousePosOrig.X) > 10)
+//                                     Undock ();
+//                     }
+
+                       if (this.HasFocus && e.Mouse.IsButtonDown (MouseButton.Left) && IsDocked)
+                               CheckUndock (e.Position);
+
+                       base.onMouseMove (sender, e);
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+
+                       if (this.HasFocus && IsDocked && e.Button == MouseButton.Left)
+                               undockingMousePosOrig = e.Position;
+               }
+               public bool CheckUndock (Point mousePos) {
+                       //if (DockingPosition == Alignment.Center)
+                       //      return false;
+                       if (Math.Abs (mousePos.X - undockingMousePosOrig.X) < undockThreshold ||
+                           Math.Abs (mousePos.X - undockingMousePosOrig.X) < undockThreshold)
+                               return false;
+                       Undock ();
+                       return true;
+               }
+
+               protected override void onStartDrag (object sender, DragDropEventArgs e)
+               {
+                       base.onStartDrag (sender, e);
+
+                       undockingMousePosOrig = IFace.Mouse.Position;
+               }
+               protected override void onDrop (object sender, DragDropEventArgs e)
+               {
+                       if (!isDocked && DockingPosition != Alignment.Undefined && e.DropTarget is DockStack)
+                               Dock (e.DropTarget as DockStack);
+                       base.onDrop (sender, e);
+               }
+               public void Undock () {
+                       lock (IFace.UpdateMutex) {
+                               DockStack ds = Parent as DockStack;
+                               ds.Undock (this);
+
+                               IFace.AddWidget (this);
+
+                               Left = savedSlot.Left;
+                               Top = savedSlot.Top;
+                               Width = savedSlot.Width;
+                               Height = savedSlot.Height;
+
+                               IsDocked = false;
+                               DockingPosition = Alignment.Undefined;
+                               Resizable = wasResizable;
+                       }
+               }
+
+               public void Dock (DockStack target){
+                       lock (IFace.UpdateMutex) {
+                               IsDocked = true;
+                               //undockingMousePosOrig = lastMousePos;
+                               savedSlot = this.LastPaintedSlot;
+                               wasResizable = Resizable;
+                               Resizable = false;
+                               LastSlots = LastPaintedSlot = Slot = default(Rectangle);
+                               Left = Top = 0;
+
+                               IFace.RemoveWidget (this);
+
+                               target.Dock (this);
+                       }
+               }
+
+               protected override void close ()
+               {
+                       if (isDocked)
+                               Undock ();
+                       base.close ();
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/EnumSelector.cs b/Crow/src/GraphicObjects/EnumSelector.cs
new file mode 100644 (file)
index 0000000..fd5f498
--- /dev/null
@@ -0,0 +1,88 @@
+//
+// Border.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
+using vkvg;
+
+namespace Crow
+{
+       /// <summary>
+       /// Convenient widget for selecting value from enum
+       /// </summary>
+       public class EnumSelector : GenericStack
+       {
+               #region CTOR
+               protected EnumSelector () : base(){}
+               public EnumSelector (Interface iface) : base(iface){}
+               #endregion
+
+               #region private fields
+               Enum enumValue;
+               Type enumType;
+               #endregion
+
+               #region public properties
+               /// <summary>
+               /// use to define the colors of the 3d border
+               /// </summary>
+               [DefaultValue(null)]
+               public virtual Enum EnumValue {
+                       get { return enumValue; }
+                       set {
+                               if (enumValue == value)
+                                       return;
+
+                               enumValue = value;
+
+                               if (enumValue != null) {
+                                       if (enumType != enumValue.GetType ()) {
+                                               ClearChildren ();
+                                               enumType = enumValue.GetType ();
+                                               foreach (string en in enumType.GetEnumNames ()) {
+                                                       RadioButton rb = new RadioButton (IFace);
+                                                       rb.Caption = en;
+                                                       if (enumValue.ToString() == en)
+                                                               rb.IsChecked = true;
+                                                       rb.Checked += (sender, e) => (((RadioButton)sender).Parent as EnumSelector).EnumValue = (Enum)Enum.Parse (enumType, (sender as RadioButton).Caption);
+                                                       AddChild (rb);
+                                                       RegisterForLayouting (LayoutingType.All);
+                                               }
+                                       }
+                               } else 
+                                       ClearChildren ();
+
+                               NotifyValueChanged ("EnumValue", enumValue);
+                               RegisterForRedraw ();
+                       }
+               }
+               #endregion
+
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Expandable.cs b/Crow/src/GraphicObjects/Expandable.cs
new file mode 100644 (file)
index 0000000..3a480b2
--- /dev/null
@@ -0,0 +1,131 @@
+//
+// Expandable.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.ComponentModel;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated control whose content can be hidden and shown on demand
+       /// </summary>
+    public class Expandable : TemplatedContainer
+    {
+               #region CTOR
+               protected Expandable() : base(){}
+               public Expandable (Interface iface) : base(iface){}
+               #endregion
+
+               #region Private fields
+               bool _isExpanded;
+               string image;
+               #endregion
+
+               #region Event Handlers
+               /// <summary>
+               /// Occurs when control is expanded.
+               /// </summary>
+               public event EventHandler Expand;
+               /// <summary>
+               /// Occurs when control is collapsed.
+               /// </summary>
+               public event EventHandler Collapse;
+               #endregion
+
+               public BooleanTestOnInstance GetIsExpandable;
+
+               /// <summary>
+               /// mouse click event handler for easy expand triggering in IML
+               /// </summary>
+               public void onClickForExpand (object sender, MouseButtonEventArgs e)
+               {
+                       IsExpanded = !IsExpanded;
+               }
+
+               #region Public properties
+               [DefaultValue("#Crow.Icons.expandable.svg")]
+               public string Image {
+                       get { return image; }
+                       set {
+                               if (image == value)
+                                       return;
+                               image = value;
+                               NotifyValueChanged ("Image", image);
+                       }
+               }
+               [DefaultValue(false)]
+        public bool IsExpanded
+        {
+                       get { return _isExpanded; }
+            set
+            {
+                               if (value == _isExpanded)
+                                       return;
+
+                               _isExpanded = value;
+
+                               bool isExp = IsExpandable;
+                               NotifyValueChanged ("IsExpandable", isExp);
+                               if (!isExp)
+                                       _isExpanded = false;
+
+                               NotifyValueChanged ("IsExpanded", _isExpanded);
+
+                               if (_isExpanded)
+                                       onExpand (this, null);
+                               else
+                                       onCollapse (this, null);
+            }
+        }
+               [XmlIgnore]public bool IsExpandable {
+                       get {
+                               try {
+                                       return GetIsExpandable == null ? true : GetIsExpandable (this);
+                               } catch (Exception ex) {
+                                       System.Diagnostics.Debug.WriteLine ("Not Expandable error: " + ex.ToString ());
+                                       return false;
+                               }
+                       }
+               }
+               #endregion
+
+               public virtual void onExpand(object sender, EventArgs e)
+               {
+                       if (_contentContainer != null)
+                               _contentContainer.Visible = true;
+
+                       Expand.Raise (this, e);
+               }
+               public virtual void onCollapse(object sender, EventArgs e)
+               {
+                       if (_contentContainer != null)
+                               _contentContainer.Visible = false;
+
+                       Collapse.Raise (this, e);
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/FileDialog.cs b/Crow/src/GraphicObjects/FileDialog.cs
new file mode 100644 (file)
index 0000000..db66ae9
--- /dev/null
@@ -0,0 +1,155 @@
+//
+// FileDialog.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.IO;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated control for selecting files
+       /// </summary>
+       public class FileDialog: Window
+       {
+               #region CTOR
+               protected FileDialog() : base(){}
+               public FileDialog (Interface iface) : base(iface){}
+               #endregion
+
+               string searchPattern, curDir, _selectedFile, _selectedDir;
+               bool showHidden, showFiles;
+
+               #region events
+               public event EventHandler OkClicked;
+               #endregion
+
+               public string SelectedFileFullPath {
+                       get { return Path.Combine (SelectedDirectory, SelectedFile); }
+               }
+               [DefaultValue("/home")]
+               public virtual string CurrentDirectory {
+                       get { return curDir; }
+                       set {
+                               if (curDir == value)
+                                       return;
+                               curDir = value;
+                               NotifyValueChanged ("CurrentDirectory", curDir);
+                               SelectedDirectory = curDir;
+                       }
+               }
+
+               [DefaultValue("*")]
+               public virtual string SearchPattern {
+                       get { return searchPattern; }
+                       set {
+                               if (searchPattern == value)
+                                       return;
+                               searchPattern = value;
+                               NotifyValueChanged ("SearchPattern", searchPattern);
+
+                       }
+               }
+               [DefaultValue(false)]
+               public virtual bool ShowHidden {
+                       get { return showHidden; }
+                       set {
+                               if (showHidden == value)
+                                       return;
+                               showHidden = value;
+                               NotifyValueChanged ("ShowHidden", showHidden);
+                       }
+               }
+               [DefaultValue(true)]
+               public virtual bool ShowFiles {
+                       get { return showFiles; }
+                       set {
+                               if (showFiles == value)
+                                       return;
+                               showFiles = value;
+                               NotifyValueChanged ("ShowFiles", showFiles);
+                       }
+               }
+               public string SelectedFile {
+                       get { return _selectedFile; }
+                       set {
+                               if (value == _selectedFile)
+                                       return;
+                               _selectedFile = value;
+                               NotifyValueChanged ("SelectedFile", _selectedFile);
+                       }
+               }
+               public string SelectedDirectory {
+                       get { return _selectedDir; }
+                       set {
+                               if (value == _selectedDir)
+                                       return;
+                               _selectedDir = value;
+                               NotifyValueChanged ("SelectedDirectory", _selectedDir);
+                       }
+               }
+
+               public void onFVSelectedItemChanged (object sender, SelectionChangeEventArgs e){
+                       if (e.NewValue != null) {
+                               if (File.GetAttributes (e.NewValue.ToString ()).HasFlag (FileAttributes.Directory)) {
+                                       SelectedDirectory = e.NewValue.ToString ();
+                                       SelectedFile = "";
+                               } else {
+                                       SelectedDirectory = Path.GetDirectoryName (e.NewValue.ToString ());
+                                       SelectedFile = Path.GetFileName (e.NewValue.ToString ());
+                               }
+                       }
+               }
+               public void onDVSelectedItemChanged (object sender, SelectionChangeEventArgs e){
+                       if (e.NewValue != null)
+                               SelectedDirectory = e.NewValue.ToString();
+               }
+               public void goUpDirClick (object sender, MouseButtonEventArgs e){
+                       string root = Directory.GetDirectoryRoot(CurrentDirectory);
+                       if (CurrentDirectory == root)
+                               return;
+                       CurrentDirectory = Directory.GetParent(CurrentDirectory).FullName;
+               }
+               void onFileSelect(object sender, MouseButtonEventArgs e){
+                       if (string.IsNullOrEmpty (SelectedFile))
+                               CurrentDirectory = SelectedDirectory;
+                       else {
+                               OkClicked.Raise (this, null);
+                               IFace.DeleteWidget (this);
+                       }
+               }
+               void onCancel(object sender, MouseButtonEventArgs e){
+                       IFace.DeleteWidget (this);
+               }
+
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/GenericStack.cs b/Crow/src/GraphicObjects/GenericStack.cs
new file mode 100644 (file)
index 0000000..5189748
--- /dev/null
@@ -0,0 +1,252 @@
+//
+// GenericStack.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Xml.Serialization;
+using System;
+using System.Linq;
+
+namespace Crow
+{
+       /// <summary>
+       /// group container that stacked its children horizontally or vertically
+       /// </summary>
+       public class GenericStack : Group
+    {
+               #region CTOR
+               protected GenericStack() : base(){}
+               public GenericStack(Interface iface) : base(iface){}
+               #endregion
+
+               #region Private fields
+        int _spacing;
+        Orientation _orientation;
+               #endregion
+
+               #region Public Properties
+        [DefaultValue(2)]
+        public int Spacing
+        {
+                       get { return _spacing; }
+            set { 
+                               if (_spacing == value)
+                                       return;
+                               _spacing = value; 
+                               NotifyValueChanged ("Spacing", Spacing);
+                               RegisterForLayouting (LayoutingType.Sizing|LayoutingType.ArrangeChildren);
+                       }
+        }
+        [DefaultValue(Orientation.Horizontal)]
+        public virtual Orientation Orientation
+        {
+            get { return _orientation; }
+            set { _orientation = value; }
+        }
+               #endregion
+
+               #region GraphicObject Overrides
+               public override bool ArrangeChildren { get { return true; } }
+               public override void ChildrenLayoutingConstraints (ref LayoutingType layoutType)
+               {
+                       //Prevent child repositionning in the direction of stacking
+                       if (Orientation == Orientation.Horizontal)
+                               layoutType &= (~LayoutingType.X);
+                       else
+                               layoutType &= (~LayoutingType.Y);                       
+               }
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       int totSpace = Math.Max(0, Spacing * (Children.Count (c => c.Visible) - 1));
+                       if (lt == LayoutingType.Width) {
+                               if (Orientation == Orientation.Horizontal)
+                                       return contentSize.Width + totSpace + 2 * Margin;
+                       }else if (Orientation == Orientation.Vertical)
+                               return contentSize.Height + totSpace + 2 * Margin;                                                      
+                       
+                       return base.measureRawSize (lt);
+               }
+               public virtual void ComputeChildrenPositions()
+               {
+                       int d = 0;
+                       if (Orientation == Orientation.Horizontal) {
+                               foreach (Widget c in Children) {
+                                       if (!c.Visible)
+                                               continue;
+                                       c.Slot.X = d;
+                                       d += c.Slot.Width + Spacing;
+                               }
+                       } else {
+                               foreach (Widget c in Children) {
+                                       if (!c.Visible)
+                                               continue;                                       
+                                       c.Slot.Y = d;
+                                       d += c.Slot.Height + Spacing;
+                               }
+                       }
+                       IsDirty = true;
+               }
+               Widget stretchedGO = null;
+               public override bool UpdateLayout (LayoutingType layoutType)
+        {
+                       RegisteredLayoutings &= (~layoutType);
+
+                       if (layoutType == LayoutingType.ArrangeChildren) {
+                               //allow 1 child to have size to 0 if stack has fixed or streched size policy,
+                               //this child will occupy remaining space
+                               //if stack size policy is Fit, no child may have stretch enabled
+                               //in the direction of stacking.
+                               ComputeChildrenPositions ();
+
+                               //if no layouting remains in queue for item, registre for redraw
+                               if (RegisteredLayoutings == LayoutingType.None && IsDirty)
+                                       IFace.EnqueueForRepaint (this);
+
+                               return true;
+                       }
+
+                       return base.UpdateLayout(layoutType);
+        }
+
+               void adjustStretchedGo (LayoutingType lt){
+                       if (stretchedGO == null)
+                               return;
+                       if (lt == LayoutingType.Width) {
+                               int newW = Math.Max (
+                                                  this.ClientRectangle.Width - contentSize.Width - Spacing * (Children.Count - 1),
+                                                  stretchedGO.MinimumSize.Width);
+                               if (stretchedGO.MaximumSize.Width > 0)
+                                       newW = Math.Min (newW, stretchedGO.MaximumSize.Width);
+                               if (newW != stretchedGO.Slot.Width) {                                                   
+                                       stretchedGO.Slot.Width = newW;
+                                       stretchedGO.IsDirty = true;
+                                       #if DEBUG_LAYOUTING
+                               Debug.WriteLine ("\tAdjusting Width of " + stretchedGO.ToString());
+                                       #endif
+                                       stretchedGO.LayoutChanged -= OnChildLayoutChanges;
+                                       stretchedGO.OnLayoutChanges (LayoutingType.Width);
+                                       stretchedGO.LayoutChanged += OnChildLayoutChanges;
+                                       stretchedGO.LastSlots.Width = stretchedGO.Slot.Width;
+                               }
+                       } else {
+                               int newH = Math.Max (
+                                       this.ClientRectangle.Height - contentSize.Height - Spacing * (Children.Count - 1),
+                                       stretchedGO.MinimumSize.Height);
+                               if (stretchedGO.MaximumSize.Height > 0)
+                                       newH = Math.Min (newH, stretchedGO.MaximumSize.Height);
+                               if (newH != stretchedGO.Slot.Height) {
+                                       stretchedGO.Slot.Height = newH;
+                                       stretchedGO.IsDirty = true;
+                                       #if DEBUG_LAYOUTING
+                                       Debug.WriteLine ("\tAdjusting Height of " + stretchedGO.ToString());
+                                       #endif
+                                       stretchedGO.LayoutChanged -= OnChildLayoutChanges;
+                                       stretchedGO.OnLayoutChanges (LayoutingType.Height);
+                                       stretchedGO.LayoutChanged += OnChildLayoutChanges;
+                                       stretchedGO.LastSlots.Height = stretchedGO.Slot.Height;
+                               }                               
+                       }
+               }
+
+               public override void OnChildLayoutChanges (object sender, LayoutingEventArgs arg)
+               {
+                       Widget go = sender as Widget;
+                       //Debug.WriteLine ("child layout change: " + go.LastSlots.ToString() + " => " + go.Slot.ToString());
+                       switch (arg.LayoutType) {
+                       case LayoutingType.Width:
+                               if (Orientation == Orientation.Horizontal) {
+                                       if (go.Width == Measure.Stretched) {
+                                               if (stretchedGO == null && Width != Measure.Fit)
+                                                       stretchedGO = go;
+                                               else if (stretchedGO != go) {
+                                                       go.Slot.Width = 0;
+                                                       go.Width = Measure.Fit;
+                                                       return;
+                                               }
+                                       } else
+                                               contentSize.Width += go.Slot.Width - go.LastSlots.Width;
+
+                                       adjustStretchedGo (LayoutingType.Width);                                        
+                                       
+                                       if (Width == Measure.Fit)
+                                               this.RegisterForLayouting (LayoutingType.Width);
+                                       
+                                       this.RegisterForLayouting (LayoutingType.ArrangeChildren);
+                                       return;
+                               }
+                               break;
+                       case LayoutingType.Height:
+                               if (Orientation == Orientation.Vertical) {
+                                       if (go.Height == Measure.Stretched) {
+                                               if (stretchedGO == null && Height != Measure.Fit)
+                                                       stretchedGO = go;
+                                               else if (stretchedGO != go){
+                                                       go.Slot.Height = 0;
+                                                       go.Height = Measure.Fit;
+                                                       return;
+                                               }
+                                       } else
+                                               contentSize.Height += go.Slot.Height - go.LastSlots.Height;
+                                       
+                                       adjustStretchedGo (LayoutingType.Height);
+
+                                       if (Height == Measure.Fit)
+                                               this.RegisterForLayouting (LayoutingType.Height);
+
+                                       this.RegisterForLayouting (LayoutingType.ArrangeChildren);
+                                       return;
+                               }
+                               break;
+                       }
+                       base.OnChildLayoutChanges (sender, arg);
+               }
+               #endregion
+
+       public override void RemoveChild (Widget child)
+               {
+                       if (child != stretchedGO) {
+                               if (Orientation == Orientation.Horizontal)
+                                       contentSize.Width -= child.LastSlots.Width;
+                               else 
+                                       contentSize.Height -= child.LastSlots.Height;                           
+                       }
+                       base.RemoveChild (child);
+                       if (child == stretchedGO) {
+                               stretchedGO = null;
+                               RegisterForLayouting (LayoutingType.Sizing);
+                       }else if (Orientation == Orientation.Horizontal)                                
+                               adjustStretchedGo (LayoutingType.Width);
+                       else                            
+                               adjustStretchedGo (LayoutingType.Height);                       
+               }
+
+               public override void ClearChildren ()
+               {
+                       base.ClearChildren ();
+                       stretchedGO = null;
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/GraduatedSlider.cs b/Crow/src/GraphicObjects/GraduatedSlider.cs
new file mode 100644 (file)
index 0000000..932378b
--- /dev/null
@@ -0,0 +1,82 @@
+//
+// GraduatedSlider.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using vkvg;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+       [DesignIgnore]
+       public class GraduatedSlider : Slider
+    {     
+               #region CTOR
+               protected GraduatedSlider() : base(){}
+               public GraduatedSlider(Interface iface) : base(iface)
+               {}
+//             public GraduatedSlider(double minimum, double maximum, double step)
+//            : base()
+//        {
+//                     Minimum = minimum;
+//                     Maximum = maximum;
+//                     SmallIncrement = step;
+//                     LargeIncrement = step * 5;
+//        }
+               #endregion
+
+               protected override void DrawGraduations(Context gr, PointD pStart, PointD pEnd)
+               {
+                       Rectangle r = ClientRectangle;
+                       Foreground.SetAsSource (gr);
+
+                       gr.LineWidth = 2;
+                       gr.MoveTo(pStart);
+                       gr.LineTo(pEnd);
+
+                       gr.Stroke();
+                       gr.LineWidth = 1;
+
+                       double sst = unity * SmallIncrement;
+                       double bst = unity * LargeIncrement;
+
+
+                       PointD vBar = new PointD(0, sst);
+                       for (double x = Minimum; x <= Maximum - Minimum; x += SmallIncrement)
+                       {
+                               double lineLength = r.Height / 3;
+                               if (x % LargeIncrement != 0)
+                                       lineLength /= 3;
+                               PointD p = new PointD(pStart.X + x * unity, pStart.Y);
+                               gr.MoveTo(p);
+                               gr.LineTo(new PointD(p.X, p.Y + lineLength));
+                       }
+                       gr.Stroke();
+               }
+    }
+}
diff --git a/Crow/src/GraphicObjects/Grid.cs b/Crow/src/GraphicObjects/Grid.cs
new file mode 100644 (file)
index 0000000..ad776bd
--- /dev/null
@@ -0,0 +1,171 @@
+//
+// Grid.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// Simple grid container
+       /// Allow symetric placement of children on a grid,
+       /// excedental child (above grid sizing) are ignored
+       /// and invisible child keep their place in the grid
+       /// </summary>
+    public class Grid : Group
+    {
+               #region CTOR
+               protected Grid () : base(){}
+               public Grid(Interface iface) : base(iface)
+               {            
+               }
+               #endregion
+
+               #region Private fields
+        int _spacing;
+               int _columnCount;
+               int _rowCount;
+               #endregion
+
+               #region Public Properties
+        [DefaultValue(2)]
+        public int Spacing
+        {
+                       get { return _spacing; }
+            set { _spacing = value; }
+        }
+        [DefaultValue(2)]
+        public virtual int ColumnCount
+        {
+            get { return _columnCount; }
+            set { 
+                               if (_columnCount == value)
+                                       return;
+
+                               _columnCount = value; 
+
+                               NotifyValueChanged ("ColumnCount", ColumnCount);
+                               this.RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       }
+        }
+               [DefaultValue(2)]
+               public virtual int RowCount
+               {
+                       get { return _rowCount; }
+                       set { 
+                               if (_rowCount == value)
+                                       return;
+
+                               _rowCount = value; 
+
+                               NotifyValueChanged ("RowCount", RowCount);
+                               this.RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       }
+               }
+               public virtual int CaseWidth {
+                       get { return (Slot.Width - (ColumnCount - 1) * Spacing) / ColumnCount; }
+               }
+               public virtual int CaseHeight {
+                       get { return (Slot.Height - (RowCount - 1) * Spacing) / RowCount; }
+               }
+
+               #endregion
+
+               #region GraphicObject Overrides
+//             protected override Size measureRawSize ()
+//             {
+//                     Size tmp = new Size ();
+//
+//                     foreach (GraphicObject c in Children.Where(ch=>ch.Visible)) {
+//                             tmp.Width = Math.Max (tmp.Width, c.Slot.Width);
+//                             tmp.Height = Math.Max (tmp.Height, c.Slot.Height);
+//                     }
+//
+//                     tmp.Width *= (ColumnCount - 1) * Spacing / ColumnCount;;
+//                     tmp.Height *= (RowCount - 1) * Spacing / RowCount;
+//                     tmp.Width += 2 * Margin;
+//                     tmp.Height += 2 * Margin;
+//
+//                     return tmp;
+//             }
+               public override void ChildrenLayoutingConstraints (ref LayoutingType layoutType)
+               {
+                       //Prevent child repositionning
+                       layoutType &= (~LayoutingType.Positioning);
+               }
+               public override bool ArrangeChildren { get { return true; } }
+               public virtual void ComputeChildrenPositions()
+               {
+                       int slotWidth = CaseWidth;
+                       int slotHeight = CaseHeight;
+                       for (int curY = 0; curY < RowCount; curY++) {
+                               for (int curX = 0; curX < ColumnCount; curX++) {
+                                       int idx = curY * ColumnCount + curX;
+                                       if (idx >= Children.Count)
+                                               return;
+                                       Widget c = Children [idx];
+                                       if (!c.Visible)
+                                               continue;
+                                       c.Slot.X = curX * (slotWidth + Spacing);
+                                       c.Slot.Y = curY * (slotHeight + Spacing);
+                                       //c.Slot.Width = slotWidth;
+                                       //c.Slot.Height = slotHeight;
+                               }
+                       }
+                       IsDirty = true;
+               }
+               public override void OnChildLayoutChanges (object sender, LayoutingEventArgs arg)
+               {
+                       //base.OnChildLayoutChanges (sender, arg);
+               }
+
+               public override bool UpdateLayout (LayoutingType layoutType)
+               {
+                       RegisteredLayoutings &= (~layoutType);
+
+                       if (layoutType == LayoutingType.ArrangeChildren) {                              
+
+                               ComputeChildrenPositions ();
+
+                               //if no layouting remains in queue for item, registre for redraw
+                               if (RegisteredLayoutings == LayoutingType.None && IsDirty)
+                                       IFace.EnqueueForRepaint (this);
+                               
+                               return true;
+                       }
+
+                       return base.UpdateLayout(layoutType);
+               }
+               #endregion
+
+    
+       }
+}
diff --git a/Crow/src/GraphicObjects/Group.cs b/Crow/src/GraphicObjects/Group.cs
new file mode 100644 (file)
index 0000000..b1536c5
--- /dev/null
@@ -0,0 +1,464 @@
+//
+// Group.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Xml.Serialization;
+using vkvg;
+using System.Diagnostics;
+using System.Reflection;
+using System.Threading;
+
+
+namespace Crow
+{
+       public class Group : Widget
+    {
+               #if DESIGN_MODE
+               public override bool FindByDesignID(string designID, out Widget go){
+                       go = null;
+                       if (base.FindByDesignID (designID, out go))
+                               return true;
+                       childrenRWLock.EnterReadLock ();
+                       foreach (Widget w in Children) {
+                               if (!w.FindByDesignID (designID, out go))
+                                       continue;
+                               childrenRWLock.ExitReadLock ();
+                               return true;
+                       }
+                       childrenRWLock.ExitReadLock ();
+                       return false;
+               }
+               public override void getIML (System.Xml.XmlDocument doc, System.Xml.XmlNode parentElem)
+               {
+                       if (this.design_isTGItem)
+                               return;
+                       base.getIML (doc, parentElem);
+                       foreach (Widget g in Children) {
+                               g.getIML (doc, parentElem.LastChild);   
+                       }
+               }
+               #endif
+
+               protected ReaderWriterLockSlim childrenRWLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+               #region CTOR
+               public Group () : base() {}
+               public Group(Interface iface) : base(iface){}
+               #endregion
+
+               #region EVENT HANDLERS
+               public event EventHandler<EventArgs> ChildrenCleared;
+               #endregion
+
+               internal Widget largestChild = null;
+               internal Widget tallestChild = null;
+
+        bool _multiSelect = false;
+               List<Widget> children = new List<Widget>();
+
+        public virtual List<Widget> Children {
+                       get { return children; }
+               }
+               [DefaultValue(false)]
+        public bool MultiSelect
+        {
+            get { return _multiSelect; }
+            set { _multiSelect = value; }
+        }
+               public virtual void AddChild(Widget g){
+                       childrenRWLock.EnterWriteLock();
+
+                       g.Parent = this;
+                       Children.Add (g);
+
+                       childrenRWLock.ExitWriteLock();
+
+                       g.RegisteredLayoutings = LayoutingType.None;
+                       g.LayoutChanged += OnChildLayoutChanges;
+                       g.RegisterForLayouting (LayoutingType.Sizing | LayoutingType.ArrangeChildren);
+               }
+        public virtual void RemoveChild(Widget child)
+               {
+                       child.LayoutChanged -= OnChildLayoutChanges;
+                       //check if HoverWidget is removed from Tree
+                       if (IFace.HoverWidget != null) {
+                               if (this.Contains (IFace.HoverWidget))
+                                       IFace.HoverWidget = null;
+                       }
+
+                       childrenRWLock.EnterWriteLock ();
+
+                       Children.Remove(child);
+                       child.Parent = null;
+
+                       childrenRWLock.ExitWriteLock ();
+
+                       if (child == largestChild && Width == Measure.Fit)
+                               searchLargestChild ();
+                       if (child == tallestChild && Height == Measure.Fit)
+                               searchTallestChild ();
+
+                       this.RegisterForLayouting (LayoutingType.Sizing | LayoutingType.ArrangeChildren);
+
+               }
+        public virtual void DeleteChild(Widget child)
+               {
+                       RemoveChild (child);
+                       child.Dispose ();
+        }
+               public virtual void InsertChild (int idx, Widget g) {
+                       childrenRWLock.EnterWriteLock ();
+                               
+                       g.Parent = this;
+                       Children.Insert (idx, g);
+
+                       childrenRWLock.ExitWriteLock ();
+
+                       g.RegisteredLayoutings = LayoutingType.None;
+                       g.LayoutChanged += OnChildLayoutChanges;
+                       g.RegisterForLayouting (LayoutingType.Sizing | LayoutingType.ArrangeChildren);
+               }
+               public virtual void RemoveChild (int idx) {
+                       RemoveChild (children[idx]);
+               }
+               public virtual void DeleteChild (int idx) {
+                       DeleteChild (children[idx]);
+               }
+               public virtual void ClearChildren()
+               {
+                       childrenRWLock.EnterWriteLock ();
+
+                       while (Children.Count > 0) {
+                               Widget g = Children [Children.Count - 1];
+                               g.LayoutChanged -= OnChildLayoutChanges;
+                               Children.RemoveAt (Children.Count - 1);
+                               g.Dispose ();
+                       }
+
+                       childrenRWLock.ExitWriteLock ();
+
+                       resetChildrenMaxSize ();
+
+                       this.RegisterForLayouting (LayoutingType.Sizing);
+                       ChildrenCleared.Raise (this, new EventArgs ());
+               }
+               public override void OnDataSourceChanged (object sender, DataSourceChangeEventArgs e)
+               {
+                       base.OnDataSourceChanged (this, e);
+
+                       childrenRWLock.EnterReadLock ();
+                       foreach (Widget g in Children) {
+                               if (g.localDataSourceIsNull & g.localLogicalParentIsNull)
+                                       g.OnDataSourceChanged (g, e);   
+                       }
+                       childrenRWLock.ExitReadLock ();
+               }
+
+               public void putWidgetOnTop(Widget w)
+               {
+                       if (Children.Contains(w))
+                       {
+                               childrenRWLock.EnterWriteLock ();
+
+                               Children.Remove (w);
+                               Children.Add (w);
+
+                               childrenRWLock.ExitWriteLock ();
+                       }
+               }
+               public void putWidgetOnBottom(Widget w)
+               {
+                       if (Children.Contains(w))
+                       {
+                               childrenRWLock.EnterWriteLock ();
+
+                               Children.Remove (w);
+                               Children.Insert (0, w);
+
+                               childrenRWLock.ExitWriteLock ();
+                       }
+               }
+
+               #region GraphicObject overrides
+
+               public override Widget FindByName (string nameToFind)
+               {
+                       if (Name == nameToFind)
+                               return this;
+                       Widget tmp = null;
+
+                       childrenRWLock.EnterReadLock ();
+
+                       foreach (Widget w in Children) {
+                               tmp = w.FindByName (nameToFind);
+                               if (tmp != null)
+                                       break;
+                       }
+
+                       childrenRWLock.ExitReadLock ();
+
+                       return tmp;
+               }
+               public override bool Contains (Widget goToFind)
+               {
+                       foreach (Widget w in Children) {
+                               if (w == goToFind)
+                                       return true;
+                               if (w.Contains (goToFind))
+                                       return true;
+                       }
+                       return false;
+               }
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       if (Children.Count > 0) {
+                               if (lt == LayoutingType.Width) {
+                                       if (largestChild == null)
+                                               searchLargestChild ();
+                                       if (largestChild == null) {
+                                               //if still null, not possible to determine a width
+                                               //because all children are stretched, force first one to fit
+                                               Children [0].Width = Measure.Fit;
+                                               return -1;//cancel actual sizing to let child computation take place
+                                       }
+                               } else {
+                                       if (tallestChild == null)
+                                               searchTallestChild ();
+                                       if (tallestChild == null) {
+                                               Children [0].Height = Measure.Fit;
+                                               return -1;
+                                       }
+                               }
+                       }
+                       return base.measureRawSize (lt);
+               }
+
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       childrenRWLock.EnterReadLock ();
+                       //position smaller objects in group when group size is fit
+                       switch (layoutType) {
+                       case LayoutingType.Width:
+                               foreach (Widget c in Children) {
+                                       if (c.Width.IsRelativeToParent)
+                                               c.RegisterForLayouting (LayoutingType.Width);
+                                       else
+                                               c.RegisterForLayouting (LayoutingType.X);
+                               }
+                               break;
+                       case LayoutingType.Height:
+                               foreach (Widget c in Children) {
+                                       if (c.Height.IsRelativeToParent)
+                                               c.RegisterForLayouting (LayoutingType.Height);
+                                       else
+                                               c.RegisterForLayouting (LayoutingType.Y);
+                               }
+                               break;
+                       }
+                       childrenRWLock.ExitReadLock ();
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       gr.Save ();
+
+                       if (ClipToClientRect) {
+                               //clip to client zone
+                               DrawingHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                               gr.Clip ();
+                       }
+
+                       childrenRWLock.EnterReadLock ();
+
+                       for (int i = 0; i < Children.Count; i++) 
+                               Children[i].Paint (ref gr);                     
+
+                       childrenRWLock.ExitReadLock ();
+                       gr.Restore ();
+               }
+               protected override void UpdateCache (Context ctx)
+               {
+                       Rectangle rb = Slot + Parent.ClientRectangle.Position;
+
+
+                       Context gr = new Context (bmp);
+
+                       if (!Clipping.IsEmpty) {
+                               Clipping.clearAndClip (gr);
+
+                               base.onDraw (gr);
+
+                               if (ClipToClientRect) {
+                                       DrawingHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                                       gr.Clip ();
+                               }
+
+                               childrenRWLock.EnterReadLock ();
+
+                               foreach (Widget c in Children) {
+                                       if (!c.Visible)
+                                               continue;
+                                       if (!Clipping.intersect (c.Slot + ClientRectangle.Position))
+                                               continue;
+                                       c.Paint (ref gr);
+                               }
+
+                               childrenRWLock.ExitReadLock ();
+
+                               #if DEBUG_CLIP_RECTANGLE
+                               gr.LineWidth = 1;
+                               Clipping.stroke(gr,Color.DarkMagenta.AdjustAlpha (0.8));
+                               gr.Stroke ();
+                               #endif
+                       }
+                       gr.Dispose ();
+
+                       ctx.SetSourceSurface (bmp, rb.X, rb.Y);
+                       ctx.Paint ();
+
+                       Clipping.Reset();
+               }
+               #endregion
+
+               public virtual void OnChildLayoutChanges (object sender, LayoutingEventArgs arg)
+               {
+                       Widget g = sender as Widget;
+
+                       switch (arg.LayoutType) {
+                       case LayoutingType.Width:
+                               if (Width != Measure.Fit)
+                                       return;
+                               if (g.Slot.Width > contentSize.Width) {
+                                       largestChild = g;
+                                       contentSize.Width = g.Slot.Width;
+                               } else if (g == largestChild)
+                                       searchLargestChild ();
+
+                               this.RegisterForLayouting (LayoutingType.Width);
+                               break;
+                       case LayoutingType.Height:
+                               if (Height != Measure.Fit)
+                                       return;
+                               if (g.Slot.Height > contentSize.Height) {
+                                       tallestChild = g;
+                                       contentSize.Height = g.Slot.Height;
+                               } else if (g == tallestChild)
+                                       searchTallestChild ();
+
+                               this.RegisterForLayouting (LayoutingType.Height);
+                               break;
+                       }
+               }
+               //TODO: x,y position should be taken in account for computation of width and height
+               void resetChildrenMaxSize(){
+                       largestChild = null;
+                       tallestChild = null;
+                       contentSize = 0;
+               }
+               void searchLargestChild(){
+                       #if DEBUG_LAYOUTING
+                       Debug.WriteLine("\tSearch largest child");
+                       #endif
+                       largestChild = null;
+                       contentSize.Width = 0;
+                       for (int i = 0; i < Children.Count; i++) {
+                               if (!Children [i].Visible)
+                                       continue;
+                               if (children [i].RegisteredLayoutings.HasFlag (LayoutingType.Width))
+                                       continue;
+                               if (Children [i].Slot.Width > contentSize.Width) {
+                                       contentSize.Width = Children [i].Slot.Width;
+                                       largestChild = Children [i];
+                               }
+                       }
+               }
+               void searchTallestChild(){
+                       #if DEBUG_LAYOUTING
+                       Debug.WriteLine("\tSearch tallest child");
+                       #endif
+                       tallestChild = null;
+                       contentSize.Height = 0;
+                       for (int i = 0; i < Children.Count; i++) {
+                               if (!Children [i].Visible)
+                                       continue;
+                               if (children [i].RegisteredLayoutings.HasFlag (LayoutingType.Height))
+                                       continue;
+                               if (Children [i].Slot.Height > contentSize.Height) {
+                                       contentSize.Height = Children [i].Slot.Height;
+                                       tallestChild = Children [i];
+                               }
+                       }
+               }
+
+
+               #region Mouse handling
+               public override void checkHoverWidget (MouseMoveEventArgs e)
+               {
+                       if (IFace.HoverWidget != this) {
+                               IFace.HoverWidget = this;
+                               onMouseEnter (this, e);
+                       }
+                       for (int i = Children.Count - 1; i >= 0; i--) {
+                               if (Children[i].MouseIsIn(e.Position))
+                               {
+                                       Children[i].checkHoverWidget (e);
+                                       return;
+                               }
+                       }
+                       base.checkHoverWidget (e);
+               }
+//             public override bool PointIsIn (ref Point m)
+//             {
+//                     if (!base.PointIsIn (ref m))
+//                             return false;
+//                     if (CurrentInterface.HoverWidget == this)
+//                             return true;
+//                     lock (Children) {
+//                             for (int i = Children.Count - 1; i >= 0; i--) {
+//                                     if (Children [i].Slot.ContainsOrIsEqual (m) && !(bool)CurrentInterface.HoverWidget?.IsOrIsInside(Children[i])) {                                                
+//                                             return false;
+//                                     }
+//                             }
+//                     }
+//                     return true;
+//             }
+               #endregion
+
+               protected override void Dispose (bool disposing)
+               {
+                       if (disposing) {
+                               foreach (Widget c in children)
+                                       c.Dispose ();
+                       }
+                       base.Dispose (disposing);
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/GroupBox.cs b/Crow/src/GraphicObjects/GroupBox.cs
new file mode 100644 (file)
index 0000000..2e32ddd
--- /dev/null
@@ -0,0 +1,43 @@
+//
+// GroupBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated container accepting one child
+       /// </summary>
+    public class GroupBox : TemplatedContainer
+    {          
+               #region CTOR
+               protected GroupBox () : base(){}
+               public GroupBox(Interface iface) : base(iface){}
+               #endregion
+       }
+}
diff --git a/Crow/src/GraphicObjects/HorizontalStack.cs b/Crow/src/GraphicObjects/HorizontalStack.cs
new file mode 100644 (file)
index 0000000..64d7cae
--- /dev/null
@@ -0,0 +1,53 @@
+//
+// HorizontalStack.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+       /// <summary>
+       /// group control stacking its children horizontally
+       /// </summary>
+    public class HorizontalStack : GenericStack
+    {
+               #region CTOR
+               protected HorizontalStack () : base(){}
+               public HorizontalStack(Interface iface) : base(iface)
+        {            
+        }
+               #endregion
+
+        [XmlIgnore]
+        public override Orientation Orientation
+        {
+            get { return Orientation.Horizontal; }
+        }
+    }
+}
diff --git a/Crow/src/GraphicObjects/HueSelector.cs b/Crow/src/GraphicObjects/HueSelector.cs
new file mode 100644 (file)
index 0000000..8ef48f1
--- /dev/null
@@ -0,0 +1,155 @@
+//
+// HueSelector.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using vkvg;
+
+namespace Crow
+{
+       [DesignIgnore]
+       public class HueSelector : ColorSelector
+       {
+               #region CTOR
+               protected HueSelector () : base(){}
+               public HueSelector (Interface iface) : base(iface)
+               {
+               }
+               #endregion
+
+               Orientation _orientation;
+               double hue;
+
+               [DefaultValue(Orientation.Horizontal)]
+               public virtual Orientation Orientation
+               {
+                       get { return _orientation; }
+                       set {
+                               if (_orientation == value)
+                                       return;
+                               _orientation = value;
+                               NotifyValueChanged ("Orientation", _orientation);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               
+               public virtual double Hue {
+                       get { return hue; }
+                       set {
+                               if (hue == value)
+                                       return;
+                               hue = value;
+                               notifyHueChanged ();
+                               updateMousePosFromHue ();
+                               RegisterForRedraw ();
+                       }
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       Rectangle r = ClientRectangle;
+                       r.Height -= 4;
+                       r.Y += 2;
+
+                       Gradient.Type gt = Gradient.Type.Horizontal;
+                       if (Orientation == Orientation.Vertical)
+                               gt = Gradient.Type.Vertical;
+
+                       Crow.Gradient grad = new Gradient (gt);
+
+                       grad.Stops.Add (new Gradient.ColorStop (0,     new Color (1, 0, 0, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.167, new Color (1, 1, 0, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.333, new Color (0, 1, 0, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.5,   new Color (0, 1, 1, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.667, new Color (0, 0, 1, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (0.833, new Color (1, 0, 1, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (1,     new Color (1, 0, 0, 1)));
+
+                       grad.SetAsSource (gr, r);
+                       DrawingHelpers.CairoRectangle (gr, r, CornerRadius);
+                       gr.Fill();
+               }
+
+               public override void Paint (ref Context ctx)
+               {
+                       base.Paint (ref ctx);
+
+                       Rectangle rb = Slot + Parent.ClientRectangle.Position;
+                       ctx.Save ();
+
+                       ctx.Translate (rb.X, rb.Y);
+
+                       ctx.SetSourceColor (Color.White);
+                       Rectangle r = ClientRectangle;
+                       if (Orientation == Orientation.Horizontal) {
+                               r.Width = 4;
+                               r.X = mousePos.X - 2;
+                       } else {
+                               r.Height = 4;
+                               r.Y = mousePos.Y - 2;
+                       }
+
+                       DrawingHelpers.CairoRectangle (ctx, r, 1);
+                       ctx.SetSourceColor (Color.White);
+                       ctx.LineWidth = 1.0;
+                       ctx.Stroke();
+                       ctx.Restore ();
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       if (Orientation == Orientation.Horizontal) {
+                               if (layoutType == LayoutingType.Width)
+                                       updateMousePosFromHue ();
+                       } else if (layoutType == LayoutingType.Height)
+                               updateMousePosFromHue ();
+               }
+               protected override void updateMouseLocalPos (Point mPos)
+               {
+                       base.updateMouseLocalPos (mPos);
+                       if (Orientation == Orientation.Horizontal)
+                               hue = (double)mousePos.X / (double)ClientRectangle.Width;
+                       else
+                               hue = (double)mousePos.Y / (double)ClientRectangle.Height;
+                       notifyHueChanged ();
+                       RegisterForRedraw ();
+               }
+               void updateMousePosFromHue(){
+                       if (Orientation == Orientation.Horizontal)
+                               mousePos.X = (int)Math.Floor(hue * (double)ClientRectangle.Width);
+                       else
+                               mousePos.Y = (int)Math.Floor(hue * (double)ClientRectangle.Height);
+               }
+               void notifyHueChanged(){
+                       NotifyValueChanged ("Hue", hue);
+                       NotifyValueChanged ("HueColor", new SolidColor (Color.FromHSV (hue)));
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/ILayoutable.cs b/Crow/src/GraphicObjects/ILayoutable.cs
new file mode 100644 (file)
index 0000000..c8aa38f
--- /dev/null
@@ -0,0 +1,55 @@
+//
+// ILayoutable.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+namespace Crow
+{
+       public interface ILayoutable
+       {
+               /// <summary> Parent in the graphic tree </summary>
+               ILayoutable Parent { get; set; }
+               /// <summary> The logical parent (used mainly for bindings) as opposed
+               ///  to the parent in the graphic tree </summary>
+               ILayoutable LogicalParent { get; set; }
+
+               Rectangle ClientRectangle { get; }
+               Rectangle getSlot();
+
+               bool ArrangeChildren { get; }
+               LayoutingType RegisteredLayoutings { get; set; }
+               void RegisterForLayouting(LayoutingType layoutType);
+               void RegisterClip(Rectangle clip);
+               bool UpdateLayout(LayoutingType layoutType);
+               bool PointIsIn(ref Point m);
+
+               Rectangle ContextCoordinates(Rectangle r);
+               Rectangle ScreenCoordinates (Rectangle r);
+
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/IMLContainer.cs b/Crow/src/GraphicObjects/IMLContainer.cs
new file mode 100644 (file)
index 0000000..8ba161a
--- /dev/null
@@ -0,0 +1,50 @@
+//
+// IMLContainer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow
+{
+       public class IMLContainer : PrivateContainer
+       {
+               public IMLContainer () : base()
+               {
+               }
+
+               string path;
+
+               public string Path {
+                       get { return path; }
+                       set {
+                               if (path == value)
+                                       return;
+                               path = value;
+                               this.SetChild (IFace.CreateInstance (path));
+                               NotifyValueChanged ("Path", path);
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/IValueChange.cs b/Crow/src/GraphicObjects/IValueChange.cs
new file mode 100644 (file)
index 0000000..7e18e5e
--- /dev/null
@@ -0,0 +1,36 @@
+//
+// IValueChange.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       public interface IValueChange
+       {
+               event EventHandler<ValueChangeEventArgs> ValueChanged;
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Image.cs b/Crow/src/GraphicObjects/Image.cs
new file mode 100644 (file)
index 0000000..2791d08
--- /dev/null
@@ -0,0 +1,215 @@
+//
+// Image.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using vkvg;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
+
+
+namespace Crow
+{
+       /// <summary>
+       /// Base widget to display an image. Accepts bitmaps and SVGs.
+       /// </summary>
+       /// <remarks>
+       /// </remarks>
+       public class Image : Widget
+       {
+               Picture _pic;
+               string _svgSub;
+               bool scaled, keepProps;
+               double opacity;
+
+               #region Public properties
+               /// <summary>
+               /// If false, original size will be kept in any case.
+               /// </summary>
+               [DefaultValue(true)]
+               public virtual bool Scaled {
+                       get { return scaled; }
+                       set {
+                               if (scaled == value)
+                                       return;
+                               scaled = value;
+                               NotifyValueChanged ("Scaled", scaled);
+                               if (_pic == null)
+                                       return;
+                               _pic.Scaled = scaled;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>
+               /// If image is scaled, proportions will be preserved.
+               /// </summary>
+               [DefaultValue(true)]
+               public virtual bool KeepProportions {
+                       get { return keepProps; }
+                       set {
+                               if (keepProps == value)
+                                       return;
+                               keepProps = value;
+                               NotifyValueChanged ("KeepProportions", keepProps);
+                               if (_pic == null)
+                                       return;
+                               _pic.KeepProportions = keepProps;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>
+               /// Image file path, may be on disk or embedded. Accepts bitmaps or SVG drawings.
+               /// </summary>
+        
+               public string Path {
+                       get { return _pic == null ? "" : _pic.Path; }
+                       set {
+                               if (value == Path)
+                                       return;
+                               try {
+                                       if (string.IsNullOrEmpty(value))
+                                               Picture = null;
+                                       else {
+                                               //lock(IFace.LayoutMutex){
+                                                       LoadImage (value);
+                                               //}
+                                       }
+                               } catch (Exception ex) {
+                                       Debug.WriteLine (ex.Message);
+                                       _pic = null;
+                               }
+                               NotifyValueChanged ("Path", Path);
+                       }
+               }
+               /// <summary>
+               /// Used only for svg images, repaint only node named referenced in SvgSub.
+               /// If null, all the svg is rendered
+               /// </summary>
+               
+               public string SvgSub {
+                       get { return _svgSub; }
+                       set {
+                               if (_svgSub == value)
+                                       return;
+                               _svgSub = value;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>
+               /// Object holding the image data once loaded, may be used directely to pupulate this control without 
+               /// specifying a path.
+               /// </summary>
+               
+               public Picture Picture {
+                       get { return _pic; }
+                       set {
+                               if (_pic == value)
+                                       return;
+                               _pic = value;
+                               NotifyValueChanged ("Picture", _pic);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>
+               /// Opacity parameter for the image
+               /// </summary>
+               // TODO:could be moved in GraphicObject
+               [DefaultValue(1.0)]
+               public virtual double Opacity {
+                       get { return opacity; }
+                       set {
+                               if (opacity == value)
+                                       return;
+                               opacity = value;
+                               NotifyValueChanged ("Faded", opacity);
+                               RegisterForRedraw ();
+                       }
+               }
+               #endregion
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of the <see cref="Crow.Image"/> class.
+               /// </summary>
+               protected Image () : base(){}
+               /// <summary>
+               /// Initializes a new instance of the <see cref="Crow.Image"/> class from code
+               /// </summary>
+               /// <param name="iface">interface to bound to</param>
+               public Image (Interface iface) : base(iface)
+               {
+               }
+               #endregion
+
+               #region Image Loading
+               public void LoadImage (string path)
+               {
+                       Picture pic;
+                       if (path.EndsWith (".svg", true, System.Globalization.CultureInfo.InvariantCulture))
+                               pic = new SvgPicture (path);
+                       else
+                               pic = new BmpPicture (path);
+
+
+                       pic.Scaled = scaled;
+                       pic.KeepProportions = keepProps;
+
+                       Picture = pic;
+               }
+               #endregion
+
+               #region GraphicObject overrides
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       if (_pic == null)
+                               return 2 * Margin;
+                               //_pic = "#Crow.Images.Icons.IconAlerte.svg";
+                       //TODO:take scalling in account
+                       if (lt == LayoutingType.Width)
+                               return _pic.Dimensions.Width + 2 * Margin;
+                       else
+                               return _pic.Dimensions.Height + 2 * Margin;
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       if (_pic == null)
+                               return;
+
+                       _pic.Paint (gr, ClientRectangle, _svgSub);
+
+                       if (Opacity<1.0) {
+                               gr.SetSourceColor (0.0, 0.0, 0.0, 1.0-Opacity);
+                               gr.Operator = Operator.DestOut;
+                               gr.Rectangle (ClientRectangle);
+                               gr.Fill ();
+                               gr.Operator = Operator.Over;
+                       }
+               }
+               #endregion
+       }
+}
diff --git a/Crow/src/GraphicObjects/Label.cs b/Crow/src/GraphicObjects/Label.cs
new file mode 100644 (file)
index 0000000..0cd3868
--- /dev/null
@@ -0,0 +1,845 @@
+//
+// Label.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Diagnostics;
+using vkvg;
+using System.Text.RegularExpressions;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+    public class Label : Widget
+    {
+               #region CTOR
+               protected Label () : base(){}
+
+               public Label(Interface iface) : base(iface)
+               {
+
+               }
+//             public Label(string _text)
+//                     : base()
+//             {
+//                     Text = _text;
+//             }
+               #endregion
+
+               public event EventHandler<TextChangeEventArgs> TextChanged;
+
+               public virtual void OnTextChanged(Object sender, TextChangeEventArgs e)
+               {
+                       textMeasureIsUpToDate = false;
+                       NotifyValueChanged ("Text", Text);
+                       TextChanged.Raise (this, e);
+               }
+        //TODO:change protected to private
+
+               #region private and protected fields
+               string _text = "label";
+        Alignment _textAlignment;
+               bool horizontalStretch;
+               bool verticalStretch;
+               bool _selectable;
+               bool _multiline;
+               Color selBackground;
+               Color selForeground;
+               Point mouseLocalPos = -1;//mouse coord in widget space, filled only when clicked
+               int _currentCol;        //0 based cursor position in string
+               int _currentLine;
+               Point _selBegin = -1;   //selection start (row,column)
+               Point _selRelease = -1; //selection end (row,column)
+               double textCursorPos;   //cursor position in cairo units in widget client coord.
+               double SelStartCursorPos = -1;
+               double SelEndCursorPos = -1;
+               bool SelectionInProgress = false;
+
+        protected Rectangle rText;
+               protected float widthRatio = 1f;
+               protected float heightRatio = 1f;
+               protected FontExtents fe;
+               protected TextExtents te;
+               #endregion
+
+               [DefaultValue("SteelBlue")]
+               public virtual Color SelectionBackground {
+                       get { return selBackground; }
+                       set {
+                               if (value == selBackground)
+                                       return;
+                               selBackground = value;
+                               NotifyValueChanged ("SelectionBackground", selBackground);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue("White")]
+               public virtual Color SelectionForeground {
+                       get { return selForeground; }
+                       set {
+                               if (value == selForeground)
+                                       return;
+                               selForeground = value;
+                               NotifyValueChanged ("SelectionForeground", selForeground);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(Alignment.Left)]
+               public Alignment TextAlignment
+        {
+            get { return _textAlignment; }
+            set {
+                               if (value == _textAlignment)
+                                       return;
+                               _textAlignment = value;
+                               RegisterForRedraw ();
+                               NotifyValueChanged ("TextAlignment", _textAlignment);
+                       }
+        }
+               [DefaultValue(false)]
+               public virtual bool HorizontalStretch {
+                       get { return horizontalStretch; }
+                       set {
+                               if (horizontalStretch == value)
+                                       return;
+                               horizontalStretch = value;
+                               RegisterForRedraw ();
+                               NotifyValueChanged ("HorizontalStretch", horizontalStretch);
+                       }
+               }
+               [DefaultValue(false)]
+               public virtual bool VerticalStretch {
+                       get { return verticalStretch; }
+                       set {
+                               if (verticalStretch == value)
+                                       return;
+                               verticalStretch = value;
+                               RegisterForRedraw ();
+                               NotifyValueChanged ("VerticalStretch", verticalStretch);
+                       }
+               }
+               [DefaultValue("label")]
+        public string Text
+        {
+            get {
+                               return lines == null ?
+                                       _text : lines.Aggregate((i, j) => i + Interface.LineBreak + j);
+                       }
+            set
+            {
+                               if (string.Equals (value, _text, StringComparison.Ordinal))
+                    return;
+
+                _text = value;
+
+                               if (string.IsNullOrEmpty(_text))
+                                       _text = "";
+
+                               lines = getLines;
+
+                               OnTextChanged (this, new TextChangeEventArgs (Text));
+                               RegisterForGraphicUpdate ();
+            }
+        }
+               [DefaultValue(false)]
+               public bool Selectable
+               {
+                       get { return _selectable; }
+                       set
+                       {
+                               if (value == _selectable)
+                                       return;
+                               _selectable = value;
+                               NotifyValueChanged ("Selectable", _selectable);
+                               SelBegin = -1;
+                               SelRelease = -1;
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(false)]
+               public bool Multiline
+               {
+                       get { return _multiline; }
+                       set
+                       {
+                               if (value == _multiline)
+                                       return;
+                               _multiline = value;
+                               NotifyValueChanged ("Multiline", _multiline);
+                               RegisterForGraphicUpdate();
+                       }
+               }
+               [DefaultValue(0)]
+               public int CurrentColumn{
+                       get { return _currentCol; }
+                       set {
+                               if (value == _currentCol)
+                                       return;
+                               if (value < 0)
+                                       _currentCol = 0;
+                               else if (value > lines [_currentLine].Length)
+                                       _currentCol = lines [_currentLine].Length;
+                               else
+                                       _currentCol = value;
+                               NotifyValueChanged ("CurrentColumn", _currentCol);
+                       }
+               }
+               [DefaultValue(0)]
+               public int CurrentLine{
+                       get { return _currentLine; }
+                       set {
+                               if (value == _currentLine)
+                                       return;
+                               if (value >= lines.Count)
+                                       _currentLine = lines.Count-1;
+                               else if (value < 0)
+                                       _currentLine = 0;
+                               else
+                                       _currentLine = value;
+                               //force recheck of currentCol for bounding
+                               int cc = _currentCol;
+                               _currentCol = 0;
+                               CurrentColumn = cc;
+                               NotifyValueChanged ("CurrentLine", _currentLine);
+                       }
+               }
+               [XmlIgnore]public Point CurrentPosition {
+                       get { return new Point(_currentCol, CurrentLine); }
+               }
+               //TODO:using HasFocus for drawing selection cause SelBegin and Release binding not to work
+               /// <summary>
+               /// Selection begin position in char units
+               /// </summary>
+               [DefaultValue("-1")]
+               public Point SelBegin {
+                       get {
+                               return _selBegin;
+                       }
+                       set {
+                               if (value == _selBegin)
+                                       return;
+                               _selBegin = value;
+                               NotifyValueChanged ("SelBegin", _selBegin);
+                               NotifyValueChanged ("SelectedText", SelectedText);
+                       }
+               }
+               [DefaultValue("-1")]
+               public Point SelRelease {
+                       get {
+                               return _selRelease;
+                       }
+                       set {
+                               if (value == _selRelease)
+                                       return;
+                               _selRelease = value;
+                               NotifyValueChanged ("SelRelease", _selRelease);
+                               NotifyValueChanged ("SelectedText", SelectedText);
+                       }
+               }
+               /// <summary>
+               /// return char at CurrentLine, CurrentColumn
+               /// </summary>
+               [XmlIgnore]protected Char CurrentChar
+               {
+                       get {
+                               return lines [CurrentLine] [CurrentColumn];
+                       }
+               }
+               /// <summary>
+               /// ordered selection start and end positions in char units
+               /// </summary>
+               [XmlIgnore]protected Point selectionStart
+               {
+                       get {
+                               return SelRelease < 0 || SelBegin.Y < SelRelease.Y ? SelBegin :
+                                       SelBegin.Y > SelRelease.Y ? SelRelease :
+                                       SelBegin.X < SelRelease.X ? SelBegin : SelRelease;
+                       }
+               }
+               [XmlIgnore]public Point selectionEnd
+               {
+                       get {
+                               return SelRelease < 0 || SelBegin.Y > SelRelease.Y ? SelBegin :
+                                       SelBegin.Y < SelRelease.Y ? SelRelease :
+                                       SelBegin.X > SelRelease.X ? SelBegin : SelRelease;
+                       }
+               }
+               [XmlIgnore]public string SelectedText
+               {
+                       get {
+
+                               if (SelRelease < 0 || SelBegin < 0)
+                                       return "";
+                               if (selectionStart.Y == selectionEnd.Y)
+                                       return lines [selectionStart.Y].Substring (selectionStart.X, selectionEnd.X - selectionStart.X);
+                               string tmp = "";
+                               tmp = lines [selectionStart.Y].Substring (selectionStart.X);
+                               for (int l = selectionStart.Y + 1; l < selectionEnd.Y; l++) {
+                                       tmp += Interface.LineBreak + lines [l];
+                               }
+                               tmp += Interface.LineBreak + lines [selectionEnd.Y].Substring (0, selectionEnd.X);
+                               return tmp;
+                       }
+               }
+               [XmlIgnore]public bool selectionIsEmpty
+               { get { return SelRelease < 0; } }
+
+               List<string> lines;
+               List<string> getLines {
+                       get {
+                               return _multiline ?
+                                       Regex.Split (_text, "\r\n|\r|\n|\\\\n").ToList() :
+                                       new List<string>(new string[] { _text });
+                       }
+               }
+               /// <summary>
+               /// Moves cursor one char to the left.
+               /// </summary>
+               /// <returns><c>true</c> if move succeed</returns>
+               public bool MoveLeft(){
+                       int tmp = _currentCol - 1;
+                       if (tmp < 0) {
+                               if (_currentLine == 0)
+                                       return false;
+                               CurrentLine--;
+                               CurrentColumn = int.MaxValue;
+                       } else
+                               CurrentColumn = tmp;
+                       return true;
+               }
+               /// <summary>
+               /// Moves cursor one char to the right.
+               /// </summary>
+               /// <returns><c>true</c> if move succeed</returns>
+               public bool MoveRight(){
+                       int tmp = _currentCol + 1;
+                       if (tmp > lines [_currentLine].Length){
+                               if (CurrentLine == lines.Count - 1)
+                                       return false;
+                               CurrentLine++;
+                               CurrentColumn = 0;
+                       } else
+                               CurrentColumn = tmp;
+                       return true;
+               }
+               public void GotoWordStart(){
+                       CurrentColumn--;
+                       //skip white spaces
+                       while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn > 0)
+                               CurrentColumn--;
+                       while (char.IsLetterOrDigit (lines [CurrentLine] [CurrentColumn]) && CurrentColumn > 0)
+                               CurrentColumn--;
+                       if (!char.IsLetterOrDigit (this.CurrentChar))
+                               CurrentColumn++;
+               }
+               public void GotoWordEnd(){
+                       //skip white spaces
+                       if (CurrentColumn >= lines [CurrentLine].Length - 1)
+                               return;
+                       while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < lines [CurrentLine].Length-1)
+                               CurrentColumn++;
+                       while (char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < lines [CurrentLine].Length-1)
+                               CurrentColumn++;
+                       if (char.IsLetterOrDigit (this.CurrentChar))
+                               CurrentColumn++;
+               }
+               public void DeleteChar()
+               {
+                       if (selectionIsEmpty) {
+                               if (CurrentColumn == 0) {
+                                       if (CurrentLine == 0 && lines.Count == 1)
+                                               return;
+                                       CurrentLine--;
+                                       CurrentColumn = lines [CurrentLine].Length;
+                                       lines [CurrentLine] += lines [CurrentLine + 1];
+                                       lines.RemoveAt (CurrentLine + 1);
+
+                                       OnTextChanged (this, new TextChangeEventArgs (Text));
+                                       return;
+                               }
+                               CurrentColumn--;
+                               lines [CurrentLine] = lines [CurrentLine].Remove (CurrentColumn, 1);
+                       } else {
+                               int linesToRemove = selectionEnd.Y - selectionStart.Y + 1;
+                               int l = selectionStart.Y;
+
+                               if (linesToRemove > 0) {
+                                       lines [l] = lines [l].Remove (selectionStart.X, lines [l].Length - selectionStart.X) +
+                                               lines [selectionEnd.Y].Substring (selectionEnd.X, lines [selectionEnd.Y].Length - selectionEnd.X);
+                                       l++;
+                                       for (int c = 0; c < linesToRemove-1; c++)
+                                               lines.RemoveAt (l);
+                                       CurrentLine = selectionStart.Y;
+                                       CurrentColumn = selectionStart.X;
+                               } else
+                                       lines [l] = lines [l].Remove (selectionStart.X, selectionEnd.X - selectionStart.X);
+                               CurrentColumn = selectionStart.X;
+                               SelBegin = -1;
+                               SelRelease = -1;
+                       }
+                       OnTextChanged (this, new TextChangeEventArgs (Text));
+               }
+               /// <summary>
+               /// Insert new string at caret position, should be sure no line break is inside.
+               /// </summary>
+               /// <param name="str">String.</param>
+               protected void Insert(string str)
+               {
+                       if (!selectionIsEmpty)
+                               this.DeleteChar ();
+                       if (_multiline) {
+                               string[] strLines = Regex.Split (str, "\r\n|\r|\n|" + @"\\n").ToArray();
+                               lines [CurrentLine] = lines [CurrentLine].Insert (CurrentColumn, strLines[0]);
+                               CurrentColumn += strLines[0].Length;
+                               for (int i = 1; i < strLines.Length; i++) {
+                                       InsertLineBreak ();
+                                       lines [CurrentLine] = lines [CurrentLine].Insert (CurrentColumn, strLines[i]);
+                                       CurrentColumn += strLines[i].Length;
+                               }
+                       } else {
+                               lines [CurrentLine] = lines [CurrentLine].Insert (CurrentColumn, str);
+                               CurrentColumn += str.Length;
+                       }
+                       OnTextChanged (this, new TextChangeEventArgs (Text));
+               }
+               /// <summary>
+               /// Insert a line break.
+               /// </summary>
+               protected void InsertLineBreak()
+               {
+                       lines.Insert(CurrentLine + 1, lines[CurrentLine].Substring(CurrentColumn));
+                       lines [CurrentLine] = lines [CurrentLine].Substring (0, CurrentColumn);
+                       CurrentLine++;
+                       CurrentColumn = 0;
+                       OnTextChanged (this, new TextChangeEventArgs (Text));
+               }
+               bool textMeasureIsUpToDate = false;
+               Size cachedTextSize = default(Size);
+
+               #region GraphicObject overrides
+               protected override int measureRawSize(LayoutingType lt)
+               {
+                       if (lines == null)
+                               lines = getLines;
+                       if (!textMeasureIsUpToDate) {
+                               using (Context gr = new Context (IFace.surf)) {
+                                       //Cairo.FontFace cf = gr.GetContextFontFace ();
+
+                                       gr.FontFace = Font.Name;
+                                       gr.FontSize = (uint)Font.Size;
+                                       //gr.FontOptions = Interface.FontRenderingOptions;
+                                       //gr.Antialias = Interface.Antialias;
+
+                                       fe = gr.FontExtents;
+                                       te = new TextExtents ();
+
+                                       cachedTextSize.Height = (int)Math.Ceiling ((fe.Ascent+fe.Descent) * Math.Max (1, lines.Count)) + Margin * 2;
+
+                                       try {
+                                               for (int i = 0; i < lines.Count; i++) {
+                                                       string l = lines[i].Replace ("\t", new String (' ', Interface.TabSize));
+
+                                                       TextExtents tmp = gr.TextExtents (l);
+
+                                                       if (tmp.XAdvance > te.XAdvance)
+                                                               te = tmp;
+                                               }
+                                               cachedTextSize.Width = (int)Math.Ceiling (te.XAdvance) + Margin * 2;
+                                               textMeasureIsUpToDate = true;
+                                       } catch {                                                       
+                                               return -1;
+                                       }                                       
+                               }
+
+                       }
+                       return lt == LayoutingType.Height ? cachedTextSize.Height : cachedTextSize.Width;
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       gr.FontFace = Font.Name;
+                       gr.FontSize = (uint)Font.Size;
+                       //gr.FontOptions = Interface.FontRenderingOptions;
+                       //gr.Antialias = Interface.Antialias;
+
+                       rText = new Rectangle(new Size(
+                               measureRawSize(LayoutingType.Width), measureRawSize(LayoutingType.Height)));
+                       rText.Width -= 2 * Margin;
+                       rText.Height -= 2 * Margin;
+
+                       widthRatio = 1f;
+                       heightRatio = 1f;
+
+                       Rectangle cb = ClientRectangle;
+
+                       rText.X = cb.X;
+                       rText.Y = cb.Y;
+
+                       if (horizontalStretch) {
+                               widthRatio = (float)cb.Width / (float)rText.Width;
+                               if (!verticalStretch)
+                                       heightRatio = widthRatio;
+                       }
+
+                       if (verticalStretch) {
+                               heightRatio = (float)cb.Height / (float)rText.Height;
+                               if (!horizontalStretch)
+                                       widthRatio = heightRatio;
+                       }
+
+                       rText.Width = (int)(widthRatio * (float)rText.Width);
+                       rText.Height = (int)(heightRatio * (float)rText.Height);
+
+                       switch (TextAlignment)
+                       {
+                       case Alignment.TopLeft:     //ok
+                               rText.X = cb.X;
+                               rText.Y = cb.Y;
+                               break;
+                       case Alignment.Top:   //ok
+                               rText.Y = cb.Y;
+                               rText.X = cb.X + cb.Width / 2 - rText.Width / 2;
+                               break;
+                       case Alignment.TopRight:    //ok
+                               rText.Y = cb.Y;
+                               rText.X = cb.Right - rText.Width;
+                               break;
+                       case Alignment.Left://ok
+                               rText.X = cb.X;
+                               rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+                               break;
+                       case Alignment.Right://ok
+                               rText.X = cb.X + cb.Width - rText.Width;
+                               rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+                               break;
+                       case Alignment.Bottom://ok
+                               rText.X = cb.Width / 2 - rText.Width / 2;
+                               rText.Y = cb.Height - rText.Height;
+                               break;
+                       case Alignment.BottomLeft://ok
+                               rText.X = cb.X;
+                               rText.Y = cb.Bottom - rText.Height;
+                               break;
+                       case Alignment.BottomRight://ok
+                               rText.Y = cb.Bottom - rText.Height;
+                               rText.X = cb.Right - rText.Width;
+                               break;
+                       case Alignment.Center://ok
+                               rText.X = cb.X + cb.Width / 2 - rText.Width / 2;
+                               //rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+                               rText.Y = cb.Y + (int)Math.Floor((double)cb.Height / 2.0 - (double)rText.Height / 2.0);
+                               break;
+                       }
+
+                       //gr.FontMatrix = new Matrix(widthRatio * (float)Font.Size, 0, 0, heightRatio * (float)Font.Size, 0, 0);
+                       fe = gr.FontExtents;
+
+                       #region draw text cursor
+                       if (HasFocus && Selectable)
+                       {
+                               if (mouseLocalPos >= 0)
+                               {
+                                       computeTextCursor(gr);
+
+                                       if (SelectionInProgress)
+                                       {
+                                               if (SelBegin < 0){
+                                                       SelBegin = new Point(CurrentColumn, CurrentLine);
+                                                       SelStartCursorPos = textCursorPos;
+                                                       SelRelease = -1;
+                                               }else{
+                                                       SelRelease = new Point(CurrentColumn, CurrentLine);
+                                                       if (SelRelease == SelBegin)
+                                                               SelRelease = -1;
+                                                       else
+                                                               SelEndCursorPos = textCursorPos;
+                                               }
+                                       }else
+                                               computeTextCursorPosition(gr);
+                               }else
+                                       computeTextCursorPosition(gr);
+
+                               Foreground.SetAsSource (gr);
+                               gr.LineWidth = 1.0;
+                               gr.MoveTo (0.5 + textCursorPos + rText.X, rText.Y + CurrentLine * (fe.Ascent+fe.Descent));
+                               gr.LineTo (0.5 + textCursorPos + rText.X, rText.Y + (CurrentLine + 1) * (fe.Ascent+fe.Descent));
+                               gr.Stroke();
+                       }
+                       #endregion
+
+                       //****** debug selection *************
+//                     if (SelRelease >= 0) {
+//                             new SolidColor(Color.DarkGreen).SetAsSource(gr);
+//                             Rectangle R = new Rectangle (
+//                                                  rText.X + (int)SelEndCursorPos - 3,
+//                                                  rText.Y + (int)(SelRelease.Y * (fe.Ascent+fe.Descent)),
+//                                                  6,
+//                                                  (int)(fe.Ascent+fe.Descent));
+//                             gr.Rectangle (R);
+//                             gr.Fill ();
+//                     }
+//                     if (SelBegin >= 0) {
+//                             new SolidColor(Color.DarkRed).SetAsSource(gr);
+//                             Rectangle R = new Rectangle (
+//                                     rText.X + (int)SelStartCursorPos - 3,
+//                                     rText.Y + (int)(SelBegin.Y * (fe.Ascent+fe.Descent)),
+//                                     6,
+//                                     (int)(fe.Ascent+fe.Descent));
+//                             gr.Rectangle (R);
+//                             gr.Fill ();
+//                     }
+                       //*******************
+
+                       for (int i = 0; i < lines.Count; i++) {
+                               string l = lines [i].Replace ("\t", new String (' ', Interface.TabSize));
+                               int lineLength = (int)gr.TextExtents (l).XAdvance;
+                               Rectangle lineRect = new Rectangle (
+                                       rText.X,
+                                       rText.Y + i * (int)(fe.Ascent+fe.Descent),
+                                       lineLength,
+                                       (int)(fe.Ascent+fe.Descent));
+
+//                             if (TextAlignment == Alignment.Center ||
+//                                     TextAlignment == Alignment.Top ||
+//                                     TextAlignment == Alignment.Bottom)
+//                                     lineRect.X += (rText.Width - lineLength) / 2;
+//                             else if (TextAlignment == Alignment.Right ||
+//                                     TextAlignment == Alignment.TopRight ||
+//                                     TextAlignment == Alignment.BottomRight)
+//                                     lineRect.X += (rText.Width - lineLength);
+                               if (string.IsNullOrWhiteSpace (l))
+                                       continue;
+
+                               Foreground.SetAsSource (gr);
+                               gr.MoveTo (lineRect.X,(double)rText.Y + fe.Ascent + (fe.Ascent+fe.Descent) * i) ;
+
+                gr.ShowText (l);
+                               gr.Fill ();
+
+                               if (Selectable) {
+                                       if (SelRelease >= 0 && i >= selectionStart.Y && i <= selectionEnd.Y) {
+                                               gr.SetSourceColor (selBackground);
+
+                                               Rectangle selRect = lineRect;
+
+                                               int cpStart = (int)SelStartCursorPos,
+                                               cpEnd = (int)SelEndCursorPos;
+
+                                               if (SelBegin.Y > SelRelease.Y) {
+                                                       cpStart = cpEnd;
+                                                       cpEnd = (int)SelStartCursorPos;
+                                               }
+
+                                               if (i == selectionStart.Y) {
+                                                       selRect.Width -= cpStart;
+                                                       selRect.Left += cpStart;
+                                               }
+                                               if (i == selectionEnd.Y)
+                                                       selRect.Width -= (lineLength - cpEnd);
+
+                                               gr.Rectangle (selRect);
+                                               gr.FillPreserve ();
+                                               gr.Save ();
+                                               gr.Clip ();
+                                               gr.SetSourceColor (SelectionForeground);
+                                               gr.MoveTo (lineRect.X, rText.Y + fe.Ascent + (fe.Ascent+fe.Descent) * i);
+                                               gr.ShowText (l);
+                                               gr.Fill ();
+                                               gr.Restore ();
+                                       }
+                               }
+                       }
+               }
+               #endregion
+
+               #region Mouse handling
+               void updatemouseLocalPos(Point mpos){
+                       mouseLocalPos = mpos - ScreenCoordinates(Slot).TopLeft - ClientRectangle.TopLeft;
+                       if (mouseLocalPos.X < 0)
+                               mouseLocalPos.X = 0;
+                       if (mouseLocalPos.Y < 0)
+                               mouseLocalPos.Y = 0;
+               }
+               public override void onMouseEnter (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseEnter (sender, e);
+                       //if (Selectable)
+                               //IFace.MouseCursor = MouseCursors.Text;
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (sender, e);
+                       //IFace.MouseCursor = MouseCursors.Default;
+               }
+               protected override void onFocused (object sender, EventArgs e)
+               {
+                       base.onFocused (sender, e);
+
+                       if (!_selectable)
+                               return;
+                       SelBegin = new Point(0,0);
+                       SelRelease = new Point (lines.LastOrDefault ().Length, lines.Count-1);
+                       RegisterForRedraw ();
+               }
+               protected override void onUnfocused (object sender, EventArgs e)
+               {
+                       base.onUnfocused (sender, e);
+
+                       SelBegin = -1;
+                       SelRelease = -1;
+                       RegisterForRedraw ();
+               }
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       if (!(SelectionInProgress && HasFocus && _selectable))
+                               return;
+
+                       updatemouseLocalPos (e.Position);
+
+                       RegisterForRedraw();
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       if (this.HasFocus && _selectable){
+                               updatemouseLocalPos (e.Position);
+                               SelBegin = -1;
+                               SelRelease = -1;
+                               SelectionInProgress = true;
+                               RegisterForRedraw();//TODO:should put it in properties
+                       }
+
+                       //done at the end to set 'hasFocus' value after testing it
+                       base.onMouseDown (sender, e);
+               }
+               public override void onMouseUp (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+                       if (!(this.HasFocus || _selectable))
+                               return;
+                       if (!SelectionInProgress)
+                               return;
+
+                       updatemouseLocalPos (e.Position);
+                       SelectionInProgress = false;
+                       RegisterForRedraw ();
+               }
+               public override void onMouseDoubleClick (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDoubleClick (sender, e);
+                       if (!(this.HasFocus || _selectable))
+                               return;
+                       
+                       GotoWordStart ();
+                       SelBegin = CurrentPosition;
+                       GotoWordEnd ();
+                       SelRelease = CurrentPosition;
+                       SelectionInProgress = false;
+                       RegisterForRedraw ();
+               }
+               #endregion
+
+               /// <summary>
+               /// Update Current Column, line and TextCursorPos
+               /// from mouseLocalPos
+               /// </summary>
+               void computeTextCursor(Context gr)
+               {
+                       TextExtents te;
+
+                       double cPos = 0f;
+
+                       CurrentLine = (int)(mouseLocalPos.Y / (fe.Ascent+fe.Descent));
+
+                       //fix cu
+                       if (CurrentLine >= lines.Count)
+                               CurrentLine = lines.Count - 1;
+
+                       switch (TextAlignment) {
+                       case Alignment.Center:
+                       case Alignment.Top:
+                       case Alignment.Bottom:
+                               cPos+= ClientRectangle.Width - gr.TextExtents(lines [CurrentLine]).Width/2.0;
+                               break;
+                       case Alignment.Right:
+                       case Alignment.TopRight:
+                       case Alignment.BottomRight:
+                               cPos += ClientRectangle.Width - gr.TextExtents(lines [CurrentLine]).Width;
+                               break;
+                       }
+
+                       for (int i = 0; i < lines[CurrentLine].Length; i++)
+                       {
+                               string c = lines [CurrentLine].Substring (i, 1);
+                               if (c == "\t")
+                                       c = new string (' ', Interface.TabSize);
+
+                               te = gr.TextExtents(c);
+
+                               double halfWidth = te.XAdvance / 2;
+
+                               if (mouseLocalPos.X <= cPos + halfWidth)
+                               {
+                                       CurrentColumn = i;
+                                       textCursorPos = cPos;
+                                       mouseLocalPos = -1;
+                                       return;
+                               }
+
+                               cPos += te.XAdvance;
+                       }
+                       CurrentColumn = lines[CurrentLine].Length;
+                       textCursorPos = cPos;
+
+                       //reset mouseLocalPos
+                       mouseLocalPos = -1;
+               }
+               /// <summary> Computes offsets in cairo units </summary>
+               void computeTextCursorPosition(Context gr)
+               {
+                       if (SelBegin >= 0)
+                               SelStartCursorPos = GetXFromTextPointer (gr, SelBegin);
+                       if (SelRelease >= 0)
+                               SelEndCursorPos = GetXFromTextPointer (gr, SelRelease);
+                       textCursorPos = GetXFromTextPointer (gr, new Point(CurrentColumn, CurrentLine));
+               }
+               /// <summary> Compute x offset in cairo unit from text position </summary>
+               double GetXFromTextPointer(Context gr, Point pos)
+               {
+                       try {
+                               string l = lines [pos.Y].Substring (0, pos.X).
+                                       Replace ("\t", new String (' ', Interface.TabSize));
+                               return gr.TextExtents (l).XAdvance;
+                       } catch{
+                               return -1;
+                       }
+               }
+    }
+}
diff --git a/Crow/src/GraphicObjects/ListBox.cs b/Crow/src/GraphicObjects/ListBox.cs
new file mode 100644 (file)
index 0000000..438e8d6
--- /dev/null
@@ -0,0 +1,48 @@
+//
+// ListBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.IO;
+using System.Diagnostics;
+using System.Xml;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace Crow
+{
+       public class ListBox : TemplatedGroup
+       {
+               #region CTOR
+               protected ListBox () : base(){}
+               public ListBox (Interface iface) : base(iface) {}
+               #endregion
+
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Menu.cs b/Crow/src/GraphicObjects/Menu.cs
new file mode 100644 (file)
index 0000000..85f5485
--- /dev/null
@@ -0,0 +1,82 @@
+//
+// Menu.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       public class Menu : TemplatedGroup
+       {
+               #region CTOR
+               protected Menu () : base(){}
+               public Menu (Interface iface) : base(iface) {}
+               #endregion
+
+               Orientation orientation;
+               bool autoOpen = false;
+
+               #region Public properties
+               [DefaultValue(Orientation.Horizontal)]
+               public Orientation Orientation {
+                       get { return orientation; }
+                       set {
+                               if (orientation == value)
+                                       return;
+                               orientation = value;
+                               NotifyValueChanged ("Orientation", orientation);
+                       }
+               }
+               [XmlIgnore]public bool AutomaticOpening
+               {
+                       get { return autoOpen; }
+                       set     {
+                               if (autoOpen == value)
+                                       return;
+                               autoOpen = value;
+                               NotifyValueChanged ("AutomaticOpening", autoOpen);
+                       }
+               }
+               #endregion
+
+               public override void AddItem (Widget g)
+               {                       
+                       base.AddItem (g);
+
+                       if (orientation == Orientation.Horizontal)
+                               g.NotifyValueChanged ("PopDirection", Alignment.Bottom);
+                       else
+                               g.NotifyValueChanged ("PopDirection", Alignment.Right);
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (sender, e);
+                       AutomaticOpening = false;
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/MenuItem.cs b/Crow/src/GraphicObjects/MenuItem.cs
new file mode 100644 (file)
index 0000000..5cfce44
--- /dev/null
@@ -0,0 +1,193 @@
+//
+// MenuItem.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       public class MenuItem : Menu
+       {
+               #region CTOR
+               protected MenuItem () : base(){}
+               public MenuItem (Interface iface) : base(iface) {}
+               #endregion
+
+               public event EventHandler Open;
+               public event EventHandler Close;
+
+               Command command;
+               Picture icon;
+               bool isOpened;
+               Measure popWidth, popHeight;
+
+               #region Public properties
+               [DefaultValue(false)]
+               public bool IsOpened {
+                       get { return isOpened; }
+                       set {
+                               if (isOpened == value)
+                                       return;
+                               isOpened = value;
+                               NotifyValueChanged ("IsOpened", isOpened);
+
+                               if (isOpened) {
+                                       onOpen (this, null);
+                                       if (LogicalParent is Menu)
+                                               (LogicalParent as Menu).AutomaticOpening = true;
+                               }else
+                                       onClose (this, null);
+                       }
+               }
+               [DefaultValue(null)]
+               public virtual Command Command {
+                       get { return command; }
+                       set {
+                               if (command == value)
+                                       return;
+
+                               if (command != null) {
+                                       command.raiseAllValuesChanged ();
+                                       command.ValueChanged -= Command_ValueChanged;
+                               }
+
+                               command = value;
+
+                               if (command != null) {
+                                       command.ValueChanged += Command_ValueChanged;
+                                       command.raiseAllValuesChanged ();
+                               }
+
+                               NotifyValueChanged ("Command", command);
+                       }
+               }
+               
+               public override bool IsEnabled {
+                       get { return Command == null ? base.IsEnabled : Command.CanExecute; }
+                       set { base.IsEnabled = value; }
+               }
+               
+               public override string Caption {
+                       get { return Command == null ? base.Caption : Command.Caption; }
+                       set { base.Caption = value; }
+               }
+               
+               public Picture Icon {
+                       get { return Command == null ? icon : Command.Icon;; }
+                       set {
+                               if (icon == value)
+                                       return;
+                               icon = value;
+                               if (command == null)
+                                       NotifyValueChanged ("Icon", icon);
+                       }
+               }
+               [DefaultValue("Fit")]
+               public virtual Measure PopWidth {
+                       get { return popWidth; }
+                       set {
+                               if (popWidth == value)
+                                       return;
+                               popWidth = value;
+                               NotifyValueChanged ("PopWidth", popWidth);
+                       }
+               }
+               [DefaultValue("Fit")]
+               public virtual Measure PopHeight {
+                       get { return popHeight; }
+                       set {
+                               if (popHeight == value)
+                                       return;
+                               popHeight = value;
+                               NotifyValueChanged ("PopHeight", popHeight);
+                       }
+               }
+               #endregion
+
+               public override void AddItem (Widget g)
+               {
+                       base.AddItem (g);
+                       g.NotifyValueChanged ("PopDirection", Alignment.Right);
+               }
+
+               void Command_ValueChanged (object sender, ValueChangeEventArgs e)
+               {
+                       string mName = e.MemberName;
+                       if (mName == "CanExecute")
+                               mName = "IsEnabled";
+                       NotifyValueChanged (mName, e.NewValue);
+               }
+               protected virtual void onOpen (object sender, EventArgs e){
+                       Open.Raise (this, null);
+               }
+               protected virtual void onClose (object sender, EventArgs e){
+                       System.Diagnostics.Debug.WriteLine ("close: " + this.ToString());
+                       Close.Raise (this, null);
+               }
+               public override bool MouseIsIn (Point m)
+               {
+                       return IsEnabled && !IsDragged ? base.MouseIsIn (m) || child.MouseIsIn (m) : false;
+               }
+               public override void onMouseEnter (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseEnter (sender, e);
+                       Menu menu = LogicalParent as Menu;
+                       if (menu == null)
+                               return;
+                       if (menu.AutomaticOpening && items.Children.Count>0)
+                               IsOpened = true;
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       if (IsOpened)
+                               IsOpened = false;
+                       base.onMouseLeave (this, e);
+               }
+               public override void onMouseClick (object sender, MouseButtonEventArgs e)
+               {
+                       if (command != null) {
+                               command.Execute ();
+                               closeMenu ();
+                       }
+                       if (hasClick)
+                               base.onMouseClick (sender, e);
+
+                       if (!IsOpened)
+                               (LogicalParent as Menu).AutomaticOpening = false;
+               }
+               void closeMenu () {
+                       MenuItem tmp = LogicalParent as MenuItem;
+                       while (tmp != null) {
+                               tmp.IsOpened = false;
+                               tmp.Background = Color.Transparent;
+                               tmp.AutomaticOpening = false;
+                               tmp = tmp.LogicalParent as MenuItem;
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/MessageBox.cs b/Crow/src/GraphicObjects/MessageBox.cs
new file mode 100644 (file)
index 0000000..c5af95f
--- /dev/null
@@ -0,0 +1,203 @@
+//
+// MessageBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       public class MessageBox : Window
+       {
+               #region CTOR
+               protected MessageBox () : base(){}
+               public MessageBox (Interface iface) : base(iface){}
+               #endregion
+
+               public enum Type {
+                       None,
+                       Information,
+                       Alert,
+                       Error,
+                       YesNo,
+                       YesNoCancel,
+
+               }
+
+               protected override void loadTemplate (Widget template)
+               {
+                       base.loadTemplate (template);
+                       NotifyValueChanged ("MsgIcon", "#Crow.Icons.iconInfo.svg");
+               }
+               string message, okMessage, cancelMessage, noMessage;
+               Type msgType = Type.None;
+
+               public event EventHandler Yes;
+               public event EventHandler No;
+               public event EventHandler Cancel;
+
+               [DefaultValue("Informations")]
+               public virtual string Message
+               {
+                       get { return message; }
+                       set {
+                               if (message == value)
+                                       return;
+                               message = value;
+                               NotifyValueChanged ("Message", message);
+                       }
+               }
+               [DefaultValue("Ok")]
+               public virtual string OkMessage
+               {
+                       get { return okMessage; }
+                       set {
+                               if (okMessage == value)
+                                       return;
+                               okMessage = value;
+                               NotifyValueChanged ("OkMessage", okMessage);
+                       }
+               }
+               [DefaultValue("Cancel")]
+               public virtual string CancelMessage
+               {
+                       get { return cancelMessage; }
+                       set {
+                               if (cancelMessage == value)
+                                       return;
+                               cancelMessage = value;
+                               NotifyValueChanged ("CancelMessage", cancelMessage);
+                       }
+               }
+               [DefaultValue("No")]
+               public virtual string NoMessage
+               {
+                       get { return cancelMessage; }
+                       set {
+                               if (cancelMessage == value)
+                                       return;
+                               cancelMessage = value;
+                               NotifyValueChanged ("NoMessage", cancelMessage);
+                       }
+               }
+               [DefaultValue("Information")]
+               public virtual Type MsgType
+               {
+                       get { return msgType; }
+                       set {
+                               if (msgType == value)
+                                       return;
+                               msgType = value;
+                               NotifyValueChanged ("MsgType", msgType);
+                               switch (msgType) {
+                               case Type.Information:
+                                       MsgIcon = "#Crow.Icons.iconInfo.svg";
+                                       Caption = "Informations";
+                                       OkMessage = "Ok";
+                                       NotifyValueChanged ("CancelButIsVisible", false);
+                                       NotifyValueChanged ("NoButIsVisible", false);
+                                       break;
+                               case Type.YesNo:
+                               case Type.YesNoCancel:
+                                       MsgIcon = "#Crow.Icons.question.svg";
+                                       Caption = "Choice";
+                                       OkMessage = "Yes";
+                                       NoMessage = "No";
+                                       NotifyValueChanged ("CancelButIsVisible", msgType == Type.YesNoCancel);
+                                       NotifyValueChanged ("NoButIsVisible", true);
+                                       break;
+                               case Type.Alert:
+                                       MsgIcon = "#Crow.Icons.IconAlerte.svg";
+                                       Caption = "Alert";
+                                       OkMessage = "Ok";
+                                       CancelMessage = "Cancel";
+                                       NotifyValueChanged ("CancelButIsVisible", true);
+                                       NotifyValueChanged ("NoButIsVisible", false);
+                                       break;
+                               case Type.Error:
+                                       MsgIcon = "#Crow.Icons.exit.svg";
+                                       Caption = "Error";
+                                       OkMessage = "Ok";
+                                       NotifyValueChanged ("CancelButIsVisible", false);
+                                       NotifyValueChanged ("NoButIsVisible", false);
+                                       break;
+                               }
+                       }
+               }
+
+               string msgIcon = null;
+               public string MsgIcon {
+                       get { return msgIcon; }
+                       set {
+                               if (value == MsgIcon)
+                                       return;
+                               msgIcon = value;
+                               NotifyValueChanged ("MsgIcon", MsgIcon);
+                       }
+               }
+               void onOkButtonClick (object sender, EventArgs e)
+               {
+                       Yes.Raise (this, null);
+                       close ();
+               }
+               void onNoButtonClick (object sender, EventArgs e)
+               {
+                       No.Raise (this, null);
+                       close ();
+               }
+               void onCancelButtonClick (object sender, EventArgs e)
+               {
+                       Cancel.Raise (this, null);
+                       close ();
+               }
+               public static MessageBox Show (Interface iface, Type msgBoxType, string message, string okMsg = "", string cancelMsg = ""){
+                       lock (iface.UpdateMutex) {
+                               MessageBox mb = new MessageBox (iface);
+                               mb.IFace.AddWidget (mb);
+                               mb.MsgType = msgBoxType;
+                               mb.Message = message;
+                               if (!string.IsNullOrEmpty(okMsg))
+                                       mb.OkMessage = okMsg;
+                               if (!string.IsNullOrEmpty(cancelMsg))
+                                       mb.CancelMessage = cancelMsg;
+                               return mb;
+                       }
+               }
+               public static MessageBox ShowModal (Interface iface, Type msgBoxType, string message){
+                       lock (iface.UpdateMutex) {
+                               MessageBox mb = new MessageBox (iface) {
+                                       Modal = true,
+                                       MsgType = msgBoxType,
+                                       Message = message
+                               };
+
+                               iface.AddWidget (mb);
+                               return mb;
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/NumericControl.cs b/Crow/src/GraphicObjects/NumericControl.cs
new file mode 100644 (file)
index 0000000..7308331
--- /dev/null
@@ -0,0 +1,142 @@
+//
+// NumericControl.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       public abstract class NumericControl : TemplatedControl
+       {
+               #region CTOR
+               protected NumericControl () : base(){}
+               public NumericControl (Interface iface) : base(iface)
+               {
+               }
+//             public NumericControl(double minimum, double maximum, double step)
+//                     : base()
+//             {
+//             }
+               #endregion
+
+               #region private fields
+               double _actualValue, minValue, maxValue, smallStep, bigStep;
+               int _decimals;
+               #endregion
+
+               #region public properties
+               [DefaultValue(2)]
+               public int Decimals
+               {
+                       get { return _decimals; }
+                       set
+                       {
+                               if (value == _decimals)
+                                       return;
+                               _decimals = value;
+                               NotifyValueChanged("Decimals",  _decimals);
+                               RegisterForGraphicUpdate();
+                       }
+               }
+               [DefaultValue(0.0)]
+               public virtual double Minimum {
+                       get { return minValue; }
+                       set {
+                               if (minValue == value)
+                                       return;
+
+                               minValue = value;
+                               NotifyValueChanged ("Minimum", minValue);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(100.0)]
+               public virtual double Maximum
+               {
+                       get { return maxValue; }
+                       set {
+                               if (maxValue == value)
+                                       return;
+
+                               maxValue = value;
+                               NotifyValueChanged ("Maximum", maxValue);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(1.0)]
+               public virtual double SmallIncrement
+               {
+                       get { return smallStep; }
+                       set {
+                               if (smallStep == value)
+                                       return;
+
+                               smallStep = value;
+                               NotifyValueChanged ("SmallIncrement", smallStep);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(5.0)]
+               public virtual double LargeIncrement
+               {
+                       get { return bigStep; }
+                       set {
+                               if (bigStep == value)
+                                       return;
+
+                               bigStep = value;
+                               NotifyValueChanged ("LargeIncrement", bigStep);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(0.0)]
+               public double Value
+               {
+                       get { return _actualValue; }
+                       set
+                       {
+                               if (value == _actualValue)
+                                       return;
+
+                               if (value < minValue)
+                                       _actualValue = minValue;
+                               else if (value > maxValue)
+                                       _actualValue = maxValue;
+                               else                    
+                                       _actualValue = value;
+
+                               _actualValue = Math.Round (_actualValue, _decimals);
+
+                               NotifyValueChanged("Value",  _actualValue);
+                               RegisterForGraphicUpdate();
+                       }
+               }
+               #endregion
+
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Popper.cs b/Crow/src/GraphicObjects/Popper.cs
new file mode 100644 (file)
index 0000000..285c6e3
--- /dev/null
@@ -0,0 +1,250 @@
+//
+// Popper.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+    public class Popper : TemplatedContainer
+    {
+               #region CTOR
+               protected Popper () : base(){}
+               public Popper (Interface iface) : base(iface){}
+               #endregion
+
+               bool _isPopped, _canPop;
+               Alignment popDirection;
+               Widget _content;
+               Measure popWidth, popHeight;
+
+               public event EventHandler Popped;
+               public event EventHandler Unpoped;
+
+               #region Public Properties
+               [DefaultValue("Fit")]
+               public virtual Measure PopWidth {
+                       get { return popWidth; }
+                       set {
+                               if (popWidth == value)
+                                       return;
+                               popWidth = value;
+                               NotifyValueChanged ("PopWidth", popWidth);
+                       }
+               }
+               [DefaultValue("Fit")]
+               public virtual Measure PopHeight {
+                       get { return popHeight; }
+                       set {
+                               if (popHeight == value)
+                                       return;
+                               popHeight = value;
+                               NotifyValueChanged ("PopHeight", popHeight);
+                       }
+               }
+               [DefaultValue(false)]
+               public bool IsPopped
+               {
+                       get { return _isPopped; }
+                       set
+                       {
+                               if (!_canPop & value)
+                                       return;                                 
+                               
+                               if (value == _isPopped)
+                                       return;
+
+                               _isPopped = value;
+
+                               NotifyValueChanged ("IsPopped", _isPopped);
+
+                               if (_isPopped)
+                                       onPop (this, null);
+                               else
+                                       onUnpop (this, null);
+
+                       }
+               }
+               [DefaultValue(true)]
+               public bool CanPop
+               {
+                       get { return _canPop; }
+                       set
+                       {
+                               if (value == _canPop)
+                                       return;
+
+                               _canPop = value;
+                               NotifyValueChanged ("CanPop", _canPop);
+                       }
+               }
+               [DefaultValue(Alignment.Bottom)]
+               public virtual Alignment PopDirection {
+                       get { return popDirection; }
+                       set {
+                               if (popDirection == value)
+                                       return;
+                               popDirection = value;
+                               NotifyValueChanged ("PopDirection", popDirection);
+                       }
+               }
+               #endregion
+
+               public override Widget Content {
+                       get { return _content; }
+                       set {
+                               if (_content != null) {
+                                       _content.LogicalParent = null;
+                                       _content.isPopup = false;
+                                       _content.LayoutChanged -= _content_LayoutChanged;
+                               }
+
+                               _content = value;
+
+                               if (_content == null)
+                                       return;
+
+                               _content.LogicalParent = this;
+                               _content.isPopup = true;
+                               _content.HorizontalAlignment = HorizontalAlignment.Left;
+                               _content.VerticalAlignment = VerticalAlignment.Top;
+                               _content.LayoutChanged += _content_LayoutChanged;
+                       }
+               }
+               void positionContent(LayoutingType lt){
+                       ILayoutable tc = Content.Parent;
+                       if (tc == null)
+                               return;
+                       Rectangle r = this.ScreenCoordinates (this.Slot);
+                       if (lt == LayoutingType.X) {
+                               if (popDirection.HasFlag (Alignment.Right)) {
+                                       if (r.Right + Content.Slot.Width > tc.ClientRectangle.Right)
+                                               Content.Left = r.Left - Content.Slot.Width;
+                                       else
+                                               Content.Left = r.Right;
+                               } else if (popDirection.HasFlag (Alignment.Left)) {
+                                       if (r.Left - Content.Slot.Width < tc.ClientRectangle.Left)
+                                               Content.Left = r.Right;
+                                       else
+                                               Content.Left = r.Left - Content.Slot.Width;
+                               } else {
+                                       if (Content.Slot.Width < tc.ClientRectangle.Width) {
+                                               if (r.Left + Content.Slot.Width > tc.ClientRectangle.Right)
+                                                       Content.Left = tc.ClientRectangle.Right - Content.Slot.Width;
+                                               else
+                                                       Content.Left = r.Left;
+                                       } else
+                                               Content.Left = 0;
+                               }
+                       }else if (lt == LayoutingType.Y) {
+                               if (Content.Slot.Height < tc.ClientRectangle.Height) {
+                                       if (PopDirection.HasFlag (Alignment.Bottom)) {
+                                               if (r.Bottom + Content.Slot.Height > tc.ClientRectangle.Bottom)
+                                                       Content.Top = r.Top - Content.Slot.Height;
+                                               else
+                                                       Content.Top = r.Bottom;
+                                       } else if (PopDirection.HasFlag (Alignment.Top)) {
+                                               if (r.Top - Content.Slot.Height < tc.ClientRectangle.Top)
+                                                       Content.Top = r.Bottom;
+                                               else
+                                                       Content.Top = r.Top - Content.Slot.Height;
+                                       } else
+                                               Content.Top = r.Top;
+                               }else
+                                       Content.Top = 0;
+                       }
+               }
+               protected void _content_LayoutChanged (object sender, LayoutingEventArgs e)
+               {
+                       if (e.LayoutType.HasFlag (LayoutingType.Width))
+                               positionContent (LayoutingType.X);
+                       if (e.LayoutType.HasFlag(LayoutingType.Height))
+                               positionContent (LayoutingType.Y);
+               }
+
+               #region GraphicObject overrides
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (this, e);
+                       IsPopped = false;
+               }
+               public override bool MouseIsIn (Point m)
+               {                       
+                       if (Content?.Parent != null)
+                               if (Content.MouseIsIn (m))
+                                       return true;
+                       return base.MouseIsIn (m);
+               }
+               public override void checkHoverWidget (MouseMoveEventArgs e)
+               {
+                       if (IFace.HoverWidget != this) {
+                               IFace.HoverWidget = this;
+                               onMouseEnter (this, e);
+                       }
+                       if (Content != null){
+                               if (Content.Parent != null) {
+                                       if (Content.MouseIsIn (e.Position)) {
+                                               Content.checkHoverWidget (e);
+                                               return;
+                                       }
+                               }
+                       }
+                       base.checkHoverWidget (e);
+               }
+               #endregion
+
+               public virtual void onPop(object sender, EventArgs e)
+               {
+                       if (Content != null) {
+                               Content.Visible = true;
+                               if (Content.Parent == null)
+                                       IFace.AddWidget (Content);
+                               if (Content.LogicalParent != this)
+                                       Content.LogicalParent = this;
+                               IFace.PutOnTop (Content, true);
+                               _content_LayoutChanged (this, new LayoutingEventArgs (LayoutingType.Sizing));
+                       }
+                       Popped.Raise (this, e);
+               }
+               public virtual void onUnpop(object sender, EventArgs e)
+               {
+                       if (Content != null) {
+                               Content.Visible = false;
+                       }
+                       Unpoped.Raise (this, e);
+               }
+
+               protected override void Dispose (bool disposing)
+               {
+                       if (_content != null && disposing) {
+                               if (_content.Parent == null)
+                                       _content.Dispose ();
+                       }
+                       base.Dispose (disposing);
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/PrivateContainer.cs b/Crow/src/GraphicObjects/PrivateContainer.cs
new file mode 100644 (file)
index 0000000..4d9aff0
--- /dev/null
@@ -0,0 +1,238 @@
+//
+// PrivateContainer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using vkvg;
+
+namespace Crow
+{
+       /// <summary>
+       /// Implement drawing and layouting for a single child, but
+       /// does not expose child to allow reuse of container
+       /// behaviour for widgets that have other xml hierarchy: example
+       /// TemplatedControl may have 3 children (template,templateItem,content) but
+       /// behave exactely as a container for layouting and drawing
+       /// </summary>
+       [DesignIgnore]
+       public class PrivateContainer : Widget
+       {
+               #region CTOR
+               protected PrivateContainer () : base(){}
+               public PrivateContainer (Interface iface) : base(iface){}
+               #endregion
+
+               #if DESIGN_MODE
+               public override bool FindByDesignID(string designID, out Widget go){
+                       go = null;
+                       if (base.FindByDesignID (designID, out go))
+                               return true;
+                       if (child == null)
+                               return false;
+                       return child.FindByDesignID (designID, out go);                                 
+               }
+               #endif
+               protected Widget child;
+               #if DEBUG_LOG
+               internal GraphicObject getTemplateRoot {
+                       get { return child; }
+               }
+               #endif
+
+               protected virtual void SetChild(Widget _child)
+               {
+
+                       if (child != null) {
+                               //check if HoverWidget is removed from Tree
+                               if (IFace.HoverWidget != null) {
+                                       if (this.Contains (IFace.HoverWidget))
+                                               IFace.HoverWidget = null;
+                               }
+                               contentSize = default(Size);
+                               child.LayoutChanged -= OnChildLayoutChanges;
+                               this.RegisterForGraphicUpdate ();
+                       }
+
+                       child = _child as Widget;
+
+                       if (child != null) {
+                               child.Parent = this;
+                               child.LayoutChanged += OnChildLayoutChanges;
+                               contentSize = child.Slot.Size;
+                               child.RegisteredLayoutings = LayoutingType.None;
+                               child.RegisterForLayouting (LayoutingType.Sizing);
+                       }
+               }
+               //dispose child if not null
+               protected virtual void deleteChild () {
+                       Widget g = child;
+                       SetChild (null);
+                       if (g != null)
+                               g.Dispose ();
+               }
+
+               #region GraphicObject Overrides
+
+               public override Widget FindByName (string nameToFind)
+               {
+                       if (Name == nameToFind)
+                               return this;
+
+                       return child == null ? null : child.FindByName (nameToFind);
+               }
+               public override bool Contains (Widget goToFind)
+               {
+                       return child == goToFind ? true : 
+                               child == null ? false : child.Contains(goToFind);
+               }
+               public override void OnDataSourceChanged (object sender, DataSourceChangeEventArgs e)
+               {
+                       base.OnDataSourceChanged (this, e);
+                       if (child != null)
+                       if (child.localDataSourceIsNull & child.localLogicalParentIsNull)
+                               child.OnDataSourceChanged (child, e);
+               }
+               public override bool UpdateLayout (LayoutingType layoutType)
+               {
+                       if (child != null) {
+                               //force sizing to fit if sizing on children and child has stretched size
+                               switch (layoutType) {
+                               case LayoutingType.Width:
+                                       if (Width == Measure.Fit && child.Width.IsRelativeToParent)
+                                               child.Width = Measure.Fit;
+                                       break;
+                               case LayoutingType.Height:
+                                       if (Height == Measure.Fit && child.Height.IsRelativeToParent)
+                                               child.Height = Measure.Fit;
+                                       break;
+                               }
+                       }
+                       return base.UpdateLayout (layoutType);
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       if (child == null)
+                               return;
+                       
+                       LayoutingType ltChild = LayoutingType.None;
+
+                       if (layoutType == LayoutingType.Width) {
+                               if (child.Width.IsRelativeToParent) {
+                                       ltChild |= LayoutingType.Width;
+                                       if (child.Width.Value < 100 && child.Left == 0)
+                                               ltChild |= LayoutingType.X;
+                               } else if (child.Left == 0)
+                                       ltChild |= LayoutingType.X;
+                       } else if (layoutType == LayoutingType.Height) {
+                               if (child.Height.IsRelativeToParent) {
+                                       ltChild |= LayoutingType.Height;
+                                       if (child.Height.Value < 100 && child.Top == 0)
+                                               ltChild |= LayoutingType.Y;
+                               } else if (child.Top == 0)
+                                               ltChild |= LayoutingType.Y;
+                       }
+                       if (ltChild == LayoutingType.None)
+                               return;
+                       child.RegisterForLayouting (ltChild);
+               }
+               public virtual void OnChildLayoutChanges (object sender, LayoutingEventArgs arg)
+               {                       
+                       Widget g = sender as Widget;
+
+                       if (arg.LayoutType == LayoutingType.Width) {
+                               if (Width != Measure.Fit)
+                                       return;
+                               contentSize.Width = g.Slot.Width;
+                               this.RegisterForLayouting (LayoutingType.Width);
+                       }else if (arg.LayoutType == LayoutingType.Height){
+                               if (Height != Measure.Fit)
+                                       return;
+                               contentSize.Height = g.Slot.Height;
+                               this.RegisterForLayouting (LayoutingType.Height);
+                       }
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       gr.Save ();
+
+                       if (ClipToClientRect) {
+                               //clip to client zone
+                               DrawingHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                               gr.Clip ();
+                       }
+
+                       if (child != null) {
+                               if (child.Visible)
+                                       child.Paint (ref gr);
+                       }
+                       gr.Restore ();
+               }
+               protected override void UpdateCache (Context ctx)
+               {
+                       Rectangle rb = Slot + Parent.ClientRectangle.Position;
+
+
+                       Context gr = new Context (bmp);
+
+                       if (!Clipping.IsEmpty) {
+                               Clipping.clearAndClip (gr);
+
+                               onDraw (gr);
+                       }
+                               
+                       gr.Dispose ();
+
+                       ctx.SetSourceSurface (bmp, rb.X, rb.Y);
+                       ctx.Paint ();
+                       Clipping.Reset ();
+               }
+               #endregion
+
+               #region Mouse handling
+               public override void checkHoverWidget (MouseMoveEventArgs e)
+               {
+                       base.checkHoverWidget (e);
+
+                       if (child != null) 
+                               if (child.MouseIsIn (e.Position)) 
+                                       child.checkHoverWidget (e);
+               }
+               #endregion
+
+               protected override void Dispose (bool disposing)
+               {
+                       if (disposing && child != null)
+                               child.Dispose ();
+                       base.Dispose (disposing);
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/ProgressBar.cs b/Crow/src/GraphicObjects/ProgressBar.cs
new file mode 100644 (file)
index 0000000..ee00777
--- /dev/null
@@ -0,0 +1,68 @@
+//
+// ProgressBar.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using vkvg;
+using System.Diagnostics;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       
+       public class ProgressBar : NumericControl
+    {
+               #region CTOR
+               protected ProgressBar () : base(){}
+               public ProgressBar(Interface iface) : base(iface){}
+               #endregion
+
+               protected override void loadTemplate (Widget template)
+               {
+                       
+               }
+
+               #region GraphicObject overrides
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       if (Maximum == 0)
+                               return;
+
+                       Rectangle rBack = ClientRectangle;
+                       rBack.Width = (int)((double)rBack.Width / Maximum * Value);
+                       Foreground.SetAsSource (gr, rBack);
+
+                       DrawingHelpers.CairoRectangle(gr,rBack,CornerRadius);
+                       gr.Fill();
+               }
+               #endregion
+    }
+}
diff --git a/Crow/src/GraphicObjects/RadioButton.cs b/Crow/src/GraphicObjects/RadioButton.cs
new file mode 100644 (file)
index 0000000..d18971a
--- /dev/null
@@ -0,0 +1,83 @@
+//
+// RadioButton.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.ComponentModel;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+    public class RadioButton : TemplatedControl
+    {                  
+               bool isChecked;
+
+               #region CTOR
+               protected RadioButton () : base(){}
+               public RadioButton(Interface iface) : base(iface){}     
+               #endregion
+
+               public event EventHandler Checked;
+               public event EventHandler Unchecked;
+
+               #region GraphicObject overrides
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {                                               
+                       Group pg = Parent as Group;
+                       if (pg != null) {
+                               for (int i = 0; i < pg.Children.Count; i++) {
+                                       RadioButton c = pg.Children [i] as RadioButton;
+                                       if (c == null)
+                                               continue;
+                                       c.IsChecked = (c == this);
+                               }
+                       } else
+                               IsChecked = !IsChecked;
+
+                       base.onMouseDown (sender, e);
+               }
+               #endregion
+
+        [DefaultValue(false)]
+        public bool IsChecked
+        {
+                       get { return isChecked; }
+            set
+            {
+                               if (isChecked == value)
+                                       return;
+                               
+                               isChecked = value;
+
+                               NotifyValueChanged ("IsChecked", value);
+
+                               if (isChecked)
+                                       Checked.Raise (this, null);
+                               else
+                                       Unchecked.Raise (this, null);
+            }
+        }
+       }
+}
diff --git a/Crow/src/GraphicObjects/SaturationValueSelector.cs b/Crow/src/GraphicObjects/SaturationValueSelector.cs
new file mode 100644 (file)
index 0000000..88eaff0
--- /dev/null
@@ -0,0 +1,143 @@
+//
+// SaturationValueSelector.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using vkvg;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+       [DesignIgnore]
+       public class SaturationValueSelector : ColorSelector
+       {
+               public SaturationValueSelector () : base(){}
+               public SaturationValueSelector (Interface iface) : base(iface)
+               {
+               }
+
+               double v, s;
+
+               
+               public virtual double V {
+                       get { return v; }
+                       set {
+                               if (v == value)
+                                       return;
+                               v = value;
+                               NotifyValueChanged ("V", v);
+                               mousePos.Y = (int)Math.Floor((1.0-v) * (double)ClientRectangle.Height);
+
+                               RegisterForRedraw ();
+                       }
+               }
+               
+               public virtual double S {
+                       get { return s; }
+                       set {
+                               if (s == value)
+                                       return;
+                               s = value;
+                               NotifyValueChanged ("S", s);
+                               mousePos.X = (int)Math.Floor(s * (double)ClientRectangle.Width);
+
+                               RegisterForRedraw ();
+                       }
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       Rectangle r = ClientRectangle;
+
+                       if (Foreground != null) {//TODO:test if null should be removed
+                               Foreground.SetAsSource (gr, r);
+                               DrawingHelpers.CairoRectangle (gr, r, CornerRadius);
+                               gr.Fill ();
+                       }
+
+                       Crow.Gradient grad = new Gradient (Gradient.Type.Horizontal);
+                       grad.Stops.Add (new Gradient.ColorStop (0, new Color (1, 1, 1, 1)));
+                       grad.Stops.Add (new Gradient.ColorStop (1, new Color (0, 0, 0, 0)));
+                       grad.SetAsSource (gr, r);
+                       DrawingHelpers.CairoRectangle (gr, r, CornerRadius);
+                       gr.Fill();
+                       grad = new Gradient (Gradient.Type.Vertical);
+                       grad.Stops.Add (new Gradient.ColorStop (0, new Color (0, 0, 0, 0)));
+                       grad.Stops.Add (new Gradient.ColorStop (1, new Color (0, 0, 0, 1)));
+                       grad.SetAsSource (gr, r);
+                       DrawingHelpers.CairoRectangle (gr, r, CornerRadius);
+                       gr.Fill();
+
+               }
+
+               public override void Paint (ref Context ctx)
+               {
+                       base.Paint (ref ctx);
+
+                       Rectangle rb = Slot + Parent.ClientRectangle.Position;
+                       ctx.Save ();
+
+                       ctx.Translate (rb.X, rb.Y);
+
+                       ctx.SetSourceColor (Color.DimGrey);
+                       ctx.Arc (mousePos.X, mousePos.Y, 3.5, 0, Math.PI * 2.0);
+                       ctx.LineWidth = 0.5;
+                       ctx.Stroke ();
+                       ctx.Translate (-1.0, -1.0);
+                       ctx.Arc (mousePos.X, mousePos.Y, 3.5, 0, Math.PI * 2.0);
+                       ctx.SetSourceColor (Color.White);
+                       ctx.Stroke ();
+
+                       ctx.Restore ();
+               }
+
+               protected override void updateMouseLocalPos (Point mPos)
+               {
+                       base.updateMouseLocalPos (mPos);
+
+                       Rectangle cb = ClientRectangle;
+                       s = (double)mousePos.X / (double)cb.Width;
+                       v = 1.0 - (double)mousePos.Y / (double)cb.Height;
+                       NotifyValueChanged ("S", s);
+                       NotifyValueChanged ("V", v);
+
+                       RegisterForRedraw ();
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+                       switch (layoutType) {
+                       case LayoutingType.Width:
+                               mousePos.X = (int)Math.Floor(s * (double)ClientRectangle.Width);
+                               break;
+                       case LayoutingType.Height:
+                               mousePos.Y = (int)Math.Floor((1.0-v) * (double)ClientRectangle.Height);
+                               break;
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/ScrollBar.cs b/Crow/src/GraphicObjects/ScrollBar.cs
new file mode 100644 (file)
index 0000000..cf6201e
--- /dev/null
@@ -0,0 +1,90 @@
+//
+// ScrollBar.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// templeted numeric control
+       /// </summary>
+       public class ScrollBar : NumericControl
+       {
+               //TODO:could be replaced by a template for a Slider
+
+               Orientation _orientation;
+               int _cursorSize;
+
+               #region CTOR
+               protected ScrollBar () : base(){}
+               public ScrollBar(Interface iface) : base(iface) {}
+               #endregion
+
+               [DefaultValue(Orientation.Vertical)]
+               public virtual Orientation Orientation
+               {
+                       get { return _orientation; }
+                       set {                           
+                               if (_orientation == value)
+                                       return;
+                               _orientation = value;
+                               NotifyValueChanged ("Orientation", _orientation);
+                               if (_orientation == Orientation.Horizontal)
+                                       NotifyValueChanged ("ScrollBackShape", "M 1.5,3.5 L 6.5,0.5 L 6.5,6.5 Z");
+                               else
+                                       NotifyValueChanged ("ScrollBackShape", "M 4.5,0.5 L 9.5,9.5 L 0.5,9.5 Z");
+
+                RegisterForGraphicUpdate ();
+                       }
+               }
+               [DefaultValue(20)]
+               public virtual int CursorSize {
+                       get { return _cursorSize; }
+                       set {
+                               if (_cursorSize == value)
+                                       return;
+                               _cursorSize = value;
+                               RegisterForGraphicUpdate ();
+                               NotifyValueChanged ("CursorSize", _cursorSize);
+                       }
+               }
+               public void onScrollBack (object sender, MouseButtonEventArgs e)
+               {
+                       Value -= SmallIncrement;
+               }
+               public void onScrollForth (object sender, MouseButtonEventArgs e)
+               {
+                       Value += SmallIncrement;
+               }
+
+               public void onSliderValueChange(object sender, ValueChangeEventArgs e){
+                       if (e.MemberName == "Value")
+                               Value = Convert.ToDouble(e.NewValue);
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/Scroller.cs b/Crow/src/GraphicObjects/Scroller.cs
new file mode 100644 (file)
index 0000000..d4b6539
--- /dev/null
@@ -0,0 +1,291 @@
+//
+// Scroller.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
+using vkvg;
+
+namespace Crow
+{
+       /// <summary>
+       /// scrolling surface, to be contained in a smaller container in which it will be scrolled
+       /// </summary>
+       public class Scroller : Container
+       {
+               #region CTOR
+               protected Scroller () : base(){}
+               public Scroller (Interface iface) : base(iface){}
+               #endregion
+
+               public event EventHandler<ScrollingEventArgs> Scrolled;
+
+               int scrollX, scrollY, maxScrollX, maxScrollY, scrollSpeed;
+
+               /// <summary>
+               /// if true, key stroke are handled in derrived class
+               /// </summary>
+               protected bool KeyEventsOverrides = false;
+
+               #region public properties
+               /// <summary> Horizontal Scrolling Position </summary>
+               [DefaultValue(0)]
+               public virtual int ScrollX {
+                       get { return scrollX; }
+                       set {
+                               if (scrollX == value)
+                                       return;
+
+                               int newS = value;
+                               if (newS < 0)
+                                       newS = 0;
+                               else if (newS > maxScrollX)
+                                       newS = maxScrollX;
+
+                               if (newS == scrollX)
+                                       return;
+
+                               scrollX = value;
+
+                               NotifyValueChanged ("ScrollX", scrollX);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Vertical Scrolling Position </summary>
+               [DefaultValue(0)]
+               public virtual int ScrollY {
+                       get { return scrollY; }
+                       set {
+                               if (scrollY == value)
+                                       return;
+
+                               int newS = value;
+                               if (newS < 0)
+                                       newS = 0;
+                               else if (newS > maxScrollY)
+                                       newS = maxScrollY;
+
+                               if (newS == scrollY)
+                                       return;
+
+                               scrollY = value;
+
+                               NotifyValueChanged ("ScrollY", scrollY);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Horizontal Scrolling maximum value </summary>
+               [DefaultValue(0)]
+               public virtual int MaxScrollX {
+                       get { return maxScrollX; }
+                       set {
+                               if (maxScrollX == value)
+                                       return;
+
+                               maxScrollX = value;
+
+                               if (scrollX > maxScrollX)
+                                       ScrollX = maxScrollX;
+
+                               NotifyValueChanged ("MaxScrollX", maxScrollX);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Vertical Scrolling maximum value </summary>
+               [DefaultValue(0)]
+               public virtual int MaxScrollY {
+                       get { return maxScrollY; }
+                       set {
+                               if (maxScrollY == value)
+                                       return;
+
+                               maxScrollY = value;
+
+                               if (scrollY > maxScrollY)
+                                       ScrollY = maxScrollY;
+
+                               NotifyValueChanged ("MaxScrollY", maxScrollY);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Mouse Wheel Scrolling multiplier </summary>
+               [DefaultValue(50)]
+               public virtual int ScrollSpeed {
+                       get { return scrollSpeed; }
+                       set {
+                               if (scrollSpeed == value)
+                                       return;
+
+                               scrollSpeed = value;
+
+                               NotifyValueChanged ("ScrollSpeed", scrollSpeed);
+                       }
+               }
+               #endregion
+
+               public override void SetChild (Widget _child)
+               {
+                       Group g = child as Group;
+                       if (g != null)
+                               g.ChildrenCleared -= onChildListCleared;
+                       
+                       base.SetChild (_child);
+
+                       g = _child as Group;
+                       if (g != null)
+                               g.ChildrenCleared += onChildListCleared;                        
+               }
+               public override void OnChildLayoutChanges (object sender, LayoutingEventArgs arg)
+               {
+                       base.OnChildLayoutChanges (sender, arg);
+                       updateMaxScroll (arg.LayoutType);
+               }
+
+
+               #region GraphicObject Overrides
+               public override Rectangle ScreenCoordinates (Rectangle r)
+               {
+                       return base.ScreenCoordinates (r) - new Point((int)ScrollX,(int)ScrollY);
+               }
+               public override bool PointIsIn (ref Point m)
+               {
+                       if (!base.PointIsIn(ref m))
+                               return false;
+                       if (!Slot.ContainsOrIsEqual (m) || child==null)
+                               return false;
+                       m += new Point (ScrollX, ScrollY);
+                       return true;
+               }
+               public override void RegisterClip (Rectangle clip)
+               {
+                       base.RegisterClip (clip - new Point(ScrollX,ScrollY));
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       if (layoutType == LayoutingType.Height)
+                               NotifyValueChanged ("PageHeight", Slot.Height);
+                       else if (layoutType == LayoutingType.Width)
+                               NotifyValueChanged ("PageWidth", Slot.Width);
+                       else
+                               return;
+                       updateMaxScroll(layoutType);
+               }
+               protected override void onDraw (Context gr)
+               {
+                       Rectangle rBack = new Rectangle (Slot.Size);
+
+                       Background.SetAsSource (gr, rBack);
+                       DrawingHelpers.CairoRectangle(gr,rBack, CornerRadius);
+                       gr.Fill ();
+
+                       gr.Save ();
+                       if (ClipToClientRect) {
+                               //clip to scrolled client zone
+                               DrawingHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                               gr.Clip ();
+                       }
+
+                       gr.Translate (-ScrollX, -ScrollY);
+                       if (child != null)
+                               child.Paint (ref gr);
+                       gr.Restore ();
+               }
+
+               #region Mouse & Keyboard
+               /// <summary> Process scrolling vertically, or if shift is down, vertically </summary>
+               public override void onMouseWheel (object sender, MouseWheelEventArgs e)
+               {
+                       base.onMouseWheel (sender, e);
+                       if (IFace.IsKeyDown (Key.LeftShift))
+                               ScrollX += e.Delta * ScrollSpeed;
+                       else
+                               ScrollY -= e.Delta * ScrollSpeed;
+               }
+               /// <summary> Process scrolling with arrow keys, home and end keys. </summary>
+               public override void onKeyDown (object sender, KeyEventArgs e)
+               {
+                       base.onKeyDown (sender, e);
+
+                       if (KeyEventsOverrides)
+                               return;
+
+                       switch (e.Key) {
+                       case Key.Up:
+                               ScrollY--;
+                               break;
+                       case Key.Down:
+                               ScrollY++;
+                               break;
+                       case Key.Left:
+                               ScrollX--;
+                               break;
+                       case Key.Right:
+                               ScrollX++;
+                               break;
+                       case Key.Home:
+                               ScrollX = 0;
+                               ScrollY = 0;
+                               break;
+                       case Key.End:
+                               ScrollX = MaxScrollX;
+                               ScrollY = MaxScrollY;
+                               break;
+                       }
+               }
+               #endregion
+
+               #endregion
+
+               void updateMaxScroll (LayoutingType lt){
+                       if (Child == null) {
+                               MaxScrollX = 0;
+                               MaxScrollY = 0;
+                               return;
+                       }
+
+                       Rectangle cb = ClientRectangle;
+
+                       if (lt == LayoutingType.Height) {
+                               MaxScrollY = child.Slot.Height - cb.Height;
+                               if (child.Slot.Height > 0)
+                                       NotifyValueChanged ("ChildHeightRatio", Slot.Height * Slot.Height / child.Slot.Height);                 
+                       } else if (lt == LayoutingType.Width) {
+                               MaxScrollX = child.Slot.Width - cb.Width;
+                               if (child.Slot.Width > 0)
+                                       NotifyValueChanged ("ChildWidthRatio", Slot.Width * Slot.Width / child.Slot.Width);
+                       }
+               }
+               void onChildListCleared(object sender, EventArgs e){
+                       ScrollY = 0;
+                       ScrollX = 0;
+               }
+
+
+    }
+}
diff --git a/Crow/src/GraphicObjects/ScrollingObject.cs b/Crow/src/GraphicObjects/ScrollingObject.cs
new file mode 100644 (file)
index 0000000..edb1aa1
--- /dev/null
@@ -0,0 +1,190 @@
+//
+// ScrollingObject.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Collections;
+using vkvg;
+
+
+namespace Crow
+{
+       /// <summary>
+       /// generic class to build scrolling control in both directions
+       /// </summary>
+       [DesignIgnore]
+       public class ScrollingObject : Widget
+       {
+               #region CTOR
+               protected ScrollingObject ():base(){}
+               public ScrollingObject (Interface iface):base(iface){}
+               #endregion
+
+               int scrollX, scrollY, maxScrollX, maxScrollY, mouseWheelSpeed;
+
+               /// <summary>
+               /// if true, key stroke are handled in derrived class
+               /// </summary>
+               protected bool KeyEventsOverrides = false;
+
+               /// <summary> Horizontal Scrolling Position </summary>
+               [DefaultValue(0)]
+               public virtual int ScrollX {
+                       get { return scrollX; }
+                       set {
+                               if (scrollX == value)
+                                       return;
+
+                               int newS = value;
+                               if (newS < 0)
+                                       newS = 0;
+                               else if (newS > maxScrollX)
+                                       newS = maxScrollX;
+
+                               if (newS == scrollX)
+                                       return;
+
+                               scrollX = newS;
+
+                               NotifyValueChanged ("ScrollX", scrollX);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Vertical Scrolling Position </summary>
+               [DefaultValue(0)]
+               public virtual int ScrollY {
+                       get { return scrollY; }
+                       set {
+                               if (scrollY == value)
+                                       return;
+
+                               int newS = value;
+                               if (newS < 0)
+                                       newS = 0;
+                               else if (newS > maxScrollY)
+                                       newS = maxScrollY;
+
+                               if (newS == scrollY)
+                                       return;
+
+                               scrollY = newS;
+
+                               NotifyValueChanged ("ScrollY", scrollY);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Horizontal Scrolling maximum value </summary>
+               [DefaultValue(0)]
+               public virtual int MaxScrollX {
+                       get { return maxScrollX; }
+                       set {
+                               if (maxScrollX == value)
+                                       return;
+
+                               maxScrollX = value;
+
+                               if (scrollX > maxScrollX)
+                                       ScrollX = maxScrollX;
+                               
+                               NotifyValueChanged ("MaxScrollX", maxScrollX);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Vertical Scrolling maximum value </summary>
+               [DefaultValue(0)]
+               public virtual int MaxScrollY {
+                       get { return maxScrollY; }
+                       set {
+                               if (maxScrollY == value)
+                                       return;
+
+                               maxScrollY = value;
+
+                               if (scrollY > maxScrollY)
+                                       ScrollY = maxScrollY;
+
+                               NotifyValueChanged ("MaxScrollY", maxScrollY);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary> Mouse Wheel Scrolling multiplier </summary>
+               [DefaultValue(1)]
+               public virtual int MouseWheelSpeed {
+                       get { return mouseWheelSpeed; }
+                       set {
+                               if (mouseWheelSpeed == value)
+                                       return;
+                               
+                               mouseWheelSpeed = value;
+
+                               NotifyValueChanged ("MouseWheelSpeed", mouseWheelSpeed);
+                       }
+               }
+
+               /// <summary> Process scrolling vertically, or if shift is down, vertically </summary>
+               public override void onMouseWheel (object sender, MouseWheelEventArgs e)
+               {
+                       base.onMouseWheel (sender, e);
+                       if (IFace.Shift)
+                               ScrollX += e.Delta * MouseWheelSpeed;
+                       else
+                               ScrollY -= e.Delta * MouseWheelSpeed;
+               }
+               /// <summary> Process scrolling with arrow keys, home and end keys. </summary>
+               public override void onKeyDown (object sender, KeyEventArgs e)
+               {
+                       base.onKeyDown (sender, e);
+
+                       if (KeyEventsOverrides)
+                               return;
+
+                       switch (e.Key) {
+                       case Key.Up:
+                               ScrollY--;
+                               break;
+                       case Key.Down:
+                               ScrollY++;
+                               break;
+                       case Key.Left:
+                               ScrollX--;
+                               break;
+                       case Key.Right:
+                               ScrollX++;
+                               break;
+                       case Key.Home:
+                               ScrollX = 0;
+                               ScrollY = 0;
+                               break;
+                       case Key.End:
+                               ScrollX = MaxScrollX;
+                               ScrollY = MaxScrollY;
+                               break;
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Shape.cs b/Crow/src/GraphicObjects/Shape.cs
new file mode 100644 (file)
index 0000000..d392c56
--- /dev/null
@@ -0,0 +1,196 @@
+//
+// Shape.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.IO;
+using System.Text;
+using vkvg;
+
+namespace Crow
+{
+       public class PathParser : StringReader
+       {
+               public PathParser (string str) : base (str) {}
+
+               public double ReadDouble () {
+                       StringBuilder tmp = new StringBuilder();
+
+                       while (Peek () >= 0) {                          
+                               char c = (char)Read();
+                               if (c.IsWhiteSpaceOrNewLine()) {
+                                       if (tmp.Length == 0)
+                                               continue;
+                                       else
+                                               break;
+                               } else if (c == ',')
+                                       break;                          
+                               tmp.Append (c);
+                       }
+                       return double.Parse (tmp.ToString ());
+               }
+               
+       }
+       public class Shape : Widget
+       {
+               #region CTOR
+               protected Shape () : base() {}
+               public Shape (Interface iface) : base (iface) {}
+               #endregion
+
+               string path;
+               double strokeWidth;
+        Size size;
+
+               public string Path {
+                       get { return path; }
+                       set {
+                               if (path == value)
+                                       return;
+                               path = value;
+                               contentSize = default (Size);
+                               NotifyValueChanged ("Path", path);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               [DefaultValue(1.0)]
+               public double StokeWidth {
+                       get { return strokeWidth; }
+                       set {
+                               if (strokeWidth == value)
+                                       return;
+                               strokeWidth = value;
+                               contentSize = default (Size);
+                               NotifyValueChanged ("StrokeWidth", strokeWidth);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+        [DefaultValue("0,0")]
+        public Size Size
+        {
+            get { return size; }
+            set
+            {
+                if (size == value)
+                    return;
+                size = value;
+                contentSize = default(Size);
+                NotifyValueChanged("Size", size);
+                RegisterForLayouting(LayoutingType.Sizing);
+            }
+        }
+        protected override void onDraw(Context gr)
+        {
+
+            if (string.IsNullOrEmpty(path))
+                return;
+
+            gr.Save();
+
+            Rectangle r = ClientRectangle;
+
+
+            double sx = (double)r.Width / (double)(contentSize.Width == 0? size.Width : contentSize.Width);
+            double sy = (double)r.Height / (double)(contentSize.Height == 0 ? size.Height : contentSize.Height);            
+
+            gr.Translate(r.Left, r.Top);
+            gr.Scale (sx,sy);
+
+
+                       executePath (gr);
+
+                       Background.SetAsSource (gr, r);
+                       gr.FillPreserve ();
+                       gr.LineWidth = strokeWidth;
+                       Foreground.SetAsSource (gr, r);
+                       gr.Stroke ();
+            gr.Restore();
+               }
+
+               void executePath (Context gr){
+                       using (PathParser sr = new PathParser (path)) {
+                               while (sr.Peek () >= 0) {
+                                       char c = (char)sr.Read ();
+                                       if (c.IsWhiteSpaceOrNewLine ())
+                                               continue;
+                                       switch (c) {
+                                       case 'M':                                               
+                                               gr.MoveTo (sr.ReadDouble (), sr.ReadDouble ());
+                                               break;
+                                       case 'm':
+                                               gr.RelMoveTo (sr.ReadDouble (), sr.ReadDouble ());
+                                               break;
+                                       case 'L':
+                                               gr.LineTo (sr.ReadDouble (), sr.ReadDouble ());
+                                               break;
+                                       case 'l':
+                                               gr.RelLineTo (sr.ReadDouble (), sr.ReadDouble ());
+                                               break;
+                                       case 'C':
+                                               gr.CurveTo (sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble ());
+                                               break;
+                                       case 'c':
+                                               gr.RelCurveTo (sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble (), sr.ReadDouble ());
+                                               break;
+                                       case 'Z':
+                                               gr.ClosePath ();
+                                               break;
+                                       case 'F':
+                                               gr.Fill ();
+                                               break;
+                                       case 'G':
+                                               gr.Stroke ();
+                                               break;
+                                       default:
+                                               throw new Exception ("Invalid character in path string of Shape control");
+                                       }
+                               }
+                       }
+               }
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       //if ((lt == LayoutingType.Width && contentSize.Width == 0) || (lt == LayoutingType.Height && contentSize.Height == 0)) {
+   //             if (size != default(Size))
+   //                 contentSize = size;
+   //             else
+   //             {
+   //                 using (Surface drawing = new Surface(IFace.dev, 1, 1))
+   //                 {
+   //                     using (Context ctx = new Context(drawing))
+   //                     {
+   //                         executePath(ctx);
+   //                         Rectangle r = ctx.StrokeExtents();
+   //                         contentSize = new Size(r.Right, r.Bottom);
+   //                     }
+   //                 }
+   //             }
+                       //}
+                       return lt == LayoutingType.Width ?
+                               contentSize.Width + 2 * Margin: contentSize.Height + 2 * Margin;
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Slider.cs b/Crow/src/GraphicObjects/Slider.cs
new file mode 100644 (file)
index 0000000..a5887d1
--- /dev/null
@@ -0,0 +1,258 @@
+//
+// Slider.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using vkvg;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated numeric control to select a value
+       /// by slidding a cursor
+       /// </summary>
+       public class Slider : NumericControl
+    {
+               #region CTOR
+               protected Slider() : base(){}
+               public Slider(Interface iface) : base(iface)
+               {}
+//             public Slider(double minimum, double maximum, double step)
+//                     : base(minimum,maximum,step)
+//             {
+//             }
+               #endregion
+
+               #region implemented abstract members of TemplatedControl
+
+               protected override void loadTemplate (Widget template = null)
+               {
+                       
+               }
+
+               #endregion
+
+               #region private fields
+        Rectangle cursor;
+               int _cursorSize;
+               Fill _cursorColor;
+               Orientation _orientation;
+               bool holdCursor = false;
+               #endregion
+
+               protected double unity;
+
+               #region Public properties
+               [DefaultValue("vgradient|0:White|0,1:LightGrey|0,9:LightGrey|1:DimGrey")]
+               public virtual Fill CursorColor {
+                       get { return _cursorColor; }
+                       set {
+                               if (_cursorColor == value)
+                                       return;
+                               _cursorColor = value;
+                               RegisterForRedraw ();
+                               NotifyValueChanged ("CursorColor", _cursorColor);
+                       }
+               }
+               [DefaultValue(10)]
+               public virtual int CursorSize {
+                       get { return _cursorSize; }
+                       set {
+                               if (_cursorSize == value || value < 8)
+                                       return;
+                               _cursorSize = value;
+                               RegisterForGraphicUpdate ();
+                               NotifyValueChanged ("CursorSize", _cursorSize);
+                       }
+               }
+               [DefaultValue(Orientation.Horizontal)]
+               public virtual Orientation Orientation
+               {
+                       get { return _orientation; }
+                       set { 
+                               if (_orientation == value)
+                                       return;
+                               _orientation = value; 
+
+                               RegisterForLayouting (LayoutingType.All);
+                               NotifyValueChanged ("Orientation", _orientation);
+                       }
+               }
+               #endregion
+
+               [DefaultValue(10.0)]
+               public override double Maximum {
+                       get { return base.Maximum; }
+                       set {                           
+                               if (value == base.Maximum)
+                                       return;
+                               base.Maximum = value;
+                               LargeIncrement = base.Maximum / 10.0;
+                               SmallIncrement = LargeIncrement / 5.0;
+                       }
+               }
+
+               #region GraphicObject Overrides
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       if (Maximum <= 0)
+                               return;
+
+                       computeCursorPosition ();
+
+                       Rectangle r = ClientRectangle;
+                       PointD pStart;
+                       PointD pEnd;
+                       if (_orientation == Orientation.Horizontal) {
+                               pStart = r.TopLeft + new Point (_cursorSize / 2, r.Height / 2);
+                               pEnd = r.TopRight + new Point (-_cursorSize / 2, r.Height / 2);
+                               pStart.Y += 0.5;
+                               pEnd.Y += 0.5;
+                       } else {
+                               pStart = r.TopLeft + new Point (r.Width / 2, _cursorSize / 2);
+                               pEnd = r.BottomLeft + new Point (r.Width / 2,- _cursorSize / 2);
+                               pStart.X += 0.5;
+                               pEnd.X += 0.5;
+
+                       }
+
+            Background.SetAsSource(gr, r);
+            gr.Rectangle (r);
+            gr.Fill ();
+
+                       DrawGraduations (gr, pStart,pEnd);
+
+                       DrawCursor (gr, cursor);
+               }
+               #endregion
+
+               protected virtual void DrawGraduations(Context gr, PointD pStart, PointD pEnd)
+               {
+                       Foreground.SetAsSource (gr);
+
+                       gr.LineWidth = 1;
+                       gr.MoveTo(pStart);
+                       gr.LineTo(pEnd);
+
+                       gr.Stroke();
+
+               }
+               protected virtual void DrawCursor(Context gr, Rectangle _cursor)
+               {
+                       DrawingHelpers.CairoRectangle (gr, _cursor, CornerRadius);
+            Foreground.SetAsSource(gr, _cursor);
+            gr.StrokePreserve();
+            CursorColor.SetAsSource(gr, _cursor);
+            gr.Fill();
+               }
+
+        void computeCursorPosition()
+        {            
+            Rectangle r = ClientRectangle;
+                       PointD p1; 
+
+                       if (_orientation == Orientation.Horizontal) {
+                               cursor = new Rectangle (new Size (_cursorSize, (int)(r.Height)));
+                               p1 = r.TopLeft + new Point (_cursorSize / 2, r.Height / 2);
+                               unity = (double)(r.Width - _cursorSize) / (Maximum - Minimum);
+                               cursor.TopLeft = new Point (r.Left + (int)((Value - Minimum) * unity),
+                                       (int)(p1.Y - cursor.Height / 2));
+                       } else {
+                               cursor = new Rectangle (new Size ((int)(r.Width), _cursorSize));
+                               p1 = r.TopLeft + new Point (r.Width / 2, _cursorSize / 2);
+                               unity = (double)(r.Height - _cursorSize) / (Maximum - Minimum);
+                               cursor.TopLeft = new Point ((int)(p1.X - r.Width / 2),
+                                       r.Top + (int)((Value - Minimum) * unity));                              
+                       }
+                       //cursor.Inflate (-1);
+        }
+               Point mouseDownInit;
+               double mouseDownInitValue;
+
+               #region mouse handling
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+                       mouseDownInit = ScreenPointToLocal (e.Position);
+                       mouseDownInitValue = Value;
+                       Rectangle cursInScreenCoord = ScreenCoordinates (cursor + Slot.Position);
+                       if (cursInScreenCoord.ContainsOrIsEqual (e.Position)){
+//                             Rectangle r = ClientRectangle;
+//                             if (r.Width - _cursorSize > 0) {
+//                                     double unit = (Maximum - Minimum) / (double)(r.Width - _cursorSize);
+//                                     mouseDownInit += new Point ((int)(Value / unit), (int)(Value / unit));
+//                             }
+                               holdCursor = true;
+                       }else if (_orientation == Orientation.Horizontal) {
+                               if (e.Position.X < cursInScreenCoord.Left)
+                                       Value -= LargeIncrement;
+                               else
+                                       Value += LargeIncrement;
+                       } else {
+                               if (e.Position.Y < cursInScreenCoord.Top)
+                                       Value -= LargeIncrement;
+                               else
+                                       Value += LargeIncrement;
+                       }
+               }
+               public override void onMouseUp (object sender,MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+
+                       holdCursor = false;
+               }
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       if (holdCursor) {                               
+                               Point m = ScreenPointToLocal (e.Position) - mouseDownInit;
+                               Rectangle r = ClientRectangle;
+
+                               if (_orientation == Orientation.Horizontal) {
+                                       if (r.Width - _cursorSize == 0)
+                                               return;                                 
+                                       double unit = (Maximum - Minimum) / (double)(r.Width - _cursorSize);
+                                       double tmp = mouseDownInitValue + (double)m.X * unit;
+                                       tmp -= tmp % SmallIncrement;
+                                       Value = tmp;
+                               } else {
+                                       if (r.Height - _cursorSize == 0)
+                                               return;                                 
+                                       double unit = (Maximum - Minimum) / (double)(r.Height - _cursorSize);
+                                       double tmp = mouseDownInitValue + (double)m.Y * unit;
+                                       tmp -= tmp % SmallIncrement;
+                                       Value = tmp;
+                               }
+                       }
+                       
+                       base.onMouseMove (sender, e);
+               }
+               #endregion
+    }
+}
diff --git a/Crow/src/GraphicObjects/Spinner.cs b/Crow/src/GraphicObjects/Spinner.cs
new file mode 100644 (file)
index 0000000..7c5fdb2
--- /dev/null
@@ -0,0 +1,55 @@
+//
+// Spinner.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       /// <summary>
+       /// templated control for selecting a numeric value by clicking on
+       /// up and down buttons
+       /// </summary>
+       public class Spinner : NumericControl
+       {
+               #region CTOR
+               protected Spinner() : base(){}
+               public Spinner (Interface iface) : base(iface)
+               {
+               }
+               #endregion
+
+               void onUp (object sender, MouseButtonEventArgs e)
+               {
+                       Value += this.SmallIncrement;
+               }
+               void onDown (object sender, MouseButtonEventArgs e)
+               {
+                       Value -= this.SmallIncrement;
+               }
+
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Splitter.cs b/Crow/src/GraphicObjects/Splitter.cs
new file mode 100644 (file)
index 0000000..cc0ba32
--- /dev/null
@@ -0,0 +1,236 @@
+//
+// Splitter.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       /// <summary>
+       /// control to add between children of a Stack to allow them to be resized
+       /// with the pointer
+       /// </summary>
+       public class Splitter : Widget
+       {
+               #region CTOR
+               protected Splitter() : base(){}
+               public Splitter (Interface iface) : base(iface){}
+               #endregion
+
+               int thickness;
+
+               [DefaultValue(1)]
+               public virtual int Thickness {
+                       get { return thickness; }
+                       set {
+                               if (thickness == value)
+                                       return;
+                               thickness = value; 
+                               NotifyValueChanged ("Thickness", thickness);
+                               RegisterForLayouting (LayoutingType.Sizing);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+
+               Unit u1, u2;
+               int init1 = -1, init2 = -1, delta = 0, min1, min2, max1 , max2;
+               Widget go1 = null, go2 = null;
+
+               void initSplit(Measure m1, int size1, Measure m2, int size2){
+                       if (m1 != Measure.Stretched) {
+                               init1 = size1;
+                               u1 = m1.Units;
+                       }
+                       if (m2 != Measure.Stretched) {
+                               init2 = size2;
+                               u2 = m2.Units;
+                       }
+               }
+               void convertSizeInPix(Widget g1){
+
+               }
+
+               #region GraphicObject override
+               public override ILayoutable Parent {
+                       get { return base.Parent; }
+                       set {
+                               if (value != null) {                    
+                                       GenericStack gs = value as GenericStack;
+                                       if (gs == null)
+                                               throw new Exception ("Splitter may only be chil of stack");
+                                       
+                               }
+                               base.Parent = value;
+                       }
+               }
+               public override void onMouseEnter (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseEnter (sender, e);
+                       //if ((Parent as GenericStack).Orientation == Orientation.Horizontal)
+                       //      IFace.MouseCursor = MouseCursors.H;
+                       //else
+                               //IFace.MouseCursor = MouseCursors.V;
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (sender, e);
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+                       go1 = go2 = null;
+                       init1 = init2 = -1;
+                       delta = 0;
+
+                       GenericStack gs = Parent as GenericStack;
+                       int ptrSplit = gs.Children.IndexOf (this);
+                       if (ptrSplit == 0 || ptrSplit == gs.Children.Count - 1)
+                               return;
+
+                       go1 = gs.Children [ptrSplit - 1];
+                       go2 = gs.Children [ptrSplit + 1];
+
+                       if (gs.Orientation == Orientation.Horizontal) {
+                               initSplit (go1.Width, go1.Slot.Width, go2.Width, go2.Slot.Width);
+                               min1 = go1.MinimumSize.Width;
+                               min2 = go2.MinimumSize.Width;
+                               max1 = go1.MaximumSize.Width;
+                               max2 = go2.MaximumSize.Width;
+                               if (init1 >= 0)
+                                       go1.Width = init1;
+                               if (init2 >= 0)
+                                       go2.Width = init2;
+                       } else {
+                               initSplit (go1.Height, go1.Slot.Height, go2.Height, go2.Slot.Height);
+                               min1 = go1.MinimumSize.Height;
+                               min2 = go2.MinimumSize.Height;
+                               max1 = go1.MaximumSize.Height;
+                               max2 = go2.MaximumSize.Height;
+                               if (init1 >= 0)
+                                       go1.Height = init1;
+                               if (init2 >= 0)
+                                       go2.Height = init2;
+                       }
+               }
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       if (!IsActive || go1 == null || go2 == null)
+                               return;
+
+                       GenericStack gs = Parent as GenericStack;
+                       int newDelta = delta, size1 = init1 , size2 = init2;
+                       if (gs.Orientation == Orientation.Horizontal) {
+                               newDelta -= e.XDelta;
+                               if (size1 < 0)
+                                       size1 = go1.Slot.Width + delta;
+                               if (size2 < 0)
+                                       size2 = go2.Slot.Width - delta;
+                       } else {
+                               newDelta -= e.YDelta;
+                               if (size1 < 0)
+                                       size1 = go1.Slot.Height + delta;
+                               if (size2 < 0)
+                                       size2 = go2.Slot.Height - delta;
+                       }
+
+                       if (size1 - newDelta < min1 || (max1 > 0 && size1 - newDelta > max1) ||
+                               size2 + newDelta < min2 || (max2 > 0 && size2 + newDelta > max2))
+                               return;
+
+                       delta = newDelta;
+
+                       if (gs.Orientation == Orientation.Horizontal) {
+                               if (init1 >= 0)
+                                       go1.Width = init1 - delta;
+                               if (init2 >= 0)
+                                       go2.Width = init2 + delta;
+                       } else {
+                               if (init1 >= 0)
+                                       go1.Height = init1 - delta;
+                               if (init2 >= 0)
+                                       go2.Height = init2 + delta;
+                       }
+               }
+               public override void onMouseUp (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+
+                       GenericStack gs = Parent as GenericStack;
+
+                       if (init1 >= 0 && u1 == Unit.Percent) {
+                               if (gs.Orientation == Orientation.Horizontal)
+                                       go1.Width = new Measure ((int)Math.Ceiling (
+                                               go1.Width.Value * 100.0 / (double)gs.Slot.Width), Unit.Percent);
+                               else
+                                       go1.Height = new Measure ((int)Math.Ceiling (
+                                               go1.Height.Value * 100.0 / (double)gs.Slot.Height), Unit.Percent);
+                       }
+                       if (init2 >= 0 && u2 == Unit.Percent) {
+                               if (gs.Orientation == Orientation.Horizontal)
+                                       go2.Width = new Measure ((int)Math.Floor (
+                                               go2.Width.Value * 100.0 / (double)gs.Slot.Width), Unit.Percent);
+                               else
+                                       go2.Height = new Measure ((int)Math.Floor (
+                                               go2.Height.Value * 100.0 / (double)gs.Slot.Height), Unit.Percent);
+                       }
+               }
+               public override bool UpdateLayout (LayoutingType layoutType)
+               {
+                       GenericStack gs = Parent as GenericStack;
+                       if (layoutType == LayoutingType.Width){
+                               if (gs.Orientation == Orientation.Horizontal)
+                                       Width = thickness;
+                               else
+                                       Width = Measure.Stretched;
+                       } else if (layoutType == LayoutingType.Height){
+                               if (gs.Orientation == Orientation.Vertical)
+                                       Height = thickness;
+                               else
+                                       Height = Measure.Stretched;
+                       }
+                       return base.UpdateLayout (layoutType);
+               }
+               public override bool PointIsIn (ref Point m)
+               {
+                       if (!(Visible & IsEnabled)||IsDragged)
+                               return false;
+                       if (!Parent.PointIsIn(ref m))
+                               return false;
+                       m -= (Parent.getSlot().Position + Parent.ClientRectangle.Position) ;
+                       Rectangle r = Slot;
+                       if (Width == Measure.Stretched)
+                               r.Inflate (0, 5);
+                       else
+                               r.Inflate (5, 0);
+                       return r.ContainsOrIsEqual (m); 
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/TabItem.cs b/Crow/src/GraphicObjects/TabItem.cs
new file mode 100644 (file)
index 0000000..95c3642
--- /dev/null
@@ -0,0 +1,336 @@
+//
+// TabItem.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
+using vkvg;
+using System.Linq;
+
+namespace Crow
+{
+       public class TabItem : TemplatedContainer
+       {
+               #region CTOR
+               protected TabItem() : base(){}
+               public TabItem (Interface iface) : base(iface){}
+               #endregion
+
+               public event EventHandler QueryClose;
+
+               internal TabView tview = null;
+
+               #region Private fields
+               Widget titleWidget;
+               int tabOffset;
+               bool isSelected;
+               Measure tabThickness;
+               Fill selectedBackground = Color.Transparent;
+               #endregion
+
+               #region TemplatedControl overrides
+               public override Widget Content {
+                       get {
+                               return _contentContainer == null ? null : _contentContainer.Child;
+                       }
+                       set {
+                               if (Content != null) {
+                                       Content.LogicalParent = null;
+                                       _contentContainer.SetChild (null);
+                               }
+                               _contentContainer.SetChild(value);
+                               if (value != null)
+                                       value.LogicalParent = this;
+                       }
+               }
+               protected override void loadTemplate(Widget template = null)
+               {
+                       base.loadTemplate (template);
+
+                       titleWidget = this.child.FindByName ("TabTitle");
+               }
+               internal Widget TabTitle { get { return titleWidget; }}
+               #endregion
+
+               /// <summary>
+               /// order of redrawing, items can't be reordered in TemplatedGroup due to data linked, so we need another index
+               /// instead of children list order
+               /// </summary>
+               public int viewIndex = 0;
+               public virtual int ViewIndex {
+                       get { return viewIndex; }
+                       set {
+                               if (viewIndex == value)
+                                       return;
+                               viewIndex = value;
+                               NotifyValueChanged ("ViewIndex", viewIndex);
+                       }
+               }
+                       
+               [DefaultValue(0)]
+               public int TabOffset {
+                       get { return tabOffset; }
+                       set {
+                               if (tabOffset == value)
+                                       return;
+                               tabOffset = value;
+                               NotifyValueChanged ("TabOffset", tabOffset);
+
+                               RegisterForLayouting (LayoutingType.X);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               public Measure TabHeight {
+                       get { return tview == null ? Measure.Fit : tview.TabHeight; }
+               }
+               public Measure TabWidth {
+                       get { return tview == null ? Measure.Fit : tview.TabWidth; }
+               }
+               [DefaultValue(false)]
+               public virtual bool IsSelected {
+                       get { return isSelected; }
+                       set {
+                               if (isSelected == value)
+                                       return;
+
+                               if (tview != null)
+                                       tview.SelectedTab = tview.Children.IndexOf(this);
+                               
+                               isSelected = value;
+                               NotifyValueChanged ("IsSelected", isSelected);
+                               RegisterForRedraw ();
+                       }
+               }
+
+               /// <summary>
+               /// background fill of the control, maybe solid color, gradient, image, or svg
+               /// </summary>
+               [DesignCategory ("Appearance")][DefaultValue("DimGrey")]
+               public virtual Fill SelectedBackground {
+                       get { return selectedBackground; }
+                       set {
+                               if (selectedBackground == value)
+                                       return;                         
+                               if (value == null)
+                                       return;
+                               selectedBackground = value;
+                               NotifyValueChanged ("SelectedBackground", selectedBackground);
+                               RegisterForRedraw ();
+                       }
+               }
+               protected override void onDraw (Context gr)
+               {
+                       gr.Save ();
+
+                       TabView tv = Parent as TabView;
+
+                       Rectangle r = TabTitle.Slot;
+                       r.Width = TabWidth;
+
+                       gr.MoveTo (0.5, r.Bottom-0.5);
+                       gr.LineTo (r.Left - tv.LeftSlope, r.Bottom-0.5);
+                       gr.CurveTo (
+                               r.Left - tv.LeftSlope / 2, r.Bottom-0.5,
+                               r.Left - tv.LeftSlope / 2, 0.5,
+                               r.Left, 0.5);
+                       gr.LineTo (r.Right, 0.5);
+                       gr.CurveTo (
+                               r.Right + tv.RightSlope / 2, 0.5,
+                               r.Right + tv.RightSlope / 2, r.Bottom-0.5,
+                               r.Right + tv.RightSlope, r.Bottom-0.5);
+                       gr.LineTo (Slot.Width-0.5, r.Bottom-0.5);
+
+
+                       gr.LineTo (Slot.Width-0.5, Slot.Height-0.5);
+                       gr.LineTo (0.5, Slot.Height-0.5);
+                       gr.ClosePath ();
+                       gr.LineWidth = 1;
+                       Foreground.SetAsSource (gr);
+                       gr.StrokePreserve ();
+                       gr.ClipPreserve ();
+
+                       if (IsSelected)
+                               SelectedBackground.SetAsSource (gr, ClientRectangle);
+                       else
+                               Background.SetAsSource (gr, ClientRectangle);
+
+                       gr.Fill ();
+
+                       base.onDraw (gr);
+
+                       gr.Restore ();
+               }
+
+               Point dragStartPoint;
+               int dragThreshold = 16;
+               int dis = 128;
+               internal TabView savedParent = null;
+
+
+               void makeFloating (TabView tv) {                        
+                       //lock (IFace.UpdateMutex) {                            
+                       //      ImageSurface di = new ImageSurface (Format.Argb32, dis, dis);
+                       //      IFace.DragImageHeight = dis;
+                       //      IFace.DragImageWidth = dis;
+                       //      using (Context ctx = new Context (di)) {
+                       //              double div = Math.Max (LastPaintedSlot.Width, LastPaintedSlot.Height);
+                       //              double s = (double)dis / div;
+                       //              ctx.Scale (s, s);
+                       //              if (bmp == null)
+                       //                      this.onDraw (ctx);
+                       //              else {
+                       //                      if (LastPaintedSlot.Width>LastPaintedSlot.Height)
+                       //                              ctx.SetSourceSurface (bmp, 0, (LastPaintedSlot.Width-LastPaintedSlot.Height)/2);
+                       //                      else
+                       //                              ctx.SetSourceSurface (bmp, (LastPaintedSlot.Height-LastPaintedSlot.Width)/2, 0);
+
+                       //                      ctx.Paint ();
+                       //              }
+                       //      }
+                       //      IFace.DragImage = di;
+                       //}
+                       //tv.RemoveChild (this);
+                       //savedParent = tv;
+               }
+
+               public override ILayoutable Parent {
+                       get {
+                               return base.Parent;
+                       }
+                       set {
+                               base.Parent = value;
+                               if (value != null) {
+                                       dragStartPoint = IFace.Mouse.Position;
+                                       savedParent = value as TabView;
+                               }
+                       }
+               }
+               protected override void onStartDrag (object sender, DragDropEventArgs e)
+               {
+                       base.onStartDrag (sender, e);
+
+                       dragStartPoint = IFace.Mouse.Position;
+               }
+               protected override void onEndDrag (object sender, DragDropEventArgs e)
+               {
+                       base.onEndDrag (sender, e);
+
+                       if (Parent != null)
+                               return;
+
+                       savedParent.AddChild (this);
+
+                       IFace.ClearDragImage ();
+               }
+               protected override void onDrop (object sender, DragDropEventArgs e)
+               {
+                       base.onDrop (sender, e);
+                       if (Parent != null)
+                               return;
+                       TabView tv = e.DropTarget as TabView;
+                       if (tv == null)
+                               return;
+
+                       IFace.ClearDragImage ();
+
+                       tv.AddChild (this);
+               }
+               #region Mouse Handling
+               public override bool PointIsIn (ref Point m)
+               {
+                       if (!base.PointIsIn (ref m))
+                               return false;
+                       if (tview == null)//double check this, just added to prevent exception
+                               return false;
+                       if (m.Y < tview.TabHeight)
+                               return TabTitle.Slot.ContainsOrIsEqual (m);
+                       else
+                               return this.isSelected;
+               }
+               public override void onMouseUp (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+                       tview?.UpdateLayout (LayoutingType.ArrangeChildren);
+               }
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       if (Parent == null)
+                               return;
+                       
+                       if (!IsDragged)
+                               return;
+
+                       TabView tv = Parent as TabView;
+                       if (Math.Abs (e.Position.Y - dragStartPoint.Y) > dragThreshold ||
+                               Math.Abs (e.Position.X - dragStartPoint.X) > dragThreshold) {
+                               makeFloating (tv);
+                               return;
+                       }
+
+                       Rectangle cb = ClientRectangle;
+
+                       int tmp = TabOffset + e.XDelta;
+                       if (tmp < tview.LeftSlope) {                            
+                               TabOffset = tview.LeftSlope;
+                       } else if (tmp > cb.Width - tv.RightSlope - tv.TabWidth) {
+                               TabOffset = cb.Width - tv.RightSlope - tv.TabWidth;
+                       }else{
+                               dragStartPoint.X = e.Position.X;
+                               TabItem[] tabItms = tv.Children.Cast<TabItem>().OrderBy (t=>t.ViewIndex).ToArray();
+                               if (ViewIndex > 0 && e.XDelta < 0) {
+                                       TabItem previous = tabItms [ViewIndex - 1];
+                                       if (tmp < previous.TabOffset + tview.TabWidth / 2) {
+                                               previous.ViewIndex = ViewIndex;
+                                               ViewIndex--;
+                                               tv.UpdateLayout (LayoutingType.ArrangeChildren);
+                                       }
+
+                               }else if (ViewIndex < tabItms.Length - 1 && e.XDelta > 0) {
+                                       TabItem next = tabItms [ViewIndex + 1];
+                                       if (tmp > next.TabOffset - tview.TabWidth / 2){
+                                               next.ViewIndex = ViewIndex;
+                                               ViewIndex++;
+                                               tv.UpdateLayout (LayoutingType.ArrangeChildren);
+                                       }
+                               }
+                               TabOffset = tmp;
+                       }
+               }
+               public void butCloseTabClick (object sender, MouseButtonEventArgs e){                   
+                       QueryClose.Raise (this, null);
+                       //if tab is used as a templated item root in a templatedGroup, local datasource
+                       //is not null, in this case, removing the data entries will delete automatically the item
+                       if (localDataSourceIsNull)
+                               (Parent as TabView)?.DeleteChild (this);
+               }
+               #endregion
+
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/TabView.cs b/Crow/src/GraphicObjects/TabView.cs
new file mode 100644 (file)
index 0000000..9f2a9ba
--- /dev/null
@@ -0,0 +1,337 @@
+//
+// TabView.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using vkvg;
+using System.Diagnostics;
+using System.Linq;
+
+namespace Crow
+{      
+       public class TabView : Group
+       {
+               #region CTOR
+               public TabView() : base(){}
+               public TabView (Interface iface) : base(iface){}
+               #endregion
+
+               #region Private fields
+               int adjustedTab = -1;
+               int leftSlope;
+               int rightSlope;
+               Measure tabHeight, tabWidth;
+               Orientation _orientation;
+               int selectedTab;
+               #endregion
+
+               #region public properties
+               [DefaultValue(Orientation.Horizontal)]
+               public virtual Orientation Orientation
+               {
+                       get { return _orientation; }
+                       set {
+                               if (_orientation == value)
+                                       return;
+                               _orientation = value;
+                               NotifyValueChanged ("Orientation", _orientation);
+                               if (_orientation == Orientation.Horizontal)
+                                       NotifyValueChanged ("TabOrientation", Orientation.Vertical);
+                               else
+                                       NotifyValueChanged ("TabOrientation", Orientation.Horizontal);                          
+                               this.RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       }
+               }
+               [DefaultValue(16)]
+               public int LeftSlope
+               {
+                       get { return leftSlope; }
+                       set {
+                               if (leftSlope == value)
+                                       return;
+                               leftSlope = value;
+                               NotifyValueChanged ("leftSlope", leftSlope);
+                               tabSizeHasChanged = true;
+                               //RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       }
+               }
+               bool tabSizeHasChanged = false;
+               [DefaultValue(16)]
+               public int RightSlope
+               {
+                       get { return rightSlope; }
+                       set {
+                               if (rightSlope == value)
+                                       return;
+                               rightSlope = value;
+                               NotifyValueChanged ("RightSlope", rightSlope);
+                               tabSizeHasChanged = true;
+                               //RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       }
+               }
+               [DefaultValue("18")]
+               public Measure TabHeight {
+                       get { return tabHeight; }
+                       set {
+                               if (tabHeight == value)
+                                       return;
+                               tabHeight = value;
+                               NotifyValueChanged ("TabHeight", tabHeight);
+//                             childrenRWLock.EnterReadLock ();
+//                             foreach (GraphicObject ti in Children) {
+//                                     ti.NotifyValueChanged ("TabHeight", tabHeight);
+//                             }
+//                             childrenRWLock.ExitReadLock ();
+                               RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       }
+               }
+               [DefaultValue("120")]
+               public Measure TabWidth {
+                       get { return adjustedTab > 0 ? (Measure)adjustedTab : tabWidth; }
+                       set {
+                               if (tabWidth == value)
+                                       return;
+                               tabWidth = value;
+                               NotifyValueChanged ("TabWidth", TabWidth);
+//
+//                             childrenRWLock.EnterReadLock ();
+//                             foreach (GraphicObject ti in Children) { 
+//                                     ti.NotifyValueChanged ("TabWidth", tabWidth);
+//                             }
+//                             childrenRWLock.ExitReadLock ();
+                               RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       }
+               }
+
+               public virtual int SelectedTab {
+                       get { return selectedTab; }
+                       set {
+                               if (value == selectedTab)
+                                       return;
+
+                               if (selectedTab < Children.Count && selectedTab >= 0)
+                                       (Children [selectedTab] as TabItem).IsSelected = false;
+
+                               selectedTab = value;
+
+                               if (selectedTab < Children.Count && selectedTab >= 0)
+                                       (Children [selectedTab] as TabItem).IsSelected = true;
+
+                               NotifyValueChanged ("SelectedTab", selectedTab);
+                               RegisterForRedraw ();
+                       }
+               }
+               #endregion
+
+               public override void AddChild (Widget child)
+               {
+                       TabItem ti = child as TabItem;
+                       if (ti == null)
+                               throw new Exception ("TabView control accept only TabItem as child.");
+
+                       ti.MouseDown += Ti_MouseDown;
+                       ti.TabTitle.LayoutChanged += Ti_TabTitle_LayoutChanged;
+                       ti.tview = this;
+
+                       base.AddChild (child);
+
+                       SelectedTab = ti.ViewIndex = Children.Count - 1;
+                       this.RegisterForLayouting (LayoutingType.ArrangeChildren);
+               }
+               public override void RemoveChild (Widget child)
+               {
+                       TabItem ti = child as TabItem;
+                       if (ti == null)
+                               throw new Exception ("TabView control accept only TabItem as child.");
+
+                       ti.MouseDown -= Ti_MouseDown;
+                       ti.TabTitle.LayoutChanged -= Ti_TabTitle_LayoutChanged;
+                       ti.tview = null;
+
+                       childrenRWLock.EnterReadLock ();
+
+                       TabItem[] tabItms = Children.Cast<TabItem>().OrderBy (t=>t.ViewIndex).ToArray();
+                       int selTabViewIdx = -1;
+
+                       if (SelectedTab < tabItms.Length && SelectedTab >= 0)
+                               selTabViewIdx = (Children [SelectedTab] as TabItem).ViewIndex;
+
+                       for (int i = selTabViewIdx+1; i < tabItms.Length; i++)
+                               tabItms [i].ViewIndex--;
+
+                       if (selTabViewIdx > tabItms.Length - 2)
+                               selTabViewIdx = tabItms.Length - 2;
+
+                       if (selTabViewIdx < 0)
+                               SelectedTab = -1;
+                       else
+                               SelectedTab = Children.IndexOf (tabItms [selTabViewIdx]);
+
+                       childrenRWLock.ExitReadLock ();
+
+                       base.RemoveChild (child);
+               }
+
+               public override bool ArrangeChildren { get { return true; } }
+               public override bool UpdateLayout (LayoutingType layoutType)
+               {
+                       RegisteredLayoutings &= (~layoutType);
+
+                       if (layoutType == LayoutingType.ArrangeChildren && Children.Count > 0) {
+                               Rectangle cb = ClientRectangle;
+
+                               int tabSpace = tabWidth + leftSlope;
+                               int tc = Children.Count (c => c.Visible == true);
+
+                               if (tc > 0)
+                                       tabSpace = Math.Min(tabSpace, (cb.Width-rightSlope) / tc);
+
+                               if (tabSpace < tabWidth + leftSlope)
+                                       adjustedTab = tabSpace - leftSlope;
+                               else
+                                       adjustedTab = -1;
+
+                               //Console.WriteLine ("tabspace: {0} tw:{1}", tabSpace, tabWidth);
+
+                               childrenRWLock.EnterReadLock();
+                               TabItem[] tabItms = Children.Cast<TabItem>().OrderBy (t=>t.ViewIndex).ToArray();
+                               childrenRWLock.ExitReadLock();
+                               int curOffset = leftSlope;
+
+                               for (int i = 0; i < tabItms.Length; i++) {
+                                       if (!tabItms [i].Visible)
+                                               continue;
+                                       tabItms [i].NotifyValueChanged ("TabHeight", tabHeight);
+                                       tabItms [i].NotifyValueChanged ("TabWidth", TabWidth);
+                                       if (!tabItms [i].IsDragged) {
+                                               tabItms [i].TabOffset = curOffset;
+                                               //Console.WriteLine ("offset: {0}=>{1}", tabItms [i].Name, tabItms [i].TabOffset);
+                                       }
+                                       if (Orientation == Orientation.Horizontal) {
+                                               curOffset += tabSpace;
+                                       } else
+                                               curOffset += tabSpace;                                  
+                               }
+
+                               //if no layouting remains in queue for item, registre for redraw
+                               if (RegisteredLayoutings == LayoutingType.None && IsDirty)
+                                       IFace.EnqueueForRepaint (this);
+
+                               return true;
+                       }
+
+                       return base.UpdateLayout(layoutType);
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       if (_orientation == Orientation.Horizontal) {
+                               if (layoutType == LayoutingType.Width)
+                                       RegisterForLayouting (LayoutingType.ArrangeChildren);                           
+                       } else if (layoutType == LayoutingType.Height)
+                               RegisterForLayouting (LayoutingType.ArrangeChildren);                   
+                       
+                       base.OnLayoutChanges (layoutType);
+               }
+
+               protected override void onDraw (Context gr)
+               {
+                       Rectangle rBack = new Rectangle (Slot.Size);
+
+                       Background.SetAsSource (gr, rBack);
+                       DrawingHelpers.CairoRectangle(gr,rBack, CornerRadius);
+                       gr.Fill ();
+
+                       gr.Save ();
+
+                       if (ClipToClientRect) {
+                               //clip to client zone
+                               DrawingHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                               gr.Clip ();
+                       }
+
+                       childrenRWLock.EnterReadLock ();
+
+                       TabItem[] tabItms = Children.Where(tt=>tt.Visible).Cast<TabItem> ().
+                               OrderBy (t => t.ViewIndex).ToArray ();
+
+                       int selTabViewIdx = -1;
+                       if (SelectedTab < tabItms.Length && SelectedTab >= 0)
+                               selTabViewIdx = (Children [SelectedTab] as TabItem).ViewIndex;
+
+                       childrenRWLock.ExitReadLock ();
+
+                       int i = 0;
+                       while (i < selTabViewIdx) {
+                               tabItms [i].Paint (ref gr);
+                               i++;
+                       }
+                       i = tabItms.Length - 1;
+                       while (i > selTabViewIdx) {
+                               tabItms [i].Paint (ref gr);
+                               i--;
+                       }
+
+                       if (selTabViewIdx >= 0)
+                               tabItms [selTabViewIdx].Paint (ref gr);
+               
+                       gr.Restore ();
+               }
+
+               protected override void onDragEnter (object sender, DragDropEventArgs e)
+               {
+                       base.onDragEnter (sender, e);
+
+                       TabItem ti = e.DragSource as TabItem;
+                       if (ti == null)
+                               return;
+                       if (ti.Parent != null || ti.savedParent == this)
+                               return;
+
+                       this.AddChild (ti);
+
+                       Point p = ScreenPointToLocal (IFace.Mouse.Position) - Margin;
+
+                       p.X = Math.Max (leftSlope, p.X);
+                       p.X = Math.Min (ClientRectangle.Width - rightSlope - TabWidth, p.X);
+                       ti.TabOffset = p.X;
+
+                       IFace.ClearDragImage ();
+
+               }
+
+               void Ti_TabTitle_LayoutChanged (object sender, LayoutingEventArgs e)
+               {
+                       if (e.LayoutType == LayoutingType.X)                            
+                               RegisterForLayouting (LayoutingType.ArrangeChildren);                   
+               }
+               void Ti_MouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       SelectedTab = Children.IndexOf (sender as Widget);
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/TemplatedContainer.cs b/Crow/src/GraphicObjects/TemplatedContainer.cs
new file mode 100644 (file)
index 0000000..61078eb
--- /dev/null
@@ -0,0 +1,101 @@
+//
+// TemplatedContainer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.Xml;
+using System.Reflection;
+
+namespace Crow
+{
+       /// <summary>
+       /// base class for new containers that will use templates.
+       /// 
+       /// TemplatedControl's **must** provide a widget of the [`Container`](Container) class named **_'Content'_** inside their template tree
+       /// </summary>
+       public class TemplatedContainer : TemplatedControl
+       {
+               #if DESIGN_MODE
+               public override void getIML (System.Xml.XmlDocument doc, System.Xml.XmlNode parentElem)
+               {
+                       if (this.design_isTGItem)
+                               return;
+                       base.getIML (doc, parentElem);
+                       if (!HasContent)
+                               return;
+                       Content.getIML (doc, parentElem.LastChild);
+               }
+               #endif
+
+               #region CTOR
+               protected TemplatedContainer() : base(){}
+               public TemplatedContainer (Interface iface) : base(iface){}
+               #endregion
+
+               protected Container _contentContainer;
+
+               /// <summary>
+               /// Single child of this templated container.
+               /// </summary>
+               public virtual Widget Content {
+                       get {
+                               return _contentContainer == null ? null : _contentContainer.Child;
+                       }
+                       set {
+                               _contentContainer.SetChild(value);
+                               NotifyValueChanged ("HasContent", HasContent);
+                       }
+               }
+               [XmlIgnore]public bool HasContent {
+                       get { return _contentContainer?.Child != null; }
+               }
+               //TODO: move loadTemplate and ResolveBinding in TemplatedContainer
+               protected override void loadTemplate(Widget template = null)
+               {
+                       base.loadTemplate (template);
+                       _contentContainer = this.child.FindByName ("Content") as Container;
+               }
+
+               #region GraphicObject overrides
+               public override Widget FindByName (string nameToFind)
+               {
+                       if (Name == nameToFind)
+                               return this;
+
+                       return Content == null ? null : Content.FindByName (nameToFind);
+               }
+               public override bool Contains (Widget goToFind)
+               {
+                       if (Content == goToFind)
+                               return true;
+                       if (Content?.Contains (goToFind) == true)
+                               return true;
+                       return base.Contains (goToFind);
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/TemplatedControl.cs b/Crow/src/GraphicObjects/TemplatedControl.cs
new file mode 100644 (file)
index 0000000..1fa24a4
--- /dev/null
@@ -0,0 +1,162 @@
+//
+// TemplatedControl.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.ComponentModel;
+using System.IO;
+using System.Xml;
+using System.Reflection;
+using vkvg;
+
+namespace Crow
+{
+       /// <summary>
+       /// Base class for all templated widget
+       /// </summary>
+       public abstract class TemplatedControl : PrivateContainer
+       {
+               #if DESIGN_MODE
+               public bool design_inlineTemplate = false;
+               public override void getIML (XmlDocument doc, XmlNode parentElem)
+               {
+                       if (this.design_isTGItem)
+                               return;
+                       base.getIML (doc, parentElem);
+                       if (child == null || !design_inlineTemplate)
+                               return;
+                       XmlElement xe = doc.CreateElement("Template");
+                       child.getIML (doc, xe);
+                       parentElem.LastChild.AppendChild (xe);
+               }
+               #endif
+
+               #region CTOR
+               protected TemplatedControl() : base(){}
+               public TemplatedControl (Interface iface) : base(iface){}
+               #endregion
+
+               string _template;
+               string caption;
+
+               /// <summary>
+               /// Template path
+               /// </summary>
+               //TODO: this property should be renamed 'TemplatePath'
+               [DefaultValue(null)]
+               public string Template {
+                       get { return _template; }
+                       set {
+                               if (Template == value)
+                                       return;
+                               _template = value;
+
+                               if (string.IsNullOrEmpty(_template))
+                                       loadTemplate ();
+                               else
+                                       loadTemplate (IFace.CreateTemplateInstance (_template, this.GetType()));
+                       }
+               }
+               /// <summary>
+               /// a caption being recurrent need in templated widget, it is declared here.
+               /// </summary>
+               [DefaultValue("Templated Control")]
+               public virtual string Caption {
+                       get { return caption; }
+                       set {
+                               if (caption == value)
+                                       return;
+                               caption = value;
+                               NotifyValueChanged ("Caption", caption);
+                       }
+               }
+
+               #region GraphicObject overrides
+
+               public override void Initialize ()
+               {
+                       loadTemplate ();
+                       base.Initialize ();
+               }
+               /// <summary>
+               /// override search method from GraphicObject to prevent
+               /// searching inside template
+               /// </summary>
+               /// <returns>widget identified by name, or null if not found</returns>
+               /// <param name="nameToFind">widget's name to find</param>
+               public override Widget FindByName (string nameToFind) => nameToFind == this.Name ? this : null;
+
+               /// <summary>
+               ///onDraw is overrided to prevent default drawing of background, template top container
+               ///may have a binding to root background or a fixed one.
+               ///this allow applying root background to random template's component
+               /// </summary>
+               /// <param name="gr">Backend context</param>
+               protected override void onDraw (Context gr)
+               {
+                       gr.Save ();
+
+                       if (ClipToClientRect) {
+                               //clip to client zone
+                               DrawingHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                               gr.Clip ();
+                       }
+
+                       if (child != null)
+                               child.Paint (ref gr);
+                       gr.Restore ();
+               }
+               #endregion
+
+               /// <summary>
+               /// Loads the template. Each TemplatedControl MUST provide a default template
+               /// It must be an embedded ressource with ID = fullTypeName.template
+               /// Entry assembly is search first, then the one where the type is defined
+               /// </summary>
+               /// <param name="template">Optional template instance</param>
+               protected virtual void loadTemplate(Widget template = null)
+               {
+                       if (this.child != null)//template change, bindings has to be reset
+                               this.ClearTemplateBinding();
+                       
+                       if (template == null) {
+                               int mdTok = this.GetType ().MetadataToken;
+
+                               if (!IFace.DefaultTemplates.ContainsKey (mdTok)) {
+                                       string defTmpId = this.GetType ().FullName + ".template";
+                                       Stream s = Assembly.GetEntryAssembly ().GetManifestResourceStream (defTmpId);
+                                       if (s == null)
+                                               s = Assembly.GetAssembly (this.GetType ()).GetManifestResourceStream (defTmpId);
+                                       if (s == null)
+                                               throw new Exception (string.Format ("No default template found for '{0}'", this.GetType ().FullName));
+                                       IFace.DefaultTemplates [mdTok] = new IML.Instantiator (IFace, s, defTmpId);
+                               }
+                               this.SetChild (IFace.DefaultTemplates[mdTok].CreateInstance());
+                       }else
+                               this.SetChild (template);
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/TemplatedGroup.cs b/Crow/src/GraphicObjects/TemplatedGroup.cs
new file mode 100644 (file)
index 0000000..0ee9a40
--- /dev/null
@@ -0,0 +1,517 @@
+//
+// TemplatedGroup.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.Xml;
+using System.Reflection;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Collections;
+using System.Threading;
+using System.Linq;
+using Crow.IML;
+using System.Diagnostics;
+using System.IO;
+
+namespace Crow
+{
+       public abstract class TemplatedGroup : TemplatedControl
+       {
+               #if DESIGN_MODE
+               public override void getIML (System.Xml.XmlDocument doc, System.Xml.XmlNode parentElem)
+               {
+                       if (this.design_isTGItem)
+                               return;
+                       base.getIML (doc, parentElem);
+
+                       if (string.IsNullOrEmpty(_itemTemplate)) {
+                               foreach (ItemTemplate it in ItemTemplates.Values) 
+                                       it.getIML (doc, parentElem.LastChild);                          
+                       }
+
+                       foreach (Widget g in Items) {
+                               g.getIML (doc, parentElem.LastChild);   
+                       }
+               }
+               #endif
+
+               #region CTOR
+               protected TemplatedGroup() : base(){}
+               public TemplatedGroup (Interface iface) : base(iface){}
+               #endregion
+
+               protected Group items;
+               string _itemTemplate, dataTest;
+
+               #region events
+               public event EventHandler<SelectionChangeEventArgs> SelectedItemChanged;
+               public event EventHandler Loaded;
+               #endregion
+
+               IList data;
+               int _selectedIndex = -1;
+               Color selBackground, selForeground;
+
+               int itemPerPage = 50;
+               CrowThread loadingThread = null;
+
+               bool isPaged = false;
+
+               #region Templating
+               //TODO: dont instantiate ItemTemplates if not used
+               //but then i should test if null in msil gen
+               public Dictionary<string, ItemTemplate> ItemTemplates = new Dictionary<string, ItemTemplate>();
+
+               /// <summary>
+               /// Keep track of expanded subnodes and closed time to unload
+               /// </summary>
+               //Dictionary<GraphicObject, Stopwatch> nodes = new Dictionary<GraphicObject, Stopwatch>();
+               internal List<Widget> nodes = new List<Widget>();
+               /// <summary>
+               /// Item templates file path, on disk or embedded.
+               /// 
+               /// ItemTemplate file may contains either a single template without the
+               /// ItemTemplate enclosing tag, or several item templates each enclosed
+               /// in a separate tag.
+               /// </summary>          
+               public string ItemTemplate {
+                       get { return _itemTemplate; }
+                       set {
+                               if (value == _itemTemplate)
+                                       return;
+
+                               _itemTemplate = value;
+
+                               //TODO:reload list with new template?
+                               NotifyValueChanged("ItemTemplate", _itemTemplate);
+                       }
+               }
+               protected override void loadTemplate(Widget template = null)
+               {
+                       base.loadTemplate (template);
+
+                       items = this.child.FindByName ("ItemsContainer") as Group;
+                       if (items == null)
+                               throw new Exception ("TemplatedGroup template Must contain a Group named 'ItemsContainer'");
+                       if (items.Children.Count == 0)
+                               NotifyValueChanged ("HasChildren", false);
+                       else
+                               NotifyValueChanged ("HasChildren", true);
+               }
+               /// <summary>
+               /// Use to define condition on Data item for selecting among ItemTemplates.
+               /// Default value is 'TypeOf' for selecting Template depending on Type of Data.
+               /// Other possible values are properties of Data
+               /// </summary>
+               /// <value>The data property test.</value>
+               [DefaultValue("TypeOf")]
+               public string DataTest {
+                       get { return dataTest; }
+                       set {
+                               if (value == dataTest)
+                                       return;
+
+                               dataTest = value;
+
+                               NotifyValueChanged("DataTest", dataTest);
+                       }
+               }
+               #endregion
+
+               public virtual List<Widget> Items{
+                       get {
+                               return isPaged ? items.Children.SelectMany(x => (x as Group).Children).ToList()
+                               : items.Children;
+                       }
+               }
+               [DefaultValue(-1)]public virtual int SelectedIndex{
+                       get { return _selectedIndex; }
+                       set {
+                               if (value == _selectedIndex)
+                                       return;
+
+                               /*if (_selectedIndex >= 0 && Items.Count > _selectedIndex) {
+                                       Items[_selectedIndex].Foreground = Color.Transparent;
+                                       Items[_selectedIndex].Background = Color.Transparent;
+                               }*/
+
+                               _selectedIndex = value;
+
+                               /*if (_selectedIndex >= 0 && Items.Count > _selectedIndex) {
+                                       Items[_selectedIndex].Foreground = SelectionForeground;
+                                       Items[_selectedIndex].Background = SelectionBackground;
+                               }*/
+
+                               NotifyValueChanged ("SelectedIndex", _selectedIndex);
+                               NotifyValueChanged ("SelectedItem", SelectedItem);
+                               SelectedItemChanged.Raise (this, new SelectionChangeEventArgs (SelectedItem));
+                       }
+               }
+               [XmlIgnore]public virtual object SelectedItem{
+                       get { return data == null ? null : _selectedIndex < 0 ? data.GetDefaultValue() : data[_selectedIndex]; }
+                       set {
+                               if (data == null) {
+                                       SelectedIndex = -1;
+                                       return;
+                               }
+                               //TODO:double check if value type will be notified to binding sys
+                               if (value == SelectedItem)
+                                       return;
+                               
+                               SelectedIndex = data.IndexOf (value);
+                       }
+               }
+               [XmlIgnore]public bool HasItems {
+                       get { return Items.Count > 0; }
+               }
+               public IList Data {
+                       get { return data; }
+                       set {
+                               if (value == data)
+                                       return;
+
+                               cancelLoadingThread ();
+
+                               if (data is IObservableList) {
+                                       IObservableList ol = data as IObservableList;
+                                       ol.ListAdd -= Ol_ListAdd;
+                                       ol.ListRemove -= Ol_ListRemove;
+                               }
+
+                               data = value;
+
+                               if (data is IObservableList) {
+                                       IObservableList ol = data as IObservableList;
+                                       ol.ListAdd += Ol_ListAdd;
+                                       ol.ListRemove += Ol_ListRemove;
+                               }
+
+                               NotifyValueChanged ("Data", data);
+
+                               //lock (CurrentInterface.LayoutMutex)
+                                       ClearItems ();
+
+                               if (data == null)
+                                       return;
+
+                               /*loadingThread = new CrowThread (this, loading);
+                               loadingThread.Finished += (object sender, EventArgs e) => (sender as TemplatedGroup).Loaded.Raise (sender, e);
+                               loadingThread.Start ();*/
+                               loading ();
+
+                               NotifyValueChanged ("SelectedIndex", _selectedIndex);
+                               NotifyValueChanged ("SelectedItem", SelectedItem);
+                               SelectedItemChanged.Raise (this, new SelectionChangeEventArgs (SelectedItem));
+                               NotifyValueChanged ("HasItems", HasItems);
+                       }
+               }
+
+               void Ol_ListRemove (object sender, ListChangedEventArg e)
+               {
+                       if (this.isPaged) {
+                               int p = e.Index / itemPerPage;
+                               int i = e.Index % itemPerPage;
+                               (items.Children [p] as Group).DeleteChild (i);
+                       } else
+                               items.DeleteChild (e.Index);
+               }
+
+               void Ol_ListAdd (object sender, ListChangedEventArg e)
+               {
+                       if (this.isPaged) {
+                               throw new NotImplementedException();
+//                             int p = e.Index / itemPerPage;
+//                             int i = e.Index % itemPerPage;
+//                             (items.Children [p] as Group).InsertChild (i, e.Element);
+                       } else
+                               loadItem (e.Element, items, dataTest);
+               }
+
+               [DefaultValue("SteelBlue")]
+               public virtual Color SelectionBackground {
+                       get { return selBackground; }
+                       set {
+                               if (value == selBackground)
+                                       return;
+                               selBackground = value;
+                               NotifyValueChanged ("SelectionBackground", selBackground);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue("White")]
+               public virtual Color SelectionForeground {
+                       get { return selForeground; }
+                       set {
+                               if (value == selForeground)
+                                       return;
+                               selForeground = value;
+                               NotifyValueChanged ("SelectionForeground", selForeground);
+                               RegisterForRedraw ();
+                       }
+               }
+
+               protected void raiseSelectedItemChanged(){
+                       SelectedItemChanged.Raise (this, new SelectionChangeEventArgs (SelectedItem));
+               }
+
+
+               public virtual void AddItem(Widget g){
+                       items.AddChild (g);
+                       g.LogicalParent = this;
+                       NotifyValueChanged ("HasChildren", true);
+               }
+               public virtual void RemoveItem(Widget g)
+               {
+                       g.LogicalParent = null;
+                       items.DeleteChild (g);
+                       if (items.Children.Count == 0)
+                               NotifyValueChanged ("HasChildren", false);
+               }
+
+               public virtual void ClearItems()
+               {
+                       _selectedIndex = -1;
+                       NotifyValueChanged ("SelectedIndex", _selectedIndex);
+                       NotifyValueChanged ("SelectedItem", null);
+
+                       items.ClearChildren ();
+                       NotifyValueChanged ("HasChildren", false);
+               }
+
+
+               #region GraphicObject overrides
+               public override Widget FindByName (string nameToFind)
+               {
+                       if (Name == nameToFind)
+                               return this;
+
+                       foreach (Widget w in Items) {
+                               Widget r = w.FindByName (nameToFind);
+                               if (r != null)
+                                       return r;
+                       }
+                       return null;
+               }
+               public override bool Contains (Widget goToFind)
+               {
+                       foreach (Widget w in Items) {
+                               if (w == goToFind)
+                                       return true;
+                               if (w.Contains (goToFind))
+                                       return true;
+                       }
+                       return base.Contains(goToFind);
+               }
+//             public override void ClearBinding ()
+//             {
+//                     if (items != null)
+//                             items.ClearBinding ();
+//
+//                     base.ClearBinding ();
+//             }
+//             public override void ResolveBindings ()
+//             {
+//                     base.ResolveBindings ();
+//                     if (items != null)
+//                             items.ResolveBindings ();
+//             }
+               #endregion
+
+               /// <summary>
+               /// Items loading thread
+               /// </summary>
+               void loading(){
+                       loadPage (data, items, dataTest);
+               }
+//                     //if (!ItemTemplates.ContainsKey ("default"))
+//                     //      ItemTemplates ["default"] = Interface.GetItemTemplate (ItemTemplate);
+//
+//                     for (int i = 1; i <= (data.Count / itemPerPage) + 1; i++) {
+//                             if ((bool)loadingThread?.cancelRequested) {
+//                                     this.Dispose ();
+//                                     return;
+//                             }
+//                             loadPage (i);
+//                             Thread.Sleep (1);
+//                     }
+//             }
+               void cancelLoadingThread(){
+                       if (loadingThread != null)
+                               loadingThread.Cancel ();
+               }
+               void loadPage(IList _data, Group page, string _dataTest)
+               {
+                       #if DEBUG_LOAD
+                       Stopwatch loadingTime = Stopwatch.StartNew ();
+                       #endif
+
+
+//                     if (typeof(TabView).IsAssignableFrom (items.GetType ())||
+//                             typeof(Menu).IsAssignableFrom (this.GetType())||
+//                             typeof(Wrapper).IsAssignableFrom (items.GetType ())) {
+                               //page = items;
+                               itemPerPage = int.MaxValue;
+//                     } else if (typeof(GenericStack).IsAssignableFrom (items.GetType ())) {
+//                             GenericStack gs = new GenericStack (items.CurrentInterface);
+//                             gs.Orientation = (items as GenericStack).Orientation;
+//                             gs.Width = items.Width;
+//                             gs.Height = items.Height;
+//                             gs.VerticalAlignment = items.VerticalAlignment;
+//                             gs.HorizontalAlignment = items.HorizontalAlignment;
+//                             page = gs;
+//                             page.Name = "page" + pageNum;
+//                             isPaged = true;
+//                     } else {
+//                             page = Activator.CreateInstance (items.GetType ()) as Group;
+//                             page.CurrentInterface = items.CurrentInterface;
+//                             page.Initialize ();
+//                             page.Name = "page" + pageNum;
+//                             isPaged = true;
+//                     }
+
+                       for (int i = 0; i < _data.Count; i++) {                         
+                               loadItem (_data[i], page, _dataTest);
+//                             if (loadingThread.cancelRequested)
+//                                     break;
+                       }
+
+//                     if (page == items)
+//                             return;
+//                     lock (CurrentInterface.LayoutMutex)
+//                             items.AddChild (page);
+
+#if DEBUG_LOAD
+                       loadingTime.Stop ();
+                       using (StreamWriter sw = new StreamWriter ("loading.log", true)) {
+                               sw.WriteLine ($"NEW ;{this.ToString(),-50};{loadingTime.ElapsedTicks,8};{loadingTime.ElapsedMilliseconds,8}");
+                       }
+#endif
+               }
+
+               protected void loadItem(object o, Group page, string _dataTest){
+                       if (o == null)//TODO:surely a threading sync problem
+                               return;
+                       Widget g = null;
+                       ItemTemplate iTemp = null;
+                       Type dataType = o.GetType ();
+                       string itempKey = dataType.FullName;
+
+                       //if item template selection is not done depending on the type of item
+                       //dataTest must contains a member name of the item 
+                       if (_dataTest != "TypeOf") {
+                               try {
+                                       itempKey = CompilerServices.getValue (dataType, o, _dataTest)?.ToString ();
+                               } catch {
+                                       itempKey = dataType.FullName;
+                               }
+                       }
+
+                       if (ItemTemplates.ContainsKey (itempKey))
+                               iTemp = ItemTemplates [itempKey];
+                       else {
+                               foreach (string it in ItemTemplates.Keys) {
+                                       if (it == "default")
+                                               continue;
+                                       Type t = CompilerServices.getTypeFromName (it);
+                                       if (t == null)
+                                               continue;
+                                       if (t.IsAssignableFrom (dataType)) {//TODO:types could be cached
+                                               iTemp = ItemTemplates [it];
+                                               break;
+                                       }
+                               }
+                               if (iTemp == null)
+                                       iTemp = ItemTemplates ["default"];
+                       }
+
+                       lock (IFace.LayoutMutex) {
+                               g = iTemp.CreateInstance();
+                               #if DESIGN_MODE
+                               g.design_isTGItem = true;
+                               #endif
+                               page.AddChild (g);
+//                             if (isPaged)
+                               g.LogicalParent = this;
+                               g.MouseClick += itemClick;
+                       }
+
+                       if (iTemp.Expand != null && g is Expandable) {
+                               Expandable e = g as Expandable;
+                               e.Expand += iTemp.Expand;
+                               e.GetIsExpandable = iTemp.HasSubItems;
+                       }
+
+                       g.DataSource = o;
+               }
+//             protected void _list_LayoutChanged (object sender, LayoutingEventArgs e)
+//             {
+//                     #if DEBUG_LAYOUTING
+//                     Debug.WriteLine("list_LayoutChanged");
+//                     #endif
+//                     if (_gsList.Orientation == Orientation.Horizontal) {
+//                             if (e.LayoutType == LayoutingType.Width)
+//                                     _gsList.Width = approxSize;
+//                     } else if (e.LayoutType == LayoutingType.Height)
+//                             _gsList.Height = approxSize;
+//             }
+               int approxSize
+               {
+                       get {
+                               if (data == null)
+                                       return -1;
+                               GenericStack page1 = items.FindByName ("page1") as GenericStack;
+                               if (page1 == null)
+                                       return -1;
+
+                               return page1.Orientation == Orientation.Horizontal ?
+                                       data.Count < itemPerPage ?
+                                       -1:
+                                       (int)Math.Ceiling ((double)page1.Slot.Width / (double)itemPerPage * (double)(data.Count+1)):
+                                       data.Count < itemPerPage ?
+                                       -1:
+                                       (int)Math.Ceiling ((double)page1.Slot.Height / (double)itemPerPage * (double)(data.Count+1));
+                       }
+               }
+               internal virtual void itemClick(object sender, MouseButtonEventArgs e){
+                       SelectedIndex = data.IndexOf((sender as Widget).DataSource);
+               }
+
+               bool emitHelperIsAlreadyExpanded (Widget go){
+                       if (nodes.Contains (go))
+                               return true;
+                       nodes.Add (go);
+                       return false;
+               }
+
+               protected override void Dispose (bool disposing)
+               {
+                       if (disposing && loadingThread != null)
+                               loadingThread.Cancel ();
+                       base.Dispose (disposing);
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/TestCairoPatch.cs b/Crow/src/GraphicObjects/TestCairoPatch.cs
new file mode 100644 (file)
index 0000000..51d9aaf
--- /dev/null
@@ -0,0 +1,148 @@
+//
+// TestCairoPatch.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using vkvg;
+
+namespace Crow
+{
+       public class TestCairoPatch : Widget
+       {
+               void computeControlPoints (
+                       double xc, double yc,
+                       double x1, double y1,
+                       out double x2, out double y2,
+                       out double x3, out double y3,
+                       double x4, double y4){
+                       double ax = x1 - xc;
+                       double ay = y1 - yc;
+                       double bx = x4 - xc;
+                       double byy = y4 - yc;
+                       double q1 = ax * ax + ay * ay;
+                       double q2 = q1 + ax * bx + ay * byy;
+                       double k2 = 4.0/3.0 * (Math.Sqrt(2.0 * q1 * q2) - q2) / (ax * byy - ay * bx);
+
+
+                       x2 = xc + ax - k2 * ay;
+                       y2 = yc + ay + k2 * ax;
+                       x3 = xc + bx + k2 * byy;
+                       y3 = yc + byy - k2 * bx;
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       //double radius = 100;
+
+                       //double pi3 = Math.PI / 3.0;
+
+                       //MeshPattern mp = new MeshPattern ();
+
+                       //double x1 = radius,y1 = 0,
+                       //x2 = 0, y2 = 0, x3 = 0, y3 = 0, x4 = 0, y4 = 0,
+                       //xc = radius,yc = radius;
+
+                       //double dx = Math.Sin (pi3) * radius;
+                       //double dy = Math.Cos (pi3) * radius;
+
+                       //mp.BeginPatch ();
+                       //mp.MoveTo (xc, yc);
+                       //mp.LineTo (x1, y1);
+                       //x4 = xc + dx;
+                       //y4 = yc - dy;
+                       //computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       //mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       //mp.SetCornerColorRGB (0, 1, 1, 1);
+                       //mp.SetCornerColorRGB (1, 1, 0, 0);
+                       //mp.SetCornerColorRGB (2, 1, 1, 0);
+
+                       //x1 = x4;
+                       //y1 = y4;
+                       //y4 = yc + dy;
+
+                       //computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       //mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       //mp.SetCornerColorRGB (3, 0, 1, 0);
+                       //mp.EndPatch ();
+
+                       //x1 = x4;
+                       //y1 = y4;
+                       //x4 = xc;
+                       //y4 = yc * 2.0;
+
+                       //mp.BeginPatch ();
+                       //mp.MoveTo (xc, yc);
+                       //mp.LineTo (x1, y1);
+                       //computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       //mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       //mp.SetCornerColorRGB (0, 1, 1, 1);
+                       //mp.SetCornerColorRGB (1, 0, 1, 0);
+                       //mp.SetCornerColorRGB (2, 0, 1, 1);
+
+                       //x1 = x4;
+                       //y1 = y4;
+                       //x4 = xc-dx;
+                       //y4 = yc+dy;
+
+                       //computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       //mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       //mp.SetCornerColorRGB (3, 0, 0, 1);
+                       //mp.EndPatch ();
+
+                       //x1 = x4;
+                       //y1 = y4;
+                       //y4 = yc - dy;
+
+                       //mp.BeginPatch ();
+                       //mp.MoveTo (xc, yc);
+                       //mp.LineTo (x1, y1);
+                       //computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       //mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       //mp.SetCornerColorRGB (0, 1, 1, 1);
+                       //mp.SetCornerColorRGB (1, 0, 0, 1);
+                       //mp.SetCornerColorRGB (2, 1, 0, 1);
+
+                       //x1 = x4;
+                       //y1 = y4;
+                       //x4 = radius;
+                       //y4 = 0;
+
+                       //computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       //mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       //mp.SetCornerColorRGB (3, 1, 0, 0);
+                       //mp.EndPatch ();
+
+                       //gr.SetSource (mp);
+                       //gr.Paint ();
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/TextBox.cs b/Crow/src/GraphicObjects/TextBox.cs
new file mode 100644 (file)
index 0000000..a269a23
--- /dev/null
@@ -0,0 +1,226 @@
+//
+// TextBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using vkvg;
+using System.Diagnostics;
+using System.Xml.Serialization;
+
+namespace Crow
+{
+    public class TextBox : Label
+    {
+               #region CTOR
+               protected TextBox() : base(){}
+               public TextBox(Interface iface) : base(iface)
+               { }
+//             public TextBox(string _initialValue)
+//                     : base(_initialValue)
+//             {
+//
+//             }
+               #endregion
+
+               #region GraphicObject overrides
+               [XmlIgnore]public override bool HasFocus   //trigger update when lost focus to errase text beam
+        {
+            get
+            {
+                return base.HasFocus;
+            }
+            set
+            {
+                base.HasFocus = value;
+                RegisterForRedraw();
+            }
+        }
+
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+                       FontExtents fe = gr.FontExtents;
+               }
+               #endregion
+                       
+        #region Keyboard handling
+               public override void onKeyDown (object sender, KeyEventArgs e)
+               {
+                       base.onKeyDown (sender, e);
+
+                       Key key = e.Key;
+
+                       switch (key)
+                       {
+                       case Key.Backspace:
+                               if (CurrentPosition == 0)
+                                       return;
+                               this.DeleteChar();
+                               break;
+                       case Key.Delete:
+                               if (selectionIsEmpty) {
+                                       if (!MoveRight ())
+                                               return;
+                               }else if (IFace.Shift)
+                                       IFace.Clipboard = this.SelectedText;
+                               this.DeleteChar ();
+                               break;
+                       case Key.KeypadEnter:
+                       case Key.Enter:
+                               if (!selectionIsEmpty)
+                                       this.DeleteChar ();
+                               if (Multiline)
+                                       this.InsertLineBreak ();
+                               else
+                                       OnTextChanged(this,new TextChangeEventArgs(Text));
+                               break;
+                       case Key.Escape:
+                               Text = "";
+                               CurrentColumn = 0;
+                               SelRelease = -1;
+                               break;
+                       case Key.Home:
+                               if (IFace.Shift) {
+                                       if (selectionIsEmpty)
+                                               SelBegin = new Point (CurrentColumn, CurrentLine);
+                                       if (IFace.Ctrl)
+                                               CurrentLine = 0;
+                                       CurrentColumn = 0;
+                                       SelRelease = new Point (CurrentColumn, CurrentLine);
+                                       break;
+                               }
+                               SelRelease = -1;
+                               if (IFace.Ctrl)
+                                       CurrentLine = 0;
+                               CurrentColumn = 0;
+                               break;
+                       case Key.End:
+                               if (IFace.Shift) {
+                                       if (selectionIsEmpty)
+                                               SelBegin = CurrentPosition;
+                                       if (IFace.Ctrl)
+                                               CurrentLine = int.MaxValue;
+                                       CurrentColumn = int.MaxValue;
+                                       SelRelease = CurrentPosition;
+                                       break;
+                               }
+                               SelRelease = -1;
+                               if (IFace.Ctrl)
+                                       CurrentLine = int.MaxValue;
+                               CurrentColumn = int.MaxValue;
+                               break;
+                       case Key.Insert:
+                               if (IFace.Shift)
+                                       this.Insert (IFace.Clipboard);
+                               else if (IFace.Ctrl && !selectionIsEmpty)
+                                       IFace.Clipboard = this.SelectedText;
+                               break;
+                       case Key.Left:
+                               if (IFace.Shift) {
+                                       if (selectionIsEmpty)
+                                               SelBegin = new Point(CurrentColumn, CurrentLine);
+                                       if (IFace.Ctrl)
+                                               GotoWordStart ();
+                                       else if (!MoveLeft ())
+                                               return;
+                                       SelRelease = CurrentPosition;
+                                       break;
+                               }
+                               SelRelease = -1;
+                               if (IFace.Ctrl)
+                                       GotoWordStart ();
+                               else
+                                       MoveLeft();
+                               break;
+                       case Key.Right:
+                               if (IFace.Shift) {
+                                       if (selectionIsEmpty)
+                                               SelBegin = CurrentPosition;
+                                       if (IFace.Ctrl)
+                                               GotoWordEnd ();
+                                       else if (!MoveRight ())
+                                               return;
+                                       SelRelease = CurrentPosition;
+                                       break;
+                               }
+                               SelRelease = -1;
+                               if (IFace.Ctrl)
+                                       GotoWordEnd ();
+                               else
+                                       MoveRight ();
+                               break;
+                       case Key.Up:
+                               if (IFace.Shift) {
+                                       if (selectionIsEmpty)
+                                               SelBegin = CurrentPosition;
+                                       CurrentLine--;
+                                       SelRelease = CurrentPosition;
+                                       break;
+                               }
+                               SelRelease = -1;
+                               CurrentLine--;
+                               break;
+                       case Key.Down:
+                               if (IFace.Shift) {
+                                       if (selectionIsEmpty)
+                                               SelBegin = CurrentPosition;
+                                       CurrentLine++;
+                                       SelRelease = CurrentPosition;
+                                       break;
+                               }
+                               SelRelease = -1;
+                               CurrentLine++;                          
+                               break;
+                       case Key.Menu:
+                               break;
+                       case Key.NumLock:
+                               break;
+                       case Key.PageDown:                              
+                               break;
+                       case Key.PageUp:
+                               break;
+                       case Key.Tab:
+                               this.Insert ("\t");
+                               break;
+                       default:
+                               break;
+                       }
+
+                       RegisterForGraphicUpdate();
+               }
+               public override void onKeyPress (object sender, KeyPressEventArgs e)
+               {
+                       base.onKeyPress (sender, e);
+
+                       this.Insert (e.KeyChar.ToString());
+
+                       SelRelease = -1;
+                       SelBegin = new Point(CurrentColumn, SelBegin.Y);
+
+                       RegisterForGraphicUpdate();
+               }
+        #endregion
+       } 
+}
diff --git a/Crow/src/GraphicObjects/TextRun.cs b/Crow/src/GraphicObjects/TextRun.cs
new file mode 100644 (file)
index 0000000..7e09fd0
--- /dev/null
@@ -0,0 +1,309 @@
+//
+// TextRun.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Diagnostics;
+using vkvg;
+using System.Text.RegularExpressions;
+using System.Xml.Serialization;
+using System.ComponentModel;
+
+namespace Crow
+{
+       [DesignIgnore]
+       public class TextRun : Widget
+       {
+               #region CTOR
+               protected TextRun () : base(){}
+               public TextRun (Interface iface) : base (iface){}
+               #endregion
+
+               //TODO:change protected to private
+
+               #region private and protected fields
+               protected string _text = "label";
+               Alignment _textAlignment = Alignment.Left;
+               bool horizontalStretch = false;
+               bool verticalStretch = false;
+               bool _multiline;
+               bool wordWrap;
+               protected Rectangle rText;
+               protected float widthRatio = 1f;
+               protected float heightRatio = 1f;
+               protected FontExtents fe;
+               protected TextExtents te;
+               #endregion
+
+
+               
+               [DefaultValue (Alignment.Left)]
+               public Alignment TextAlignment {
+                       get { return _textAlignment; }
+                       set { _textAlignment = value; }
+               }
+               
+               [DefaultValue (false)]
+               public virtual bool HorizontalStretch {
+                       get { return horizontalStretch; }
+                       set {
+                               if (horizontalStretch == value)
+                                       return;
+                               horizontalStretch = value;
+                               RegisterForRedraw ();
+                               NotifyValueChanged ("HorizontalStretch", horizontalStretch);
+                       }
+               }
+               
+               [DefaultValue (false)]
+               public virtual bool VerticalStretch {
+                       get { return verticalStretch; }
+                       set {
+                               if (verticalStretch == value)
+                                       return;
+                               verticalStretch = value;
+                               RegisterForRedraw ();
+                               NotifyValueChanged ("VerticalStretch", verticalStretch);
+                       }
+               }
+               
+               [DefaultValue ("label")]
+               public string Text {
+                       get {
+                               return lines == null ?
+                                       _text : lines.Aggregate ((i, j) => i + Interface.LineBreak + j);
+                       }
+                       set {
+                               if (_text == value)
+                                       return;
+
+                               RegisterForGraphicUpdate ();
+
+                               _text = value;
+
+                               if (string.IsNullOrEmpty (_text))
+                                       _text = "";
+
+                               lines = getLines;
+                       }
+               }
+               
+               [DefaultValue (false)]
+               public bool Multiline {
+                       get { return _multiline; }
+                       set {
+                               _multiline = value;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               
+               [DefaultValue (false)]
+               public bool WordWrap {
+                       get {
+                               return wordWrap;
+                       }
+                       set {
+                               if (wordWrap == value)
+                                       return;
+                               wordWrap = value;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+
+               List<string> lines;
+               List<string> getLines {
+                       get {
+                               return _multiline ?
+                                       Regex.Split (_text, "\r\n|\r|\n").ToList () :
+                                       new List<string> (new string [] { _text });
+                       }
+               }
+
+               #region GraphicObject overrides
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       if (lines == null)
+                               lines = getLines;
+
+                       using (Surface img = new Surface (IFace.dev, 10, 10)) {
+                               using (Context gr = new Context (img)) {
+                                       //Cairo.FontFace cf = gr.GetContextFontFace ();
+
+                                       gr.FontFace = Font.Name;
+                                       gr.FontSize = (uint)Font.Size;
+
+
+                                       fe = gr.FontExtents;
+                                       te = new TextExtents ();
+
+                                       if (lt == LayoutingType.Height) {
+                                               int lc = lines.Count;
+                                               //ensure minimal height = text line height
+                                               if (lc == 0)
+                                                       lc = 1;
+
+                                               return (int)(fe.Height * lc) + Margin * 2;
+                                       }
+
+                                       foreach (string s in lines) {
+                                               string l = s.Replace("\t", new String (' ', Interface.TabSize));
+                                               TextExtents tmp = gr.TextExtents (l);
+                                               if (tmp.XAdvance > te.XAdvance)
+                                                       te = tmp;
+                                       }
+                                       return (int)Math.Ceiling (te.XAdvance) + Margin * 2;
+                               }
+                       }
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       //gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                       //gr.SetFontSize (Font.Size);
+                       //gr.FontOptions = Interface.FontRenderingOptions;
+                       //gr.Antialias = Interface.Antialias;
+
+                       rText = new Rectangle (new Size (
+                               measureRawSize (LayoutingType.Width), measureRawSize (LayoutingType.Height)));
+                       rText.Width -= 2 * Margin;
+                       rText.Height -= 2 * Margin;
+
+                       widthRatio = 1f;
+                       heightRatio = 1f;
+
+                       Rectangle cb = ClientRectangle;
+
+                       //ignore text alignment if size to content = true
+                       //or if text size is larger than client bounds
+                       if (Width < 0 || Height < 0 || rText.Width > cb.Width) {
+                               rText.X = cb.X;
+                               rText.Y = cb.Y;
+                       } else {
+                               if (horizontalStretch) {
+                                       widthRatio = (float)cb.Width / rText.Width;
+                                       if (!verticalStretch)
+                                               heightRatio = widthRatio;
+                               }
+                               if (verticalStretch) {
+                                       heightRatio = (float)cb.Height / rText.Height;
+                                       if (!horizontalStretch)
+                                               widthRatio = heightRatio;
+                               }
+
+                               rText.Width = (int)(widthRatio * cb.Width);
+                               rText.Height = (int)(heightRatio * cb.Height);
+
+                               switch (TextAlignment) {
+                               case Alignment.TopLeft:     //ok
+                                       rText.X = cb.X;
+                                       rText.Y = cb.Y;
+                                       break;
+                               case Alignment.Top:   //ok                                              
+                                       rText.Y = cb.Y;
+                                       rText.X = cb.X + cb.Width / 2 - rText.Width / 2;
+                                       break;
+                               case Alignment.TopRight:    //ok
+                                       rText.Y = cb.Y;
+                                       rText.X = cb.Right - rText.Width;
+                                       break;
+                               case Alignment.Left://ok
+                                       rText.X = cb.X;
+                                       rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+                                       break;
+                               case Alignment.Right://ok
+                                       rText.X = cb.X + cb.Width - rText.Width;
+                                       rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+                                       break;
+                               case Alignment.Bottom://ok
+                                       rText.X = cb.Width / 2 - rText.Width / 2;
+                                       rText.Y = cb.Height - rText.Height;
+                                       break;
+                               case Alignment.BottomLeft://ok
+                                       rText.X = cb.X;
+                                       rText.Y = cb.Bottom - rText.Height;
+                                       break;
+                               case Alignment.BottomRight://ok
+                                       rText.Y = cb.Bottom - rText.Height;
+                                       rText.X = cb.Right - rText.Width;
+                                       break;
+                               case Alignment.Center://ok
+                                       rText.X = cb.X + cb.Width / 2 - rText.Width / 2;
+                                       rText.Y = cb.Y + cb.Height / 2 - rText.Height / 2;
+                                       break;
+                               }
+                       }
+
+                       //gr.FontMatrix = new Matrix (widthRatio * Font.Size, 0, 0, heightRatio * Font.Size, 0, 0);
+
+
+                       int curLineCount = 0;
+                       for (int i = 0; i < lines.Count; i++) {
+                               string l = lines [i].Replace ("\t", new String (' ', Interface.TabSize));
+                               List<string> wl = new List<string> ();
+                               int lineLength = (int)gr.TextExtents (l).XAdvance;
+
+                               if (wordWrap && lineLength > cb.Width) {
+                                       string tmpLine = "";
+                                       int curChar = 0;
+                                       while (curChar < l.Length) {
+                                               tmpLine += l [curChar];
+                                               if ((int)gr.TextExtents (tmpLine).XAdvance > cb.Width) {
+                                                       tmpLine = tmpLine.Remove (tmpLine.Length - 1);
+                                                       wl.Add (tmpLine);
+                                                       tmpLine = "";
+                                                       continue;
+                                               }
+                                               curChar++;
+                                       }
+                                       wl.Add (tmpLine);
+                               } else
+                                       wl.Add (l);
+
+                               foreach (string ll in wl) {
+                                       lineLength = (int)gr.TextExtents (ll).XAdvance;
+
+
+                                       if (string.IsNullOrWhiteSpace (ll)) {
+                                               curLineCount++;
+                                               continue;
+                                       }
+
+                                       Foreground.SetAsSource (gr);
+                                       gr.MoveTo (rText.X, rText.Y + fe.Ascent + fe.Height * curLineCount);
+
+                                       gr.ShowText (ll);
+                                       gr.Fill ();
+
+                                       curLineCount++;
+                               }
+                       }
+               }
+               #endregion
+       }
+}
diff --git a/Crow/src/GraphicObjects/TreeView.cs b/Crow/src/GraphicObjects/TreeView.cs
new file mode 100644 (file)
index 0000000..3bcf638
--- /dev/null
@@ -0,0 +1,106 @@
+//
+// TreeView.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.Diagnostics;
+using System.ComponentModel;
+
+namespace Crow
+{
+       //treeview expect expandable child (or not)
+       //if their are expandable, some functions and events are added
+       public class TreeView : TemplatedGroup
+       {
+               Widget selectedItemContainer = null;
+               bool isRoot;
+
+               #region CTOR
+               protected TreeView() : base(){}
+               public TreeView (Interface iface) : base(iface)
+               {
+               }
+               #endregion
+
+               [DefaultValue(false)]
+               public virtual bool IsRoot {
+                       get { return isRoot; }
+                       set {
+                               if (isRoot == value)
+                                       return;
+                               isRoot = value;
+                               NotifyValueChanged ("IsRoot", isRoot);
+                       }
+               }
+               [XmlIgnore]public override object SelectedItem {
+                       get {
+                               return selectedItemContainer == null ?
+                                       "" : selectedItemContainer.DataSource;
+                       }
+               }
+
+               internal override void itemClick (object sender, MouseButtonEventArgs e)
+               {
+                       Widget tmp = sender as Widget;
+                       /*if (selectedItemContainer != null) {
+                               selectedItemContainer.Foreground = Color.Transparent;
+                               selectedItemContainer.Background = Color.Transparent;
+                       }*/
+                       selectedItemContainer = tmp;
+                       //selectedItemContainer.Foreground = SelectionForeground;
+                       //selectedItemContainer.Background = SelectionBackground;
+                       NotifyValueChanged ("SelectedItem", SelectedItem);
+                       raiseSelectedItemChanged ();
+               }
+
+               void onExpandAll_MouseClick (object sender, MouseButtonEventArgs e)
+               {
+                       ExpandAll ();
+               }
+
+               public void ExpandAll(){
+                       foreach (Group grp in items.Children) {
+                               foreach (Widget go in grp.Children) {
+                                       Expandable exp = go as Expandable;
+                                       if (exp == null)
+                                               continue;
+                                       TreeView subTV = exp.FindByName ("List") as TreeView;
+                                       if (subTV == null)
+                                               continue;
+                                       EventHandler handler = null;
+                                       handler = delegate(object sender, EventArgs e) {
+                                               TreeView tv = sender as TreeView;
+                                               tv.Loaded -= handler;
+                                               tv.ExpandAll ();
+                                       };
+                                       subTV.Loaded += handler;
+                                       exp.IsExpanded = true;
+                               }
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Trend.cs b/Crow/src/GraphicObjects/Trend.cs
new file mode 100644 (file)
index 0000000..e6d6490
--- /dev/null
@@ -0,0 +1,189 @@
+//
+// Trend.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using vkvg;
+
+namespace Crow
+{
+       public class Trend : Widget
+       {
+               #region private fields
+               double minValue, maxValue, lowThreshold, highThreshold;
+               Fill lowThresholdFill, highThresholdFill;
+               int nbValues;
+               List<double> values = new List<double>();
+               #endregion
+
+
+
+               public virtual void AddValue(double _value)
+               {
+                       values.Add (_value);
+                       while (values.Count > nbValues)
+                               values.RemoveAt (0);
+                       RegisterForRedraw ();
+               }
+               #region CTOR
+               protected Trend () : base()
+               {
+               }
+               #endregion
+               [XmlIgnore]public virtual int NewValue {
+                       set {
+                               AddValue (value);
+                       }
+               }
+               [DefaultValue(400)]
+               public virtual int NbValues {
+                       get { return nbValues; }
+                       set {
+                               if (nbValues == value)
+                                       return;
+
+                               nbValues = value;
+                               NotifyValueChanged ("NbValues", minValue);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(0.0)]
+               public virtual double Minimum {
+                       get { return minValue; }
+                       set {
+                               if (minValue == value)
+                                       return;
+
+                               minValue = value;
+                               NotifyValueChanged ("Minimum", minValue);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(100.0)]
+               public virtual double Maximum
+               {
+                       get { return maxValue; }
+                       set {
+                               if (maxValue == value)
+                                       return;
+
+                               maxValue = value;
+                               NotifyValueChanged ("Maximum", maxValue);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(1.0)]
+               public virtual double LowThreshold {
+                       get { return lowThreshold; }
+                       set {
+                               if (lowThreshold == value)
+                                       return;
+                               lowThreshold = value;
+                               NotifyValueChanged ("LowThreshold", lowThreshold);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               [DefaultValue(80.0)]
+               public virtual double HighThreshold {
+                       get { return highThreshold; }
+                       set {
+                               if (highThreshold == value)
+                                       return;
+                               highThreshold = value;
+                               NotifyValueChanged ("HighThreshold", highThreshold);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               [DefaultValue("DarkRed")]
+               public virtual Fill LowThresholdFill {
+                       get { return lowThresholdFill; }
+                       set {
+                               if (lowThresholdFill == value)
+                                       return;
+                               lowThresholdFill = value;
+                               NotifyValueChanged ("LowThresholdFill", lowThresholdFill);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue("DarkGreen")]
+               public virtual Fill HighThresholdFill {
+                       get { return highThresholdFill; }
+                       set {
+                               if (highThresholdFill == value)
+                                       return;
+                               highThresholdFill = value;
+                               NotifyValueChanged ("HighThresholdFill", highThresholdFill);
+                               RegisterForRedraw ();
+                       }
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+//                     if (values.Count == 0)
+//                             return;
+//                     Rectangle r = ClientRectangle;
+
+//                     int i = values.Count -1;
+
+//                     double ptrX = (double)r.Right;
+//                     double scaleY = (double)r.Height / (Maximum - Minimum);
+//                     double stepX = (double)r.Width / (double)(nbValues-1);
+
+//                     gr.LineWidth = 1.0;
+//                     gr.SetDash (new double[]{ 1.0 },0.0);
+
+
+
+//                     LowThresholdFill.SetAsSource (gr);
+//                     gr.MoveTo (r.Left, r.Bottom - LowThreshold * scaleY);
+//                     gr.LineTo (r.Right, r.Bottom - LowThreshold * scaleY);
+////                   gr.Rectangle (r.Left, r.Bottom - LowThreshold * scaleY, r.Width, LowThreshold * scaleY);
+//                     gr.Stroke();
+
+//                     HighThresholdFill.SetAsSource (gr);
+//                     gr.MoveTo (r.Left, (Maximum - HighThreshold) * scaleY);
+//                     gr.LineTo (r.Right, (Maximum - HighThreshold) * scaleY);
+////                   gr.Rectangle (r.Left, r.Top, r.Width, (Maximum - HighThreshold) * scaleY);
+                       //gr.Stroke();
+
+                       //gr.MoveTo (ptrX, values [i] * scaleY);
+
+                       //Foreground.SetAsSource (gr);
+                       //gr.SetDash (new double[]{ }, 0.0);
+
+                       //while (i >= 0) {
+                       //              gr.LineTo (ptrX, r.Bottom - values [i] * scaleY);
+                       //      ptrX -= stepX;
+                       //      i--;
+                       //}
+                       //gr.Stroke ();
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/VerticalStack.cs b/Crow/src/GraphicObjects/VerticalStack.cs
new file mode 100644 (file)
index 0000000..cf0a251
--- /dev/null
@@ -0,0 +1,54 @@
+//
+// VerticalStack.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Crow
+{
+       /// <summary>
+       /// group control stacking its children vertically
+       /// </summary>
+    public class VerticalStack : GenericStack
+    {
+               #region CTOR
+               protected VerticalStack() : base(){}
+               public VerticalStack(Interface iface) : base(iface)
+        {
+        }
+               #endregion
+
+        [XmlIgnore]
+        public override Orientation Orientation
+        {
+            get { return Orientation.Vertical; }            
+        }
+
+
+    }
+}
diff --git a/Crow/src/GraphicObjects/Widget.cs b/Crow/src/GraphicObjects/Widget.cs
new file mode 100644 (file)
index 0000000..0f8f180
--- /dev/null
@@ -0,0 +1,2003 @@
+//
+// GraphicObject.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Xml.Serialization;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Runtime.CompilerServices;
+using vkvg;
+using System.Diagnostics;
+using Crow.IML;
+using System.Threading;
+
+
+#if DESIGN_MODE
+using System.Xml;
+using System.IO;
+#endif
+
+namespace Crow
+{
+       /// <summary>
+       /// The base class for all the graphic tree elements.
+       /// </summary>
+       public class Widget : ILayoutable, IValueChange, IDisposable
+       {
+               internal ReaderWriterLockSlim parentRWLock = new ReaderWriterLockSlim();
+               #if DEBUG_LOG
+               //0 is the main graphic tree, for other obj tree not added to main tree, it range from 1->n
+               //useful to track events for obj shown later, not on start, or never added to main tree
+               public int treeIndex;
+               public int yIndex;//absolute index in the graphic tree for debug draw
+               public int xLevel;//x increment for debug draw
+               #endif
+               #if DESIGN_MODE
+               static MethodInfo miDesignAddDefLoc = typeof(Widget).GetMethod("design_add_style_location",
+                       BindingFlags.Instance | BindingFlags.NonPublic);
+               static MethodInfo miDesignAddValLoc = typeof(Widget).GetMethod("design_add_iml_location",
+                       BindingFlags.Instance | BindingFlags.NonPublic);
+               
+               public volatile bool design_HasChanged = false;
+               public string design_id;
+               public int design_line;
+               public int design_column;
+               public string design_imlPath;
+               public bool design_isTGItem = false;//true if this is a templated item's root
+               public Dictionary<string,string> design_iml_values = new Dictionary<string, string>();
+               public Dictionary<string,string> design_style_values = new Dictionary<string, string>();
+               //public Dictionary<string,FileLocation> design_iml_locations = new Dictionary<string, FileLocation>();
+               public Dictionary<string,FileLocation> design_style_locations = new Dictionary<string, FileLocation>();
+
+               internal void design_add_style_location (string memberName, string path, int line, int col) {                   
+                       if (design_style_locations.ContainsKey(memberName)){
+                               Console.WriteLine ("default value localtion already set for {0}{1}.{2}", this.GetType().Name, this.design_id, memberName);
+                               return;
+                       }
+                       design_style_locations.Add(memberName, new FileLocation(path,line,col));
+               }
+//             internal void design_add_iml_location (string memberName, string path, int line, int col) {
+//                     if (design_iml_locations.ContainsKey(memberName)){
+//                             Console.WriteLine ("IML value localtion already set for {0}{1}.{2}", this.GetType().Name, this.design_id, memberName);
+//                             return;
+//                     }
+//                     design_iml_locations.Add(memberName, new FileLocation(path,line,col));
+//             }
+                       
+               public virtual bool FindByDesignID(string designID, out Widget go){
+                       go = null;
+                       if (this.design_id == designID){
+                               go = this;
+                               return true;
+                       }
+                       return false;
+               }
+
+               public string GetIML(){
+                       XmlDocument doc = new XmlDocument( );
+
+                       using (StringWriter sw = new StringWriter ()) {
+                               XmlWriterSettings settings = new XmlWriterSettings {
+                                       Indent = true,
+                                       IndentChars = "\t",
+                               };
+                               using (XmlWriter xtw = XmlWriter.Create (sw, settings)) {
+                                       //(1) the xml declaration is recommended, but not mandatory
+                                       XmlDeclaration xmlDeclaration = doc.CreateXmlDeclaration ("1.0", "UTF-8", null);
+                                       doc.InsertBefore (xmlDeclaration, null);
+                                       getIML (doc, (XmlNode)doc);
+                                       doc.WriteTo (xtw);
+                               }
+                               this.design_HasChanged = false;
+                               return sw.ToString ();
+                       }
+               }
+
+               public virtual void getIML(XmlDocument doc, XmlNode parentElem) {
+                       if (this.design_isTGItem)
+                               return;
+                       
+                       XmlElement xe = doc.CreateElement(this.GetType().Name);
+
+                       foreach (KeyValuePair<string,string> kv in design_iml_values) {
+                               XmlAttribute xa = doc.CreateAttribute (kv.Key);
+                               xa.Value = kv.Value;
+                               xe.Attributes.Append (xa);
+                       }
+
+                       parentElem.AppendChild (xe);
+               }
+               public Surface CreateIcon (int dragIconSize = 32) {
+                       Surface di = null; //new ImageSurface (Format.Argb32, dragIconSize, dragIconSize);
+                       //using (Context ctx = new Context (di)) {
+                       //      double div = Math.Max (LastPaintedSlot.Width, LastPaintedSlot.Height);
+                       //      double s = (double)dragIconSize / div;
+                       //      ctx.Scale (s, s);
+                       //      if (bmp == null)
+                       //              this.onDraw (ctx);
+                       //      else {
+                       //              if (LastPaintedSlot.Width>LastPaintedSlot.Height)
+                       //                      ctx.SetSourceSurface (bmp, 0, (LastPaintedSlot.Width-LastPaintedSlot.Height)/2);
+                       //              else
+                       //                      ctx.SetSourceSurface (bmp, (LastPaintedSlot.Height-LastPaintedSlot.Width)/2, 0);
+                       //              ctx.Paint ();
+                       //      }
+                       //}
+                       return di;
+               }
+        public string DesignName {
+            get { return GetType ().Name + design_id; }
+        }
+               #endif
+
+               #region IDisposable implementation
+               protected bool disposed = false;
+
+               public void Dispose(){  
+                       Dispose(true);  
+                       GC.SuppressFinalize(this);  
+               }  
+               ~Widget(){
+                       Debug.WriteLine(this.ToString() + " not disposed by user");
+                       Dispose(false);
+               }
+               protected virtual void Dispose(bool disposing){
+                       if (disposed){
+                               #if DEBUG_DISPOSE
+                               Debug.WriteLine ("Trying to dispose already disposed obj: {0}", this.ToString());
+                               #endif
+                               return;
+                       }
+
+                       if (disposing) {
+                               #if DEBUG_DISPOSE
+                               Debug.WriteLine ("Disposing: {0}", this.ToString());
+                               if (IsQueueForRedraw)
+                               throw new Exception("Trying to dispose an object queued for Redraw: " + this.ToString());
+                               #endif
+
+                               unshownPostActions ();
+
+                               if (!localDataSourceIsNull)
+                                       DataSource = null;
+
+                               parentRWLock.EnterWriteLock();
+                               parent = null;
+                               parentRWLock.ExitWriteLock();
+                       } else
+                               Debug.WriteLine ("!!! Finalized by GC: {0}", this.ToString ());
+                       bmp?.Dispose ();
+                       disposed = true;
+               }  
+               #endregion
+
+               #if DEBUG_LOG
+               internal static List<GraphicObject> GraphicObjects = new List<GraphicObject>();
+               #endif
+
+               internal bool isPopup = false;
+               public Widget focusParent {
+                       get { return (isPopup ? LogicalParent : parent) as Widget; }
+               }
+
+               /// <summary>
+               /// interface this widget is bound to, this should not be changed once the instance is created
+               /// </summary>
+               public Interface IFace = null;
+
+               /// <summary>
+               /// contains the dirty rectangles in the coordinate system of the cache. those dirty zones
+               /// are repeated at each cached levels of the tree with correspondig coordinate system. This is done
+               /// in a dedicated step of the update between layouting and drawing.
+               /// </summary>
+               public Rectangles Clipping = new Rectangles();
+
+               #region IValueChange implementation
+               /// <summary>
+               /// Raise to notify that the value of a property has changed, the binding system
+               /// rely mainly on this event. the member name may not be present in the class, this is 
+               /// used in **propertyless** bindings, this allow to raise custom named events without needing
+               /// to create an new one in the class or a new property.
+               /// </summary>
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               /// <summary>
+               /// Helper function to raise the value changed event
+               /// </summary>
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       //Debug.WriteLine ("Value changed: {0}->{1} = {2}", this, MemberName, _value);
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               #region CTOR
+               /// <summary>
+               /// default private parameter less constructor use in instantiators, it should not be used
+               /// when creating widget from code because widgets has to be bound to an interface before any other
+               /// action.
+               /// </summary>
+               protected Widget () {
+                       #if DEBUG_LOG
+                       GraphicObjects.Add (this);
+                       DebugLog.AddEvent(DbgEvtType.GOClassCreation, this);
+                       #endif                  
+               }
+               /// <summary>
+               /// This constructor **must** be used when creating widget from code.
+               ///
+               /// When creating new widgets derived from GraphicObject, both parameterless and this constructors are
+               /// facultatives, the compiler will create the parameterless one automaticaly if no other one exists.
+               /// But if you intend to be able to create instances of the new widget in code and override the constructor
+               /// with the Interface parameter, you **must** also provide the override of the parameterless constructor because
+               /// compiler will not create it automatically because of the presence of the other one.
+               /// </summary>
+               /// <param name="iface">Iface.</param>
+               public Widget (Interface iface) : this()
+               {
+                       IFace = iface;
+                       Initialize ();
+               }
+               #endregion
+               //internal bool initialized = false;
+               /// <summary>
+               /// Initialize this Graphic object instance by setting style and default values and loading template if required
+               /// </summary>
+               public virtual void Initialize(){
+                       loadDefaultValues ();
+               }
+               #region private fields
+               LayoutingType registeredLayoutings = LayoutingType.All;
+               ILayoutable logicalParent;
+               ILayoutable parent;
+               string name;
+               Fill background = Color.Transparent;
+               Fill foreground = Color.White;
+               Font font = "sans, 10";
+               protected Measure width, height;
+               int left, top;
+               double cornerRadius;
+               int margin;
+               bool focusable ;
+               bool hasFocus;
+               bool isActive;
+               bool isHover;
+               bool mouseRepeat;
+               bool forwardMouseEvents;
+               protected bool isVisible = true;
+               bool isEnabled = true;
+               VerticalAlignment verticalAlignment = VerticalAlignment.Center;
+               HorizontalAlignment horizontalAlignment = HorizontalAlignment.Center;
+               Size maximumSize = "0,0";
+               Size minimumSize = "0,0";
+               bool cacheEnabled;
+               bool clipToClientRect = true;
+               Type dataSourceType;
+               protected object dataSource;
+               bool rootDataLevel;
+               string style;
+               object tag;
+               bool isDragged;
+               bool allowDrag;
+               bool allowDrop;
+               string tooltip;
+               IList<Command> contextCommands;
+               #endregion
+
+               #region public fields
+               /// <summary>
+               /// Current size and position computed during layouting pass
+               /// </summary>
+               public Rectangle Slot = new Rectangle ();
+               /// <summary>
+               /// keep last slot components for each layouting pass to track
+               /// changes and trigger update of other component accordingly
+               /// </summary>
+               public Rectangle LastSlots;
+               /// <summary>
+               /// keep last slot painted on screen to clear traces if moved or resized
+               /// version to clear effective oldslot if parents have been moved or resized.
+               /// IDEA is to add a ScreenCoordinates function that use only lastPaintedSlots
+               /// </summary>
+               //TODO: we should ensure the whole parsed widget tree is the last painted
+               public Rectangle LastPaintedSlot;
+               /// <summary>Prevent requeuing multiple times the same widget</summary>
+               public bool IsQueueForClipping = false;
+               /// <summary>drawing Cache, if null, a redraw is done, cached or not</summary>
+               public Surface bmp;
+               public bool IsDirty = true;
+               /// <summary>
+               /// This size is computed on each child' layout changes.
+               /// In stacking widget, it is used to compute the remaining space for the stretched
+               /// widget inside the stack, which is never added to the contentSize, instead, its size
+               /// is deducted from (parent.ClientRectangle - contentSize)
+               /// </summary>
+               internal Size contentSize;
+               #endregion
+
+               #region ILayoutable
+               [XmlIgnore]public LayoutingType RegisteredLayoutings { get { return registeredLayoutings; } set { registeredLayoutings = value; } }
+               //TODO: it would save the recurent cost of a cast in event bubbling if parent type was GraphicObject
+               //              or we could add to the interface the mouse events
+               /// <summary>
+               /// Parent in the graphic tree, used for rendering and layouting
+               /// </summary>
+               [XmlIgnore]public virtual ILayoutable Parent {
+                       get { return parent; }
+                       set {
+                               if (parent == value)
+                                       return;
+                               DataSourceChangeEventArgs e = new DataSourceChangeEventArgs (parent, value);
+
+                               parentRWLock.EnterWriteLock();
+                               parent = value;
+                               Slot = LastSlots = default(Rectangle);
+                               parentRWLock.ExitWriteLock();
+                                                                       
+                               onParentChanged (this, e);
+                       }
+               }
+               [XmlIgnore]public ILayoutable LogicalParent {
+                       get { return logicalParent == null ? Parent : logicalParent; }
+                       set {
+                               if (logicalParent == value)
+                                       return;
+                               if (logicalParent != null)
+                                       (logicalParent as Widget).DataSourceChanged -= onLogicalParentDataSourceChanged;
+                               DataSourceChangeEventArgs dsce = new DataSourceChangeEventArgs (LogicalParent, null);
+                               logicalParent = value;
+                               dsce.NewDataSource = LogicalParent;
+                               if (logicalParent != null)
+                                       (logicalParent as Widget).DataSourceChanged += onLogicalParentDataSourceChanged;
+                               onLogicalParentChanged (this, dsce);
+                       }
+               }
+               [XmlIgnore]public virtual Rectangle ClientRectangle {
+                       get {
+                               Rectangle cb = Slot.Size;
+                               cb.Inflate ( - margin);
+                               return cb;
+                       }
+               }
+               public virtual Rectangle ContextCoordinates(Rectangle r){
+                       Widget go = Parent as Widget;
+                       if (go == null)
+                               return r + Parent.ClientRectangle.Position;
+                       return go.CacheEnabled ?
+                               r + Parent.ClientRectangle.Position :
+                               Parent.ContextCoordinates (r);
+               }
+               public virtual Rectangle ScreenCoordinates (Rectangle r){
+                       try {
+                               return
+                                       Parent.ScreenCoordinates(r) + Parent.getSlot().Position + Parent.ClientRectangle.Position;                              
+                       } catch (Exception ex) {
+                               Debug.WriteLine (ex);
+                               return default(Rectangle);
+                       }
+               }
+               public virtual Rectangle getSlot () { return Slot;}
+               #endregion
+               public Point ScreenPointToLocal(Point p){
+                       Point pt = p - ScreenCoordinates(Slot).TopLeft - ClientRectangle.TopLeft;
+                       if (pt.X < 0)
+                               pt.X = 0;
+                       if (pt.Y < 0)
+                               pt.Y = 0;
+                       return pt;
+               }
+
+               #region EVENT HANDLERS
+               /// <summary>Occurs when mouse wheel is rolled in this object. It bubbles to the root</summary>
+               public event EventHandler<MouseWheelEventArgs> MouseWheelChanged;
+               /// <summary>Occurs when mouse button is released in this object. It bubbles to the root</summary>
+               public event EventHandler<MouseButtonEventArgs> MouseUp;
+               /// <summary>Occurs when mouse button is pressed in this object. It bubbles to the root</summary>
+               public event EventHandler<MouseButtonEventArgs> MouseDown;
+               /// <summary>Occurs when mouse button has been pressed then relesed in this object. It bubbles to the root</summary>
+               public event EventHandler<MouseButtonEventArgs> MouseClick;
+               /// <summary>Occurs when mouse button has been pressed then relesed 2 times in this object. It bubbles to the root</summary>
+               public event EventHandler<MouseButtonEventArgs> MouseDoubleClick;
+               /// <summary>Occurs when mouse mouve in this object. It bubbles to the root</summary>
+               public event EventHandler<MouseMoveEventArgs> MouseMove;
+               /// <summary>Occurs when mouse enter this object</summary>
+               public event EventHandler<MouseMoveEventArgs> MouseEnter;
+               /// <summary>Occurs when mouse leave this object</summary>
+               public event EventHandler<MouseMoveEventArgs> MouseLeave;
+               /// <summary>Occurs when key is pressed when this object is active</summary>
+               public event EventHandler<KeyEventArgs> KeyDown;
+               /// <summary>Occurs when key is released when this object is active</summary>
+               public event EventHandler<KeyEventArgs> KeyUp;
+               /// <summary>Occurs when translated key event occurs in the host when this object is active</summary>
+               public event EventHandler<KeyPressEventArgs> KeyPress;
+               /// <summary>Occurs when this object received focus</summary>
+               public event EventHandler Focused;
+               /// <summary>Occurs when this object loose focus</summary>
+               public event EventHandler Unfocused;
+               /// <summary>Occurs when mouse is over</summary>
+               public event EventHandler Hover;
+               /// <summary>Occurs when this control is no longer the Hover one</summary>
+               //public event EventHandler UnHover;
+               /// <summary>Occurs when this object loose focus</summary>
+               public event EventHandler Enabled;
+               /// <summary>Occurs when the enabled state this object is set to false</summary>
+               public event EventHandler Disabled;
+
+               #region DragAndDrop Events
+               public event EventHandler<DragDropEventArgs> StartDrag;
+               public event EventHandler<DragDropEventArgs> DragEnter;
+               public event EventHandler<DragDropEventArgs> DragLeave;
+               public event EventHandler<DragDropEventArgs> EndDrag;
+               public event EventHandler<DragDropEventArgs> Drop;
+               #endregion
+
+               /// <summary>
+               /// Occurs when default value and styling are loaded, and for templated control,
+               /// template is also loaded. Bindings should be functionnal as well.
+               /// </summary>
+               public event EventHandler Initialized;
+
+               /// <summary>Occurs when one part of the rendering slot changed</summary>
+               public event EventHandler<LayoutingEventArgs> LayoutChanged;
+               /// <summary>Occurs when DataSource changed</summary>
+               public event EventHandler<DataSourceChangeEventArgs> DataSourceChanged;
+               /// <summary>Occurs when the parent has changed</summary>
+               public event EventHandler<DataSourceChangeEventArgs> ParentChanged;
+               /// <summary>Occurs when the logical parent has changed</summary>
+               public event EventHandler<DataSourceChangeEventArgs> LogicalParentChanged;
+               #endregion
+
+               internal bool hasDoubleClick => MouseDoubleClick != null;
+               internal bool hasClick => MouseClick != null;
+
+               #region public properties
+               /// <summary>Random value placeholder</summary>
+               [DesignCategory ("Divers")]
+               public object Tag {
+                       get { return tag; }
+                       set {
+                               if (tag == value)
+                                       return;
+                               tag = value;
+                               NotifyValueChanged ("Tag", tag);
+                       }
+               }
+               /// <summary>
+               /// If enabled, resulting bitmap of graphic object is cached
+               /// speeding up rendering of complex object. Default is enabled.
+               /// </summary>
+               [DesignCategory ("Behavior")][DefaultValue(true)]
+               public virtual bool CacheEnabled {
+                       get { return cacheEnabled; }
+                       set {
+                               if (cacheEnabled == value)
+                                       return;
+                               cacheEnabled = value;
+                               NotifyValueChanged ("CacheEnabled", cacheEnabled);
+                       }
+               }
+               /// <summary>
+               /// If true, rendering of GraphicObject is clipped inside client rectangle
+               /// </summary>
+               [DesignCategory ("Appearance")][DefaultValue(true)]
+               public virtual bool ClipToClientRect {
+                       get { return clipToClientRect; }
+                       set {
+                               if (clipToClientRect == value)
+                                       return;
+                               clipToClientRect = value;
+                               NotifyValueChanged ("ClipToClientRect", clipToClientRect);
+                               this.RegisterForRedraw ();
+                       }
+               }
+               #if DEBUG_LOG
+               [XmlIgnore]public string TreePath {
+                       get { return this.GetType().Name + GraphicObjects.IndexOf(this).ToString ();    }
+               }
+               #endif
+               /// <summary>
+               /// Name is used in binding to reference other GraphicObjects inside the graphic tree
+               /// and by template controls to find special element in their template implementation such
+               /// as a container or a group to put children in.
+               /// </summary>
+               [DesignCategory ("Divers")][DefaultValue(null)]
+               public virtual string Name {
+                       get {
+                               #if DEBUG_LOG
+                               return string.IsNullOrEmpty(name) ? this.GetType().Name + GraphicObjects.IndexOf(this).ToString () : name;
+                               #else
+                               return name;
+                               #endif
+                       }
+                       set {
+                               if (name == value)
+                                       return;
+                               name = value;
+                               NotifyValueChanged("Name", name);
+                       }
+               }
+               /// <summary>
+               /// Vertical alignment inside parent, disabled if height is stretched
+               /// or top coordinate is not null
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue(VerticalAlignment.Center)]
+               public virtual VerticalAlignment VerticalAlignment {
+                       get { return verticalAlignment; }
+                       set {
+                               if (verticalAlignment == value)
+                                       return;
+
+                               verticalAlignment = value;
+                               NotifyValueChanged("VerticalAlignment", verticalAlignment);
+                               RegisterForLayouting (LayoutingType.Y);
+                       }
+               }
+               /// <summary>
+               /// Horizontal alignment inside parent, disabled if width is stretched
+               /// or left coordinate is not null
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue(HorizontalAlignment.Center)]
+               public virtual HorizontalAlignment HorizontalAlignment {
+                       get { return horizontalAlignment; }
+                       set {
+                               if (horizontalAlignment == value)
+                                       return;
+                               horizontalAlignment = value;
+                               NotifyValueChanged("HorizontalAlignment", horizontalAlignment);
+                               RegisterForLayouting (LayoutingType.X);
+                       }
+               }
+               /// <summary>
+               /// x position inside parent
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue(0)]
+               public virtual int Left {
+                       get { return left; }
+                       set {
+                               if (left == value)
+                                       return;
+                               left = value;
+                               NotifyValueChanged ("Left", left);
+                               this.RegisterForLayouting (LayoutingType.X);
+                       }
+               }
+               /// <summary>
+               /// y position inside parent
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue(0)]
+               public virtual int Top {
+                       get { return top; }
+                       set {
+                               if (top == value)
+                                       return;
+                               top = value;
+                               NotifyValueChanged ("Top", top);
+                               this.RegisterForLayouting (LayoutingType.Y);
+                       }
+               }
+               /// <summary>
+               /// Helper property used to set width and height to fit in one call
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue(false)]
+               public virtual bool Fit {
+                       get { return Width == Measure.Fit && Height == Measure.Fit ? true : false; }
+                       set {
+                               if (value == Fit)
+                                       return;
+
+                               Width = Height = Measure.Fit;
+                       }
+               }
+               /// <summary>
+               /// Width of this control, by default inherited from parent. May have special values
+               /// such as Stretched or Fit. It may be proportionnal or absolute.
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue("Inherit")]
+               public virtual Measure Width {
+                       get {
+                               return width.Units == Unit.Inherit ?
+                                       Parent is Widget ? (Parent as Widget).WidthPolicy :
+                                       Measure.Stretched : width;
+                       }
+                       set {
+                               if (width == value)
+                                       return;
+                               if (value.IsFixed) {
+                                       if (value < minimumSize.Width || (value > maximumSize.Width && maximumSize.Width > 0))
+                                               return;
+                               }
+                               Measure old = width;
+                               width = value;
+                               NotifyValueChanged ("Width", width);
+                               if (width == Measure.Stretched || old == Measure.Stretched) {
+                                       //NotifyValueChanged ("WidthPolicy", width.Policy);
+                                       //contentSize in Stacks are only update on childLayoutChange, and the single stretched
+                                       //child of the stack is not counted in contentSize, so when changing size policy of a child
+                                       //we should adapt contentSize
+                                       //TODO:check case when child become stretched, and another stretched item already exists.
+                                       GenericStack gs = Parent as GenericStack;
+                                       if (gs != null){ //TODO:check if I should test Group instead
+                                               if (gs.Orientation == Orientation.Horizontal) {
+                                                       if (width == Measure.Stretched)
+                                                               gs.contentSize.Width -= this.LastSlots.Width;
+                                                       else
+                                                               gs.contentSize.Width += this.LastSlots.Width;
+                                               }
+                                       }                                                       
+                               }
+
+                               this.RegisterForLayouting (LayoutingType.Width);
+                       }
+               }
+               /// <summary>
+               /// Height of this control, by default inherited from parent. May have special values
+               /// such as Stretched or Fit. It may be proportionnal or absolute.
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue("Inherit")]
+               public virtual Measure Height {
+                       get {
+                               return height.Units == Unit.Inherit ?
+                                       Parent is Widget ? (Parent as Widget).HeightPolicy :
+                                       Measure.Stretched : height;
+                       }
+                       set {
+                               if (height == value)
+                                       return;
+                               if (value.IsFixed) {
+                                       if (value < minimumSize.Height || (value > maximumSize.Height && maximumSize.Height > 0))
+                                               return;
+                               }
+                               Measure old = height;
+                               height = value;
+                               NotifyValueChanged ("Height", height);
+                               if (height == Measure.Stretched || old == Measure.Stretched) {
+                                       //NotifyValueChanged ("HeightPolicy", HeightPolicy);
+                                       GenericStack gs = Parent as GenericStack;
+                                       if (gs != null){ //TODO:check if I should test Group instead
+                                               if (gs.Orientation == Orientation.Vertical) {
+                                                       if (height == Measure.Stretched)
+                                                               gs.contentSize.Height -= this.LastSlots.Height;
+                                                       else
+                                                               gs.contentSize.Height += this.LastSlots.Height;
+                                               }
+                                       }
+                               }
+
+                               this.RegisterForLayouting (LayoutingType.Height);
+                       }
+               }
+               /// <summary>
+               /// Was Used for binding on dimensions, this property will never hold fixed size, but instead only
+               /// Fit or Stretched, **with inherited state implementation, it is not longer used in binding**
+               /// </summary>
+               [XmlIgnore]public virtual Measure WidthPolicy { get {
+                               return Width.IsFit ? Measure.Fit : Measure.Stretched; } }
+               /// <summary>
+               /// Was Used for binding on dimensions, this property will never hold fixed size, but instead only
+               /// Fit or Stretched, **with inherited state implementation, it is not longer used in binding**
+               /// </summary>
+               [XmlIgnore]public virtual Measure HeightPolicy { get {
+                               return Height.IsFit ? Measure.Fit : Measure.Stretched; } }
+               /// <summary>
+               /// Indicate that this object may received focus or not, if not focusable all the descendants are 
+               /// affected.
+               /// </summary>
+               [DesignCategory ("Behaviour")][DefaultValue(false)]
+               public virtual bool Focusable {
+                       get { return focusable; }
+                       set {
+                               if (focusable == value)
+                                       return;
+                               focusable = value;
+                               NotifyValueChanged ("Focusable", focusable);
+                       }
+               }
+               /// <summary>
+               /// True when this control has the focus, only one control per interface may have it.
+               /// </summary>
+               [XmlIgnore]public virtual bool HasFocus {
+                       get { return hasFocus; }
+                       set {
+                               if (value == hasFocus)
+                                       return;
+
+                               hasFocus = value;
+                               if (hasFocus)
+                                       onFocused (this, null);
+                               else
+                                       onUnfocused (this, null);
+                               NotifyValueChanged ("HasFocus", hasFocus);
+                       }
+               }
+               /// <summary>
+               /// true if this control is active, this means that mouse has been pressed in it and not yet released. It could 
+               /// be used for other two states periferic action.
+               /// </summary>
+               [XmlIgnore]public virtual bool IsActive {
+                       get { return isActive; }
+                       set {
+                               if (value == isActive)
+                                       return;
+
+                               isActive = value;
+                               NotifyValueChanged ("IsActive", isActive);
+                       }
+               }
+               /// <summary>
+               /// true if this control has the pointer hover
+               /// </summary>
+               [XmlIgnore]public virtual bool IsHover {
+                       get { return isHover; }
+                       set {
+                               if (value == isHover)
+                                       return;
+
+                               isHover = value;
+
+                               if (isHover)
+                                       Hover.Raise (this, null);
+
+                               NotifyValueChanged ("IsHover", isHover);
+                       }
+               }
+               /// <summary>
+               /// true if holding mouse button down should trigger multiple click events
+               /// </summary>
+               [DesignCategory ("Behaviour")][DefaultValue(false)]
+               public virtual bool MouseRepeat {
+                       get { return mouseRepeat; }
+                       set {
+                               if (mouseRepeat == value)
+                                       return;
+                               mouseRepeat = value;
+                               NotifyValueChanged ("MouseRepeat", mouseRepeat);
+                       }
+               }
+               /// <summary>
+               /// forward mouse events even if an handle is bound
+               /// </summary>
+               [DesignCategory ("Behaviour")][DefaultValue (false)]
+               public bool ForwardMouseEvents {
+                       get { return forwardMouseEvents; }
+                       set {
+                               if (forwardMouseEvents == value)
+                                       return;
+                               forwardMouseEvents = value;
+                               NotifyValueChanged ("ForwardMouseEvents", forwardMouseEvents);
+                       }
+               }
+               bool clearBackground = false;
+               /// <summary>
+               /// background fill of the control, maybe solid color, gradient, image, or svg
+               /// </summary>
+               [DesignCategory ("Appearance")][DefaultValue("Transparent")]
+               public virtual Fill Background {
+                       get { return background; }
+                       set {
+                               if (background == value)
+                                       return;
+                               clearBackground = false;
+                               if (value == null)
+                                       return;
+                               background = value;
+                               NotifyValueChanged ("Background", background);
+                               RegisterForRedraw ();
+                               if (background is SolidColor) {
+                                       if ((background as SolidColor).Equals (Color.Clear))
+                                               clearBackground = true;
+                               }
+                       }
+               }
+               /// <summary>
+               /// Foreground fill of the control, usage may be different among derived controls
+               /// </summary>
+               [DesignCategory ("Appearance")][DefaultValue("White")]
+               public virtual Fill Foreground {
+                       get { return foreground; }
+                       set {
+                               if (foreground == value)
+                                       return;
+                               foreground = value;
+                               NotifyValueChanged ("Foreground", foreground);
+                               RegisterForRedraw ();
+                       }
+               }
+               /// <summary>
+               /// Font being used in many controls, it is defined in the base GraphicObject class.
+               /// </summary>
+               [DesignCategory ("Appearance")][DefaultValue("droid, 10")]
+               public virtual Font Font {
+                       get { return font; }
+                       set {
+                               if (value == font)
+                                       return;
+                               font = value;
+                               NotifyValueChanged ("Font", font);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>
+               /// to get rounded corners
+               /// </summary>
+               [DesignCategory ("Appearance")][DefaultValue(0.0)]
+               public virtual double CornerRadius {
+                       get { return cornerRadius; }
+                       set {
+                               if (value == cornerRadius)
+                                       return;
+                               cornerRadius = value;
+                               NotifyValueChanged ("CornerRadius", cornerRadius);
+                               RegisterForRedraw ();
+                       }
+               }
+               /// <summary>
+               /// This is a single integer for the 4 direction, a gap between the control and it's container,
+               /// by default it is filled with the background.
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue(0)]
+               public virtual int Margin {
+                       get { return margin; }
+                       set {
+                               if (value == margin)
+                                       return;
+                               margin = value;
+                               NotifyValueChanged ("Margin", margin);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>
+               /// set the visible state of the control, invisible controls does reserve space in the layouting system.
+               /// </summary>
+               [DesignCategory ("Appearance")][DefaultValue(true)]
+               public virtual bool Visible {
+                       get { return isVisible; }
+                       set {
+                               if (value == isVisible)
+                                       return;
+
+                               isVisible = value;
+
+                               RegisterForLayouting (LayoutingType.Sizing);
+
+                               if (!isVisible && IFace.HoverWidget != null) {                                  
+                                       if (IFace.HoverWidget.IsOrIsInside (this)) {
+                                               //IFace.HoverWidget = null;
+                                               IFace.ProcessMouseMove (IFace.Mouse.X, IFace.Mouse.Y);
+                                       }
+                               }
+
+                               NotifyValueChanged ("Visible", isVisible);
+                       }
+               }
+               /// <summary>
+               /// get or set the enabled state, disabling a control will affect focuability and
+               /// also it's rendering which will be grayed
+               /// </summary>
+               [DesignCategory ("Behaviour")][DefaultValue(true)]
+               public virtual bool IsEnabled {
+                       get { return isEnabled; }
+                       set {
+                               if (value == isEnabled)
+                                       return;
+
+                               isEnabled = value;
+
+                               if (isEnabled)
+                                       onEnable (this, null);
+                               else
+                                       onDisable (this, null);
+
+                               NotifyValueChanged ("IsEnabled", isEnabled);
+                               RegisterForRedraw ();
+                       }
+               }
+               /// <summary>
+               /// Minimal width and  height for this control
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue("1,1")]
+               public virtual Size MinimumSize {
+                       get { return minimumSize; }
+                       set {
+                               if (value == minimumSize)
+                                       return;
+
+                               minimumSize = value;
+
+                               NotifyValueChanged ("MinimumSize", minimumSize);
+                               RegisterForLayouting (LayoutingType.Sizing);
+                       }
+               }
+               /// <summary>
+               /// Maximum width and  height for this control, unlimited if null.
+               /// </summary>
+               [DesignCategory ("Layout")][DefaultValue("0,0")]
+               public virtual Size MaximumSize {
+                       get { return maximumSize; }
+                       set {
+                               if (value == maximumSize)
+                                       return;
+
+                               maximumSize = value;
+
+                               NotifyValueChanged (nameof(MaximumSize), maximumSize);
+                               RegisterForLayouting (LayoutingType.Sizing);
+                       }
+               }
+               /// <summary>
+               /// Fully qualify type name of expected data source.
+               /// If set, datasource bindings will be speedup by avoiding reflexion in generated dyn methods.
+               /// If an object of a different type is set as datasource, bindings will be canceled.
+               /// It accepts all derived type.
+               /// </summary>
+               [DesignCategory ("Data")]
+               public Type DataSourceType {
+                       get { return dataSourceType; }
+                       set { dataSourceType = value; }
+               }
+               /// <summary>
+               /// Seek first logical tree upward if logicalParent is set, or seek graphic tree for
+               /// a not null dataSource that will be active for all descendants having dataSource=null
+               /// </summary>
+                       [DesignCategory ("Data")]
+               public virtual object DataSource {
+                       set {
+                               if (DataSource == value)
+                                       return;
+
+                               DataSourceChangeEventArgs dse = new DataSourceChangeEventArgs (DataSource, null);
+                               dataSource = value;
+                               dse.NewDataSource = DataSource;
+
+                               if (dse.NewDataSource == dse.OldDataSource)
+                                       return;
+
+                               if (value != null)
+                                       rootDataLevel = true;
+
+                               #if DEBUG_LOG
+                               DbgEvent dbgEvt = DebugLog.AddEvent(DbgEvtType.GOLockLayouting, this);
+                               #endif
+                               lock (IFace.LayoutMutex) {
+                                       OnDataSourceChanged (this, dse);
+                                       NotifyValueChanged ("DataSource", DataSource);
+                               }
+                               #if DEBUG_LOG
+                               dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                               #endif
+                       }
+                       get {
+                               return rootDataLevel ? dataSource : dataSource == null ?
+                                       LogicalParent == null ? null :
+                                       LogicalParent is Widget ? (LogicalParent as Widget).DataSource : null :
+                                       dataSource;
+                       }
+               }
+               /// <summary>
+               /// If true, rendering of GraphicObject is clipped inside client rectangle
+               /// </summary>
+               [DesignCategory ("Data")][DefaultValue(false)]
+               public virtual bool RootDataLevel {
+                       get { return rootDataLevel; }
+                       set {
+                               if (rootDataLevel == value)
+                                       return;
+                               rootDataLevel = value;
+                               NotifyValueChanged ("RootDataLevel", rootDataLevel);
+                               this.RegisterForRedraw ();
+                       }
+               }
+               protected virtual void onLogicalParentDataSourceChanged(object sender, DataSourceChangeEventArgs e){
+                       if (localDataSourceIsNull)
+                               OnDataSourceChanged (this, e);
+               }
+               internal bool localDataSourceIsNull { get { return dataSource == null; } }
+               public bool localLogicalParentIsNull { get { return logicalParent == null; } }
+
+               public virtual void OnDataSourceChanged(object sender, DataSourceChangeEventArgs e){
+                       DataSourceChanged.Raise (this, e);
+                       #if DEBUG_LOG
+                       DebugLog.AddEvent(DbgEvtType.GONewDataSource, this);
+                       #endif
+
+                       #if DEBUG_BINDING
+                       Debug.WriteLine("New DataSource for => {0} \n\t{1}=>{2}", this.ToString(),e.OldDataSource,e.NewDataSource);
+                       #endif
+               }
+               /// <summary>
+               /// Style key to use for this control
+               /// </summary>
+               [DesignCategory ("Appearance")]
+               public virtual string Style {
+                       get { return style; }
+                       set {
+                               if (value == style)
+                                       return;
+
+                               style = value;
+
+                               NotifyValueChanged ("Style", style);
+                       }
+               }
+               [DesignCategory ("Divers")]
+               public virtual string Tooltip {
+                       get { return tooltip; }
+                       set {
+                               if (tooltip == value)
+                                       return;
+                               tooltip = value;
+                               NotifyValueChanged("Tooltip", tooltip);
+                       }
+               }
+               [DesignCategory ("Divers")]
+               public IList<Command> ContextCommands {
+                       get { return contextCommands; }
+                       set {
+                               if (contextCommands == value)
+                                       return;
+                               contextCommands = value;
+                               NotifyValueChanged("ContextCommands", contextCommands);
+                       }
+               }
+               #endregion
+
+               #region Default and Style Values loading
+               /// <summary> Loads the default values from XML attributes default </summary>
+               public void loadDefaultValues()
+               {
+                       #if DEBUG_LOG
+                       DbgEvent dbgEvt = DebugLog.AddEvent(DbgEvtType.GOInitialization, this);
+                       #endif
+
+                       Type thisType = this.GetType ();
+
+                       if (!string.IsNullOrEmpty (style)) {
+                               if (IFace.DefaultValuesLoader.ContainsKey (style)) {
+                                       IFace.DefaultValuesLoader [style] (this);
+                                       onInitialized (this, null);
+                                       return;
+                               }
+                       } else if (IFace.DefaultValuesLoader.ContainsKey (thisType.FullName)) {
+                               IFace.DefaultValuesLoader [thisType.FullName] (this);
+                               onInitialized (this, null);
+                               return;
+                       } else  if (IFace.DefaultValuesLoader.ContainsKey (thisType.Name)) {
+                               IFace.DefaultValuesLoader [thisType.Name] (this);
+                               onInitialized (this, null);
+                               return;
+                       }
+
+                       List<Style> styling = new List<Style>();
+
+                       //Search for a style matching :
+                       //1: Full class name, with full namespace
+                       //2: class name
+                       //3: style may have been registered with their ressource ID minus .style extention
+                       //   those files being placed in a Styles folder
+                       string styleKey = style;
+                       if (!string.IsNullOrEmpty (style)) {
+                               if (IFace.Styling.ContainsKey (style)) {
+                                       styling.Add (IFace.Styling [style]);
+                               }
+                       }
+                       if (IFace.Styling.ContainsKey (thisType.FullName)) {
+                               styling.Add (IFace.Styling [thisType.FullName]);
+                               if (string.IsNullOrEmpty (styleKey))
+                                       styleKey = thisType.FullName;
+                       }
+                       if (IFace.Styling.ContainsKey (thisType.Name)) {
+                               styling.Add (IFace.Styling [thisType.Name]);
+                               if (string.IsNullOrEmpty (styleKey))
+                                       styleKey = thisType.Name;
+                       }
+
+                       if (string.IsNullOrEmpty (styleKey))
+                               styleKey = thisType.FullName;
+
+                       //Reflexion being very slow compared to dyn method or delegates,
+                       //I compile the initial values coded in the CustomAttribs of the class,
+                       //all other instance of this type would not longer use reflexion to init properly
+                       //but will fetch the  dynamic initialisation method compiled for this precise type
+                       //TODO:measure speed gain.
+#region Delfault values Loading dynamic compilation
+                       DynamicMethod dm = null;
+                       ILGenerator il = null;
+
+                       dm = new DynamicMethod("dyn_loadDefValues", null, new Type[] { typeof (object) }, thisType, true);
+
+            il = dm.GetILGenerator(256);
+                       il.DeclareLocal(typeof (object));//store root
+                       il.Emit(OpCodes.Nop);
+                       //set local GraphicObject to root object passed as 1st argument
+                       il.Emit (OpCodes.Ldarg_0);
+                       il.Emit (OpCodes.Stloc_0);
+
+                       foreach (EventInfo ei in thisType.GetEvents(BindingFlags.Public | BindingFlags.Instance)) {
+                               string expression;
+                               if (!getDefaultEvent(ei, styling, out expression))
+                                       continue;
+                               //TODO:dynEventHandler could be cached somewhere, maybe a style instanciator class holding the styling delegate and bound to it.
+                               foreach (string exp in CompilerServices.splitOnSemiColumnOutsideAccolades(expression)) {
+                                       string trimed = exp.Trim();
+                                       if (trimed.StartsWith ("{", StringComparison.Ordinal)){
+                                               il.Emit (OpCodes.Ldloc_0);//load this as 1st arg of event Add
+
+                                               //push eventInfo as 1st arg of compile
+                                               il.Emit (OpCodes.Ldloc_0);
+                                               il.Emit (OpCodes.Call, CompilerServices.miGetType);
+                                               il.Emit (OpCodes.Ldstr, ei.Name);//push event name
+                                               il.Emit (OpCodes.Call, CompilerServices.miGetEvent);
+                                               //push expression as 2nd arg of compile
+                                               il.Emit (OpCodes.Ldstr, trimed.Substring (1, trimed.Length - 2));
+                                               //push null as 3rd arg, currentNode, not known when instanciing
+                                               il.Emit (OpCodes.Ldnull);
+                                               il.Emit (OpCodes.Call, CompilerServices.miCompileDynEventHandler);
+                                               il.Emit (OpCodes.Castclass, ei.EventHandlerType);
+                                               il.Emit (OpCodes.Call, ei.AddMethod);
+                                       }else
+                                               Debug.WriteLine("error in styling, event not handled : " + trimed);
+                               }
+                       }
+
+                       foreach (PropertyInfo pi in thisType.GetProperties(BindingFlags.Public | BindingFlags.Instance)) {
+                               if (pi.GetSetMethod () == null)
+                                       continue;
+                               XmlIgnoreAttribute xia = (XmlIgnoreAttribute)pi.GetCustomAttribute (typeof(XmlIgnoreAttribute));
+                               if (xia != null)
+                                       continue;
+
+                               object defaultValue;
+
+                               int styleIndex = -1;
+                               if (styling.Count > 0){
+                                       for (int i = 0; i < styling.Count; i++) {
+                                               if (styling[i].ContainsKey (pi.Name)){
+                                                       styleIndex = i;
+                                                       break;
+                                               }
+                                       }
+                               }
+                               if (styleIndex >= 0){
+                                       if (pi.PropertyType.IsEnum)//maybe should be in parser..
+                                               defaultValue = Enum.Parse(pi.PropertyType, (string)styling[styleIndex] [pi.Name], true);
+                                       else
+                                               defaultValue = styling[styleIndex] [pi.Name];
+
+                                       #if DESIGN_MODE
+                                       if (defaultValue != null){
+                                               FileLocation fl = styling[styleIndex].Locations[pi.Name];
+                                               il.Emit (OpCodes.Ldloc_0);
+                                               il.Emit (OpCodes.Ldstr, pi.Name);
+                                               il.Emit (OpCodes.Ldstr, fl.FilePath);
+                                               il.Emit (OpCodes.Ldc_I4, fl.Line);
+                                               il.Emit (OpCodes.Ldc_I4, fl.Column);
+                                               il.Emit (OpCodes.Call, miDesignAddDefLoc);
+
+                                               il.Emit (OpCodes.Ldloc_0);
+                                               il.Emit (OpCodes.Ldfld, typeof(Widget).GetField("design_style_values"));
+                                               il.Emit (OpCodes.Ldstr, pi.Name);
+                                               il.Emit (OpCodes.Ldstr, defaultValue.ToString());
+                                               il.Emit (OpCodes.Call, CompilerServices.miDicStrStrAdd);
+                                       }
+                                       #endif
+
+                               }else {
+                                       DefaultValueAttribute dv = (DefaultValueAttribute)pi.GetCustomAttribute (typeof (DefaultValueAttribute));
+                                       if (dv == null)
+                                               continue;
+                                       defaultValue = dv.Value;
+                               }
+
+                               CompilerServices.EmitSetValue (il, pi, defaultValue);
+                       }
+                       il.Emit(OpCodes.Ret);
+                       #endregion
+
+                       try {
+                               IFace.DefaultValuesLoader[styleKey] = (Interface.LoaderInvoker)dm.CreateDelegate(typeof(Interface.LoaderInvoker));
+                               IFace.DefaultValuesLoader[styleKey] (this);
+                       } catch (Exception ex) {
+                               throw new Exception ("Error applying style <" + styleKey + ">:", ex);
+                       }
+
+                       #if DEBUG_LOG
+                       dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                       #endif
+
+                       onInitialized (this, null);
+               }
+               protected virtual void onInitialized (object sender, EventArgs e){
+                       Initialized.Raise(sender, e);
+               }
+               bool getDefaultEvent(EventInfo ei, List<Style> styling,
+                       out string expression){
+                       expression = "";
+                       if (styling.Count > 0){
+                               for (int i = 0; i < styling.Count; i++) {
+                                       if (styling[i].ContainsKey (ei.Name)){
+                                               expression = (string)styling[i] [ei.Name];
+                                               return true;
+                                       }
+                               }
+                       }
+                       return false;
+               }
+#endregion
+
+               public virtual Widget FindByName(string nameToFind){
+                       return string.Equals(nameToFind, name, StringComparison.Ordinal) ? this : null;
+               }
+               public virtual bool Contains(Widget goToFind){
+                       return false;
+               }
+               /// <summary>
+               /// return true if this is contained inside go
+               /// </summary>
+               public bool IsOrIsInside(Widget go){
+                       if (this == go)
+                               return true;
+                       ILayoutable p = this.Parent;
+                       while (p != null) {
+                               if (p == go)
+                                       return true;
+                               p = p.Parent;
+                       }
+                       return false;
+               }
+
+               #region Drag&Drop
+               [DesignCategory ("DragAndDrop")][DefaultValue(false)]
+               public virtual bool AllowDrag {
+                       get { return allowDrag; }
+                       set {
+                               if (allowDrag == value)
+                                       return;
+                               allowDrag = value;
+                               NotifyValueChanged ("AllowDrag", allowDrag);
+                       }
+               }
+               [DesignCategory ("DragAndDrop")][DefaultValue(false)]
+               public virtual bool AllowDrop {
+                       get { return allowDrop; }
+                       set {
+                               if (allowDrop == value)
+                                       return;
+                               allowDrop = value;
+                               NotifyValueChanged ("AllowDrop", allowDrop);
+                       }
+               }
+
+//             public List<Type> AllowedDroppedTypes;
+//             public void AddAllowedDroppedType (Type newType){
+//                     if (AllowedDroppedTypes == null)
+//                             AllowedDroppedTypes = new List<Type> ();
+//                     AllowedDroppedTypes.Add (newType);
+//                     NotifyValueChanged ("AllowDrop", AllowDrop);
+//             }
+//             [XmlIgnore]public virtual bool AllowDrop {
+//                     get { return AllowedDroppedTypes?.Count>0; }
+//             }
+               [XmlIgnore]public virtual bool IsDragged {
+                       get { return isDragged; }
+                       set {
+                               if (isDragged == value)
+                                       return;
+                               isDragged = value;
+
+                               NotifyValueChanged ("IsDragged", IsDragged);
+                       }
+               }
+               /// <summary>
+               /// fired when drag and drop operation start
+               /// </summary>
+               protected virtual void onStartDrag (object sender, DragDropEventArgs e){
+                       IFace.HoverWidget = null;
+                       IsDragged = true;
+                       StartDrag.Raise (this, e);
+                       #if DEBUG_DRAGNDROP
+                       Debug.WriteLine(this.ToString() + " : START DRAG => " + e.ToString());
+                       #endif
+               }
+               /// <summary>
+               ///  Occured when dragging ends without dropping
+               /// </summary>
+               protected virtual void onEndDrag (object sender, DragDropEventArgs e){                  
+                       IsDragged = false;
+                       EndDrag.Raise (this, e);
+                       #if DEBUG_DRAGNDROP
+                       Debug.WriteLine(this.ToString() + " : END DRAG => " + e.ToString());
+                       #endif
+               }
+               protected virtual void onDragEnter (object sender, DragDropEventArgs e){
+                       e.DropTarget = this;
+                       DragEnter.Raise (this, e);
+                       #if DEBUG_DRAGNDROP
+                       Debug.WriteLine(this.ToString() + " : DRAG Enter => " + e.ToString());
+                       #endif
+               }
+               protected virtual void onDragLeave (object sender, DragDropEventArgs e){                        
+                       e.DropTarget = null;
+                       DragLeave.Raise (this, e);
+                       #if DEBUG_DRAGNDROP
+                       Debug.WriteLine(this.ToString() + " : DRAG Leave => " + e.ToString());
+                       #endif
+               }
+               protected virtual void onDrop (object sender, DragDropEventArgs e){                     
+                       IsDragged = false;
+                       Drop.Raise (this, e);
+                       //e.DropTarget.onDragLeave (this, e);//raise drag leave in target
+                       #if DEBUG_DRAGNDROP
+                       Debug.WriteLine(this.ToString() + " : DROP => " + e.ToString());
+                       #endif
+               }
+               public bool IsDropTarget {
+                       get { return IFace.DragAndDropOperation?.DropTarget == this; }
+               }
+
+               #endregion
+
+               #region Queuing
+               /// <summary>
+               /// Register old and new slot for clipping
+               /// </summary>
+               public virtual void ClippingRegistration(){
+                       #if DEBUG_LOG
+                       DbgEvent dbgEvt = DebugLog.AddEvent(DbgEvtType.GOClippingRegistration, this);
+                       #endif  
+                       parentRWLock.EnterReadLock ();
+                       if (parent != null) {                                   
+                               Parent.RegisterClip (LastPaintedSlot);
+                               Parent.RegisterClip (Slot);
+                       }
+                       parentRWLock.ExitReadLock ();
+                       #if DEBUG_LOG
+                       dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                       #endif
+               }
+               /// <summary>
+               /// Add clip rectangle to this.clipping and propagate up to root
+               /// </summary>
+               /// <param name="clip">Clip rectangle</param>
+               public virtual void RegisterClip(Rectangle clip){
+                       #if DEBUG_LOG
+                       DbgEvent dbgEvt = DebugLog.AddEvent(DbgEvtType.GORegisterClip, this);
+                       #endif
+                       Rectangle cb = ClientRectangle;
+                       Rectangle  r = clip + cb.Position;
+                       if (r.Right > cb.Right)
+                               r.Width -= r.Right - cb.Right;
+                       if (r.Bottom > cb.Bottom)
+                               r.Height -= r.Bottom - cb.Bottom;
+                       if (cacheEnabled && !IsDirty)
+                               Clipping.AddRectangle (r);
+                       if (Parent == null)
+                               return;
+                       Widget p = Parent as Widget;
+                       if (p?.IsDirty == true && p?.CacheEnabled == true)
+                               return;
+                       Parent.RegisterClip (r + Slot.Position);
+                       #if DEBUG_LOG
+                       dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                       #endif
+               }
+               /// <summary> Full update, content and layouting, taking care of sizing policy </summary>
+               [MethodImpl(MethodImplOptions.AggressiveInlining)]
+               public void RegisterForGraphicUpdate ()
+               {
+                       IsDirty = true;
+                       if (Width.IsFit || Height.IsFit)
+                               RegisterForLayouting (LayoutingType.Sizing);
+                       else if (RegisteredLayoutings == LayoutingType.None)
+                               IFace.EnqueueForRepaint (this);
+               }
+               /// <summary> query an update of the content without layouting changes</summary>
+               [MethodImpl(MethodImplOptions.AggressiveInlining)]
+               public void RegisterForRedraw ()
+               {
+                       IsDirty = true;
+                       if (RegisteredLayoutings == LayoutingType.None)
+                               IFace.EnqueueForRepaint (this);
+               }
+               #endregion
+
+               #region Layouting
+
+               /// <summary> return size of content + margins </summary>
+               protected virtual int measureRawSize (LayoutingType lt) {
+                       return lt == LayoutingType.Width ?
+                               contentSize.Width + 2 * margin: contentSize.Height + 2 * margin;
+               }
+               /// <summary> By default in groups, LayoutingType.ArrangeChildren is reset </summary>
+               public virtual void ChildrenLayoutingConstraints(ref LayoutingType layoutType){
+               }
+               public virtual bool ArrangeChildren { get { return false; } }
+               public virtual void RegisterForLayouting(LayoutingType layoutType){
+                       if (Parent == null)
+                               return;
+                       lock (IFace.LayoutMutex) {
+                               //prevent queueing same LayoutingType for this
+                               layoutType &= (~RegisteredLayoutings);
+
+                               if (layoutType == LayoutingType.None)
+                                       return;
+                               //dont set position for stretched item
+                               if (Width == Measure.Stretched)
+                                       layoutType &= (~LayoutingType.X);
+                               if (Height == Measure.Stretched)
+                                       layoutType &= (~LayoutingType.Y);
+
+                               if (!ArrangeChildren)
+                                       layoutType &= (~LayoutingType.ArrangeChildren);
+
+                               //apply constraints depending on parent type
+                               if (Parent is Widget)
+                                       (Parent as Widget).ChildrenLayoutingConstraints (ref layoutType);
+
+//                             //prevent queueing same LayoutingType for this
+                               layoutType &= (~RegisteredLayoutings);
+
+                               if (layoutType == LayoutingType.None)
+                                       return;
+
+                               //enqueue LQI LayoutingTypes separately
+                               if (layoutType.HasFlag (LayoutingType.Width))
+                                       IFace.LayoutingQueue.Enqueue (new LayoutingQueueItem (LayoutingType.Width, this));
+                               if (layoutType.HasFlag (LayoutingType.Height))
+                                       IFace.LayoutingQueue.Enqueue (new LayoutingQueueItem (LayoutingType.Height, this));
+                               if (layoutType.HasFlag (LayoutingType.X))
+                                       IFace.LayoutingQueue.Enqueue (new LayoutingQueueItem (LayoutingType.X, this));
+                               if (layoutType.HasFlag (LayoutingType.Y))
+                                       IFace.LayoutingQueue.Enqueue (new LayoutingQueueItem (LayoutingType.Y, this));
+                               if (layoutType.HasFlag (LayoutingType.ArrangeChildren))
+                                       IFace.LayoutingQueue.Enqueue (new LayoutingQueueItem (LayoutingType.ArrangeChildren, this));
+                       }
+               }
+
+               /// <summary> trigger dependant sizing component update </summary>
+               public virtual void OnLayoutChanges(LayoutingType  layoutType)
+               {
+                       switch (layoutType) {
+                       case LayoutingType.Width:
+                               RegisterForLayouting (LayoutingType.X);
+                               break;
+                       case LayoutingType.Height:
+                               RegisterForLayouting (LayoutingType.Y);
+                               break;
+                       }
+                       LayoutChanged.Raise (this, new LayoutingEventArgs (layoutType));
+               }
+               internal protected void raiseLayoutChanged(LayoutingEventArgs e){
+                       LayoutChanged.Raise (this, e);
+               }
+               /// <summary> Update layout component only one at a time, this is where the computation of alignement
+               /// and size take place.
+               /// The redrawing will only be triggered if final slot size has changed </summary>
+               /// <returns><c>true</c>, if layouting was possible, <c>false</c> if conditions were not
+               /// met and LQI has to be re-queued</returns>
+               public virtual bool UpdateLayout (LayoutingType layoutType)
+               {
+                       //unset bit, it would be reset if LQI is re-queued
+                       registeredLayoutings &= (~layoutType);
+
+                       switch (layoutType) {
+                       case LayoutingType.X:
+                               if (left == 0) {
+
+                                       if (Parent.RegisteredLayoutings.HasFlag (LayoutingType.Width) ||
+                                           RegisteredLayoutings.HasFlag (LayoutingType.Width))
+                                               return false;
+
+                                       switch (horizontalAlignment) {
+                                       case HorizontalAlignment.Left:
+                                               Slot.X = 0;
+                                               break;
+                                       case HorizontalAlignment.Right:
+                                               Slot.X = Parent.ClientRectangle.Width - Slot.Width;
+                                               break;
+                                       case HorizontalAlignment.Center:
+                                               Slot.X = Parent.ClientRectangle.Width / 2 - Slot.Width / 2;
+                                               break;
+                                       }
+                               } else
+                                       Slot.X = left;
+
+                               if (LastSlots.X == Slot.X)
+                                       break;
+
+                               IsDirty = true;
+
+                               OnLayoutChanges (layoutType);
+
+                               LastSlots.X = Slot.X;
+                               break;
+                       case LayoutingType.Y:
+                               if (top == 0) {
+
+                                       if (Parent.RegisteredLayoutings.HasFlag (LayoutingType.Height) ||
+                                           RegisteredLayoutings.HasFlag (LayoutingType.Height))
+                                               return false;
+
+                                       switch (verticalAlignment) {
+                                       case VerticalAlignment.Top://this could be processed even if parent Height is not known
+                                               Slot.Y = 0;
+                                               break;
+                                       case VerticalAlignment.Bottom:
+                                               Slot.Y = Parent.ClientRectangle.Height - Slot.Height;
+                                               break;
+                                       case VerticalAlignment.Center:
+                                               Slot.Y = Parent.ClientRectangle.Height / 2 - Slot.Height / 2;
+                                               break;
+                                       }
+                               } else
+                                       Slot.Y = top;
+
+                               if (LastSlots.Y == Slot.Y)
+                                       break;
+
+                               IsDirty = true;
+
+                               OnLayoutChanges (layoutType);
+
+                               LastSlots.Y = Slot.Y;
+                               break;
+                       case LayoutingType.Width:
+                               if (isVisible) {
+                                       if (Width.IsFixed)
+                                               Slot.Width = Width;
+                                       else if (Width == Measure.Fit) {
+                                               Slot.Width = measureRawSize (LayoutingType.Width);
+                                       } else if (Parent.RegisteredLayoutings.HasFlag (LayoutingType.Width))
+                                               return false;
+                                       else if (Width == Measure.Stretched)
+                                               Slot.Width = Parent.ClientRectangle.Width;
+                                       else
+                                               Slot.Width = (int)Math.Round ((double)(Parent.ClientRectangle.Width * Width) / 100.0);
+
+                                       if (Slot.Width < 0)
+                                               return false;
+
+                                       //size constrain
+                                       if (Slot.Width < minimumSize.Width) {
+                                               Slot.Width = minimumSize.Width;
+                                               //NotifyValueChanged ("WidthPolicy", Measure.Stretched);
+                                       } else if (Slot.Width > maximumSize.Width && maximumSize.Width > 0) {
+                                               Slot.Width = maximumSize.Width;
+                                               //NotifyValueChanged ("WidthPolicy", Measure.Stretched);
+                                       }
+                               } else
+                                       Slot.Width = 0;
+
+                               if (LastSlots.Width == Slot.Width)
+                                       break;
+
+                               IsDirty = true;
+
+                               OnLayoutChanges (layoutType);
+
+                               LastSlots.Width = Slot.Width;
+                               break;
+                       case LayoutingType.Height:
+                               if (isVisible) {
+                                       if (Height.IsFixed)
+                                               Slot.Height = Height;
+                                       else if (Height == Measure.Fit) {
+                                               Slot.Height = measureRawSize (LayoutingType.Height);
+                                       } else if (Parent.RegisteredLayoutings.HasFlag (LayoutingType.Height))
+                                               return false;
+                                       else if (Height == Measure.Stretched)
+                                               Slot.Height = Parent.ClientRectangle.Height;
+                                       else
+                                               Slot.Height = (int)Math.Round ((double)(Parent.ClientRectangle.Height * Height) / 100.0);
+
+                                       if (Slot.Height < 0)
+                                               return false;
+
+                                       //size constrain
+                                       if (Slot.Height < minimumSize.Height) {
+                                               Slot.Height = minimumSize.Height;
+                                               //NotifyValueChanged ("HeightPolicy", Measure.Stretched);
+                                       } else if (Slot.Height > maximumSize.Height && maximumSize.Height > 0) {
+                                               Slot.Height = maximumSize.Height;
+                                               //NotifyValueChanged ("HeightPolicy", Measure.Stretched);
+                                       }
+                               } else
+                                       Slot.Height = 0;
+
+                               if (LastSlots.Height == Slot.Height)
+                                       break;
+
+                               IsDirty = true;
+
+                               OnLayoutChanges (layoutType);
+
+                               LastSlots.Height = Slot.Height;
+                               break;
+                       }
+
+                       //if no layouting remains in queue for item, registre for redraw
+                       if (this.registeredLayoutings == LayoutingType.None && IsDirty)
+                               IFace.EnqueueForRepaint (this);
+
+                       return true;
+               }
+               #endregion
+
+               #region Rendering
+               /// <summary> This is the common overridable drawing routine to create new widget </summary>
+               protected virtual void onDraw(Context gr)
+               {
+                       #if DEBUG_LOG
+                       DbgEvent dbgEvt = DebugLog.AddEvent(DbgEvtType.GODraw, this);
+                       #endif
+
+                       Rectangle rBack = new Rectangle (Slot.Size);
+
+                       //if (background != Color.Transparent) {
+                               background.SetAsSource (gr, rBack);
+                               DrawingHelpers.CairoRectangle (gr, rBack, cornerRadius);
+                               gr.Fill ();
+                       //}
+
+                       #if DEBUG_LOG
+                       dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                       #endif
+               }
+
+               /// <summary>
+               /// Internal drawing context creation on a cached surface limited to slot size
+               /// this trigger the effective drawing routine </summary>
+               protected virtual void RecreateCache ()
+               {
+                       #if DEBUG_LOG
+                       DbgEvent dbgEvt = DebugLog.AddEvent(DbgEvtType.GORecreateCache, this);
+                       #endif
+
+                       /*if (bmp == null)
+                               bmp = IFace.surf.CreateSimilar (Content.ColorAlpha, Slot.Width, Slot.Height);
+                       else if (LastPaintedSlot.Width != Slot.Width || LastPaintedSlot.Height != Slot.Height)
+                               bmp.SetSize (Slot.Width, Slot.Height);*/
+                       bmp?.Dispose ();
+                       //bmp = IFace.surf.CreateSimilar (Content.ColorAlpha, Slot.Width, Slot.Height);
+                       bmp = new Surface(IFace.dev, Slot.Width, Slot.Height);
+
+                       using (Context gr = new Context (bmp)) {
+                               //gr.Antialias = Interface.Antialias;
+                               onDraw (gr);
+                       }
+
+                       IsDirty = false;
+
+                       #if DEBUG_LOG
+                       dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                       #endif
+               }
+               protected virtual void UpdateCache(Context ctx){
+                       #if DEBUG_LOG
+                       DbgEvent dbgEvt = DebugLog.AddEvent(DbgEvtType.GOUpdateCacheAndPaintOnCTX, this);
+                       #endif
+
+                       Rectangle rb = Slot + Parent.ClientRectangle.Position;
+                       if (clearBackground) {
+                                       ctx.Save ();
+                                       ctx.Operator = Operator.Clear;
+                                       ctx.Rectangle (rb);
+                                       ctx.Fill ();
+                                       ctx.Restore ();
+                       }
+
+                       ctx.SetSourceSurface (bmp, rb.X, rb.Y);
+                       ctx.Paint ();
+                       Clipping.Reset ();
+                       #if DEBUG_LOG
+                       dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                       #endif
+               }
+               /// <summary> Chained painting routine on the parent context of the actual cached version
+               /// of the widget </summary>
+               public virtual void Paint (ref Context ctx)
+               {
+                       #if DEBUG_LOG
+                       DebugLog.AddEvent(DbgEvtType.GOPaint, this);
+                       #endif
+                       //TODO:this test should not be necessary
+                       if (Slot.Height <= 0 || Slot.Width <= 0 || parent == null)
+                               return;
+                       lock (this) {
+                               if (cacheEnabled) {
+                                       if (Slot.Width > Interface.MaxCacheSize || Slot.Height > Interface.MaxCacheSize)
+                                               cacheEnabled = false;
+                               }
+
+                               if (cacheEnabled) {
+                                       if (IsDirty)
+                                               RecreateCache ();
+
+                                       UpdateCache (ctx);
+                                       if (!isEnabled)                                         
+                                               paintDisabled (ctx, Slot + Parent.ClientRectangle.Position);                                    
+                               } else {
+                                       Rectangle rb = Slot + Parent.ClientRectangle.Position;
+                                       ctx.Save ();
+
+                                       ctx.Translate (rb.X, rb.Y);
+
+                                       onDraw (ctx);
+                                       if (!isEnabled)
+                                               paintDisabled (ctx, Slot);
+
+                                       //ctx.Translate (-rb.X, -rb.Y);
+                                       ctx.Restore ();
+                               }
+                               LastPaintedSlot = Slot;
+                       }
+               }
+               void paintDisabled(Context gr, Rectangle rb){
+                       gr.Operator = Operator.Xor;
+                       gr.SetSourceColor (0.6, 0.6, 0.6, 0.3);
+                       gr.Rectangle (rb);
+                       gr.Fill ();
+                       gr.Operator = Operator.Over;
+               }
+               #endregion
+
+        #region Keyboard handling
+               public virtual void onKeyDown(object sender, KeyEventArgs e){
+                       KeyDown.Raise (this, e);
+               }
+               public virtual void onKeyUp(object sender, KeyEventArgs e){
+                       KeyUp.Raise (this, e);
+               }
+               public virtual void onKeyPress(object sender, KeyPressEventArgs e){
+                       KeyPress.Raise (this, e);
+               }
+        #endregion
+
+               #region Mouse handling
+               /// <summary>
+               /// Recursive local coordinate point test.
+               /// After test on parent, point m is in local coord system.
+               /// </summary>
+               /// <returns>return true, if point is in the bounds of this control</returns>
+               /// <param name="m">by ref point to test, init value is not kept</param>
+               public virtual bool PointIsIn(ref Point m)
+               {
+                       if (parent == null)
+                               return false;
+                       if (!(isVisible & isEnabled)||IsDragged)
+                               return false;
+                       if (!parent.PointIsIn(ref m))
+                               return false;
+                       m -= (parent.getSlot().Position + parent.ClientRectangle.Position) ;
+                       return Slot.ContainsOrIsEqual (m);                                      
+               }
+               public virtual bool MouseIsIn(Point m)
+               {                       
+                       return (!(isVisible & isEnabled)||IsDragged) ? false : PointIsIn (ref m);
+               }
+               public virtual void checkHoverWidget(MouseMoveEventArgs e)
+               {
+                       if (IFace.HoverWidget != this) {
+                               IFace.HoverWidget = this;
+                               onMouseEnter (this, e);
+                       }
+
+                       //this.onMouseMove (this, e);//without this, window border doesn't work, should be removed
+               }
+               public virtual void onMouseMove(object sender, MouseMoveEventArgs e)
+               {
+                       if (allowDrag & hasFocus & e.Mouse.LeftButton == ButtonState.Pressed) {
+                               if (IFace.DragAndDropOperation == null) {
+                                       IFace.DragAndDropOperation = new DragDropEventArgs (this);
+                                       onStartDrag (this, IFace.DragAndDropOperation);
+                               }
+                       }
+
+                       //dont bubble event if dragged, mouse move is routed directely from iface
+                       //to let other control behind have mouse entering
+                       if (isDragged)
+                               return;
+
+                       if (MouseMove == null)
+                               focusParent?.onMouseMove (sender, e);
+                       else
+                               MouseMove.Invoke (this, e);
+
+               }
+               public virtual void onMouseDown(object sender, MouseButtonEventArgs e){
+#if DEBUG_FOCUS
+                       Debug.WriteLine("MOUSE DOWN => " + this.ToString());
+#endif
+
+                       /*if (focusable && !Interface.FocusOnHover) {
+                               BubblingMouseButtonEventArg be = e as BubblingMouseButtonEventArg;
+                               if (be.Focused == null) {
+                                       be.Focused = this;
+                                       IFace.FocusedWidget = this;
+                                       if (e.Button == MouseButton.Right && contextCommands != null)
+                                               IFace.ShowContextMenu (this);                                   
+                               }
+                       }*/
+                       if (MouseDown != null)
+                               MouseDown.Invoke (this, e);
+                       if (MouseDown == null || forwardMouseEvents)
+                               focusParent?.onMouseDown (sender, e);
+               }
+               public virtual void onMouseUp(object sender, MouseButtonEventArgs e){
+#if DEBUG_FOCUS
+                       Debug.WriteLine("MOUSE UP => " + this.ToString());
+#endif
+
+                       /*if (IFace.DragAndDropOperation != null){
+                               if (IFace.DragAndDropOperation.DragSource == this) {
+                                       if (IFace.DragAndDropOperation.DropTarget != null)
+                                               onDrop (this, IFace.DragAndDropOperation);
+                                       else
+                                               onEndDrag (this, IFace.DragAndDropOperation);
+                                       IFace.DragAndDropOperation = null;
+                               }
+                       }*/
+
+                       if (MouseUp != null)
+                               MouseUp.Invoke (this, e);
+                       if (MouseUp == null || forwardMouseEvents)
+                               focusParent?.onMouseUp (sender, e);
+
+               }
+               public virtual void onMouseClick(object sender, MouseButtonEventArgs e){
+#if DEBUG_FOCUS
+                       Debug.WriteLine("CLICK => " + this.ToString());
+#endif
+                       if (MouseClick != null)
+                               MouseClick.Invoke (this, e);
+                       if (MouseClick == null || forwardMouseEvents)
+                               focusParent?.onMouseClick (sender, e);
+               }
+               public virtual void onMouseDoubleClick(object sender, MouseButtonEventArgs e){
+#if DEBUG_FOCUS
+                       Debug.WriteLine("DOUBLE CLICK => " + this.ToString());
+#endif
+                       if (MouseDoubleClick != null)
+                               MouseDoubleClick.Invoke (this, e);
+                       if (MouseDoubleClick == null || forwardMouseEvents)
+                               focusParent?.onMouseDoubleClick (sender, e);
+               }
+               public virtual void onMouseWheel(object sender, MouseWheelEventArgs e){
+                       if (MouseWheelChanged != null)
+                               MouseWheelChanged.Invoke (this, e);
+                       if (MouseWheelChanged == null || forwardMouseEvents)
+                               focusParent?.onMouseWheel (sender, e);
+
+               }
+               public virtual void onMouseEnter(object sender, MouseMoveEventArgs e)
+               {
+                       #if DEBUG_FOCUS
+                       Debug.WriteLine("MouseEnter => " + this.ToString());
+                       #endif
+
+                       if (IFace.DragAndDropOperation != null) {
+                               Widget g = this;
+                               while (g != null) {
+                                       if (g.AllowDrop) {
+                                               if (IFace.DragAndDropOperation.DragSource != this && IFace.DragAndDropOperation.DropTarget != this) {
+                                                       if (IFace.DragAndDropOperation.DropTarget != null)
+                                                               IFace.DragAndDropOperation.DropTarget.onDragLeave (this, IFace.DragAndDropOperation);
+                                                       g.onDragEnter (this, IFace.DragAndDropOperation);
+                                               }
+                                               break;
+                                       }
+                                       g = g.focusParent;
+                               }
+                       }
+
+                       MouseEnter.Raise (this, e);
+               }
+               public virtual void onMouseLeave(object sender, MouseMoveEventArgs e)
+               {
+                       #if DEBUG_FOCUS
+                       Debug.WriteLine("MouseLeave => " + this.ToString());
+                       #endif
+
+                       MouseLeave.Raise (this, e);
+               }
+
+               #endregion
+
+               protected virtual void onFocused(object sender, EventArgs e){
+                       #if DEBUG_FOCUS
+                       Debug.WriteLine("Focused => " + this.ToString());
+                       #endif
+                       Focused.Raise (this, e);
+               }
+               protected virtual void onUnfocused(object sender, EventArgs e){
+                       #if DEBUG_FOCUS
+                       Debug.WriteLine("UnFocused => " + this.ToString());
+                       #endif
+                       Unfocused.Raise (this, e);
+               }
+
+               public virtual void onEnable(object sender, EventArgs e){
+                       Enabled.Raise (this, e);
+               }
+               public virtual void onDisable(object sender, EventArgs e){
+                       Disabled.Raise (this, e);
+               }
+               protected virtual void onParentChanged(object sender, DataSourceChangeEventArgs e) {
+                       ParentChanged.Raise (this, e);
+                       if (logicalParent == null)
+                               LogicalParentChanged.Raise (this, e);
+               }
+               protected virtual void onLogicalParentChanged(object sender, DataSourceChangeEventArgs e) {
+                       LogicalParentChanged.Raise (this, e);
+               }
+               internal void ClearTemplateBinding(){
+                       #if DEBUG_UPDATE
+                       Debug.WriteLine (string.Format("ClearTemplateBinding: {0}", this.ToString()));
+                       #endif
+                       if (ValueChanged == null)
+                               return;
+                       EventInfo eiEvt = this.GetType().GetEvent ("ValueChanged");
+                       foreach (Delegate d in ValueChanged.GetInvocationList()) {
+                               if (d.Method.Name == "dyn_tmpValueChanged") {
+                                       eiEvt.RemoveEventHandler (this, d);
+                                       #if DEBUG_BINDING
+                                       Debug.WriteLine ("\t{0} template binding handler removed in {1} for: {2}", d.Method.Name, this, "ValueChanged");
+                                       #endif
+                               }
+                       }
+               }
+               public override string ToString ()
+               {
+                       string tmp ="";
+
+                       if (Parent != null)
+                               tmp = Parent.ToString () + tmp;
+                       #if DEBUG_LAYOUTING
+                       return Name == "unamed" ? tmp + "." + this.GetType ().Name + GraphicObjects.IndexOf(this).ToString(): tmp + "." + Name;
+                       #else
+                       return string.IsNullOrEmpty(Name) ? tmp + "." + this.GetType ().Name : tmp + "." + Name;
+                       #endif
+               }
+               /// <summary>
+               /// Checks to handle when widget is removed from the visible graphic tree
+               /// </summary>
+               void unshownPostActions () {
+                       if (IFace.HoverWidget != null) {
+                               if (IFace.HoverWidget.IsOrIsInside (this)) {
+                                       IFace.HoverWidget = null;
+                                       IFace.ProcessMouseMove (IFace.Mouse.X, IFace.Mouse.Y);
+                               }
+                       }
+                       if (IFace.ActiveWidget != null) {
+                               if (IFace.ActiveWidget.IsOrIsInside (this))
+                                       IFace.ActiveWidget = null;
+                       }
+                       if (IFace.FocusedWidget != null) {
+                               if (IFace.FocusedWidget.IsOrIsInside (this))
+                                       IFace.FocusedWidget = null;
+                       }                                       
+               }
+       }
+}
diff --git a/Crow/src/GraphicObjects/Window.cs b/Crow/src/GraphicObjects/Window.cs
new file mode 100644 (file)
index 0000000..8208083
--- /dev/null
@@ -0,0 +1,466 @@
+//
+// Window.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Diagnostics;
+
+namespace Crow
+{
+       public class Window : TemplatedContainer
+       {
+               public enum Direction
+               {
+                       None,
+                       N,
+                       S,
+                       E,
+                       W,
+                       NW,
+                       NE,
+                       SW,
+                       SE,
+               }
+
+               string _icon;
+               bool resizable;
+               bool movable;
+               bool modal;
+               protected bool hoverBorder = false;
+               bool alwaysOnTop = false;
+               Fill titleBarBackground = Color.SteelBlue;
+               Fill titleBarForeground = Color.White;
+
+               Rectangle savedBounds;
+               bool _minimized = false;
+
+               Direction currentDirection = Direction.None;
+
+               #region Events
+               public event EventHandler Closing;
+               public event EventHandler Maximized;
+               public event EventHandler Unmaximized;
+               public event EventHandler Minimize;
+               #endregion
+
+               #region CTOR
+               protected Window() : base(){}
+               public Window (Interface iface) : base(iface){}
+               #endregion
+
+               #region TemplatedContainer overrides
+               protected override void loadTemplate(Widget template = null)
+               {
+                       base.loadTemplate (template);
+
+                       NotifyValueChanged ("ShowNormal", false);
+                       NotifyValueChanged ("ShowMinimize", true);
+                       NotifyValueChanged ("ShowMaximize", true);
+               }
+               #endregion
+
+               #region public properties
+               [DefaultValue("#Crow.Icons.crow.svg")]
+               public string Icon {
+                       get { return _icon; } 
+                       set {
+                               if (_icon == value)
+                                       return;
+                               _icon = value;
+                               NotifyValueChanged ("Icon", _icon);
+                       }
+               } 
+               /// <summary>
+               /// Background of the title bar if any.
+               /// </summary>
+               [DefaultValue("vgradient|0:Onyx|1:SteelBlue")]
+               public virtual Fill TitleBarBackground {
+                       get { return titleBarBackground; }
+                       set {
+                               if (titleBarBackground == value)
+                                       return;
+                               titleBarBackground = value;
+                               NotifyValueChanged ("TitleBarBackground", titleBarBackground);
+                               RegisterForRedraw ();
+                       }
+               }
+               /// <summary>
+               /// Foreground of the title bar, usualy used for the window caption color.
+               /// </summary>
+               [DefaultValue("White")]
+               public virtual Fill TitleBarForeground {
+                       get { return titleBarForeground; }
+                       set {
+                               if (titleBarForeground == value)
+                                       return;
+                               titleBarForeground = value;
+                               NotifyValueChanged ("TitleBarForeground", titleBarForeground);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(true)]
+               public bool Resizable {
+                       get {
+                               return resizable;
+                       }
+                       set {
+                               if (resizable == value)
+                                       return;
+                               resizable = value;
+                               NotifyValueChanged ("Resizable", resizable);
+                       }
+               }
+               [DefaultValue(true)]
+               public bool Movable {
+                       get {
+                               return movable;
+                       }
+                       set {
+                               if (movable == value)
+                                       return;
+                               movable = value;
+                               NotifyValueChanged ("Movable", movable);
+                       }
+               }
+               [DefaultValue(false)]
+               public bool Modal {
+                       get {
+                               return modal;
+                       }
+                       set {
+                               if (modal == value)
+                                       return;
+                               modal = value;
+                               NotifyValueChanged ("Modal", modal);
+                       }
+               }
+               [DefaultValue(false)]
+               public bool IsMinimized {
+                       get { return _minimized; }
+                       set{
+                               if (value == IsMinimized)
+                                       return;
+
+                               _minimized = value;
+                               _contentContainer.Visible = !_minimized;
+
+                               NotifyValueChanged ("IsMinimized", _minimized);
+                       }
+               }
+               [XmlIgnore]public bool IsMaximized {
+                       get { return Width == Measure.Stretched & Height == Measure.Stretched & !_minimized; }
+               }
+               [XmlIgnore]public bool IsNormal {
+                       get { return !(IsMaximized|_minimized); }
+               }
+               [DefaultValue(false)]
+               public bool AlwaysOnTop {
+                       get {
+                               return modal ? true : alwaysOnTop;
+                       }
+                       set {
+                               if (alwaysOnTop == value)
+                                       return;
+                               
+                               alwaysOnTop = value;
+
+                               if (AlwaysOnTop && Parent != null)
+                                       IFace.PutOnTop (this);
+
+                               NotifyValueChanged ("AlwaysOnTop", AlwaysOnTop);
+                       }
+               }
+//             [DefaultValue(WindowState.Normal)]
+//             public virtual WindowState State {
+//                     get { return _state; }
+//                     set {
+//                             if (_state == value)
+//                                     return;
+//                             _state = value;
+//                             NotifyValueChanged ("State", _state);
+//                             NotifyValueChanged ("IsNormal", IsNormal);
+//                             NotifyValueChanged ("IsMaximized", IsMaximized);
+//                             NotifyValueChanged ("IsMinimized", IsMinimized);
+//                             NotifyValueChanged ("IsNotMinimized", IsNotMinimized);
+//                     }
+//             } 
+               #endregion
+
+               /// <summary>
+               /// Moves the and resize with the same function entry point, the direction give the kind of move or resize
+               /// </summary>
+               /// <param name="XDelta">mouse delta on the X axis</param>
+               /// <param name="YDelta">mouse delta on the Y axis</param>
+               /// <param name="currentDirection">Current Direction of the operation, none for moving, other value for resizing in the given direction</param>
+               public void MoveAndResize (int XDelta, int YDelta, Direction currentDirection = (Direction)0) {
+                       int currentLeft = this.Left;
+                       int currentTop = this.Top;
+                       int currentWidth, currentHeight;
+
+                       if (currentLeft == 0) {
+                               currentLeft = this.Slot.Left;
+                               this.Left = currentLeft;
+                       }
+                       if (currentTop == 0) {
+                               currentTop = this.Slot.Top;
+                               this.Top = currentTop;
+                       }
+                       if (this.Width.IsFixed)
+                               currentWidth = this.Width;
+                       else
+                               currentWidth = this.Slot.Width;
+
+                       if (this.Height.IsFixed)
+                               currentHeight = this.Height;
+                       else
+                               currentHeight = this.Slot.Height;
+
+                       switch (currentDirection) {
+                       case Direction.None:
+                               this.Left = currentLeft + XDelta;                               
+                               this.Top = currentTop + YDelta;
+                               break;
+                       case Direction.N:
+                               this.Height = currentHeight - YDelta;
+                               if (this.Height == currentHeight - YDelta)
+                                       this.Top = currentTop + YDelta;
+                               break;
+                       case Direction.S:
+                               this.Height = currentHeight + YDelta;
+                               break;
+                       case Direction.W:
+                               this.Width = currentWidth - XDelta;
+                               if (this.Width == currentWidth - XDelta)
+                                       this.Left = currentLeft + XDelta;
+                               break;
+                       case Direction.E:
+                               this.Width = currentWidth + XDelta;
+                               break;
+                       case Direction.NW:
+                               this.Height = currentHeight - YDelta;
+                               if (this.Height == currentHeight - YDelta)
+                                       this.Top = currentTop + YDelta;
+                               this.Width = currentWidth - XDelta;
+                               if (this.Width == currentWidth - XDelta)
+                                       this.Left = currentLeft + XDelta;
+                               break;
+                       case Direction.NE:
+                               this.Height = currentHeight - YDelta;
+                               if (this.Height == currentHeight - YDelta)
+                                       this.Top = currentTop + YDelta;
+                               this.Width = currentWidth + XDelta;
+                               break;
+                       case Direction.SW:
+                               this.Width = currentWidth - XDelta;
+                               if (this.Width == currentWidth - XDelta)
+                                       this.Left = currentLeft + XDelta;
+                               this.Height = currentHeight + YDelta;
+                               break;
+                       case Direction.SE:
+                               this.Height = currentHeight + YDelta;
+                               this.Width = currentWidth + XDelta;
+                               break;
+                       }                       
+               }
+
+               #region GraphicObject Overrides
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       Interface otkgw = IFace;
+
+                       if (!hoverBorder) {
+                               currentDirection = Direction.None;
+                               //IFace.MouseCursor = MouseCursors.Default;
+                               return;
+                       }
+
+                       if (this.HasFocus && movable) {
+                               if (e.Mouse.IsButtonDown (MouseButton.Left)) {
+                                       MoveAndResize (e.XDelta, e.YDelta, currentDirection);
+                                       return;
+                               }
+                       }
+                       if (Resizable) {
+                               Direction lastDir = currentDirection;
+
+                               if (Math.Abs (e.Position.Y - this.Slot.Y) < Interface.BorderThreshold) {
+                                       if (Math.Abs (e.Position.X - this.Slot.X) < Interface.BorderThreshold)
+                                               currentDirection = Direction.NW;
+                                       else if (Math.Abs (e.Position.X - this.Slot.Right) < Interface.BorderThreshold)
+                                               currentDirection = Direction.NE;
+                                       else
+                                               currentDirection = Direction.N;
+                               } else if (Math.Abs (e.Position.Y - this.Slot.Bottom) < Interface.BorderThreshold) {
+                                       if (Math.Abs (e.Position.X - this.Slot.X) < Interface.BorderThreshold)
+                                               currentDirection = Direction.SW;
+                                       else if (Math.Abs (e.Position.X - this.Slot.Right) < Interface.BorderThreshold)
+                                               currentDirection = Direction.SE;
+                                       else
+                                               currentDirection = Direction.S;
+                               } else if (Math.Abs (e.Position.X - this.Slot.X) < Interface.BorderThreshold)
+                                       currentDirection = Direction.W;
+                               else if (Math.Abs (e.Position.X - this.Slot.Right) < Interface.BorderThreshold)
+                                       currentDirection = Direction.E;
+                               else
+                                       currentDirection = Direction.None;
+
+                               //if (currentDirection != lastDir) {
+                               //      switch (currentDirection) {
+                               //      case Direction.None:
+                               //              otkgw.MouseCursor = MouseCursors.Default;
+                               //              break;
+                               //      case Direction.N:
+                               //              otkgw.MouseCursor = MouseCursors.V;
+                               //              break;
+                               //      case Direction.S:
+                               //              otkgw.MouseCursor = MouseCursors.V;
+                               //              break;
+                               //      case Direction.E:
+                               //              otkgw.MouseCursor = MouseCursors.H;
+                               //              break;
+                               //      case Direction.W:
+                               //              otkgw.MouseCursor = MouseCursors.H;
+                               //              break;
+                               //      case Direction.NW:
+                               //              otkgw.MouseCursor = MouseCursors.NW;
+                               //              break;
+                               //      case Direction.NE:
+                               //              otkgw.MouseCursor = MouseCursors.NE;
+                               //              break;
+                               //      case Direction.SW:
+                               //              otkgw.MouseCursor = MouseCursors.SW;
+                               //              break;
+                               //      case Direction.SE:
+                               //              otkgw.MouseCursor = MouseCursors.SE;
+                               //              break;
+                               //      }
+                               //}                             
+                       }                               
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+               }
+               public override bool MouseIsIn (Point m)
+               {
+                       return modal ? true : base.MouseIsIn (m);
+               }
+               #endregion
+
+               protected void onMaximized (object sender, EventArgs e){
+                       lock (IFace.LayoutMutex) {
+                               if (!IsMinimized)
+                                       savedBounds = this.LastPaintedSlot;
+                               this.Left = this.Top = 0;
+                               this.RegisterForLayouting (LayoutingType.Positioning);
+                               this.Width = this.Height = Measure.Stretched;
+                               IsMinimized = false;
+                               Resizable = false;
+                               NotifyValueChanged ("ShowNormal", true);
+                               NotifyValueChanged ("ShowMinimize", true);
+                               NotifyValueChanged ("ShowMaximize", false);
+                       }
+
+                       Maximized.Raise (sender, e);
+               }
+               protected void onUnmaximized (object sender, EventArgs e){
+                       lock (IFace.LayoutMutex) {
+                               this.Left = savedBounds.Left;
+                               this.Top = savedBounds.Top;
+                               this.Width = savedBounds.Width;
+                               this.Height = savedBounds.Height;
+                               IsMinimized = false;
+                               Resizable = true;
+                               NotifyValueChanged ("ShowNormal", false);
+                               NotifyValueChanged ("ShowMinimize", true);
+                               NotifyValueChanged ("ShowMaximize", true);
+                       }
+
+                       Unmaximized.Raise (sender, e);
+               }
+               protected void onMinimized (object sender, EventArgs e){
+                       lock (IFace.LayoutMutex) {
+                               if (IsNormal)
+                                       savedBounds = this.LastPaintedSlot;
+                               Width = 200;
+                               Height = 20;
+                               Resizable = false;
+                               IsMinimized = true;
+                               NotifyValueChanged ("ShowNormal", true);
+                               NotifyValueChanged ("ShowMinimize", false);
+                               NotifyValueChanged ("ShowMaximize", true);
+                       }
+
+                       Minimize.Raise (sender, e);
+               }
+               protected virtual void onBorderMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       hoverBorder = false;
+                       currentDirection = Direction.None;
+                       //IFace.MouseCursor = MouseCursors.Default;
+               }
+               protected virtual void onBorderMouseEnter (object sender, MouseMoveEventArgs e)
+               {
+                       hoverBorder = true;
+               }
+
+
+               protected void butQuitPress (object sender, MouseButtonEventArgs e)
+               {
+                       //IFace.MouseCursor = MouseCursors.Default;
+                       close ();
+               }
+
+               protected virtual void close(){
+                       Closing.Raise (this, null);
+                       if (Parent is Interface)
+                               (Parent as Interface).DeleteWidget (this);
+                       else {
+                               Widget p = Parent as Widget;
+                               if (p is Group) {
+                                       lock (IFace.UpdateMutex) {
+                                               RegisterClip (p.ScreenCoordinates (p.LastPaintedSlot));
+                                               (p as Group).DeleteChild (this);
+                                       }
+                                       //(Parent as Group).RegisterForRedraw ();
+                               } else if (Parent is PrivateContainer)
+                                       (Parent as Container).Child = null;
+                       }
+               }
+
+               public static Window Show (Interface iface, string imlPath, bool modal = false){
+                       lock (iface.UpdateMutex) {
+                               Window w = iface.Load (imlPath) as Window;
+                               w.Modal = modal;
+                               return w;
+                       }
+               }
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/Wrapper.cs b/Crow/src/GraphicObjects/Wrapper.cs
new file mode 100644 (file)
index 0000000..cc31985
--- /dev/null
@@ -0,0 +1,251 @@
+//
+// Wrapper.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       /// <summary>
+       /// group control that arrange its children in a direction and jump to
+       /// the next line or row when no room is left
+       /// </summary>
+       public class Wrapper : GenericStack
+       {
+               #region CTOR
+               protected Wrapper() : base(){}
+               public Wrapper (Interface iface) : base(iface){}
+               #endregion
+
+               #region Group Overrides
+               public override void ChildrenLayoutingConstraints (ref LayoutingType layoutType)
+               {
+                       layoutType &= (~LayoutingType.Positioning);
+               }
+               public override void ComputeChildrenPositions()
+               {
+                       int dx = 0;
+                       int dy = 0;
+
+                       if (Orientation == Orientation.Vertical) {
+                               int tallestChild = 0;
+                               foreach (Widget c in Children) {
+                                       if (!c.Visible)
+                                               continue;
+                                       if (dx + c.Slot.Width > ClientRectangle.Width) {
+                                               dx = 0;
+                                               dy += tallestChild + Spacing;
+                                               c.Slot.X = dx;
+                                               c.Slot.Y = dy;
+                                               tallestChild = c.Slot.Height;
+                                       } else {
+                                               if (tallestChild < c.Slot.Height)
+                                                       tallestChild = c.Slot.Height;
+                                               c.Slot.X = dx;
+                                               c.Slot.Y = dy;
+                                       }
+                                       dx += c.Slot.Width + Spacing;
+                               }
+                       } else {
+                               int largestChild = 0;
+                               foreach (Widget c in Children) {
+                                       if (!c.Visible)
+                                               continue;
+                                       if (dy + c.Slot.Height > ClientRectangle.Height) {
+                                               dy = 0;
+                                               dx += largestChild + Spacing;
+                                               c.Slot.X = dx;
+                                               c.Slot.Y = dy;
+                                               largestChild = c.Slot.Width;
+                                       } else {
+                                               if (largestChild < c.Slot.Width)
+                                                       largestChild = c.Slot.Width;
+                                               c.Slot.X = dx;
+                                               c.Slot.Y = dy;
+                                       }
+                                       dy += c.Slot.Height + Spacing;
+                               }
+                       }
+                       IsDirty = true;
+               }
+               public override void OnChildLayoutChanges (object sender, LayoutingEventArgs arg)
+               {
+                       //children can't stretch in a wrapper
+                       Widget go = sender as Widget;
+                       //System.Diagnostics.Debug.WriteLine ("wrapper child layout change: " + go.LastSlots.ToString() + " => " + go.Slot.ToString());
+                       switch (arg.LayoutType) {
+                       case LayoutingType.Width:
+                               if (Orientation == Orientation.Horizontal && go.Width.Units == Unit.Percent){
+                                       go.Width = Measure.Fit;
+                                       return;
+                               }
+                               this.RegisterForLayouting (LayoutingType.Width);
+                               break;
+                       case LayoutingType.Height:
+                               if (Orientation == Orientation.Vertical && go.Height.IsRelativeToParent) {
+                                       go.Height = Measure.Fit;
+                                       return;
+                               }
+                               this.RegisterForLayouting (LayoutingType.Height);
+                               break;
+                       default:
+                               return;
+                       }
+                       this.RegisterForLayouting (LayoutingType.ArrangeChildren);
+               }
+               #endregion
+
+               #region GraphicObject Overrides
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       int tmp = 0;
+                       //Wrapper can't fit in the opposite direction of the wrapper, this func is called only if Fit
+                       if (lt == LayoutingType.Width) {
+                               if (Orientation == Orientation.Vertical) {
+                                       Width = Measure.Stretched;
+                                       return -1;
+                               } else if (RegisteredLayoutings.HasFlag (LayoutingType.Height))
+                                       return -1;
+                               else {
+                                       int dy = 0;
+                                       int largestChild = 0;
+
+                                       childrenRWLock.EnterReadLock();
+
+                                       foreach (Widget c in Children) {
+                                               if (!c.Visible)
+                                                       continue;
+                                               if (c.Height.IsRelativeToParent &&
+                                                   c.RegisteredLayoutings.HasFlag (LayoutingType.Height)) {
+                                                       childrenRWLock.ExitReadLock();
+                                                       return -1;
+                                               }
+                                               if (dy + c.Slot.Height > ClientRectangle.Height) {
+                                                       dy = 0;
+                                                       tmp += largestChild + Spacing;
+                                                       largestChild = c.Slot.Width;
+                                               } else if (largestChild < c.Slot.Width)
+                                                       largestChild = c.Slot.Width;
+
+                                               dy += c.Slot.Height + Spacing;
+                                       }
+
+                                       childrenRWLock.ExitReadLock ();
+
+                                       if (dy == 0)
+                                               tmp -= Spacing;
+                                       return tmp + largestChild + 2 * Margin;
+                               }
+                       } else if (Orientation == Orientation.Horizontal) {
+                               Height = Measure.Stretched;
+                               return -1;
+                       } else if (RegisteredLayoutings.HasFlag (LayoutingType.Width))
+                               return -1;
+                       else {
+                               int dx = 0;
+                               int tallestChild = 0;
+
+                               childrenRWLock.EnterReadLock();
+
+                               foreach (Widget c in Children) {
+                                       if (!c.Visible)
+                                               continue;
+                                       if (c.Width.IsRelativeToParent &&
+                                           c.RegisteredLayoutings.HasFlag (LayoutingType.Width)) {
+                                               childrenRWLock.ExitReadLock();
+                                               return -1;
+                                       }
+                                       if (dx + c.Slot.Width > ClientRectangle.Width) {
+                                               dx = 0;
+                                               tmp += tallestChild + Spacing;
+                                               tallestChild = c.Slot.Height;
+                                       } else if (tallestChild < c.Slot.Height)
+                                               tallestChild = c.Slot.Height;
+
+                                       dx += c.Slot.Width + Spacing;
+                               }
+
+                               childrenRWLock.ExitReadLock();
+
+                               if (dx == 0)
+                                       tmp -= Spacing;
+                               return tmp + tallestChild + 2 * Margin;
+                       }
+               }
+
+               public override bool UpdateLayout (LayoutingType layoutType)
+               {
+                       RegisteredLayoutings &= (~layoutType);
+
+                       if (layoutType == LayoutingType.ArrangeChildren) {
+                               if ((RegisteredLayoutings & LayoutingType.Sizing) != 0)
+                                       return false;
+
+                               ComputeChildrenPositions ();
+
+                               //if no layouting remains in queue for item, registre for redraw
+                               if (RegisteredLayoutings == LayoutingType.None && IsDirty)
+                                       IFace.EnqueueForRepaint (this);
+
+                               return true;
+                       }
+
+                       return base.UpdateLayout(layoutType);
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       #if DEBUG_LAYOUTING
+                       IFace.currentLQI.Slot = LastSlots;
+                       IFace.currentLQI.Slot = Slot;
+                       #endif
+                       switch (layoutType) {
+                       case LayoutingType.Width:
+                               foreach (Widget c in Children) {
+                                       if (c.Width.IsRelativeToParent)
+                                               c.RegisterForLayouting (LayoutingType.Width);
+                               }
+                               if (Height == Measure.Fit)
+                                       RegisterForLayouting (LayoutingType.Height);
+                               RegisterForLayouting (LayoutingType.X);
+                               break;
+                       case LayoutingType.Height:
+                               foreach (Widget c in Children) {
+                                       if (c.Height.IsRelativeToParent)
+                                               c.RegisterForLayouting (LayoutingType.Height);
+                               }
+                               if (Width == Measure.Fit)
+                                       RegisterForLayouting (LayoutingType.Width);
+                               RegisterForLayouting (LayoutingType.Y);
+                               break;
+                       default:
+                               return;
+                       }
+                       RegisterForLayouting (LayoutingType.ArrangeChildren);
+                       raiseLayoutChanged (new LayoutingEventArgs (layoutType));
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/GraphicObjects/XmlIgnoreAttribute.cs b/Crow/src/GraphicObjects/XmlIgnoreAttribute.cs
new file mode 100644 (file)
index 0000000..29e5bf6
--- /dev/null
@@ -0,0 +1,34 @@
+//
+// Expandable.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+    public class XmlIgnoreAttribute : Attribute
+    {
+    }
+}
\ No newline at end of file
diff --git a/Crow/src/IListChanged.cs b/Crow/src/IListChanged.cs
new file mode 100644 (file)
index 0000000..b2b2337
--- /dev/null
@@ -0,0 +1,43 @@
+//
+// IListChanged.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow
+{
+       public class ListChangedEventArg : EventArgs {
+               public int Index;
+               public object Element;
+               public ListChangedEventArg (int index, object element) {
+                       Index = index;
+                       Element = element;
+               }
+       }
+       public interface IObservableList {
+               event EventHandler<ListChangedEventArg> ListAdd;
+               event EventHandler<ListChangedEventArg> ListRemove;             
+       }
+}
+
diff --git a/Crow/src/IML/BindingDefinition.cs b/Crow/src/IML/BindingDefinition.cs
new file mode 100644 (file)
index 0000000..9cbaf62
--- /dev/null
@@ -0,0 +1,91 @@
+//
+// BindingDefinition.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow.IML
+{
+       /// <summary>
+       /// store binding source and target addresses and member names
+       /// </summary>
+       public class BindingDefinition
+       {
+               public NodeAddress SourceNA = null;//the widget declaring this binding in a member
+               public string SourceMember = "";//the member where the binding string has been found
+               public NodeAddress TargetNA = null;//
+               public string TargetMember = "";
+               public string TargetName = "";
+               public bool TwoWay = false;//two way binding
+               public Type targetType = null;//added to store dataSourceType if set
+
+               #region CTOR
+               public BindingDefinition (NodeAddress _sourceNA, string _sourceMember){
+                       SourceNA = _sourceNA;
+                       SourceMember = _sourceMember;
+               }
+               public BindingDefinition (NodeAddress _sourceNA, string _sourceMember, NodeAddress _targetNA, string _targetMember, string _targetName = "", bool _twoWay = false)
+               {
+                       SourceNA = _sourceNA;
+                       SourceMember = _sourceMember;
+                       TargetNA = _targetNA;
+                       TargetMember = _targetMember;
+                       TargetName = _targetName;
+                       TwoWay = _twoWay;
+               }
+               #endregion
+
+               public bool IsDataSourceBinding { get { return TargetNA == null; }}
+               public bool IsTemplateBinding { get { return IsDataSourceBinding ? false : TargetNA.Count == 0; }}
+               public bool HasUnresolvedTargetName { get { return !string.IsNullOrEmpty(TargetName); }}
+               public MemberAddress SourceMemberAddress { get { return new MemberAddress (SourceNA, SourceMember);}}
+               public MemberAddress TargetMemberAddress { get { return new MemberAddress (TargetNA, TargetMember);}}
+
+               /// <summary>
+               /// replace the target node address with corresponding named node address, and clear the target name once resolved
+               /// </summary>
+               /// <param name="newTargetNA">Named Node</param>
+               public void ResolveTargetName(NodeAddress newTargetNA){
+                       TargetNA = newTargetNA;
+                       TargetName = "";
+               }
+
+               public override string ToString ()
+               {
+                       string tmp = string.Format ("Source:{0}.{1}", SourceNA, SourceMember);
+                       if (TwoWay)
+                               tmp += " <=> ";
+                       else
+                               tmp += " <=  ";
+                                       
+                       if (string.IsNullOrEmpty (TargetName))
+                               tmp += string.Format ("Target:{0}.{1}]", TargetNA, TargetMember);
+                       else
+                               tmp += string.Format ("Target:{0}.{1}.{2}]", TargetNA, TargetName, TargetMember);
+                       return tmp;
+               }
+       }
+}
+
diff --git a/Crow/src/IML/BindingMember.cs b/Crow/src/IML/BindingMember.cs
new file mode 100644 (file)
index 0000000..f6cc047
--- /dev/null
@@ -0,0 +1,191 @@
+//
+// BindingMember.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Reflection.Emit;
+
+namespace Crow.IML
+{
+       /// <summary>
+       /// Binding expression parser.
+       /// 
+       /// Valid tokens in binding expression:
+       /// - '../' => 1 level up in graphic tree
+       /// - './' or '/' => template root level
+       /// - '.Name1.Name2' current level properties
+       /// - 'name.prop' named descendant in graphic tree, search with 'FindByName' method of GraphicObject
+       /// </summary>
+       public class BindingMember
+       {
+               /// <summary>
+               /// true if expression was enclosed in '
+               /// </summary>
+               public bool IsStringConstant = false;
+               /// <summary>
+               /// Nb level to go up, '-1' for template root
+               /// </summary>
+               public int LevelsUp;
+               /// <summary>
+               /// Remaining string after '/' split, splitted on '.'
+               /// </summary>
+               public string[] Tokens;
+
+               /// <summary>
+               /// Target the template's root node, expression was in the form './name[.name[...]]' or '/name[.name[...]]'
+               /// </summary>
+               public bool IsTemplateBinding { get { return LevelsUp < 0; }}
+
+               /// <summary>
+               /// No level change and expression was '.name'
+               /// </summary>
+               /// <value><c>true</c> if this instance is current node property; otherwise, <c>false</c>.</value>
+               public bool IsCurrentNodeProperty {
+                       get {
+                               return LevelsUp == 0 && ( Tokens.Length == 2 && string.IsNullOrEmpty(Tokens[0]));
+                       }
+               }
+               /// <summary>
+               /// no level change, and only a single name in Tokens[], that's dataSource member if property binding
+               /// </summary>
+               public bool IsSingleName { get { return LevelsUp == 0 && Tokens.Length == 1; }}
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of BindingMember.
+               /// </summary>
+               public BindingMember (){}
+               /// <summary>
+               /// Initializes a new instance of BindingMember by parsing the string passed as argument
+               /// </summary>
+               /// <param name="expression">binding expression</param>
+               public BindingMember (string expression){
+                       if (string.IsNullOrEmpty (expression))
+                               return;
+
+                       string[] splitedExp = expression.Trim().Split ('/');
+
+                       int ptr = 0;
+                       if (splitedExp.Length == 1) {
+                               if (splitedExp [0].StartsWith ("\'",StringComparison.Ordinal)) {
+                                       if (!splitedExp [0].EndsWith ("\'", StringComparison.Ordinal))
+                                               throw new Exception (string.Format
+                                                       ("IML:malformed string constant in binding expression: {0}", splitedExp [0]));
+                                       Tokens = new string[] { splitedExp [0].Substring (1, splitedExp [0].Length - 2) };
+                                       IsStringConstant = true;
+                                       return;
+                               }
+                       } else if (string.IsNullOrEmpty (splitedExp [0])) {
+                               ptr++;
+                       } else {
+                                if (splitedExp [0] == ".") {//template root
+                                       LevelsUp = -1;
+                                       ptr++;
+                               } else {
+                                       while (splitedExp [ptr] == "..")
+                                               ptr++;
+                                       LevelsUp = ptr;
+                               }
+                       }
+                       if (ptr != splitedExp.Length - 1)
+                               throw new Exception ("invalid expresion: " + expression);
+                       Tokens = splitedExp [ptr].Split ('.');
+               }
+               #endregion
+
+               /// <summary>
+               /// Emits the MSIL instructions to get the target of the binding expression
+               /// </summary>
+               /// <param name="il">current MSIL generator</param>
+               /// <param name="cancel">cancel branching in MSIL if something go wrong</param>
+               public void emitGetTarget(ILGenerator il, System.Reflection.Emit.Label cancel){
+
+                       if (IsTemplateBinding) {
+                               System.Reflection.Emit.Label nextLogicParent = il.DefineLabel ();
+                               il.MarkLabel (nextLogicParent);
+                               il.Emit (OpCodes.Callvirt, CompilerServices.miGetLogicalParent);
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, cancel);
+                               il.Emit (OpCodes.Isinst, typeof(TemplatedControl));
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, nextLogicParent);
+                       } else if (LevelsUp > 0) {//go upward in logical tree
+                               il.Emit (OpCodes.Ldc_I4, LevelsUp);//push arg 2 of goUpLevels
+                               il.Emit (OpCodes.Call, CompilerServices.miGoUpLevels);
+                               //test if null
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, cancel);
+                       }
+
+                       if (!string.IsNullOrEmpty (Tokens [0])) {//find by name
+                               il.Emit (OpCodes.Ldstr, Tokens [0]);
+                               il.Emit (OpCodes.Callvirt, CompilerServices.miFindByName);
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, cancel);
+                       }
+
+                       for (int i = 1; i < Tokens.Length -1; i++) {
+                               System.Reflection.Emit.Label miOK = il.DefineLabel ();
+                               il.Emit (OpCodes.Dup);//duplicate instance
+                               il.Emit (OpCodes.Ldstr, Tokens [i]);//load member name
+                               il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brtrue, miOK);
+                               il.Emit (OpCodes.Pop);//pop dup instance
+                               il.Emit (OpCodes.Br, cancel);
+                               il.MarkLabel (miOK);
+                               il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx);
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Brfalse, cancel);
+                       }
+               }
+               /// <summary>
+               /// Emit the MSIL instructions to get the target property of the binding expression
+               /// </summary>
+               /// <param name="il">current MSIL generator</param>
+               /// <param name="cancel">cancel branching in MSIL if something go wrong</param>
+               public void emitGetProperty(ILGenerator il, System.Reflection.Emit.Label cancel) {
+                       System.Reflection.Emit.Label miOK = il.DefineLabel ();
+                       il.Emit (OpCodes.Dup);//duplicate instance
+                       il.Emit (OpCodes.Ldstr, Tokens [Tokens.Length -1]);//load member name
+                       il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
+                       il.Emit (OpCodes.Dup);
+                       il.Emit (OpCodes.Brtrue, miOK);
+                       il.Emit (OpCodes.Pop);//pop dup instance
+                       il.Emit (OpCodes.Br, cancel);
+                       il.MarkLabel (miOK);
+                       il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx);
+               }
+               /// <summary>
+               /// Emit the MSIL instructions to set the target property of the binding expression
+               /// </summary>
+               /// <param name="il">current MSIL generator</param>
+               public void emitSetProperty(ILGenerator il) {
+                       il.Emit (OpCodes.Ldstr, Tokens [Tokens.Length -1]);//load member name
+                       il.Emit (OpCodes.Call, CompilerServices.miSetValWithRefx);
+               }
+       }
+}
+
diff --git a/Crow/src/IML/EventBinding.cs b/Crow/src/IML/EventBinding.cs
new file mode 100644 (file)
index 0000000..41e0c96
--- /dev/null
@@ -0,0 +1,45 @@
+//
+// EventBinding.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Reflection;
+
+namespace Crow.IML
+{
+       public class EventBinding : BindingDefinition
+       {
+               public EventInfo SourceEvent;
+
+               #region CTOR
+               public EventBinding (NodeAddress _sourceNA, EventInfo _sourceEvt, NodeAddress _targetNA, string _targetMember, string _targetName = "")
+                       : base (_sourceNA, _sourceEvt.Name, _targetNA, _targetMember, _targetName)
+               {
+                       SourceEvent = _sourceEvt;
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/IML/IMLContext.cs b/Crow/src/IML/IMLContext.cs
new file mode 100644 (file)
index 0000000..1d5b550
--- /dev/null
@@ -0,0 +1,266 @@
+//
+// Context.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Xml;
+
+namespace Crow.IML
+{
+       public class DataSourceBinding {
+               public bool TwoWay;
+               public MemberAddress Source;
+               public string DataSourceMember;
+       }
+       /// <summary>
+       /// Context while parsing IML, this will store what's needed only while parsing and not during instancing
+       /// </summary>
+       public class IMLContext
+       {
+               public XmlReader reader = null;
+               public int curLine = 0;
+               public Type RootType = null;
+
+               public DynamicMethod dm = null;
+               public ILGenerator il = null;
+               //public SubNodeType curSubNodeType;
+               public NodeStack nodesStack = new NodeStack ();
+
+               /// <summary> store addresses of named node for name resolution at end of parsing </summary>
+               public Dictionary<string, List<NodeAddress>> Names  = new Dictionary<string, List<NodeAddress>>();
+               /// <summary> Store non datasource binding (in tree and template) by origine and orig member </summary>
+               public Dictionary<NodeAddress, Dictionary<string, List<MemberAddress>>> Bindings =
+                       new Dictionary<NodeAddress, Dictionary<string, List<MemberAddress>>>();
+               /// <summary> Store binding with name in target, will be resolved at end of parsing </summary>
+               public List<BindingDefinition> UnresolvedTargets = new List<BindingDefinition>();
+
+
+               public IMLContext (Type rootType)
+               {
+                       RootType = rootType;
+                       dm = new DynamicMethod ("dyn_instantiator",
+                               typeof (object), new Type [] { typeof (Instantiator), typeof (Interface) }, true);
+                       il = dm.GetILGenerator (256);
+
+                       il.DeclareLocal (typeof (Widget));
+                       il.Emit (OpCodes.Nop);
+                       //set local GraphicObject to root object
+                       ConstructorInfo ci = rootType.GetConstructor (
+                                       BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, 
+                                       null, Type.EmptyTypes, null);
+                       if (ci == null)
+                               throw new Exception ("No default parameterless constructor found in " + rootType.Name);                 
+                       il.Emit (OpCodes.Newobj, ci);
+                       il.Emit (OpCodes.Stloc_0);
+                       CompilerServices.emitSetCurInterface (il);
+               }
+
+               Type curDataSourceType = null;
+               /// <summary>
+               /// Pushs  new node and set datasourcetype to current ds type
+               /// </summary>
+               /// <param name="crowType">Crow type.</param>
+               /// <param name="_index">Index.</param>
+               public void PushNode (Type crowType, int _index = 0) {
+                       nodesStack.Push (new Node (crowType, _index, curDataSourceType));
+               }
+               /// <summary>
+               /// Pops node and set curDS type to previous one in node on top of the stack
+               /// </summary>
+               /// <returns>The node.</returns>
+               public Node PopNode () {
+                       Node n = nodesStack.Pop ();
+                       if (nodesStack.Count > 0)
+                               curDataSourceType = nodesStack.Peek().DataSourceType;
+                       return n;
+               }
+               public bool CurrentNodeHasDataSourceType {
+                       get { return curDataSourceType != null; }
+               }
+               public Type CurrentDataSourceType {
+                       get { return curDataSourceType; }
+               }
+               public void SetDataSourceTypeForCurrentNode (Type dsType)
+               {
+                       Node n = nodesStack.Pop ();
+                       n.DataSourceType = dsType;
+                       nodesStack.Push (n);
+                       curDataSourceType = dsType;
+               }
+
+               public NodeAddress CurrentNodeAddress {
+                       get {
+                               Node[] n = nodesStack.ToArray ();
+                               Array.Reverse (n);
+                               return new NodeAddress(n);
+                       }
+               }
+               public Type CurrentNodeType {
+                       get { return nodesStack.Peek().CrowType; }
+               }
+               public void StorePropertyBinding(NodeAddress origNA, string origMember, NodeAddress destNA, string destMember){
+                       Dictionary<string, List<MemberAddress>> nodeBindings = null;
+                       if (Bindings.ContainsKey (origNA))
+                               nodeBindings = Bindings [origNA];
+                       else {
+                               nodeBindings = new Dictionary<string, List<MemberAddress>> ();
+                               Bindings [origNA] = nodeBindings;
+                       }
+
+                       if (!nodeBindings.ContainsKey (origMember))
+                               nodeBindings [origMember] = new List<MemberAddress> ();
+                       nodeBindings [origMember].Add (new MemberAddress (destNA, destMember));
+               }
+               public void StorePropertyBinding(BindingDefinition bindDef){
+                       if (bindDef.HasUnresolvedTargetName) {
+                               UnresolvedTargets.Add (bindDef);
+                               return;
+                       }
+                       StorePropertyBinding (bindDef.TargetNA, bindDef.TargetMember, bindDef.SourceNA, bindDef.SourceMember);
+                       if (bindDef.TwoWay)
+                               StorePropertyBinding (bindDef.SourceNA, bindDef.SourceMember, bindDef.TargetNA, bindDef.TargetMember);
+               }
+               /// <summary>
+               /// Stores all the names found in current iml for binding resolution if any of them
+               /// are targeting named widget 
+               /// </summary>
+               public void StoreCurrentName(string name){
+                       if (!Names.ContainsKey(name))
+                               Names[name] = new List<NodeAddress>();
+                       Names[name].Add(CurrentNodeAddress);
+               }
+               public void ResolveNamedTargets(){//TODO:methodinfo fetching is redundant with early parsing
+                       foreach (BindingDefinition bd in UnresolvedTargets) {
+                               if (bd.HasUnresolvedTargetName) {
+                                       try {
+                                               ResolveName (bd);       
+                                       } catch (Exception ex) {
+                                               System.Diagnostics.Debug.WriteLine (ex.ToString ());
+                                               continue;
+                                       }
+                               }
+
+                               if (bd is EventBinding) {
+                                       emitHandlerMethodAddition (bd as EventBinding);
+                                       continue;
+                               }
+
+                               MemberInfo miSource = bd.SourceMemberAddress.member;
+                               if (miSource == null)
+                                       throw new Exception ("Source member '" + bd.SourceMember + "' not found");
+                               StorePropertyBinding (bd);
+                       }
+               }
+               public void ResolveName (BindingDefinition bd){
+
+                       if (!Names.ContainsKey (bd.TargetName))
+                               throw new Exception ("Target Name '" + bd.TargetName + "' not found");
+
+                       NodeAddress resolvedNA = null;
+                       foreach (NodeAddress na in Names[bd.TargetName]) {
+                               bool naMatch = true;
+                               for (int i = 0; i < bd.TargetNA.Count; i++) {
+                                       if (bd.TargetNA [i] != na [i]) {
+                                               naMatch = false;
+                                               break;
+                                       }
+                               }
+                               if (naMatch) {
+                                       resolvedNA = na;
+                                       break;
+                               }
+                       }
+
+                       if (resolvedNA == null)
+                               throw new Exception ("Target Name '" + bd.TargetName + "' not found");
+
+                       bd.ResolveTargetName (resolvedNA);
+               }
+
+               /// <summary>
+               /// Emits cached delegate handler addition in the context of instantiator (ctx)
+               /// </summary>
+               public void emitCachedDelegateHandlerAddition(int index, EventInfo evt, NodeAddress address = null){
+                       il.Emit(OpCodes.Ldloc_0);//load ref to current graphic object
+                       CompilerServices.emitGetInstance (il, address);
+                       il.Emit(OpCodes.Ldarg_0);//load ref to this instanciator onto the stack
+                       il.Emit(OpCodes.Ldfld, CompilerServices.fiCachedDel);
+                       il.Emit(OpCodes.Ldc_I4, index);//load delegate index
+                       il.Emit(OpCodes.Callvirt, CompilerServices.miGetDelegateListItem);
+                       il.Emit(OpCodes.Call, evt.AddMethod);//call add event
+               }
+               /// <summary>
+               /// Emits the handler method addition, done at end of parsing, Loc_0 is root node instance
+               /// </summary>
+               /// <param name="bd">Bd.</param>
+               public void emitHandlerMethodAddition(EventBinding bd){
+
+                       //fetch source instance with address for handler addition (as 1st arg of handler.add)
+                       il.Emit (OpCodes.Ldloc_0);//push root
+                       CompilerServices.emitGetInstance (il, bd.SourceNA);
+
+                       il.Emit (OpCodes.Ldloc_0);
+                       CompilerServices.emitGetInstance (il, bd.TargetNA);
+
+                       string[] membs = bd.TargetMember.Split ('.');
+                       for (int i = 0; i < membs.Length - 1; i++) {
+                               il.Emit (OpCodes.Dup);
+                               il.Emit (OpCodes.Ldstr, membs[i]);
+                               il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
+                               il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx);
+                       }
+
+                       //load handlerType of sourceEvent to create handler delegate (1st arg)
+                       il.Emit (OpCodes.Ldtoken, bd.SourceEvent.EventHandlerType);
+                       il.Emit (OpCodes.Call, CompilerServices.miGetTypeFromHandle);
+                       //load methodInfo (3rd arg)
+                       il.Emit (OpCodes.Ldstr, membs[membs.Length-1]);
+                       il.Emit (OpCodes.Call, CompilerServices.miCreateDel);
+                       il.Emit (OpCodes.Call, bd.SourceEvent.AddMethod);//call add event
+               }
+//             public void emitHandlerMethodAddition(EventBinding bd){
+//                     //fetch source instance with address for handler addition (as 1st arg of handler.add)
+//                     il.Emit (OpCodes.Ldloc_0);//push root
+//                     CompilerServices.emitGetInstance (il, bd.SourceNA);
+//
+//                     //load handlerType of sourceEvent to create handler delegate (1st arg)
+//                     il.Emit (OpCodes.Ldtoken, bd.SourceEvent.EventHandlerType);
+//                     il.Emit (OpCodes.Call, CompilerServices.miGetTypeFromHandle);
+//                     //load target the where the method is defined (2nd arg)
+//                     il.Emit (OpCodes.Ldloc_0);
+//                     CompilerServices.emitGetInstance (il, bd.TargetNA);
+//                     //load methodInfo (3rd arg)
+//                     il.Emit (OpCodes.Ldstr, bd.TargetMember);
+//
+//                     il.Emit (OpCodes.Callvirt, CompilerServices.miCreateDel);
+//
+//                     il.Emit (OpCodes.Callvirt, bd.SourceEvent.AddMethod);//call add event
+//             }
+//
+       }
+}
\ No newline at end of file
diff --git a/Crow/src/IML/MemberAddress.cs b/Crow/src/IML/MemberAddress.cs
new file mode 100644 (file)
index 0000000..a2ef206
--- /dev/null
@@ -0,0 +1,115 @@
+//
+// MemberAddress.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace Crow.IML
+{
+       /// <summary>
+       /// Address member of a node
+       /// </summary>
+       public struct MemberAddress
+       {
+               public string memberName;
+               public MemberInfo member;
+               public NodeAddress Address;
+
+               public PropertyInfo Property { get { return member as PropertyInfo; }}
+               public bool IsTemplateBinding { get { return Address == null ? false : Address.Count == 0; }}
+
+               public MemberAddress (NodeAddress _address, string _member, bool findMember = true)
+               {
+                       Address = _address;
+                       memberName = _member;
+                       member = null;
+
+                       if (Address == null)
+                               return;
+                       if (Address.Count == 0)
+                               return;
+
+                       if (!findMember)
+                               return;
+                       if (!tryFindMember ())
+                               throw new Exception ("Member Not Found: " + memberName);
+               }
+               public MemberAddress (NodeAddress _address, MemberInfo _member)
+               {
+                       Address = _address;
+                       member = _member;
+                       memberName = "";
+
+                       if (member != null)
+                               memberName = member.Name;
+               }
+
+               #region Equality Compare
+               public override bool Equals (object obj)
+               {
+                       return obj is MemberAddress && this == (MemberAddress)obj;
+               }
+               public override int GetHashCode ()
+               {
+                       return Address.GetHashCode () ^ member.GetHashCode ();
+               }
+               public static bool operator == (MemberAddress x, MemberAddress y)
+               {
+                       return x.Address == y.Address && x.memberName == y.memberName;
+               }
+               public static bool operator != (MemberAddress x, MemberAddress y)
+               {
+                       return !(x == y);
+               }
+               #endregion
+
+               bool tryFindMember ()
+               {
+#if DEBUG_BINDING_FUNC_CALLS
+            Console.WriteLine ($"tryFindMember ({Address},{member})");
+#endif
+                       if (member != null)
+                               throw new Exception ("member already found");
+                       if (Address == null)
+                               return false;
+                       if (Address.Count == 0)
+                               return false;
+                       Type t = Address.LastOrDefault ().CrowType;
+                       member = t.GetMember (memberName, BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).FirstOrDefault ();
+
+#region search for extensions methods if member not found in type
+                       if (member == null && !string.IsNullOrEmpty (memberName)) {
+                               Assembly a = Assembly.GetExecutingAssembly ();
+                               string mn = memberName;
+                               member = CompilerServices.GetExtensionMethods (a, t, mn);
+                       }
+#endregion
+
+                       return member != null;
+               }
+       }
+}
diff --git a/Crow/src/IML/Node.cs b/Crow/src/IML/Node.cs
new file mode 100644 (file)
index 0000000..5ba9396
--- /dev/null
@@ -0,0 +1,110 @@
+//
+// Node.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Collections.Generic;
+
+namespace Crow.IML
+{
+       /// <summary>
+       /// IML Node are defined with a type and the index in the parent,
+       /// </summary>
+       public struct Node
+       {
+               #region CTOR
+               public Node (Type crowType, int _index = 0, Type dsType = null)
+               {
+                       CrowType = crowType;
+                       Index = _index;
+                       DataSourceType = dsType;
+               }
+               #endregion
+
+               /// <summary> Current node type</summary>
+               public readonly Type CrowType;
+               /// <summary> Index in parent, -1 for template</summary>
+               public readonly int Index;
+               /// <summary>
+               /// DataSourceType attribute if set
+               /// </summary>
+               public Type DataSourceType;
+
+
+               /// <summary>
+               /// retrieve the child addition method depending on the type of this node
+               /// </summary>
+               /// <returns>The child addition method</returns>
+               /// <param name="childIdx">child index or, template root node has index == -1</param>
+               public MethodInfo GetAddMethod(int childIdx){
+                       if (typeof (Group).IsAssignableFrom (CrowType))
+                               return CompilerServices.miAddChild;
+                       if (typeof (Container).IsAssignableFrom (CrowType))
+                               return CompilerServices.miSetChild;
+                       if (typeof (TemplatedContainer).IsAssignableFrom (CrowType))
+                               return childIdx < 0 ? CompilerServices.miLoadTmp : CompilerServices.piContent.GetSetMethod();
+                       if (typeof (TemplatedGroup).IsAssignableFrom (CrowType))
+                               return childIdx < 0 ? CompilerServices.miLoadTmp : CompilerServices.miAddItem;
+                       if (typeof (TemplatedControl).IsAssignableFrom (CrowType))
+                               return CompilerServices.miLoadTmp;
+                       return null;
+               }
+
+#region Equality Compare
+               public override bool Equals (object obj)
+               {
+                       if (obj == null) 
+                               return false;                   
+                       Node n = (Node)obj;
+                       return CrowType == n.CrowType && Index == n.Index;
+               }
+               public override int GetHashCode ()
+               {
+                       return CrowType.GetHashCode () ^ Index.GetHashCode ();
+               }
+#endregion
+
+               public bool HasTemplate {
+                       get { return typeof (TemplatedControl).IsAssignableFrom (CrowType);}
+               }
+               public bool IsTemplatedGroup {
+                       get { return typeof (TemplatedGroup).IsAssignableFrom (CrowType);}
+               }
+               public bool HasDataSourceType {
+                       get { return DataSourceType != null; }
+               }
+
+               public static implicit operator string (Node sn)
+               {
+                       return sn.ToString ();
+               }
+               public override string ToString ()
+               {
+                       return string.Format ("{0}.{1}", CrowType.FullName, Index);
+               }
+       }
+}
diff --git a/Crow/src/IML/NodeAddress.cs b/Crow/src/IML/NodeAddress.cs
new file mode 100644 (file)
index 0000000..55ef21b
--- /dev/null
@@ -0,0 +1,148 @@
+//
+// NodeAddress.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace Crow.IML
+{
+       /// <summary>
+       /// Node address is a list of nodes from root to leaf defining a unique node
+       /// </summary>
+       public class NodeAddress : List<Node>
+       {
+               #region CTOR
+               public NodeAddress (Node[] nodes) : base(nodes) {}
+               #endregion
+
+               public Type NodeType { get { return Count == 0 ? null : this[this.Count -1].CrowType; }}
+
+               /// <summary>
+               /// Gets the node adress from binding expression starting from this node
+               /// and return in expression remaining part
+               /// </summary>
+               public NodeAddress ResolveExpression (ref string expression){
+                       int ptr = this.Count - 1;
+                       string[] splitedExp = expression.Split ('/');
+
+                       if (splitedExp.Length < 2)//dataSource binding
+                               return null;
+
+                       if (!string.IsNullOrEmpty (splitedExp [0])) {//else bind on current node
+                               //return new NodeAddress (this.Take(ptr+1).ToArray());
+                               if (splitedExp [0] == ".") {//search template root
+                                       ptr--;
+                                       while (ptr >= 0) {
+                                               if (typeof(TemplatedControl).IsAssignableFrom (this [ptr].CrowType))
+                                                       break;
+                                               ptr--;
+                                       }
+                               } else if (splitedExp [0] == "..") { //search starting at current node
+                                       int levelUp = splitedExp.Length - 1;
+                                       if (levelUp > ptr + 1)
+                                               throw new Exception ("Binding error: try to bind outside IML source");
+                                       ptr -= levelUp;
+                               }
+                       }
+                       expression = splitedExp [splitedExp.Length - 1];
+                       //TODO:change Template special address identified with Nodecount = 0 to something not using array count to 0,
+                       //here linq is working without limits checking in compile option
+                       //but defining a 0 capacity array with limits cheking enabled, cause 'out of memory' error
+                       return new NodeAddress (this.Take(ptr+1).ToArray());//[ptr+1];
+                       //Array.Copy (sourceAddr.ToArray (), targetNode, ptr + 1);
+                       //return new NodeAddress (targetNode);
+               }
+               /// <summary>
+               /// get BindingDefinition from binding expression
+               /// </summary>
+               public BindingDefinition GetBindingDef(string sourceMember, string expression){
+                       BindingDefinition bindingDef = new BindingDefinition(this, sourceMember);
+                       if (string.IsNullOrEmpty (expression)) {
+                               return bindingDef;
+                       } else {
+                               if (expression.StartsWith ("²", StringComparison.Ordinal)) {
+                                       bindingDef.TwoWay = true;
+                                       expression = expression.Substring (1);
+                               }
+
+                               string exp = expression;
+                               bindingDef.TargetNA = this.ResolveExpression (ref exp);
+
+                               string [] bindTrg = exp.Split ('.');
+
+                               if (bindTrg.Length == 0)
+                                       throw new Exception ("invalid binding expression: " + expression);
+                               if (bindTrg.Length == 1)
+                                       bindingDef.TargetMember = bindTrg [0];
+                               else {
+                                       if (!string.IsNullOrEmpty(bindTrg[0]))//searchByName
+                                               bindingDef.TargetName = bindTrg[0];
+
+                                       bindingDef.TargetMember = exp.Substring (bindTrg[0].Length + 1);
+                               }
+                       }
+
+                       return bindingDef;
+               }
+
+               #region Object overrides
+               public override bool Equals (object obj)
+               {
+                       if (obj == null) 
+                               return false;
+                       
+                       NodeAddress na = (NodeAddress)obj;
+                       return this.SequenceEqual (na);
+               }
+               public override int GetHashCode ()
+               {
+                       unchecked {
+                               int hash = 19;
+                               foreach (Node n in this)
+                                       hash = hash * 31 + (n == null ? 0 : n.GetHashCode ());  
+                               return hash;
+                       }
+               }
+               public override string ToString ()
+               {
+                       string tmp = "";
+                       foreach (Node n in this)
+                               tmp += string.Format ("{0};", n.Index);                 
+                       return tmp;
+               }
+               #endregion
+       }
+
+       public class NamedNodeAddress : NodeAddress {
+               public string Name;
+               public NamedNodeAddress(string name, Node[] nodes) : base(nodes){
+                       Name = name;
+               }
+       }
+}
diff --git a/Crow/src/IML/NodeStack.cs b/Crow/src/IML/NodeStack.cs
new file mode 100644 (file)
index 0000000..80e9156
--- /dev/null
@@ -0,0 +1,50 @@
+//
+// NodeStack.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+namespace Crow.IML
+{
+       public class NodeStack : Stack<Node>
+       {
+               public NodeStack () : base()
+               {
+               }
+               public void IncrementCurrentNodeIndex(){
+                       Node n = this.Pop();
+                       this.Push (new Node (n.CrowType, n.Index + 1));
+               }
+               public void DecrementCurrentNodeIndex(){
+                       Node n = this.Pop();
+                       this.Push (new Node (n.CrowType, n.Index - 1));
+               }
+               public void ResetCurrentNodeIndex(){                    
+                       this.Push (new Node (this.Pop().CrowType));
+               }
+       }
+}
+
diff --git a/Crow/src/IMLAttributes.cs b/Crow/src/IMLAttributes.cs
new file mode 100644 (file)
index 0000000..929fd4f
--- /dev/null
@@ -0,0 +1,44 @@
+//
+// IMLAttributes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow
+{
+       public class DesignIgnore : Attribute
+       {               
+       }
+
+       public class DesignCategory : Attribute
+       {
+               public string Name { get; set; }
+
+               public DesignCategory (string name)
+               {
+                       Name = name;
+               }
+       }
+}
+
diff --git a/Crow/src/Input/ButtonState.cs b/Crow/src/Input/ButtonState.cs
new file mode 100644 (file)
index 0000000..17849ca
--- /dev/null
@@ -0,0 +1,45 @@
+ #region License
+ //
+ // The Open Toolkit Library License
+ //
+ // Copyright (c) 2006 - 2010 the Open Toolkit library.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
+ // of this software and associated documentation files (the "Software"), to deal
+ // in the Software without restriction, including without limitation the rights to
+ // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ // the Software, and to permit persons to whom the Software is furnished to do
+ // so, subject to the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included in all
+ // copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ // OTHER DEALINGS IN THE SOFTWARE.
+ //
+ #endregion
+
+namespace Crow
+{
+    /// <summary>
+    /// Enumerates possible mouse button states.
+    /// </summary>
+    public enum ButtonState
+    {
+       /// <summary>
+       /// Indicates that a mouse button is released.
+       /// </summary>
+       Released = 0,
+
+       /// <summary>
+       /// Indicates that a mouse button is pressed.
+       /// </summary>
+       Pressed = 1
+    }
+}
diff --git a/Crow/src/Input/Buttons.cs b/Crow/src/Input/Buttons.cs
new file mode 100644 (file)
index 0000000..ebf3bc4
--- /dev/null
@@ -0,0 +1,166 @@
+//
+// GamePadButton.cs
+//
+// Author:
+//       robert <${AuthorEmail}>
+//
+// Copyright (c) 2012 robert
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow
+{
+    /// <summary>
+    /// Enumerates available buttons for a <c>GamePad</c> device.
+    /// </summary>
+    [Flags]
+    public enum Buttons
+    {
+       /// <summary>
+       /// DPad up direction button
+       /// </summary>
+       DPadUp = 1 << 0,
+
+       /// <summary>
+       /// DPad down direction button
+       /// </summary>
+       DPadDown = 1 << 1,
+
+       /// <summary>
+       /// DPad left direction button
+       /// </summary>
+       DPadLeft = 1 << 2,
+
+       /// <summary>
+       /// DPad right direction button
+       /// </summary>
+       DPadRight = 1 << 3,
+
+       /// <summary>
+       /// Start button
+       /// </summary>
+       Start = 1 << 4,
+
+       /// <summary>
+       /// Back button
+       /// </summary>
+       Back = 1 << 5,
+
+       /// <summary>
+       /// Left stick button
+       /// </summary>
+       LeftStick = 1 << 6,
+
+       /// <summary>
+       /// Right stick button
+       /// </summary>
+       RightStick = 1 << 7,
+
+       /// <summary>
+       /// Left shoulder button
+       /// </summary>
+       LeftShoulder = 1 << 8,
+
+       /// <summary>
+       /// Right shoulder button
+       /// </summary>
+       RightShoulder = 1 << 9,
+
+       /// <summary>
+       /// Home button
+       /// </summary>
+       Home = 1 << 11,
+
+       /// <summary>
+       /// Home button
+       /// </summary>
+       BigButton = Home,
+
+       /// <summary>
+       /// A button
+       /// </summary>
+       A = 1 << 12,
+
+       /// <summary>
+       /// B button
+       /// </summary>
+       B = 1 << 13,
+
+       /// <summary>
+       /// X button
+       /// </summary>
+       X = 1 << 14,
+
+       /// <summary>
+       /// Y button
+       /// </summary>
+       Y = 1 << 15,
+
+       /// <summary>
+       /// Left thumbstick left direction button
+       /// </summary>
+       LeftThumbstickLeft = 1 << 21,
+
+       /// <summary>
+       /// Right trigger button
+       /// </summary>
+       RightTrigger = 1 << 22,
+
+       /// <summary>
+       /// Left trigger button
+       /// </summary>
+       LeftTrigger = 1 << 23,
+
+       /// <summary>
+       /// Right thumbstick up direction button
+       /// </summary>
+       RightThumbstickUp = 1 << 24,
+
+       /// <summary>
+       /// Right thumbstick down direction button
+       /// </summary>
+       RightThumbstickDown = 1 << 25,
+
+       /// <summary>
+       /// Right stick right direction button
+       /// </summary>
+       RightThumbstickRight = 1 << 26,
+
+       /// <summary>
+       /// Right stick left direction button
+       /// </summary>
+       RightThumbstickLeft = 1 << 27,
+
+       /// <summary>
+       /// Left stick up direction button
+       /// </summary>
+       LeftThumbstickUp = 1 << 28,
+
+       /// <summary>
+       /// Left stick down direction button
+       /// </summary>
+       LeftThumbstickDown = 1 << 29,
+
+       /// <summary>
+       /// Left stick right direction button
+       /// </summary>
+       LeftThumbstickRight = 1 << 30,
+    }
+}
diff --git a/Crow/src/Input/Key.cs b/Crow/src/Input/Key.cs
new file mode 100644 (file)
index 0000000..ae75313
--- /dev/null
@@ -0,0 +1,157 @@
+ #region License
+ //
+ // The Open Toolkit Library License
+ //
+ // Copyright (c) 2006 - 2009 the Open Toolkit library.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
+ // of this software and associated documentation files (the "Software"), to deal
+ // in the Software without restriction, including without limitation the rights to
+ // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ // the Software, and to permit persons to whom the Software is furnished to do
+ // so, subject to the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included in all
+ // copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ // OTHER DEALINGS IN THE SOFTWARE.
+ //
+ #endregion
+
+namespace Crow
+{
+    /// <summary>
+    /// The available keyboard keys.
+    /// </summary>
+    public enum Key : int
+    {
+               Unknown = -1,
+               Space = 32,
+               Apostrophe = 39,
+               Comma = 44,
+               Minus = 45,
+               Period = 46,
+               Slash = 47,
+               Num0 = 48,
+               Num1 = 49,
+               Num2 = 50,
+               Num3 = 51,
+               Num4 = 52,
+               Num5 = 53,
+               Num6 = 54,
+               Num7 = 55,
+               Num8 = 56,
+               Num9 = 57,
+               Semicolon = 59,
+               Equal = 61,
+               A = 65,
+               B = 66,
+               C = 67,
+               D = 68,
+               E = 69,
+               F = 70,
+               G = 71,
+               H = 72,
+               I = 73,
+               J = 74,
+               K = 75,
+               L = 76,
+               M = 77,
+               N = 78,
+               O = 79,
+               P = 80,
+               Q = 81,
+               R = 82,
+               S = 83,
+               T = 84,
+               U = 85,
+               V = 86,
+               W = 87,
+               X = 88,
+               Y = 89,
+               Z = 90,
+               LeftBracket = 91,
+               Backslash = 92,
+               RightBracket = 93,
+               GraveAccent = 96,
+               World1 = 161,
+               World2 = 162,
+               Escape = 256,
+               Enter = 257,
+               Tab = 258,
+               Backspace = 259,
+               Insert = 260,
+               Delete = 261,
+               Right = 262,
+               Left = 263,
+               Down = 264,
+               Up = 265,
+               PageUp = 266,
+               PageDown = 267,
+               Home = 268,
+               End = 269,
+               CapsLock = 280,
+               ScrollLock = 281,
+               NumLock = 282,
+               PrintScreen = 283,
+               Pause = 284,
+               F1 = 290,
+               F2 = 291,
+               F3 = 292,
+               F4 = 293,
+               F5 = 294,
+               F6 = 295,
+               F7 = 296,
+               F8 = 297,
+               F9 = 298,
+               F10 = 299,
+               F11 = 300,
+               F12 = 301,
+               F13 = 302,
+               F14 = 303,
+               F15 = 304,
+               F16 = 305,
+               F17 = 306,
+               F18 = 307,
+               F19 = 308,
+               F20 = 309,
+               F21 = 310,
+               F22 = 311,
+               F23 = 312,
+               F24 = 313,
+               F25 = 314,
+               Keypad0 = 320,
+               Keypad1 = 321,
+               Keypad2 = 322,
+               Keypad3 = 323,
+               Keypad4 = 324,
+               Keypad5 = 325,
+               Keypad6 = 326,
+               Keypad7 = 327,
+               Keypad8 = 328,
+               Keypad9 = 329,
+               KeypadDecimal = 330,
+               KeypadDivide = 331,
+               KeypadMultiply = 332,
+               KeypadSubtract = 333,
+               KeypadAdd = 334,
+               KeypadEnter = 335,
+               KeypadEqual = 336,
+               LeftShift = 340,
+               LeftControl = 341,
+               LeftAlt = 342,
+               LeftSuper = 343,
+               RightShift = 344,
+               RightControl = 345,
+               RightAlt = 346,
+               RightSuper = 347,
+               Menu = 348,
+       }
+}
\ No newline at end of file
diff --git a/Crow/src/Input/KeyEventArgs.cs b/Crow/src/Input/KeyEventArgs.cs
new file mode 100644 (file)
index 0000000..510e68a
--- /dev/null
@@ -0,0 +1,64 @@
+#region License
+//
+// The Open Toolkit Library License
+//
+// Copyright (c) 2006 - 2009 the Open Toolkit library.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights to
+// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// the Software, and to permit persons to whom the Software is furnished to do
+// so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Crow
+{
+    public class KeyEventArgs : EventArgs
+    {
+               int keyCode;
+               Key key;
+               bool repeat;    
+
+               public KeyEventArgs(Key _key, bool _repeat)
+               {
+                       key = _key;
+                       repeat = _repeat;
+               }
+               public KeyEventArgs(KeyEventArgs args)
+               {
+                   Key = args.Key;
+               }
+               public Key Key
+               {
+                   get { return key; }
+                   internal set { key = value; }
+               }
+               public uint ScanCode
+               {
+                   get { return (uint)Key; }
+               }
+               public bool IsRepeat
+               {
+                   get { return repeat; }
+                   internal set { repeat = value; }
+               }
+    }
+}
diff --git a/Crow/src/Input/KeyPressEventArgs.cs b/Crow/src/Input/KeyPressEventArgs.cs
new file mode 100644 (file)
index 0000000..7399061
--- /dev/null
@@ -0,0 +1,58 @@
+// #region License
+// //
+// // The Open Toolkit Library License
+// //
+// // Copyright (c) 2006 - 2009 the Open Toolkit library.
+// //
+// // Permission is hereby granted, free of charge, to any person obtaining a copy
+// // of this software and associated documentation files (the "Software"), to deal
+// // in the Software without restriction, including without limitation the rights to 
+// // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+// // the Software, and to permit persons to whom the Software is furnished to do
+// // so, subject to the following conditions:
+// //
+// // The above copyright notice and this permission notice shall be included in all
+// // copies or substantial portions of the Software.
+// //
+// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// // OTHER DEALINGS IN THE SOFTWARE.
+// //
+// #endregion
+
+using System;
+
+namespace Crow
+{
+    /// <summary>
+    /// Defines the event arguments for KeyPress events. Instances of this class are cached:
+    /// KeyPressEventArgs should only be used inside the relevant event, unless manually cloned.
+    /// </summary>
+    public class KeyPressEventArgs : EventArgs
+    {
+        char key_char;
+        
+        /// <summary>
+        /// Constructs a new instance.
+        /// </summary>
+        /// <param name="keyChar">The ASCII character that was typed.</param>
+        public KeyPressEventArgs(char keyChar)
+        {
+            KeyChar = keyChar;
+        }
+
+        /// <summary>
+        /// Gets a <see cref="System.Char"/> that defines the ASCII character that was typed.
+        /// </summary>
+        public char KeyChar
+        {
+            get { return key_char; }
+            internal set { key_char = value; }
+        }
+    }
+}
diff --git a/Crow/src/Input/MouseButton.cs b/Crow/src/Input/MouseButton.cs
new file mode 100644 (file)
index 0000000..92be477
--- /dev/null
@@ -0,0 +1,92 @@
+ #region License
+ //
+ // The Open Toolkit Library License
+ //
+ // Copyright (c) 2006 - 2009 the Open Toolkit library.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
+ // of this software and associated documentation files (the "Software"), to deal
+ // in the Software without restriction, including without limitation the rights to
+ // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ // the Software, and to permit persons to whom the Software is furnished to do
+ // so, subject to the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included in all
+ // copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ // OTHER DEALINGS IN THE SOFTWARE.
+ //
+ #endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Crow
+{
+    /// <summary>
+    /// Enumerates all possible mouse buttons.
+    /// </summary>
+    public enum MouseButton
+    {
+       /// <summary>
+       /// The left mouse button.
+       /// </summary>
+       Left = 0,
+       /// <summary>
+       /// The middle mouse button.
+       /// </summary>
+       Middle,
+       /// <summary>
+       /// The right mouse button.
+       /// </summary>
+       Right,
+       /// <summary>
+       /// The first extra mouse button.
+       /// </summary>
+       Button1,
+       /// <summary>
+       /// The second extra mouse button.
+       /// </summary>
+       Button2,
+       /// <summary>
+       /// The third extra mouse button.
+       /// </summary>
+       Button3,
+       /// <summary>
+       /// The fourth extra mouse button.
+       /// </summary>
+       Button4,
+       /// <summary>
+       /// The fifth extra mouse button.
+       /// </summary>
+       Button5,
+       /// <summary>
+       /// The sixth extra mouse button.
+       /// </summary>
+       Button6,
+       /// <summary>
+       /// The seventh extra mouse button.
+       /// </summary>
+       Button7,
+       /// <summary>
+       /// The eigth extra mouse button.
+       /// </summary>
+       Button8,
+       /// <summary>
+       /// The ninth extra mouse button.
+       /// </summary>
+       Button9,
+       /// <summary>
+       /// Indicates the last available mouse button.
+       /// </summary>
+       LastButton
+    }
+}
diff --git a/Crow/src/Input/MouseEventArgs.cs b/Crow/src/Input/MouseEventArgs.cs
new file mode 100644 (file)
index 0000000..6874109
--- /dev/null
@@ -0,0 +1,372 @@
+#region License
+//
+// MouseEventArgs.cs
+//
+// Author:
+//       Stefanos A. <stapostol@gmail.com>
+//
+// Copyright (c) 2006-2014 Stefanos Apostolopoulos
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#endregion
+
+using System;
+
+namespace Crow
+{
+    /// <summary>
+    /// Defines the event data for <see cref="MouseDevice"/> events.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Do not cache instances of this type outside their event handler.
+    /// If necessary, you can clone an instance using the
+    /// <see cref="MouseEventArgs(MouseEventArgs)"/> constructor.
+    /// </para>
+    /// </remarks>
+    public class MouseEventArgs : EventArgs
+    {
+       #region Fields
+
+       MouseState state;
+
+       #endregion
+
+       #region Constructors
+
+       /// <summary>
+       /// Constructs a new instance.
+       /// </summary>
+       public MouseEventArgs()
+       {
+           state.SetIsConnected(true);
+       }
+
+       /// <summary>
+       /// Constructs a new instance.
+       /// </summary>
+       /// <param name="x">The X position.</param>
+       /// <param name="y">The Y position.</param>
+       public MouseEventArgs(int x, int y)
+           : this()
+       {
+           state.X = x;
+           state.Y = y;
+       }
+
+       /// <summary>
+       /// Constructs a new instance.
+       /// </summary>
+       /// <param name="args">The <see cref="MouseEventArgs"/> instance to clone.</param>
+       public MouseEventArgs(MouseEventArgs args)
+           : this(args.X, args.Y)
+       {
+       }
+
+       #endregion
+
+       #region Protected Members
+
+       internal void SetButton(MouseButton button, ButtonState state)
+       {
+           if (button < 0 || button > MouseButton.LastButton)
+               throw new ArgumentOutOfRangeException();
+
+           switch (state)
+           {
+               case ButtonState.Pressed:
+                   this.state.EnableBit((int)button);
+                   break;
+
+               case ButtonState.Released:
+                   this.state.DisableBit((int)button);
+                   break;
+           }
+       }
+
+       internal ButtonState GetButton(MouseButton button)
+       {
+           if (button < 0 || button > MouseButton.LastButton)
+               throw new ArgumentOutOfRangeException();
+
+           return
+               state.ReadBit((int)button) ?
+               ButtonState.Pressed : ButtonState.Released;
+       }
+
+       #endregion
+
+       #region Public Members
+
+       /// <summary>
+       /// Gets the X position of the mouse for the event.
+       /// </summary>
+       public int X { get { return state.X; } internal set { state.X = value; } }
+
+       /// <summary>
+       /// Gets the Y position of the mouse for the event.
+       /// </summary>
+       public int Y { get { return state.Y; } internal set { state.Y = value; } }
+
+       /// <summary>
+       /// Gets a <see cref="System.Drawing.Point"/> representing the location of the mouse for the event.
+       /// </summary>
+       public Point Position
+       {
+           get { return new Point(state.X, state.Y); }
+           set
+           {
+               X = value.X;
+               Y = value.Y;
+           }
+       }
+
+       /// <summary>
+       /// Gets the current <see cref="OpenTK.Input.MouseState"/>.
+       /// </summary>
+       public MouseState Mouse
+       {
+           get { return state; }
+           set { state = value; }
+       }
+
+       #endregion
+    }
+
+    /// <summary>
+    /// Defines the event data for <see cref="MouseDevice.Move"/> events.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Do not cache instances of this type outside their event handler.
+    /// If necessary, you can clone an instance using the
+    /// <see cref="MouseMoveEventArgs(MouseMoveEventArgs)"/> constructor.
+    /// </para>
+    /// </remarks>
+    public class MouseMoveEventArgs : MouseEventArgs
+    {
+       #region Fields
+
+       int x_delta, y_delta;
+
+       #endregion
+
+       #region Constructors
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseMoveEventArgs"/> instance.
+       /// </summary>
+       public MouseMoveEventArgs() { }
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseMoveEventArgs"/> instance.
+       /// </summary>
+       /// <param name="x">The X position.</param>
+       /// <param name="y">The Y position.</param>
+       /// <param name="xDelta">The change in X position produced by this event.</param>
+       /// <param name="yDelta">The change in Y position produced by this event.</param>
+       public MouseMoveEventArgs(int x, int y, int xDelta, int yDelta)
+           : base(x, y)
+       {
+           XDelta = xDelta;
+           YDelta = yDelta;
+       }
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseMoveEventArgs"/> instance.
+       /// </summary>
+       /// <param name="args">The <see cref="MouseMoveEventArgs"/> instance to clone.</param>
+       public MouseMoveEventArgs(MouseMoveEventArgs args)
+           : this(args.X, args.Y, args.XDelta, args.YDelta)
+       {
+       }
+
+       #endregion
+
+       #region Public Members
+
+       /// <summary>
+       /// Gets the change in X position produced by this event.
+       /// </summary>
+       public int XDelta { get { return x_delta; } internal set { x_delta = value; } }
+
+       /// <summary>
+       /// Gets the change in Y position produced by this event.
+       /// </summary>
+       public int YDelta { get { return y_delta; } internal set { y_delta = value; } }
+
+       #endregion
+    }
+
+    /// <summary>
+    /// Defines the event data for <see cref="MouseDevice.ButtonDown"/> and <see cref="MouseDevice.ButtonUp"/> events.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Do not cache instances of this type outside their event handler.
+    /// If necessary, you can clone an instance using the
+    /// <see cref="MouseButtonEventArgs(MouseButtonEventArgs)"/> constructor.
+    /// </para>
+    /// </remarks>
+    public class MouseButtonEventArgs : MouseEventArgs
+    {
+       #region Fields
+
+       MouseButton button;
+
+       #endregion
+
+       #region Constructors
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseButtonEventArgs"/> instance.
+       /// </summary>
+       public MouseButtonEventArgs() { }
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseButtonEventArgs"/> instance.
+       /// </summary>
+       /// <param name="x">The X position.</param>
+       /// <param name="y">The Y position.</param>
+       /// <param name="button">The mouse button for the event.</param>
+       /// <param name="pressed">The current state of the button.</param>
+       public MouseButtonEventArgs(int x, int y, MouseButton button, bool pressed)
+           : base(x, y)
+       {
+           this.button = button;
+           this.IsPressed = pressed;
+       }
+
+       public MouseButtonEventArgs(MouseButton button)
+               : base()
+       {
+               this.button = button;
+       }
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseButtonEventArgs"/> instance.
+       /// </summary>
+       /// <param name="args">The <see cref="MouseButtonEventArgs"/> instance to clone.</param>
+       public MouseButtonEventArgs(MouseButtonEventArgs args)
+           : this(args.X, args.Y, args.Button, args.IsPressed)
+       {
+       }
+
+       #endregion
+
+       #region Public Members
+
+       /// <summary>
+       /// Gets the <see cref="MouseButton"/> that triggered this event.
+       /// </summary>
+       public MouseButton Button { get { return button; } internal set { button = value; } }
+
+       /// <summary>
+       /// Gets a System.Boolean representing the state of the mouse button for the event.
+       /// </summary>
+       public bool IsPressed
+       {
+           get { return GetButton(Button) == ButtonState.Pressed; }
+           internal set { SetButton(Button, value ? ButtonState.Pressed : ButtonState.Released); }
+       }
+
+       #endregion
+    }
+
+    /// <summary>
+    /// Defines the event data for <see cref="MouseDevice.WheelChanged"/> events.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    /// Do not cache instances of this type outside their event handler.
+    /// If necessary, you can clone an instance using the
+    /// <see cref="MouseWheelEventArgs(MouseWheelEventArgs)"/> constructor.
+    /// </para>
+    /// </remarks>
+    public class MouseWheelEventArgs : MouseEventArgs
+    {
+       #region Fields
+
+       float delta;
+
+       #endregion
+
+       #region Constructors
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseWheelEventArgs"/> instance.
+       /// </summary>
+       public MouseWheelEventArgs() { }
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseWheelEventArgs"/> instance.
+       /// </summary>
+       /// <param name="x">The X position.</param>
+       /// <param name="y">The Y position.</param>
+       /// <param name="value">The value of the wheel.</param>
+       /// <param name="delta">The change in value of the wheel for this event.</param>
+       public MouseWheelEventArgs(int x, int y, int value, int delta)
+           : base(x, y)
+       {
+           Mouse.SetScrollAbsolute(Mouse.Scroll.X, value);
+           this.delta = delta;
+       }
+
+       /// <summary>
+       /// Constructs a new <see cref="MouseWheelEventArgs"/> instance.
+       /// </summary>
+       /// <param name="args">The <see cref="MouseWheelEventArgs"/> instance to clone.</param>
+       public MouseWheelEventArgs(MouseWheelEventArgs args)
+           : this(args.X, args.Y, args.Value, args.Delta)
+       {
+       }
+
+       #endregion
+
+       #region Public Members
+
+       /// <summary>
+       /// Gets the value of the wheel in integer units.
+       /// To support high-precision mice, it is recommended to use <see cref="ValuePrecise"/> instead.
+       /// </summary>
+       public int Value { get { return (int)Math.Round(Mouse.Scroll.Y, MidpointRounding.AwayFromZero); } }
+
+       /// <summary>
+       /// Gets the change in value of the wheel for this event in integer units.
+       /// To support high-precision mice, it is recommended to use <see cref="DeltaPrecise"/> instead.
+       /// </summary>
+       public int Delta { get { return (int)Math.Round(delta, MidpointRounding.AwayFromZero); } }
+
+       /// <summary>
+       /// Gets the precise value of the wheel in floating-point units.
+       /// </summary>
+       public float ValuePrecise
+       {
+           get { return Mouse.Scroll.Y; }
+       }
+
+       /// <summary>
+       /// Gets the precise change in value of the wheel for this event in floating-point units.
+       /// </summary>
+       public float DeltaPrecise { get { return delta; } internal set { delta = value; } }
+
+       #endregion
+    }
+}
diff --git a/Crow/src/Input/MouseScroll.cs b/Crow/src/Input/MouseScroll.cs
new file mode 100644 (file)
index 0000000..a04e9d6
--- /dev/null
@@ -0,0 +1,118 @@
+#region License
+//
+// MouseWheel.cs
+//
+// Author:
+//       Stefanos A. <stapostol@gmail.com>
+//
+// Copyright (c) 2006-2014 Stefanos Apostolopoulos
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+#endregion
+
+using System;
+
+namespace Crow
+{
+    /// <summary>
+    /// Represents the state of a mouse wheel.
+    /// </summary>
+    public struct MouseScroll : IEquatable<MouseScroll>
+    {
+       #region Public Members
+
+       /// <summary>
+       /// Gets the absolute horizontal offset of the wheel,
+       /// or 0 if no horizontal scroll wheel exists.
+       /// </summary>
+       /// <value>The x.</value>
+       public float X { get; internal set; }
+
+       /// <summary>
+       /// Gets the absolute vertical offset of the wheel,
+       /// or 0 if no vertical scroll wheel exists.
+       /// </summary>
+       /// <value>The y.</value>
+       public float Y { get; internal set; }
+
+       /// <param name="left">A <see cref="MouseScroll"/> instance to test for equality.</param>
+       /// <param name="right">A <see cref="MouseScroll"/> instance to test for equality.</param>
+       public static bool operator ==(MouseScroll left, MouseScroll right)
+       {
+           return left.Equals(right);
+       }
+
+       /// <param name="left">A <see cref="MouseScroll"/> instance to test for inequality.</param>
+       /// <param name="right">A <see cref="MouseScroll"/> instance to test for inequality.</param>
+       public static bool operator !=(MouseScroll left, MouseScroll right)
+       {
+           return !left.Equals(right);
+       }
+
+       /// <summary>
+       /// Returns a <see cref="System.String"/> that represents the current <see cref="OpenTK.Input.MouseScroll"/>.
+       /// </summary>
+       /// <returns>A <see cref="System.String"/> that represents the current <see cref="OpenTK.Input.MouseScroll"/>.</returns>
+       public override string ToString()
+       {
+           return string.Format("[X={0:0.00}, Y={1:0.00}]", X, Y);
+       }
+
+       /// <summary>
+       /// Serves as a hash function for a <see cref="OpenTK.Input.MouseScroll"/> object.
+       /// </summary>
+       /// <returns>A hash code for this instance that is suitable for use in hashing algorithms and data structures such as a
+       /// hash table.</returns>
+       public override int GetHashCode()
+       {
+           return X.GetHashCode() ^ Y.GetHashCode();
+       }
+
+       /// <summary>
+       /// Determines whether the specified <see cref="System.Object"/> is equal to the current <see cref="OpenTK.Input.MouseScroll"/>.
+       /// </summary>
+       /// <param name="obj">The <see cref="System.Object"/> to compare with the current <see cref="OpenTK.Input.MouseScroll"/>.</param>
+       /// <returns><c>true</c> if the specified <see cref="System.Object"/> is equal to the current
+       /// <see cref="OpenTK.Input.MouseScroll"/>; otherwise, <c>false</c>.</returns>
+       public override bool Equals(object obj)
+       {
+           return
+               obj is MouseScroll &&
+               Equals((MouseScroll)obj);
+       }
+
+       #endregion
+
+       #region IEquatable Members
+
+       /// <summary>
+       /// Determines whether the specified <see cref="OpenTK.Input.MouseScroll"/> is equal to the current <see cref="OpenTK.Input.MouseScroll"/>.
+       /// </summary>
+       /// <param name="other">The <see cref="OpenTK.Input.MouseScroll"/> to compare with the current <see cref="OpenTK.Input.MouseScroll"/>.</param>
+       /// <returns><c>true</c> if the specified <see cref="OpenTK.Input.MouseScroll"/> is equal to the current
+       /// <see cref="OpenTK.Input.MouseScroll"/>; otherwise, <c>false</c>.</returns>
+       public bool Equals(MouseScroll other)
+       {
+           return X == other.X && Y == other.Y;
+       }
+
+       #endregion
+    }
+}
diff --git a/Crow/src/Input/MouseState.cs b/Crow/src/Input/MouseState.cs
new file mode 100644 (file)
index 0000000..f6db21e
--- /dev/null
@@ -0,0 +1,362 @@
+ #region License
+ //
+ // The Open Toolkit Library License
+ //
+ // Copyright (c) 2006 - 2009 the Open Toolkit library.
+ //
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
+ // of this software and associated documentation files (the "Software"), to deal
+ // in the Software without restriction, including without limitation the rights to
+ // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ // the Software, and to permit persons to whom the Software is furnished to do
+ // so, subject to the following conditions:
+ //
+ // The above copyright notice and this permission notice shall be included in all
+ // copies or substantial portions of the Software.
+ //
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ // OTHER DEALINGS IN THE SOFTWARE.
+ //
+ #endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Crow
+{
+    /// <summary>
+    /// Encapsulates the state of a mouse device.
+    /// </summary>
+    public struct MouseState : IEquatable<MouseState>
+    {
+       #region Fields
+
+       public const int MaxButtons = 16; // we are storing in an ushort
+       Point position;
+       MouseScroll scroll;
+       ushort buttons;
+       bool is_connected;
+
+       #endregion
+
+
+
+       #region Public Members
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether the specified
+       /// <see cref="OpenTK.Input.MouseButton"/> is pressed.
+       /// </summary>
+       /// <param name="button">The <see cref="OpenTK.Input.MouseButton"/> to check.</param>
+       /// <returns>True if key is pressed; false otherwise.</returns>
+       public bool this[MouseButton button]
+       {
+           get { return IsButtonDown(button); }
+           internal set
+           {
+               if (value)
+                   EnableBit((int)button);
+               else
+                   DisableBit((int)button);
+           }
+       }
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether this button is down.
+       /// </summary>
+       /// <param name="button">The <see cref="OpenTK.Input.MouseButton"/> to check.</param>
+       public bool IsButtonDown(MouseButton button)
+       {
+           return ReadBit((int)button);
+       }
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether this button is up.
+       /// </summary>
+       /// <param name="button">The <see cref="OpenTK.Input.MouseButton"/> to check.</param>
+       public bool IsButtonUp(MouseButton button)
+       {
+           return !ReadBit((int)button);
+       }
+
+       /// <summary>
+       /// Gets the absolute wheel position in integer units.
+       /// To support high-precision mice, it is recommended to use <see cref="WheelPrecise"/> instead.
+       /// </summary>
+       public int Wheel
+       {
+           get { return (int)Math.Round(scroll.Y, MidpointRounding.AwayFromZero); }
+       }
+
+       /// <summary>
+       /// Gets the absolute wheel position in floating-point units.
+       /// </summary>
+       public float WheelPrecise
+       {
+           get { return scroll.Y; }
+       }
+
+       /// <summary>
+       /// Gets a <see cref="OpenTK.Input.MouseScroll"/> instance,
+       /// representing the current state of the mouse scroll wheel.
+       /// </summary>
+       public MouseScroll Scroll
+       {
+           get { return scroll; }
+       }
+
+       /// <summary>
+       /// Gets an integer representing the absolute x position of the pointer, in window pixel coordinates.
+       /// </summary>
+       public int X
+       {
+               get { return position.X; }
+           set { position.X = value; }
+       }
+
+       /// <summary>
+       /// Gets an integer representing the absolute y position of the pointer, in window pixel coordinates.
+       /// </summary>
+       public int Y
+       {
+               get { return position.Y; }
+           set { position.Y = value; }
+       }
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether the left mouse button is pressed.
+       /// This property is intended for XNA compatibility.
+       /// </summary>
+       public ButtonState LeftButton
+       {
+           get { return IsButtonDown(MouseButton.Left) ? ButtonState.Pressed : ButtonState.Released; }
+       }
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether the middle mouse button is pressed.
+       /// This property is intended for XNA compatibility.
+       /// </summary>
+       public ButtonState MiddleButton
+       {
+           get { return IsButtonDown(MouseButton.Middle) ? ButtonState.Pressed : ButtonState.Released; }
+       }
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether the right mouse button is pressed.
+       /// This property is intended for XNA compatibility.
+       /// </summary>
+       public ButtonState RightButton
+       {
+           get { return IsButtonDown(MouseButton.Right) ? ButtonState.Pressed : ButtonState.Released; }
+       }
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether the first extra mouse button is pressed.
+       /// This property is intended for XNA compatibility.
+       /// </summary>
+       public ButtonState XButton1
+       {
+           get { return IsButtonDown(MouseButton.Button1) ? ButtonState.Pressed : ButtonState.Released; }
+       }
+
+       /// <summary>
+       /// Gets a <see cref="System.Boolean"/> indicating whether the second extra mouse button is pressed.
+       /// This property is intended for XNA compatibility.
+       /// </summary>
+       public ButtonState XButton2
+       {
+           get { return IsButtonDown(MouseButton.Button2) ? ButtonState.Pressed : ButtonState.Released; }
+       }
+
+       /// <summary>
+       /// Gets the absolute wheel position in integer units. This property is intended for XNA compatibility.
+       /// To support high-precision mice, it is recommended to use <see cref="WheelPrecise"/> instead.
+       /// </summary>
+       public int ScrollWheelValue
+       {
+           get { return Wheel; }
+       }
+
+       /// <summary>
+       /// Gets a value indicating whether this instance is connected.
+       /// </summary>
+       /// <value><c>true</c> if this instance is connected; otherwise, <c>false</c>.</value>
+       public bool IsConnected
+       {
+           get { return is_connected; }
+           internal set { is_connected = value; }
+       }
+
+       /// <summary>
+       /// Checks whether two <see cref="MouseState" /> instances are equal.
+       /// </summary>
+       /// <param name="left">
+       /// A <see cref="MouseState"/> instance.
+       /// </param>
+       /// <param name="right">
+       /// A <see cref="MouseState"/> instance.
+       /// </param>
+       /// <returns>
+       /// True if both left is equal to right; false otherwise.
+       /// </returns>
+       public static bool operator ==(MouseState left, MouseState right)
+       {
+           return left.Equals(right);
+       }
+
+       /// <summary>
+       /// Checks whether two <see cref="MouseState" /> instances are not equal.
+       /// </summary>
+       /// <param name="left">
+       /// A <see cref="MouseState"/> instance.
+       /// </param>
+       /// <param name="right">
+       /// A <see cref="MouseState"/> instance.
+       /// </param>
+       /// <returns>
+       /// True if both left is not equal to right; false otherwise.
+       /// </returns>
+       public static bool operator !=(MouseState left, MouseState right)
+       {
+           return !left.Equals(right);
+       }
+
+       /// <summary>
+       /// Compares to an object instance for equality.
+       /// </summary>
+       /// <param name="obj">
+       /// The <see cref="System.Object"/> to compare to.
+       /// </param>
+       /// <returns>
+       /// True if this instance is equal to obj; false otherwise.
+       /// </returns>
+       public override bool Equals(object obj)
+       {
+           if (obj is MouseState)
+           {
+               return this == (MouseState)obj;
+           }
+           else
+           {
+               return false;
+           }
+       }
+
+       /// <summary>
+       /// Generates a hashcode for the current instance.
+       /// </summary>
+       /// <returns>
+       /// A <see cref="System.Int32"/> represting the hashcode for this instance.
+       /// </returns>
+       public override int GetHashCode()
+       {
+           return buttons.GetHashCode() ^ X.GetHashCode() ^ Y.GetHashCode() ^ scroll.GetHashCode();
+       }
+
+       /// <summary>
+       /// Returns a <see cref="System.String"/> that represents the current <see cref="OpenTK.Input.MouseState"/>.
+       /// </summary>
+       /// <returns>A <see cref="System.String"/> that represents the current <see cref="OpenTK.Input.MouseState"/>.</returns>
+       public override string ToString()
+       {
+           string b = Convert.ToString(buttons, 2).PadLeft(10, '0');
+           return String.Format("[X={0}, Y={1}, Scroll={2}, Buttons={3}, IsConnected={4}]",
+               X, Y, Scroll, b, IsConnected);
+       }
+
+       #endregion
+
+       #region Internal Members
+
+       internal Point Position
+       {
+           get { return position; }
+           set { position = value; }
+       }
+
+       internal bool ReadBit(int offset)
+       {
+           ValidateOffset(offset);
+           return (buttons & (1 << offset)) != 0;
+       }
+
+       public void EnableBit(int offset)
+       {
+           ValidateOffset(offset);
+           buttons |= unchecked((ushort)(1 << offset));
+       }
+
+       public void DisableBit(int offset)
+       {
+           ValidateOffset(offset);
+           buttons &= unchecked((ushort)(~(1 << offset)));
+       }
+
+       internal void MergeBits(MouseState other)
+       {
+           buttons |= other.buttons;
+           SetScrollRelative(other.scroll.X, other.scroll.Y);
+           X += other.X;
+           Y += other.Y;
+           IsConnected |= other.IsConnected;
+       }
+
+       internal void SetIsConnected(bool value)
+       {
+           IsConnected = value;
+       }
+
+       #region Internal Members
+
+       internal void SetScrollAbsolute(float x, float y)
+       {
+           scroll.X = x;
+           scroll.Y = y;
+       }
+
+       internal void SetScrollRelative(float x, float y)
+       {
+           scroll.X += x;
+           scroll.Y += y;
+       }
+
+       #endregion
+
+       #endregion
+
+       #region Private Members
+
+       static void ValidateOffset(int offset)
+       {
+           if (offset < 0 || offset >= 16)
+               throw new ArgumentOutOfRangeException("offset");
+       }
+
+       #endregion
+
+       #region IEquatable<MouseState> Members
+
+       /// <summary>
+       /// Compares two MouseState instances.
+       /// </summary>
+       /// <param name="other">The instance to compare two.</param>
+       /// <returns>True, if both instances are equal; false otherwise.</returns>
+       public bool Equals(MouseState other)
+       {
+           return
+               buttons == other.buttons &&
+               X == other.X &&
+               Y == other.Y &&
+               Scroll == other.Scroll;
+       }
+
+       #endregion
+    }
+}
diff --git a/Crow/src/Instantiator.cs b/Crow/src/Instantiator.cs
new file mode 100644 (file)
index 0000000..d86c013
--- /dev/null
@@ -0,0 +1,1391 @@
+//
+// Instantiator.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Text;
+using System.Diagnostics;
+using System.Xml;
+using System.Reflection.Emit;
+using System.Reflection;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Crow.IML
+{
+       public class InstantiatorException : Exception {
+               public string Path;
+               public InstantiatorException (string path, Exception innerException)
+                       : base ("ITor error:" + path, innerException){
+                       Path = path;
+               }
+       }
+       public delegate object InstanciatorInvoker(Interface iface);
+
+       /// <summary>
+       /// Reflexion being very slow, the settings of the starting values for widgets are set by a dynamic method.
+       /// This method is created on the first instacing and is recalled for further widget instancing.
+       /// 
+       /// It includes:
+       ///     - XML values setting
+       ///     - Default values (appearing as attribute in C#)  loading
+       ///     - Styling
+       /// 
+       /// Instantiators are shared amongs interfaces. Their are stored with their path as key, and inlined template
+       /// and itemtemplate are stored with a generated uuid
+       /// </summary>
+       public class Instantiator
+       {
+               #region Dynamic Method ID generation
+               static long curId = 0;
+               internal static long NewId {
+                       get { return curId++; }
+               }
+               #endregion
+
+               internal static Dictionary<string, Type> knownGOTypes = new Dictionary<string, Type> ();
+
+               public Type RootType;
+               InstanciatorInvoker loader;
+               protected Interface iface;
+
+               internal string sourcePath;
+
+               #if DESIGN_MODE
+               public static int NextInstantiatorID = 0;
+               public int currentInstantiatorID = 0;
+               int currentDesignID = 0;
+               internal string NextDesignID { get { return string.Format ("{0}_{1}",currentInstantiatorID, currentDesignID++); }}
+               #endif
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of the Instantiator class.
+               /// </summary>
+               public Instantiator (Interface _iface, string path) : this (_iface, _iface.GetStreamFromPath(path), path) {
+                       
+               }
+               /// <summary>
+               /// Initializes a new instance of the Instantiator class.
+               /// </summary>
+               public Instantiator (Interface _iface, Stream stream, string srcPath = null)
+               {
+                       #if DESIGN_MODE
+                       currentInstantiatorID = NextInstantiatorID++;
+                       #endif
+                       iface = _iface;
+                       sourcePath = srcPath;
+                       #if DEBUG_LOAD
+                       Stopwatch loadingTime = Stopwatch.StartNew ();
+                       #endif
+                       try {
+                               using (XmlReader itr = XmlReader.Create (stream)) {
+                                       parseIML (itr);
+                               }
+                       } catch (Exception ex) {
+                               throw new InstantiatorException(sourcePath, ex);
+                       } finally {
+                               stream?.Dispose ();
+#if DEBUG_LOAD
+                               loadingTime.Stop ();
+                               using (StreamWriter sw = new StreamWriter ("loading.log", true)) {
+                                       sw.WriteLine ($"ITOR;{sourcePath,-50};{loadingTime.ElapsedTicks,8};{loadingTime.ElapsedMilliseconds,8}");
+                               }
+#endif
+                       }
+               }
+               /// <summary>
+               /// Initializes a new instance of the Instantiator class with an already openned xml reader
+               /// positionned on the start tag inside the itemTemplate
+               /// </summary>
+               public Instantiator (Interface _iface, XmlReader itr){
+                       #if DESIGN_MODE
+                       currentInstantiatorID = NextInstantiatorID++;
+                       #endif
+                       iface = _iface;
+                       parseIML (itr);
+               }
+               //TODO:check if still used
+               public Instantiator (Interface _iface, Type _root, InstanciatorInvoker _loader)
+               {
+                       #if DESIGN_MODE
+                       currentInstantiatorID = NextInstantiatorID++;
+                       #endif
+                       iface = _iface;
+                       RootType = _root;
+                       loader = _loader;
+               }
+               /// <summary>
+               /// Create a new instantiator from IML fragment provided directely as a string
+               /// </summary>
+               /// <returns>A new instantiator</returns>
+               /// <param name="fragment">IML string</param>
+               public static Instantiator CreateFromImlFragment (Interface _iface, string fragment)
+               {
+                       using (Stream s = new MemoryStream (Encoding.UTF8.GetBytes (fragment))) {
+                               return new Instantiator (_iface, s);
+                       }
+               }
+               #endregion
+
+               /// <summary>
+               /// Creates a new instance of the GraphicObject compiled in the instantiator
+               /// </summary>
+               /// <returns>The new graphic object instance</returns>
+               public Widget CreateInstance(){
+#if DEBUG_LOAD
+                       Stopwatch loadingTime = Stopwatch.StartNew ();
+                       GraphicObject o = loader (iface) as GraphicObject;
+                       loadingTime.Stop ();
+                       using (StreamWriter sw = new StreamWriter ("loading.log", true)) {
+                               sw.WriteLine ($"NEW ;{sourcePath,-50};{loadingTime.ElapsedTicks,8};{loadingTime.ElapsedMilliseconds,8}");
+                       }
+                       return o;
+#else
+                       return loader (iface) as Widget;
+#endif
+               }
+               /// <summary>
+               /// Creates a new instance of T compiled in the instantiator
+               /// and bind it the an interface
+               /// </summary>
+               /// <returns>The new T instance</returns>
+               public T CreateInstance<T>(){
+#if DEBUG_LOAD
+                       Stopwatch loadingTime = Stopwatch.StartNew ();
+                       T i = (T)loader (iface);
+                       loadingTime.Stop ();
+                       using (StreamWriter sw = new StreamWriter ("loading.log", true)) {
+                               sw.WriteLine ($"NEW ;{sourcePath,-50};{loadingTime.ElapsedTicks,8};{loadingTime.ElapsedMilliseconds,8}");
+                       }
+                       return i;
+#else
+                       return (T)loader (iface);
+#endif
+               }
+               List<DynamicMethod> dsValueChangedDynMeths = new List<DynamicMethod>();
+               List<Delegate> cachedDelegates = new List<Delegate>();
+               /// <summary>
+               /// store indices of template delegate to be handled by root parentChanged event
+               /// </summary>
+               List<int> templateCachedDelegateIndices = new List<int>();
+               /// <summary>
+               /// Store template bindings in the instantiator
+               /// </summary>
+               Delegate templateBinding;
+
+               #region IML parsing
+               /// <summary>
+               /// Parses IML and build a dynamic method that will be used to instantiate one or multiple occurences of the IML file or fragment
+               /// </summary>
+               void parseIML (XmlReader reader) {
+                       IMLContext ctx = new IMLContext (findRootType (reader));
+
+                       ctx.PushNode (ctx.RootType);
+                       emitLoader (reader, ctx);
+                       ctx.PopNode ();
+
+                       foreach (int idx in templateCachedDelegateIndices)
+                               ctx.emitCachedDelegateHandlerAddition(idx, CompilerServices.eiLogicalParentChanged);
+
+                       ctx.ResolveNamedTargets ();
+
+                       emitBindingDelegates (ctx);
+
+            ctx.il.Emit (OpCodes.Ldloc_0);//load root obj to return
+                       ctx.il.Emit(OpCodes.Ret);
+
+                       reader.Read ();//close tag
+                       RootType = ctx.RootType;
+                       loader = (InstanciatorInvoker)ctx.dm.CreateDelegate (typeof (InstanciatorInvoker), this);
+               }
+               /// <summary>
+               /// read first node to set GraphicObject class for loading
+               /// and let reader position on that node
+               /// </summary>
+               Type findRootType (XmlReader reader)
+               {
+                       string root = "Object";
+                       while (reader.NodeType != XmlNodeType.Element)
+                               reader.Read ();
+                       root = reader.Name;
+                       Type t = tryGetGOType (root);
+                       if (t == null)
+                               throw new Exception ("IML parsing error: undefined root type (" + root + ")");
+                       return t;
+               }
+               /// <summary>
+               /// main parsing entry point
+               /// </summary>
+               void emitLoader (XmlReader reader, IMLContext ctx)
+               {
+                       int curLine = ctx.curLine;
+
+                       #if DESIGN_MODE
+                       IXmlLineInfo li = (IXmlLineInfo)reader;
+                       ctx.curLine += li.LineNumber - 1;
+                       #endif
+
+                       string tmpXml = reader.ReadOuterXml ();
+
+                       if (ctx.nodesStack.Peek().HasTemplate)
+                               emitTemplateLoad (ctx, tmpXml);
+
+                       emitGOLoad (ctx, tmpXml);
+
+                       ctx.curLine = curLine;
+                       //emitCheckAndBindValueChanged (ctx);
+               }
+               /// <summary>
+               /// Parses the item template tag.
+               /// </summary>
+               /// <returns>the string triplet dataType, itemTmpID read as attribute of this tag</returns>
+               /// <param name="reader">current xml text reader</param>
+               /// <param name="itemTemplatePath">file containing the templates if its a dedicated one</param>
+               string[] parseItemTemplateTag (IMLContext ctx, XmlReader reader, string itemTemplatePath = "") {
+                       string dataType = "default", datas = "", path = "", dataTest = "TypeOf";
+                       while (reader.MoveToNextAttribute ()) {
+                               if (reader.Name == "DataType")
+                                       dataType = reader.Value;
+                               else if (reader.Name == "Data")
+                                       datas = reader.Value;
+                               else if (reader.Name == "Path")
+                                       path = reader.Value;
+                               else if (reader.Name == "DataTest")
+                                       dataTest = reader.Value;
+                       }
+                       reader.MoveToElement ();
+
+                       string itemTmpID = itemTemplatePath;
+
+                       if (string.IsNullOrEmpty (path)) {
+                               itemTmpID += Guid.NewGuid ().ToString ();
+                               iface.ItemTemplates [itemTmpID] =
+                                       new ItemTemplate (iface, new MemoryStream (Encoding.UTF8.GetBytes (reader.ReadInnerXml ())), dataTest, dataType, datas);
+
+                       } else {
+                               if (!reader.IsEmptyElement)
+                                       throw new Exception ("ItemTemplate with Path attribute set may not include sub nodes");
+                               itemTmpID += path+dataType+datas;
+                               if (!iface.ItemTemplates.ContainsKey (itemTmpID))
+                                       iface.ItemTemplates [itemTmpID] =
+                                               new ItemTemplate (iface, path, ctx.CurrentNodeType, dataTest, dataType, datas);
+                       }
+                       return new string [] { dataType, itemTmpID, datas, dataTest };
+               }
+               /// <summary>
+               /// process template and item template definition prior to
+               /// other attributes or childs processing
+               /// </summary>
+               /// <param name="ctx">Loading Context</param>
+               /// <param name="tmpXml">xml fragment</param>
+               void emitTemplateLoad (IMLContext ctx, string tmpXml) {
+                       //if its a template, first read template elements
+                       using (XmlTextReader reader = new XmlTextReader (tmpXml, XmlNodeType.Element, null)) {
+                               List<string[]> itemTemplateIds = new List<string[]> ();
+                               bool inlineTemplate = false;
+
+                               reader.Read ();
+                               string templatePath = reader.GetAttribute ("Template");
+                               string itemTemplatePath = reader.GetAttribute ("ItemTemplate");
+
+                               int depth = reader.Depth + 1;
+                               while (reader.Read ()) {
+                                       if (!reader.IsStartElement () || reader.Depth > depth)
+                                               continue;
+                                       if (reader.Name == "Template") {
+                                               inlineTemplate = true;
+                                               #if DESIGN_MODE
+                                               ctx.il.Emit (OpCodes.Ldloc_0);
+                                               ctx.il.Emit (OpCodes.Ldc_I4_1);
+                                               ctx.il.Emit (OpCodes.Stfld, typeof(TemplatedControl).GetField("design_inlineTemplate"));
+                                               #endif
+                                               reader.Read ();
+                                               readChildren (reader, ctx, -1);
+                                       } else if (reader.Name == "ItemTemplate")
+                                               itemTemplateIds.Add (parseItemTemplateTag (ctx, reader));                                       
+                               }
+
+                               if (!inlineTemplate) {//load from path or default template
+                                       ctx.il.Emit (OpCodes.Ldloc_0);//Load  current templatedControl ref
+                                       if (string.IsNullOrEmpty (templatePath)) {
+                                               ctx.il.Emit (OpCodes.Ldnull);//default template loading
+                                       } else {
+                                               ctx.il.Emit (OpCodes.Ldarg_1);//load currentInterface
+                                               ctx.il.Emit (OpCodes.Ldstr, templatePath); //Load template path string
+                                               //get declaring type for search fallback assembly
+                                               ctx.il.Emit (OpCodes.Ldloc_0);
+                                               ctx.il.Emit (OpCodes.Call, CompilerServices.miGetType);
+                                               ctx.il.Emit (OpCodes.Callvirt,
+                                                       CompilerServices.miIFaceCreateTemplateInst);
+                                       }
+                                       ctx.il.Emit (OpCodes.Callvirt, CompilerServices.miLoadTmp);//load template
+                               }
+                               if (itemTemplateIds.Count == 0) {
+                                       //try to load ItemTemplate(s) from ItemTemplate attribute of TemplatedGroup
+                                       if (!string.IsNullOrEmpty (itemTemplatePath)) {
+                                               //check if it is already loaded in cache as a single itemTemplate instantiator
+                                               if (iface.ItemTemplates.ContainsKey (itemTemplatePath)) {
+                                                       itemTemplateIds.Add (new string [] { "default", itemTemplatePath, "" });
+                                               } else {
+                                                       using (Stream stream = iface.GetTemplateStreamFromPath (itemTemplatePath, ctx.CurrentNodeType)) {
+                                                               //itemtemplate files may have multiple root nodes
+                                                               XmlReaderSettings itrSettings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment };
+                                                               using (XmlReader itr = XmlReader.Create (stream, itrSettings)) {                                                                        
+                                                                       while (itr.Read ()) {
+                                                                               if (!itr.IsStartElement ())
+                                                                                       continue;
+                                                                               if (itr.NodeType == XmlNodeType.Element) {
+                                                                                       if (itr.Name != "ItemTemplate") {
+                                                                                               //the file contains a single template to use as default
+                                                                                               iface.ItemTemplates [itemTemplatePath] =
+                                                                                                       new ItemTemplate (iface, itr);
+                                                                                               itemTemplateIds.Add (new string [] { "default", itemTemplatePath, "", "TypeOf" });
+                                                                                               break;//we should be at the end of the file
+                                                                                       }
+                                                                                       itemTemplateIds.Add (parseItemTemplateTag (ctx, itr, itemTemplatePath));
+                                                                               }
+                                                                       }
+                                                               }
+                                                       }
+                                               }
+                                       }
+                               }
+                               if (!ctx.nodesStack.Peek ().IsTemplatedGroup)
+                                       return;
+                               //add the default item template if no default is defined
+                               if (!itemTemplateIds.Any(ids=>ids[0] == "default"))
+                                       itemTemplateIds.Add (new string [] { "default", "#Crow.DefaultItem.template", "", "TypeOf"});
+                               //get item templates 
+                               foreach (string [] iTempId in itemTemplateIds) {
+                                       ctx.il.Emit (OpCodes.Ldloc_0);//load TempControl ref
+                                       ctx.il.Emit (OpCodes.Ldfld, CompilerServices.fldItemTemplates);//load ItemTemplates dic field
+
+                                       //prepare argument to add itemTemplate to templated group dic of ItemTemplates
+                                       ctx.il.Emit (OpCodes.Ldstr, iTempId [0]);//load key
+                                       //load itemTemplate
+                                       ctx.il.Emit (OpCodes.Ldarg_1);//load currentInterface
+                                       ctx.il.Emit (OpCodes.Ldstr, iTempId [1]);//load path
+                                       //second arg is Type, to find assembly where to search if not in entry
+                                       ctx.il.Emit (OpCodes.Ldloc_0);//load TempControl ref
+                                       ctx.il.Emit (OpCodes.Call, CompilerServices.miGetType);
+                                       ctx.il.Emit (OpCodes.Callvirt, CompilerServices.miGetITemp);
+                                       ctx.il.Emit (OpCodes.Callvirt, CompilerServices.miAddITemp);
+
+                                       if (!string.IsNullOrEmpty (iTempId [2])) {
+                                               //expand delegate creation
+                                               ctx.il.Emit (OpCodes.Ldloc_0);//load TempControl ref
+                                               ctx.il.Emit (OpCodes.Ldfld, CompilerServices.fldItemTemplates);
+                                               ctx.il.Emit (OpCodes.Ldstr, iTempId [0]);//load key
+                                               ctx.il.Emit (OpCodes.Callvirt, CompilerServices.miGetITempFromDic);
+                                               ctx.il.Emit (OpCodes.Ldloc_0);//load root of treeView
+                                               ctx.il.Emit (OpCodes.Callvirt, CompilerServices.miCreateExpDel);
+                                       }
+                               }
+                       }
+               }
+
+               #if DESIGN_MODE
+               void emitSetDesignAttribute (IMLContext ctx, string name, string value){
+                       //store member value in iml
+                       ctx.il.Emit (OpCodes.Ldloc_0);
+                       ctx.il.Emit (OpCodes.Ldfld, typeof(Widget).GetField("design_iml_values"));
+                       ctx.il.Emit (OpCodes.Ldstr, name);
+                       if (string.IsNullOrEmpty (value))
+                               ctx.il.Emit (OpCodes.Ldnull);
+                       else
+                               ctx.il.Emit (OpCodes.Ldstr, value);
+                       ctx.il.Emit (OpCodes.Call, CompilerServices.miDicStrStrAdd);
+               }
+               #endif
+
+               /// <summary>
+               /// process styling, attributes and children loading.
+               /// </summary>
+               /// <param name="ctx">parsing context</param>
+               /// <param name="tmpXml">xml fragment</param>
+               void emitGOLoad (IMLContext ctx, string tmpXml) {
+                       using (XmlTextReader reader = new XmlTextReader (tmpXml, XmlNodeType.Element, null)) {
+                               reader.Read ();
+
+#if DESIGN_MODE
+                               IXmlLineInfo li = (IXmlLineInfo)reader;
+                               ctx.il.Emit (OpCodes.Ldloc_0);
+                               ctx.il.Emit (OpCodes.Ldstr, this.NextDesignID);
+                               ctx.il.Emit (OpCodes.Stfld, typeof(Widget).GetField("design_id"));
+                               ctx.il.Emit (OpCodes.Ldloc_0);
+                               ctx.il.Emit (OpCodes.Ldc_I4, ctx.curLine + li.LineNumber);
+                               ctx.il.Emit (OpCodes.Stfld, typeof(Widget).GetField("design_line"));
+                               ctx.il.Emit (OpCodes.Ldloc_0);
+                               ctx.il.Emit (OpCodes.Ldc_I4, li.LinePosition);
+                               ctx.il.Emit (OpCodes.Stfld, typeof(Widget).GetField("design_column"));
+                               if (!string.IsNullOrEmpty (sourcePath)) {
+                                       ctx.il.Emit (OpCodes.Ldloc_0);
+                                       ctx.il.Emit (OpCodes.Ldstr, sourcePath);
+                                       ctx.il.Emit (OpCodes.Stfld, typeof(Widget).GetField("design_imlPath"));
+                               }
+#endif
+                               #region Styling and default values loading
+                               //first check for Style attribute then trigger default value loading
+                               if (reader.HasAttributes) {
+                                       string style = reader.GetAttribute ("Style");
+                                       if (!string.IsNullOrEmpty (style)) {
+                                               CompilerServices.EmitSetValue (ctx.il, CompilerServices.piStyle, style);
+#if DESIGN_MODE
+                                               emitSetDesignAttribute (ctx, "Style", style);
+#endif
+                                       }
+                                       //check for dataSourceType, if set, datasource bindings will use direct setter/getter
+                                       //instead of reflexion
+                                       string dataSourceType = reader.GetAttribute ("DataSourceType");
+                                       if (string.IsNullOrEmpty (dataSourceType)) {
+                                               //if not set but dataSource is not null, reset dsType to null
+                                               string ds = reader.GetAttribute ("DataSource");
+                                               if (!string.IsNullOrEmpty (ds)) 
+                                                       ctx.SetDataSourceTypeForCurrentNode (null);
+                                       } else
+                                               ctx.SetDataSourceTypeForCurrentNode(CompilerServices.getTypeFromName (dataSourceType));
+                               }
+                               ctx.il.Emit (OpCodes.Ldloc_0);
+                ctx.il.Emit (OpCodes.Callvirt, CompilerServices.miLoadDefaultVals);
+#endregion
+
+
+                               #region Attributes reading
+                               if (reader.HasAttributes) {
+
+                                       while (reader.MoveToNextAttribute ()) {
+                                               if (reader.Name == "Style" || reader.Name == "DataSourceType")
+                                                       continue;
+
+                                               #if DESIGN_MODE
+                                               emitSetDesignAttribute (ctx, reader.Name, reader.Value);
+                                               #endif
+
+                                               MemberInfo mi = ctx.CurrentNodeType.GetMember (reader.Name).FirstOrDefault ();
+                                               if (mi == null)
+                                                       throw new Exception ("Member '" + reader.Name + "' not found in " + ctx.CurrentNodeType.Name);
+
+                                               if (mi.MemberType == MemberTypes.Event) {
+                                                       foreach (string exp in CompilerServices.splitOnSemiColumnOutsideAccolades(reader.Value)) {
+                                                               string trimed = exp.Trim();
+                                                               if (trimed.StartsWith ("{", StringComparison.Ordinal))
+                                                                       compileAndStoreDynHandler (ctx, mi as EventInfo, trimed.Substring (1, trimed.Length - 2));
+                                                               else
+                                                                       emitHandlerBinding (ctx, mi as EventInfo, trimed);
+                                                       }
+
+                                                       continue;
+                                               }
+                                               PropertyInfo pi = mi as PropertyInfo;
+                                               if (pi == null)
+                                                       throw new Exception ("Member '" + reader.Name + "' is not a property in " + ctx.CurrentNodeType.Name);
+
+                                               if (pi.Name == "Name")
+                                                       ctx.StoreCurrentName (reader.Value);
+
+                                               if (reader.Value.StartsWith ("{", StringComparison.Ordinal))
+                                                       readPropertyBinding (ctx, reader.Name, reader.Value.Substring (1, reader.Value.Length - 2));
+                                               else
+                                                       CompilerServices.EmitSetValue (ctx.il, pi, reader.Value);
+
+                                       }
+                                       reader.MoveToElement ();
+                               }
+                               #endregion
+
+                               readChildren (reader, ctx);
+
+                               ctx.nodesStack.ResetCurrentNodeIndex ();
+                       }
+               }
+               /// <summary>
+               /// Parse child node an generate corresponding msil
+               /// </summary>
+               void readChildren (XmlReader reader, IMLContext ctx, int startingIdx = 0)
+               {
+                       bool endTagReached = false;
+                       int nodeIdx = startingIdx;
+                       while (reader.Read ()) {
+                               switch (reader.NodeType) {
+                               case XmlNodeType.EndElement:
+                                       endTagReached = true;
+                                       break;
+                               case XmlNodeType.Element:
+                                       //skip Templates
+                                       if (reader.Name == "Template" ||
+                                           reader.Name == "ItemTemplate") {
+                                               reader.Skip ();
+                                               continue;
+                                       }
+
+                                       //push 2x current instance on stack for parenting and reseting loc0 to parent
+                                       //loc_0 will be used for child
+                                       ctx.il.Emit (OpCodes.Ldloc_0);
+                                       ctx.il.Emit (OpCodes.Ldloc_0);
+
+                                       Type t = tryGetGOType (reader.Name);
+                                       if (t == null)
+                                               throw new Exception (reader.Name + " type not found");
+                                       ConstructorInfo ci = t.GetConstructor (
+                                                                    BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public,  
+                                               null, Type.EmptyTypes, null);
+                                       if (ci == null)
+                                               throw new Exception ("No default parameterless constructor found in " + t.Name);                                        
+                                       ctx.il.Emit (OpCodes.Newobj, ci);
+                                       ctx.il.Emit (OpCodes.Stloc_0);//child is now loc_0
+                                       CompilerServices.emitSetCurInterface (ctx.il);
+
+                                       ctx.nodesStack.Push (new Node (t, nodeIdx));
+                                       emitLoader (reader, ctx);
+                                       ctx.nodesStack.Pop ();
+
+                                       ctx.il.Emit (OpCodes.Ldloc_0);//load child on stack for parenting
+                                       ctx.il.Emit (OpCodes.Callvirt, ctx.nodesStack.Peek().GetAddMethod(nodeIdx));
+                                       ctx.il.Emit (OpCodes.Stloc_0); //reset local to current go
+
+                                       nodeIdx++;
+
+                                       break;
+                               }
+                               if (endTagReached)
+                                       break;
+                       }
+               }
+               #endregion
+               /// <summary>
+               /// Reads binding expression found as attribute value in iml
+               /// </summary>
+               /// <param name="ctx">IML Context</param>
+               /// <param name="sourceMember">IML Attribute name</param>
+               /// <param name="expression">Binding Expression with accollades trimed</param>
+               void readPropertyBinding (IMLContext ctx, string sourceMember, string expression)
+               {
+                       NodeAddress sourceNA = ctx.CurrentNodeAddress;
+                       BindingDefinition bindingDef = sourceNA.GetBindingDef (sourceMember, expression);
+
+#if DEBUG_BINDING
+                       Debug.WriteLine("Property Binding: " + bindingDef.ToString());
+#endif
+
+                       if (bindingDef.IsDataSourceBinding) {//bind on data source
+                               if (ctx.CurrentNodeHasDataSourceType)
+                                       emitDataSourceBindings (ctx, bindingDef, ctx.CurrentDataSourceType);
+                               else
+                                       emitDataSourceBindings (ctx, bindingDef);
+                       } else
+                               ctx.StorePropertyBinding (bindingDef);
+               }
+
+               #region Emit Helper
+               void dataSourceChangedEmitHelper(object dscSource, object dataSource, int dynMethIdx){
+                       if (dataSource is IValueChange)
+                               (dataSource as IValueChange).ValueChanged +=
+                                       (EventHandler<ValueChangeEventArgs>)dsValueChangedDynMeths [dynMethIdx].CreateDelegate (typeof(EventHandler<ValueChangeEventArgs>), dscSource);
+               }
+               /// <summary> Emits remove old data source event handler.</summary>
+               void emitRemoveOldDataSourceHandler(ILGenerator il, string eventName, string delegateName, bool DSSide = true){
+                       System.Reflection.Emit.Label cancel = il.DefineLabel ();
+
+                       il.Emit (OpCodes.Ldarg_2);//load old parent
+                       il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCOldDS);
+                       il.Emit (OpCodes.Brfalse, cancel);//old parent is null
+
+                       //remove handler
+                       if (DSSide){//event is defined in the dataSource instance
+                               il.Emit (OpCodes.Ldarg_2);//1st arg load old datasource
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCOldDS);
+                       }else//the event is in the source
+                               il.Emit (OpCodes.Ldarg_1);//1st arg load old datasource
+                       il.Emit (OpCodes.Ldstr, eventName);//2nd arg event name
+                       il.Emit (OpCodes.Ldstr, delegateName);//3d arg: delegate name
+                       il.Emit (OpCodes.Call, CompilerServices.miRemEvtHdlByName);
+                       il.MarkLabel(cancel);
+               }
+               #endregion
+
+               #region Event Bindings
+               /// <summary>
+               /// Compile events expression in IML attributes, and store the result in the instanciator
+               /// Those handlers will be bound when instatiing
+               /// </summary>
+               void compileAndStoreDynHandler (IMLContext ctx, EventInfo sourceEvent, string expression)
+               {
+                       //store event handler dynamic method in instanciator
+                       int dmIdx = cachedDelegates.Count;
+                       cachedDelegates.Add (CompilerServices.compileDynEventHandler (sourceEvent, expression, ctx.CurrentNodeAddress));
+                       ctx.emitCachedDelegateHandlerAddition(dmIdx, sourceEvent);
+               }
+               /// <summary> Emits handler method bindings </summary>
+               void emitHandlerBinding (IMLContext ctx, EventInfo sourceEvent, string expression){
+                       NodeAddress currentNode = ctx.CurrentNodeAddress;
+                       BindingDefinition bindingDef = currentNode.GetBindingDef (sourceEvent.Name, expression);
+
+                       #if DEBUG_BINDING
+                       Debug.WriteLine("Event Binding: " + bindingDef.ToString());
+                       #endif
+
+                       if (bindingDef.IsTemplateBinding | bindingDef.IsDataSourceBinding) {
+                               //we need to bind datasource method to source event
+                               DynamicMethod dm = new DynamicMethod ("dyn_dsORtmpChangedForHandler" + NewId,
+                                                          typeof(void),
+                                                          CompilerServices.argsBoundDSChange, true);
+
+                               ILGenerator il = dm.GetILGenerator (256);
+                               System.Reflection.Emit.Label cancel = il.DefineLabel ();
+
+                               il.DeclareLocal (typeof(MethodInfo));//used to cancel binding if method doesn't exist
+
+                               il.Emit (OpCodes.Nop);
+
+                               emitRemoveOldDataSourceHandler (il, sourceEvent.Name, bindingDef.TargetMember, false);
+
+
+                               //fetch method in datasource and test if it exist
+                               il.Emit (OpCodes.Ldarg_2);//load new datasource
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                               il.Emit (OpCodes.Brfalse, cancel);//cancel if new datasource is null
+                               il.Emit (OpCodes.Ldarg_2);//load new datasource
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                               il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);//load handler method name
+                               il.Emit (OpCodes.Call, CompilerServices.miGetMethInfoWithRefx);
+                               il.Emit (OpCodes.Stloc_0);//save MethodInfo                                          
+                il.Emit (OpCodes.Ldloc_0);//push mi for test if null
+                il.Emit (OpCodes.Brfalse, cancel);//cancel if null
+
+                il.Emit (OpCodes.Ldarg_1);//load datasource change source where the event is as 1st arg of handler.add
+                if (bindingDef.IsTemplateBinding)//fetch source instance with address
+                    CompilerServices.emitGetInstance (il, bindingDef.SourceNA);
+
+                //load handlerType of sourceEvent to create delegate (1st arg)
+                il.Emit (OpCodes.Ldtoken, sourceEvent.EventHandlerType);
+                il.Emit (OpCodes.Call, CompilerServices.miGetTypeFromHandle);
+                il.Emit (OpCodes.Ldarg_2);//load new datasource where the method is defined
+                il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                il.Emit (OpCodes.Ldloc_0);//load methodInfo (3rd arg)
+
+                il.Emit (OpCodes.Call, CompilerServices.miCreateBoundDel);
+                il.Emit (OpCodes.Call, sourceEvent.AddMethod);//call add event
+                                          
+                System.Reflection.Emit.Label finish = il.DefineLabel ();
+                il.Emit (OpCodes.Br, finish);
+                il.MarkLabel (cancel);
+                               #if DEBUG_BINDING
+                               il.EmitWriteLine (string.Format ("Handler method '{0}' for '{1}' NOT FOUND in new dataSource", bindingDef.TargetMember, sourceEvent.Name));
+                               #endif
+                               il.MarkLabel (finish);
+                               #if DEBUG_BINDING
+                               il.EmitWriteLine (string.Format ("Handler method '{0}' for '{1}' FOUND in new dataSource", bindingDef.TargetMember, sourceEvent.Name));
+                               #endif
+                                              
+                               il.Emit (OpCodes.Ret);
+
+                               //store dschange delegate in instatiator instance for access while instancing graphic object
+                               int delDSIndex = cachedDelegates.Count;
+                               cachedDelegates.Add (dm.CreateDelegate (CompilerServices.ehTypeDSChange, this));
+
+                               if (bindingDef.IsDataSourceBinding)
+                                       ctx.emitCachedDelegateHandlerAddition (delDSIndex, CompilerServices.eiDSChange);
+                               else //template handler binding, will be added to root parentChanged
+                                       templateCachedDelegateIndices.Add (delDSIndex);
+                       } else {//normal in tree handler binding, store until tree is complete (end of parse)
+                               ctx.UnresolvedTargets.Add (new EventBinding (
+                                       bindingDef.SourceNA, sourceEvent,
+                                       bindingDef.TargetNA, bindingDef.TargetMember, bindingDef.TargetName));
+                       }
+               }
+               #endregion
+
+               #region Property Bindings
+               /// <summary>
+               /// Create and store in the instanciator the ValueChanged delegates
+               /// those delegates uses grtree functions to set destination value so they don't
+               /// need to be bound to destination instance as in the ancient system.
+               /// </summary>
+               void emitBindingDelegates(IMLContext ctx){
+                       foreach (KeyValuePair<NodeAddress,Dictionary<string, List<MemberAddress>>> bindings in ctx.Bindings ) {
+                               if (bindings.Key.Count == 0)//template binding
+                                       emitTemplateBindings (ctx, bindings.Value);
+                               else
+                                       emitPropertyBindings (ctx,  bindings.Key, bindings.Value);
+                       }
+               }
+               void emitPropertyBindings(IMLContext ctx, NodeAddress origine, Dictionary<string, List<MemberAddress>> bindings){
+                       Type origineNodeType = origine.NodeType;
+
+                       //value changed dyn method
+                       DynamicMethod dm = new DynamicMethod ("dyn_valueChanged" + NewId,
+                               typeof (void), CompilerServices.argsValueChange, true);
+                       ILGenerator il = dm.GetILGenerator (256);
+
+                       System.Reflection.Emit.Label endMethod = il.DefineLabel ();
+
+                       il.DeclareLocal (typeof(object));
+
+                       il.Emit (OpCodes.Nop);
+
+                       int i = 0;
+                       foreach (KeyValuePair<string, List<MemberAddress>> bindingCase in bindings ) {
+
+                               System.Reflection.Emit.Label nextTest = il.DefineLabel ();
+
+                               #region member name test
+                               //load source member name
+                               il.Emit (OpCodes.Ldarg_1);
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName);
+
+                               il.Emit (OpCodes.Ldstr, bindingCase.Key);//load name to test
+                               il.Emit (OpCodes.Ldc_I4_4);//StringComparison.Ordinal
+                               il.Emit (OpCodes.Call, CompilerServices.stringEquals);
+                               il.Emit (OpCodes.Brfalse, nextTest);//if not equal, jump to next case
+                               #endregion
+
+                               #region destination member affectations
+                               PropertyInfo piOrig = origineNodeType.GetProperty (bindingCase.Key);
+                               Type origineType = null;
+                               if (piOrig != null)
+                                       origineType = piOrig.PropertyType;
+                               foreach (MemberAddress ma in bindingCase.Value) {
+                                       //first we have to load destination instance onto the stack, it is access
+                                       //with graphic tree functions deducted from nodes topology
+                                       il.Emit (OpCodes.Ldarg_0);//load source instance of ValueChanged event
+
+                                       NodeAddress destination = ma.Address;
+
+                                       if (destination.Count == 0){//template reverse binding
+                                               //fetch destination instance (which is the template root)
+                                               for (int j = 0; j < origine.Count ; j++)
+                                                       il.Emit(OpCodes.Callvirt, CompilerServices.miGetLogicalParent);
+                                       }else
+                                               CompilerServices.emitGetInstance (il, origine, destination);
+
+                                       if (origineType != null && destination.Count > 0){//else, prop less binding or reverse template bind, no init requiered
+                                               //for initialisation dynmeth, push destination instance loc_0 is root node in ctx
+                                               ctx.il.Emit(OpCodes.Ldloc_0);
+                                               CompilerServices.emitGetInstance (ctx.il, destination);
+
+                                               //init dynmeth: load actual value from origine
+                                               ctx.il.Emit (OpCodes.Ldloc_0);
+                                               CompilerServices.emitGetInstance (ctx.il, origine);
+                                               ctx.il.Emit (OpCodes.Callvirt, origineNodeType.GetProperty (bindingCase.Key).GetGetMethod());
+                                       }
+                                       //load new value
+                                       il.Emit (OpCodes.Ldarg_1);
+                                       il.Emit (OpCodes.Ldfld, CompilerServices.fiVCNewValue);
+
+                                       if (origineType == null)//property less binding, no init
+                                               CompilerServices.emitConvert (il, ma.Property.PropertyType);
+                                       else if (destination.Count > 0) {
+                                               if (origineType.IsValueType)
+                                                       ctx.il.Emit(OpCodes.Box, origineType);
+
+                                               CompilerServices.emitConvert (ctx.il, origineType, ma.Property.PropertyType);
+                                               CompilerServices.emitConvert (il, origineType, ma.Property.PropertyType);
+
+                                               ctx.il.Emit (OpCodes.Callvirt, ma.Property.GetSetMethod());//set init value
+                                       } else {// reverse templateBinding
+                                               il.Emit (OpCodes.Ldstr, ma.memberName);//arg 3 of setValueWithReflexion
+                                               il.Emit (OpCodes.Call, CompilerServices.miSetValWithRefx);
+                                               continue;
+                                       }
+                                       il.Emit (OpCodes.Callvirt, ma.Property.GetSetMethod());//set value on value changes
+                               }
+                               #endregion
+                               il.Emit (OpCodes.Br, endMethod);
+                               il.MarkLabel (nextTest);
+
+                               i++;
+                       }
+
+                       il.MarkLabel (endMethod);
+                       il.Emit (OpCodes.Ret);
+
+                       //store and emit Add in ctx
+                       int dmIdx = cachedDelegates.Count;
+                       cachedDelegates.Add (dm.CreateDelegate (typeof(EventHandler<ValueChangeEventArgs>)));
+                       ctx.emitCachedDelegateHandlerAddition (dmIdx, CompilerServices.eiValueChange, origine);
+
+                       #if DEBUG_BINDING
+                       Debug.WriteLine("\tCrow property binding: " + dm.Name);
+                       #endif
+
+               }
+               void emitTemplateBindings(IMLContext ctx, Dictionary<string, List<MemberAddress>> bindings){
+                       //value changed dyn method
+                       DynamicMethod dm = new DynamicMethod ("dyn_tmpValueChanged",
+                               typeof (void), CompilerServices.argsValueChange, true);
+                       ILGenerator il = dm.GetILGenerator (256);
+
+                       //create parentchanged dyn meth in parallel to have only one loop over bindings
+                       DynamicMethod dmPC = new DynamicMethod ("dyn_InitAndLogicalParentChanged",
+                               typeof (void),
+                               CompilerServices.argsBoundDSChange, true);
+                       ILGenerator ilPC = dmPC.GetILGenerator (256);
+
+                       il.Emit (OpCodes.Nop);
+                       ilPC.Emit (OpCodes.Nop);
+
+                       System.Reflection.Emit.Label endMethod = il.DefineLabel ();
+
+                       il.DeclareLocal (typeof(object));
+                       ilPC.DeclareLocal (typeof(object));//used for checking propery less bindings
+                       ilPC.DeclareLocal (typeof(MemberInfo));//used for checking propery less bindings
+
+                       System.Reflection.Emit.Label cancel = ilPC.DefineLabel ();
+
+                       #region Unregister previous parent event handler
+                       //unregister previous parent handler if not null
+                       ilPC.Emit (OpCodes.Ldarg_2);//load old parent
+                       ilPC.Emit (OpCodes.Ldfld, CompilerServices.fiDSCOldDS);
+                       ilPC.Emit (OpCodes.Brfalse, cancel);//old parent is null
+
+                       ilPC.Emit (OpCodes.Ldarg_2);//load old parent
+                       ilPC.Emit (OpCodes.Ldfld, CompilerServices.fiDSCOldDS);
+                       //Load cached delegate
+                       ilPC.Emit(OpCodes.Ldarg_0);//load ref to this instanciator onto the stack
+                       ilPC.Emit(OpCodes.Ldfld, CompilerServices.fiTemplateBinding);
+
+                       //add template bindings dynValueChanged delegate to new parent event
+                       ilPC.Emit(OpCodes.Callvirt, CompilerServices.eiValueChange.RemoveMethod);//call remove event
+                       #endregion
+
+                       ilPC.MarkLabel(cancel);
+
+                       #region check if new parent is null
+                       cancel = ilPC.DefineLabel ();
+                       ilPC.Emit (OpCodes.Ldarg_2);//load datasource change arg
+                       ilPC.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                       ilPC.Emit (OpCodes.Brfalse, cancel);//new ds is null
+                       #endregion
+
+                       int i = 0;
+                       foreach (KeyValuePair<string, List<MemberAddress>> bindingCase in bindings ) {
+
+                               System.Reflection.Emit.Label nextTest = il.DefineLabel ();
+
+                               #region member name test
+                               //load source member name
+                               il.Emit (OpCodes.Ldarg_1);
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName);
+
+                               il.Emit (OpCodes.Ldstr, bindingCase.Key);//load name to test
+                               il.Emit (OpCodes.Ldc_I4_4);//StringComparison.Ordinal
+                               il.Emit (OpCodes.Call, CompilerServices.stringEquals);
+                               il.Emit (OpCodes.Brfalse, nextTest);//if not equal, jump to next case
+                               #endregion
+
+                               #region destination member affectations
+
+                               foreach (MemberAddress ma in bindingCase.Value) {
+                                       if (ma.Address.Count == 0){
+                                               Debug.WriteLine("\t\tBUG: reverse template binding in normal template binding");
+                                               continue;//template binding
+                                       }
+                                       //first we try to get memberInfo of new parent, if it doesn't exist, it's a propery less binding
+                                       ilPC.Emit (OpCodes.Ldarg_2);//load new parent onto the stack for handler addition
+                                       ilPC.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                                       ilPC.Emit (OpCodes.Stloc_0);//save new parent
+                                       //get parent type
+                                       ilPC.Emit (OpCodes.Ldloc_0);//push parent instance
+                                       ilPC.Emit (OpCodes.Ldstr, bindingCase.Key);//load member name
+                                       ilPC.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
+                                       ilPC.Emit (OpCodes.Stloc_1);//save memberInfo
+                                       ilPC.Emit (OpCodes.Ldloc_1);//push mi for test if null
+                                       System.Reflection.Emit.Label propLessReturn = ilPC.DefineLabel ();
+                                       ilPC.Emit (OpCodes.Brfalse, propLessReturn);
+
+
+                                       //first we have to load destination instance onto the stack, it is access
+                                       //with graphic tree functions deducted from nodes topology
+                                       il.Emit (OpCodes.Ldarg_0);//load source instance of ValueChanged event
+                                       CompilerServices.emitGetChild (il, typeof(TemplatedControl), -1);
+                                       CompilerServices.emitGetInstance (il, ma.Address);
+
+                                       ilPC.Emit (OpCodes.Ldarg_2);//load destination instance to set actual value of member
+                                       ilPC.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                                       CompilerServices.emitGetChild (ilPC, typeof(TemplatedControl), -1);
+                                       CompilerServices.emitGetInstance (ilPC, ma.Address);
+
+                                       //load new value
+                                       il.Emit (OpCodes.Ldarg_1);
+                                       il.Emit (OpCodes.Ldfld, CompilerServices.fiVCNewValue);
+
+                                       //for the parent changed dyn meth we need to fetch actual value for initialisation thrue reflexion
+                                       ilPC.Emit (OpCodes.Ldloc_0);//push root instance of instanciator as parentChanged source
+                                       ilPC.Emit (OpCodes.Ldloc_1);//push mi for value fetching
+                                       ilPC.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx);
+
+                                       CompilerServices.emitConvert (il, ma.Property.PropertyType);
+                                       CompilerServices.emitConvert (ilPC, ma.Property.PropertyType);
+
+                                       il.Emit (OpCodes.Callvirt, ma.Property.GetSetMethod());
+                                       ilPC.Emit (OpCodes.Callvirt, ma.Property.GetSetMethod());
+
+                                       ilPC.MarkLabel(propLessReturn);
+                               }
+                               #endregion
+                               il.Emit (OpCodes.Br, endMethod);
+                               il.MarkLabel (nextTest);
+
+                               i++;
+                       }
+                       //il.Emit (OpCodes.Pop);
+                       il.MarkLabel (endMethod);
+                       il.Emit (OpCodes.Ret);
+
+                       //store template bindings in instanciator
+                       templateBinding = dm.CreateDelegate (typeof(EventHandler<ValueChangeEventArgs>));
+
+                       #region emit LogicalParentChanged method
+
+                       //load new parent onto the stack for handler addition
+                       ilPC.Emit (OpCodes.Ldarg_2);
+                       ilPC.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+
+                       //Load cached delegate
+                       ilPC.Emit(OpCodes.Ldarg_0);//load ref to this instanciator onto the stack
+                       ilPC.Emit(OpCodes.Ldfld, CompilerServices.fiTemplateBinding);
+
+                       //add template bindings dynValueChanged delegate to new parent event
+                       ilPC.Emit(OpCodes.Call, CompilerServices.eiValueChange.AddMethod);//call add event
+
+                       ilPC.MarkLabel (cancel);
+                       ilPC.Emit (OpCodes.Ret);
+
+                       //store dschange delegate in instatiator instance for access while instancing graphic object
+                       int delDSIndex = cachedDelegates.Count;
+                       cachedDelegates.Add(dmPC.CreateDelegate (CompilerServices.ehTypeDSChange, this));
+                       #endregion
+
+                       ctx.emitCachedDelegateHandlerAddition(delDSIndex, CompilerServices.eiLogicalParentChanged);
+               }
+               /// <summary>
+               /// data source binding with known data type
+               /// </summary>
+               void emitDataSourceBindings (IMLContext ctx, BindingDefinition bindingDef, Type dsType)
+               {
+#if DEBUG_BINDING_FUNC_CALLS
+                       Console.WriteLine ($"emitDataSourceBindings with data type knows: {bindingDef}");
+#endif
+                       DynamicMethod dm = null;
+                       ILGenerator il = null;
+                       int dmVC = 0;
+                       PropertyInfo piSource = ctx.CurrentNodeType.GetProperty (bindingDef.SourceMember);
+                       //if no dataSource member name is provided, valuechange is not handle and datasource change
+                       //will be used as origine value
+                       string delName = "dyn_DSvalueChanged" + NewId;
+                       if (!string.IsNullOrEmpty (bindingDef.TargetMember)) {
+                               #region create valuechanged method
+                               dm = new DynamicMethod (delName,
+                                       typeof (void),
+                                       CompilerServices.argsBoundValueChange, true);
+
+                               il = dm.GetILGenerator (256);
+
+                               System.Reflection.Emit.Label endMethod = il.DefineLabel ();
+
+                               il.DeclareLocal (typeof (object));
+
+                               il.Emit (OpCodes.Nop);
+
+                               //load value changed member name onto the stack
+                               il.Emit (OpCodes.Ldarg_2);
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName);
+
+                               //test if it's the expected one
+                               il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);
+                               il.Emit (OpCodes.Ldc_I4_4);//StringComparison.Ordinal
+                               il.Emit (OpCodes.Call, CompilerServices.stringEquals);
+                               il.Emit (OpCodes.Brfalse, endMethod);
+                               //set destination member with valueChanged new value
+                               //load destination ref
+                               il.Emit (OpCodes.Ldarg_0);
+                               //load new value onto the stack
+                               il.Emit (OpCodes.Ldarg_2);
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiVCNewValue);
+
+                               //by default, source value type is deducted from target member type to allow
+                               //memberless binding, if targetMember exists, it will be used to determine target
+                               //value type for conversion
+                               CompilerServices.emitConvert (il, piSource.PropertyType);
+
+                               if (!piSource.CanWrite)
+                                       throw new Exception ("Source member of bindind is read only:" + piSource.ToString ());
+
+                               il.Emit (OpCodes.Callvirt, piSource.GetSetMethod ());
+
+                               il.MarkLabel (endMethod);
+                               il.Emit (OpCodes.Ret);
+
+                               //vc dyn meth is stored in a cached list, it will be bound to datasource only
+                               //when datasource of source graphic object changed
+                               dmVC = dsValueChangedDynMeths.Count;
+                               dsValueChangedDynMeths.Add (dm);
+                               #endregion
+                       }
+
+                       #region emit dataSourceChanged event handler
+                       //now we create the datasource changed method that will init the destination member with
+                       //the actual value of the origin member of the datasource and then will bind the value changed
+                       //dyn methode.
+                       //dm is bound to the instanciator instance to have access to cached dyn meth and delegates
+                       dm = new DynamicMethod ("dyn_dschanged" + NewId,
+                               typeof (void),
+                               CompilerServices.argsBoundDSChange, true);
+
+                       il = dm.GetILGenerator (256);
+
+                       il.DeclareLocal (typeof (object));//used for checking propery less bindings
+                       il.DeclareLocal (typeof (MemberInfo));//used for checking propery less bindings
+                       il.DeclareLocal (typeof (object));//new datasource store, save one field access
+                       System.Reflection.Emit.Label cancel = il.DefineLabel ();
+                       System.Reflection.Emit.Label newDSIsNull = il.DefineLabel ();
+                       System.Reflection.Emit.Label cancelInit = il.DefineLabel ();
+
+                       il.Emit (OpCodes.Nop);
+
+                       il.Emit (OpCodes.Ldarg_2);//load datasource change arg
+                       il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                       il.Emit (OpCodes.Stloc_2);//new ds is now loc 2
+
+                       emitRemoveOldDataSourceHandler (il, "ValueChanged", delName, true);
+
+                       if (!string.IsNullOrEmpty (bindingDef.TargetMember)) {
+                               if (bindingDef.TwoWay) //remove handler
+                                       emitRemoveOldDataSourceHandler (il, "ValueChanged", delName, false);
+                               //test if new ds is null
+                               il.Emit (OpCodes.Ldloc_2);
+                               il.Emit (OpCodes.Brfalse, newDSIsNull);//new ds is null
+                               //test if new ds is of expected type
+                               il.Emit (OpCodes.Ldloc_2);
+                               il.Emit (OpCodes.Isinst, dsType);
+                               //il.Emit (OpCodes.Call, CompilerServices.miGetMDToken);
+                               //il.Emit (OpCodes.Ldc_I4, dsType.MetadataToken);
+                               il.Emit (OpCodes.Brfalse, newDSIsNull);
+                       }
+
+                       #region fetch initial Value
+                       if (!string.IsNullOrEmpty (bindingDef.TargetMember)) {
+                               Type mbType;
+                               MemberInfo mi = CompilerServices.GetMemberInfo (dsType, bindingDef.TargetMember, out mbType);
+                               if (mi != null) {
+                                       il.Emit (OpCodes.Ldarg_1);//load source of dataSourceChanged which is the dest instance
+                                       il.Emit (OpCodes.Ldloc_2);//load new ds
+                                       CompilerServices.emitGetMemberValue (il, dsType, mi);
+                                       if (mbType != piSource.PropertyType)
+                                               CompilerServices.emitConvert (il, mbType, piSource.PropertyType);
+                                       il.Emit (OpCodes.Callvirt, piSource.GetSetMethod ());
+                               }
+                       }
+                       #endregion
+
+                       if (!string.IsNullOrEmpty (bindingDef.TargetMember)) {
+                               il.MarkLabel (cancelInit);
+                               //check if new dataSource implement IValueChange
+                               il.Emit (OpCodes.Ldloc_2);//load new datasource
+                               il.Emit (OpCodes.Isinst, typeof (IValueChange));
+                               il.Emit (OpCodes.Brfalse, cancel);
+
+                               il.Emit (OpCodes.Ldarg_0);//load ref to this instanciator onto the stack
+                               il.Emit (OpCodes.Ldarg_1);//load datasource change source
+                               il.Emit (OpCodes.Ldloc_2);//load new datasource
+                               il.Emit (OpCodes.Ldc_I4, dmVC);//load index of dynmathod
+                               il.Emit (OpCodes.Call, CompilerServices.miDSChangeEmitHelper);
+
+                               il.MarkLabel (cancel);
+
+                               if (bindingDef.TwoWay) {
+                                       il.Emit (OpCodes.Ldarg_1);//arg1: dataSourceChange source, the origine of the binding
+                                       il.Emit (OpCodes.Ldstr, bindingDef.SourceMember);//arg2: orig member
+                                       il.Emit (OpCodes.Ldloc_2);//arg3: new datasource
+                                       il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);//arg4: dest member
+                                       il.Emit (OpCodes.Call, CompilerServices.miDSReverseBinding);
+                               }
+
+                       }
+                       il.MarkLabel (newDSIsNull);
+                       il.Emit (OpCodes.Ret);
+
+                       //store dschange delegate in instatiator instance for access while instancing graphic object
+                       int delDSIndex = cachedDelegates.Count;
+                       cachedDelegates.Add (dm.CreateDelegate (CompilerServices.ehTypeDSChange, this));
+                       #endregion
+
+                       ctx.emitCachedDelegateHandlerAddition (delDSIndex, CompilerServices.eiDSChange);
+
+#if DEBUG_BINDING
+                       Debug.WriteLine("\tDataSource ValueChanged: " + delName);
+                       Debug.WriteLine("\tDataSource Changed: " + dm.Name);
+#endif
+               }
+               /// <summary>
+               /// create the valuechanged handler, the datasourcechanged handler and emit event handling
+               /// </summary>
+               void emitDataSourceBindings(IMLContext ctx, BindingDefinition bindingDef){
+#if DEBUG_BINDING_FUNC_CALLS
+                       Console.WriteLine ($"emitDataSourceBindings: {bindingDef}");
+#endif
+                       DynamicMethod dm = null;
+                       ILGenerator il = null;
+                       int dmVC = 0;
+                       PropertyInfo piSource = ctx.CurrentNodeType.GetProperty(bindingDef.SourceMember);
+                       //if no dataSource member name is provided, valuechange is not handle and datasource change
+                       //will be used as origine value
+                       string delName = "dyn_DSvalueChanged" + NewId;
+                       if (!string.IsNullOrEmpty(bindingDef.TargetMember)){
+#region create valuechanged method
+                               dm = new DynamicMethod (delName,
+                                       typeof (void),
+                                       CompilerServices.argsBoundValueChange, true);
+
+                               il = dm.GetILGenerator (32);
+
+                               System.Reflection.Emit.Label endMethod = il.DefineLabel ();
+
+                               il.DeclareLocal (typeof(object));
+
+                               il.Emit (OpCodes.Nop);
+
+                               //load value changed member name onto the stack
+                               il.Emit (OpCodes.Ldarg_2);
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName);
+
+                               //test if it's the expected one
+                               il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);
+                               il.Emit (OpCodes.Ldc_I4_4);//StringComparison.Ordinal
+                               il.Emit (OpCodes.Call, CompilerServices.stringEquals);
+                               il.Emit (OpCodes.Brfalse, endMethod);
+                               //set destination member with valueChanged new value
+                               //load destination ref
+                               il.Emit (OpCodes.Ldarg_0);
+                               //load new value onto the stack
+                               il.Emit (OpCodes.Ldarg_2);
+                               il.Emit (OpCodes.Ldfld, CompilerServices.fiVCNewValue);
+
+                               //by default, source value type is deducted from target member type to allow
+                               //memberless binding, if targetMember exists, it will be used to determine target
+                               //value type for conversion
+                               CompilerServices.emitConvert (il, piSource.PropertyType);
+
+                               if (!piSource.CanWrite)
+                                       throw new Exception ("Source member of bindind is read only:" + piSource.ToString());
+
+                               il.Emit (OpCodes.Callvirt, piSource.GetSetMethod ());
+
+                               il.MarkLabel (endMethod);
+                               il.Emit (OpCodes.Ret);
+
+                               //vc dyn meth is stored in a cached list, it will be bound to datasource only
+                               //when datasource of source graphic object changed
+                               dmVC = dsValueChangedDynMeths.Count;
+                               dsValueChangedDynMeths.Add (dm);
+#endregion
+                       }
+
+#region emit dataSourceChanged event handler
+                       //now we create the datasource changed method that will init the destination member with
+                       //the actual value of the origin member of the datasource and then will bind the value changed
+                       //dyn methode.
+                       //dm is bound to the instanciator instance to have access to cached dyn meth and delegates
+                       dm = new DynamicMethod ("dyn_dschanged" + NewId,
+                               typeof (void),
+                               CompilerServices.argsBoundDSChange, true);
+
+                       il = dm.GetILGenerator (64);
+
+                       il.DeclareLocal (typeof(object));//used for checking propery less bindings
+                       il.DeclareLocal (typeof(MemberInfo));//used for checking propery less bindings
+                       il.DeclareLocal (typeof (object));//new datasource store, save one field access
+                       System.Reflection.Emit.Label cancel = il.DefineLabel ();
+                       System.Reflection.Emit.Label newDSIsNull = il.DefineLabel ();
+                       System.Reflection.Emit.Label cancelInit = il.DefineLabel ();
+
+                       il.Emit (OpCodes.Nop);
+
+                       il.Emit (OpCodes.Ldarg_2);//load datasource change arg
+                       il.Emit (OpCodes.Ldfld, CompilerServices.fiDSCNewDS);
+                       il.Emit (OpCodes.Stloc_2);//new ds is now loc 2
+
+                       emitRemoveOldDataSourceHandler (il, "ValueChanged", delName, true);
+
+                       if (!string.IsNullOrEmpty(bindingDef.TargetMember)){
+                               if (bindingDef.TwoWay)//remove handler
+                                       emitRemoveOldDataSourceHandler(il, "ValueChanged", delName, false);
+
+                               il.Emit (OpCodes.Ldloc_2);
+                               il.Emit (OpCodes.Brfalse, newDSIsNull);//new ds is null
+                       }
+
+#region fetch initial Value
+                       if (!string.IsNullOrEmpty(bindingDef.TargetMember)){
+                               il.Emit (OpCodes.Ldloc_2); 
+                               il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);//load member name
+                               il.Emit (OpCodes.Call, CompilerServices.miGetMembIinfoWithRefx);
+                               il.Emit (OpCodes.Stloc_1);//save memberInfo
+                               il.Emit (OpCodes.Ldloc_1);//push mi for test if null
+                               il.Emit (OpCodes.Brfalse, cancelInit);//propertyLessBinding
+                       }
+
+                       il.Emit (OpCodes.Ldarg_1);//load source of dataSourceChanged which is the dest instance
+                       il.Emit (OpCodes.Ldloc_2);//load new datasource
+                       if (!string.IsNullOrEmpty(bindingDef.TargetMember)){
+                               il.Emit (OpCodes.Ldloc_1);//push mi for value fetching
+                               il.Emit (OpCodes.Call, CompilerServices.miGetValWithRefx);
+                       }
+                       CompilerServices.emitConvert (il, piSource.PropertyType);
+                       il.Emit (OpCodes.Callvirt, piSource.GetSetMethod ());
+#endregion
+
+                       if (!string.IsNullOrEmpty(bindingDef.TargetMember)){
+                               il.MarkLabel(cancelInit);
+                               //check if new dataSource implement IValueChange
+                               il.Emit (OpCodes.Ldloc_2);//load new datasource
+                               il.Emit (OpCodes.Isinst, typeof(IValueChange));
+                               il.Emit (OpCodes.Brfalse, cancel);
+
+                               il.Emit(OpCodes.Ldarg_0);//load ref to this instanciator onto the stack
+                               il.Emit (OpCodes.Ldarg_1);//load datasource change source
+                               il.Emit (OpCodes.Ldloc_2);//load new datasource
+                               il.Emit(OpCodes.Ldc_I4, dmVC);//load index of dynmathod
+                               il.Emit (OpCodes.Call, CompilerServices.miDSChangeEmitHelper);
+
+                               il.MarkLabel (cancel);
+
+                               if (bindingDef.TwoWay){
+                                       il.Emit (OpCodes.Ldarg_1);//arg1: dataSourceChange source, the origine of the binding
+                                       il.Emit (OpCodes.Ldstr, bindingDef.SourceMember);//arg2: orig member
+                                       il.Emit (OpCodes.Ldloc_2);//arg3: new datasource
+                                       il.Emit (OpCodes.Ldstr, bindingDef.TargetMember);//arg4: dest member
+                                       il.Emit (OpCodes.Call, CompilerServices.miDSReverseBinding);
+                               }
+
+                       }
+                       il.MarkLabel (newDSIsNull);
+                       il.Emit (OpCodes.Ret);
+
+                       //store dschange delegate in instatiator instance for access while instancing graphic object
+                       int delDSIndex = cachedDelegates.Count;
+                       cachedDelegates.Add(dm.CreateDelegate (CompilerServices.ehTypeDSChange, this));
+#endregion
+
+                       ctx.emitCachedDelegateHandlerAddition(delDSIndex, CompilerServices.eiDSChange);
+
+#if DEBUG_BINDING
+                       Debug.WriteLine("\tDataSource ValueChanged: " + delName);
+                       Debug.WriteLine("\tDataSource Changed: " + dm.Name);
+#endif
+               }
+               /// <summary>
+               /// Two way binding for datasource, graphicObj=>dataSource link, datasource value has priority
+               /// and will be set as init for source property (in emitDataSourceBindings func)
+               /// </summary>
+               /// <param name="orig">Graphic object instance, source of binding</param>
+               /// <param name="origMember">Origin member name</param>
+               /// <param name="dest">datasource instance, target of the binding</param>
+               /// <param name="destMember">Destination member name</param>
+               static void dataSourceReverseBinding(IValueChange orig, string origMember, object dest, string destMember){
+                       Type tOrig = orig.GetType ();
+                       Type tDest = dest.GetType ();
+                       PropertyInfo piOrig = tOrig.GetProperty (origMember);
+                       PropertyInfo piDest = tDest.GetProperty (destMember);
+
+                       if (piDest == null) {
+                               Debug.WriteLine ("Member '{0}' not found in new DataSource '{1}' of '{2}'", destMember, dest, orig);
+                               return;
+                       }
+#if DEBUG_BINDING
+                       Debug.WriteLine ("DS Reverse binding: Member '{0}' found in new DS '{1}' of '{2}'", destMember, dest, orig);
+#endif
+
+#region ValueChanged emit
+                       DynamicMethod dm = new DynamicMethod ("dyn_valueChanged" + NewId,
+                               typeof (void), CompilerServices.argsBoundValueChange, true);
+                       ILGenerator il = dm.GetILGenerator (256);
+
+                       System.Reflection.Emit.Label endMethod = il.DefineLabel ();
+
+                       il.Emit (OpCodes.Nop);
+
+                       //load value changed member name onto the stack
+                       il.Emit (OpCodes.Ldarg_2);
+                       il.Emit (OpCodes.Ldfld, CompilerServices.fiVCMbName);
+
+                       //test if it's the expected one
+                       il.Emit (OpCodes.Ldstr, origMember);
+                       il.Emit (OpCodes.Ldc_I4_4);//StringComparison.Ordinal
+                       il.Emit (OpCodes.Call, CompilerServices.stringEquals);
+                       il.Emit (OpCodes.Brfalse, endMethod);
+                       //set destination member with valueChanged new value
+                       //load destination ref
+                       il.Emit (OpCodes.Ldarg_0);
+                       //load new value onto the stack
+                       il.Emit (OpCodes.Ldarg_2);
+                       il.Emit (OpCodes.Ldfld, CompilerServices.fiVCNewValue);
+
+                       //if (piOrig.PropertyType != piDest.PropertyType)
+                               CompilerServices.emitConvert (il, piOrig.PropertyType, piDest.PropertyType);
+
+                       il.Emit (OpCodes.Callvirt, piDest.GetSetMethod ());
+
+                       il.MarkLabel (endMethod);
+                       il.Emit (OpCodes.Ret);
+#endregion
+
+                       orig.ValueChanged += (EventHandler<ValueChangeEventArgs>)dm.CreateDelegate (typeof(EventHandler<ValueChangeEventArgs>), dest);
+               }
+#endregion
+
+               /// <summary>
+               /// search for graphic object type in crow assembly, if not found,
+               /// search for type independently of namespace in all the loaded assemblies
+               /// </summary>
+               /// <remarks>
+               /// </remarks>
+               /// <returns>the corresponding type object</returns>
+               /// <param name="typeName">graphic object type name without its namespace</param>
+               Type tryGetGOType (string typeName){
+                       if (knownGOTypes.ContainsKey (typeName))
+                               return knownGOTypes [typeName];
+                       Type t = Type.GetType ("Crow." + typeName);
+                       if (t != null) {
+                               knownGOTypes.Add (typeName, t);
+                               return t;
+                       }                       
+                       foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies()) {
+                               if (a.IsDynamic)
+                                       continue;
+                               foreach (Type expT in a.GetExportedTypes ()) {
+                                       if (expT.Name != typeName)
+                                               continue;
+                                       knownGOTypes.Add (typeName, expT);
+                                       return expT;
+                               }
+                       }
+                       return null;
+               }
+       }
+}
+
diff --git a/Crow/src/Interface.cs b/Crow/src/Interface.cs
new file mode 100644 (file)
index 0000000..ecc1fbf
--- /dev/null
@@ -0,0 +1,1328 @@
+//
+// Interface.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Threading;
+using vkvg;
+using Crow.IML;
+
+
+namespace Crow
+{
+       /// <summary>
+       /// The Interface Class is the root of crow graphic trees. It is thread safe allowing
+       /// application to run multiple interfaces in different threads.
+       /// It provides the Dirty bitmap and zone of the interface to be drawn on screen.
+       /// </summary>
+       /// <remarks>
+       /// The Interface contains :
+       ///     - rendering and layouting queues and logic.
+       ///     - helpers to load XML interfaces files directely bound to this interface
+       ///     - global static constants and variables of CROW
+       ///     - Keyboard and Mouse logic
+       ///     - the resulting bitmap of the interface
+       /// 
+       /// the master branch and the nuget package includes an OpenTK renderer which allows
+       /// the creation of multiple threaded interfaces.
+       /// 
+       /// If you intend to create another renderer (GDK, vulkan, etc) the minimal step is to
+       /// put an interface instance as member of your root object and call (optionally in another thread) the update function
+       /// at regular interval. Then you have to call
+       /// mouse, keyboard and resize functions of the interface when those events occurs in the host app.
+       /// 
+       /// The resulting surface (a byte array in the OpenTK renderer) is made available and protected with the
+       /// RenderMutex of the interface.
+       /// </remarks>
+       public class Interface : ILayoutable, IDisposable ,IValueChange
+       {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       //Debug.WriteLine ("Value changed: {0}->{1} = {2}", this, MemberName, _value);
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               #region CTOR
+               static Interface(){
+                       CrowConfigRoot =
+                               System.IO.Path.Combine(
+                                       Environment.GetFolderPath(Environment.SpecialFolder.UserProfile),
+                                       ".config");
+                       CrowConfigRoot = System.IO.Path.Combine (CrowConfigRoot, "crow");
+                       if (!Directory.Exists (CrowConfigRoot))
+                               Directory.CreateDirectory (CrowConfigRoot);
+
+                       //ensure all assemblies are loaded, because IML could contains classes not instanciated in source
+                       foreach (string af in Directory.GetFiles (AppDomain.CurrentDomain.BaseDirectory, "*.dll")){
+                               try {
+                                       Assembly.LoadFrom (af); 
+                               } catch (Exception ex) {
+                                       Console.WriteLine ("{0} not loaded as assembly.", af);
+                               }
+                       }
+
+                       //FontRenderingOptions = new FontOptions ();
+                       //FontRenderingOptions.Antialias = Antialias.Subpixel;
+                       //FontRenderingOptions.HintMetrics = HintMetrics.On;
+                       //FontRenderingOptions.HintStyle = HintStyle.Full;
+                       //FontRenderingOptions.SubpixelOrder = SubpixelOrder.Default;
+               }
+
+               public Interface(vkvg.Device dev, int width=800, int height=600){
+                       this.dev = dev;
+
+                       clientRectangle = new Rectangle (0, 0, width, height);
+
+                       Init ();
+
+                       ProcessResize (clientRectangle);
+               }
+               #endregion
+
+               public vkvg.Device dev;
+               public vkvg.Surface surf;
+
+               protected bool running;
+
+               public void Run () {
+                       //load default main.crow if present
+                       try {
+                               Load ("#main.crow").DataSource = this;
+                       } catch {}
+
+                       running = true;
+
+                       int frameCount = 0;
+
+                       while (running) {
+                               Update ();
+                               ProcessEvents ();
+
+#if MEASURE_TIME
+                               if (frameCount++ < 100)
+                                       continue;
+                               for (int i = 0; i < PerfMeasures.Count; i++) {
+                                       PerfMeasures [i].NotifyChanges ();
+                               }
+                               frameCount = 0;
+#endif
+                       }
+               }
+
+               #region IDisposable Support
+               private bool disposedValue = false; // To detect redundant calls
+
+               protected virtual void Dispose(bool disposing)
+               {
+                       if (!disposedValue)
+                       {
+                               if (disposing)
+                               {
+                                       ClearInterface ();
+                                       surf?.Dispose ();
+                               }
+
+
+                               disposedValue = true;
+                       }
+               }
+
+               // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
+               ~Interface() {
+                       // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
+                       Dispose(false);
+               }
+
+               // This code added to correctly implement the disposable pattern.
+               public void Dispose()
+               {
+                       Dispose(true);
+                       GC.SuppressFinalize(this);
+               }
+               #endregion
+
+               public void ProcessEvents() {
+
+                       if (armedClick != null) {
+                               if (lastClickTime.ElapsedMilliseconds > DoubleClick) {
+                                       //cancel double click and 
+                                       armedClick.onMouseClick (armedClick, armedClickEventArgs);
+                                       armedClick = null;
+                               }
+                       }
+
+                       Widget w = _hoverWidget;  //previous hover widget 
+                               
+                       //if (!FocusOnHover || (w == _hoverWidget))
+                       //      return;
+
+                       //w = _hoverWidget;
+                       while (w != null) {
+                               if (w.Focusable) {
+                                       FocusedWidget = _hoverWidget;
+                                       break;
+                               }
+                               w = w.focusParent;
+                       }               
+
+               }
+
+               public void Init () {
+                       CultureInfo.DefaultThreadCurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
+
+                       CurrentInterface = this;
+                       //loadCursors ();
+                       loadStyling ();
+
+                       #if MEASURE_TIME
+                       PerfMeasures.Add (updateMeasure);
+                       PerfMeasures.Add (drawingMeasure);
+                       PerfMeasures.Add (layoutingMeasure);
+                       PerfMeasures.Add (clippingMeasure);
+                       #endif
+               }
+
+               #region Static and constants
+               /// <summary>
+               /// Crow configuration root path
+               /// </summary>
+               public static string CrowConfigRoot;
+               /// <summary>If true, mouse focus is given when mouse is over control</summary>
+               public static bool FocusOnHover = true;
+               /// <summary> Threshold to catch borders for sizing </summary>
+               public static int BorderThreshold = 5;
+               /// <summary> delay before tooltip appear </summary>
+               public static int ToolTipDelay = 500;
+               /// <summary>Double click threshold in milisecond</summary>
+               public static int DoubleClick = 240;//max duration between two mouse_down evt for a dbl clk in milisec.
+               /// <summary> Time to wait in millisecond before starting repeat loop</summary>
+               public static int DeviceRepeatDelay = 700;
+               /// <summary> Time interval in millisecond between device event repeat</summary>
+               public static int DeviceRepeatInterval = 40;
+               public static float WheelIncrement = 1;
+               /// <summary>Tabulation size in Text controls</summary>
+               public static int TabSize = 4;
+               public static string LineBreak = "\n";
+               /// <summary> Allow rendering of interface in development environment </summary>
+               public static bool DesignerMode = false;
+               /// <summary> Disable caching for a widget if this threshold is reached </summary>
+               public const int MaxCacheSize = 2048;
+               /// <summary> Above this count, the layouting is discard from the current
+               /// update cycle and requeued for the next</summary>
+               public const int MaxLayoutingTries = 3;
+               /// <summary> Above this count, the layouting is discard for the widget and it
+               /// will not be rendered on screen </summary>
+               public const int MaxDiscardCount = 5;
+               /// <summary> Global font rendering settings for Cairo </summary>
+               //public static FontOptions FontRenderingOptions;
+               /// <summary> Global font rendering settings for Cairo </summary>
+               //public static Antialias Antialias = Antialias.Subpixel;
+
+               /// <summary>
+               /// Each control need a ref to the root interface containing it, if not set in GraphicObject.currentInterface,
+               /// the ref of this one will be stored in GraphicObject.currentInterface
+               /// </summary>
+               public static Interface CurrentInterface;
+               Stopwatch lastClickTime = new Stopwatch();
+               internal Widget armedClick;//store widget with double click on first click
+               internal MouseButtonEventArgs armedClickEventArgs;
+
+               #endregion
+
+               #region Public Fields
+               /// <summary>Graphic Tree of this interface</summary>
+               public List<Widget> GraphicTree = new List<Widget>();
+               /// <summary>Interface's resulting bitmap</summary>
+               //public byte[] bmp;
+               /// <summary>resulting bitmap limited to last redrawn part</summary>
+               //public byte[] dirtyBmp;
+               /// <summary>True when host has to repaint Interface</summary>
+               public bool IsDirty;
+               /// <summary>Coordinate of the dirty bmp on the original bmp</summary>
+               public Rectangle DirtyRect;
+               /// <summary>Locked for each layouting operation</summary>
+               public object LayoutMutex = new object();
+               /// <summary>Sync mutex between host and Crow for rendering operations (bmp, dirtyBmp,...)</summary>
+               public object RenderMutex = new object();
+               /// <summary>Global lock of the update cycle</summary>
+               public object UpdateMutex = new object();
+               /// <summary>Global lock of the clipping queue</summary>
+               public object ClippingMutex = new object();
+               //TODO:share resource instances
+               /// <summary>
+               /// Store loaded resources instances shared among controls to reduce memory footprint
+               /// </summary>
+               public Dictionary<string,object> Ressources = new Dictionary<string, object>();
+               /// <summary>The Main layouting queue.</summary>
+               public Queue<LayoutingQueueItem> LayoutingQueue = new Queue<LayoutingQueueItem> ();
+               /// <summary>Store discarded lqi between two updates</summary>
+               public Queue<LayoutingQueueItem> DiscardQueue;
+               /// <summary>Main drawing queue, holding layouted controls</summary>
+               public Queue<Widget> ClippingQueue = new Queue<Widget>();
+               public string Clipboard;//TODO:use object instead for complex copy paste
+               /// <summary>each IML and fragments (such as inline Templates) are compiled as a Dynamic Method stored here
+               /// on the first instance creation of a IML item.
+               /// </summary>
+               public Dictionary<String, Instantiator> Instantiators = new Dictionary<string, Instantiator>();
+               public Dictionary<String, Instantiator> Templates = new Dictionary<string, Instantiator> ();
+               /// <summary>
+               /// default templates dic by metadata token
+               /// </summary>
+               public Dictionary<int, Instantiator> DefaultTemplates = new Dictionary<int, Instantiator> ();
+               /// <summary>
+               /// Item templates stored with their index
+               /// </summary>
+               public Dictionary<String, ItemTemplate> ItemTemplates = new Dictionary<string, ItemTemplate> ();
+
+               public List<CrowThread> CrowThreads = new List<CrowThread>();//used to monitor thread finished
+
+               public DragDropEventArgs DragAndDropOperation = null;
+               public Surface DragImage = null;
+               public int DragImageWidth, DragImageHeight, DragImageX, DragImageY;
+               public void ClearDragImage () {
+                       lock (UpdateMutex) {                            
+                               clipping.AddRectangle(new Rectangle (DragImageX, DragImageY, DragImageWidth, DragImageHeight));                         
+                               DragImage.Dispose();
+                               DragImage = null;
+                       }                       
+               }
+               #endregion
+
+               #region Private Fields
+               /// <summary>Client rectangle in the host context</summary>
+               protected Rectangle clientRectangle;
+               /// <summary>Clipping rectangles on the root context</summary>
+               Rectangles clipping = new Rectangles();
+               /// <summary>Main Cairo context</summary>
+               Context ctx;
+               #endregion
+
+               #region Default values and Style loading
+               /// Default values of properties from GraphicObjects are retrieve from XML Attributes.
+               /// The reflexion process used to retrieve those values being very slow, it is compiled in MSIL
+               /// and injected as a dynamic method referenced in the DefaultValuesLoader Dictionnary.
+               /// The compilation is done on the first object instancing, and is also done for custom widgets
+               public delegate void LoaderInvoker(object instance);
+               /// <summary>Store one loader per StyleKey</summary>
+               public Dictionary<String, LoaderInvoker> DefaultValuesLoader = new Dictionary<string, LoaderInvoker>();
+               /// <summary>Store dictionnary of member/value per StyleKey</summary>
+               public Dictionary<string, Style> Styling;
+               /// <summary> parse all styling data's during application startup and build global Styling Dictionary </summary>
+               protected virtual void loadStyling() {
+                       Styling = new Dictionary<string, Style> ();
+
+                       //fetch styling info in this order, if member styling is alreadey referenced in previous
+                       //assembly, it's ignored.
+                       loadStylingFromAssembly (Assembly.GetEntryAssembly ());
+                       loadStylingFromAssembly (Assembly.GetExecutingAssembly ());
+               }
+               /// <summary> Search for .style resources in assembly </summary>
+               void loadStylingFromAssembly (Assembly assembly) {
+                       if (assembly == null)
+                               return;
+                       foreach (string s in assembly
+                               .GetManifestResourceNames ()
+                               .Where (r => r.EndsWith (".style", StringComparison.OrdinalIgnoreCase))) {
+                               using (Stream stream = assembly.GetManifestResourceStream (s)) {
+                                       new StyleReader (this.Styling, stream, s);
+                               }
+
+                       }
+               }
+
+               #endregion
+
+
+               #region Load/Save
+               /// <summary>get template stream from path providing the declaring type for which
+               /// this template is loaded. If not found in entry assembly, the assembly where the type is defined
+               /// will be searched
+               /// </summary>
+               /// <returns>The template stream</returns>
+               public virtual Stream GetTemplateStreamFromPath (string path, Type declaringType)
+               {
+                       Stream s = null;
+                       if (path.StartsWith ("#", StringComparison.Ordinal)) {
+                               string resId = path.Substring (1);
+                               s = Assembly.GetEntryAssembly ().GetManifestResourceStream (resId);
+                               if (s == null)
+                                       s = Assembly.GetAssembly (declaringType).GetManifestResourceStream (resId);
+                               if (s == null)
+                                       throw new Exception ($"Template not found '{path}'");
+                       } else {
+                               if (!File.Exists (path))
+                                       throw new FileNotFoundException ("Template not found: ", path);
+                               s = new FileStream (path, FileMode.Open, FileAccess.Read);
+                       }
+                       return s;
+               }
+               /// <summary>Open file or find a resource from path string</summary>
+               /// <returns>A file or resource stream</returns>
+               /// <param name="path">This could be a normal file path, or an embedded ressource ID
+               /// Resource ID's must be prefixed with '#' character</param>
+               public virtual Stream GetStreamFromPath (string path)
+               {
+                       Stream stream = null;
+
+                       if (path.StartsWith ("#", StringComparison.Ordinal)) {
+                               string resId = path.Substring (1);
+                               string assemblyName = resId.Split ('.') [0];
+                               Assembly a = AppDomain.CurrentDomain.GetAssemblies ().FirstOrDefault (aa => aa.GetName ().Name == assemblyName);
+                               if (a == null)
+                                       throw new Exception ($"Assembly '{assemblyName}' not found for ressource '{path}'.");
+                               stream = a.GetManifestResourceStream (resId);
+                               if (stream == null)
+                                       throw new Exception ("Resource not found: " + path);
+                       } else {
+                               if (!File.Exists (path))
+                                       throw new FileNotFoundException ("File not found: ", path);
+                               stream = new FileStream (path, FileMode.Open, FileAccess.Read);
+                       }
+                       return stream;
+               }
+               public static Stream StaticGetStreamFromPath (string path)
+               {
+                       Stream stream = null;
+
+                       if (path.StartsWith ("#", StringComparison.Ordinal)) {
+                               string resId = path.Substring (1);
+                               string assemblyName = resId.Split ('.') [0];
+                               Assembly a = AppDomain.CurrentDomain.GetAssemblies ().FirstOrDefault (aa => aa.GetName ().Name == assemblyName);
+                               if (a == null)
+                                       throw new Exception ($"Assembly '{assemblyName}' not found for ressource '{path}'.");
+                               stream = a.GetManifestResourceStream (resId);
+                               /*foreach (var s in a.GetManifestResourceNames()) {
+                                       Console.WriteLine (s);
+                               }*/
+                               if (stream == null)
+                                       throw new Exception ("Resource not found: " + path);
+                       } else {
+                               if (!File.Exists (path))
+                                       throw new FileNotFoundException ("File not found: ", path);
+                               stream = new FileStream (path, FileMode.Open, FileAccess.Read);
+                       }
+                       return stream;
+               }
+               /// <summary>
+               /// Add the content of the IML fragment to the graphic tree of this interface
+               /// </summary>
+               /// <returns>return the new instance for convenience, may be ignored</returns>
+               /// <param name="imlFragment">a valid IML string</param>
+               public Widget LoadIMLFragment (string imlFragment) {
+                       lock (UpdateMutex) {
+                               Widget tmp = CreateITorFromIMLFragment (imlFragment).CreateInstance();
+                               AddWidget (tmp);
+                               return tmp;
+                       }
+               }
+               /// <summary>
+               /// Create an instantiator bound to this interface from the IML fragment
+               /// </summary>
+               /// <returns>return the new instantiator</returns>
+               /// <param name="imlFragment">a valid IML string</param>
+               public Instantiator CreateITorFromIMLFragment (string imlFragment) {                    
+                       return Instantiator.CreateFromImlFragment (this, imlFragment);
+               }
+               /// <summary>
+               /// Create an instance of a GraphicObject and add it to the GraphicTree of this Interface
+               /// </summary>
+               /// <returns>new instance of graphic object created</returns>
+               /// <param name="path">path of the iml file to load</param>
+               public Widget Load (string path)
+               {
+                       lock (UpdateMutex) {
+                               Widget tmp = CreateInstance (path);
+                               AddWidget (tmp);
+                               return tmp;
+                       }
+               }
+               /// <summary>
+               /// Create an instance of a GraphicObject linked to this interface but not added to the GraphicTree
+               /// </summary>
+               /// <returns>new instance of graphic object created</returns>
+               /// <param name="path">path of the iml file to load</param>
+               public virtual Widget CreateInstance (string path)
+               {
+                       try {
+                               return GetInstantiator (path).CreateInstance ();
+                       } catch (Exception ex) {
+                               throw new Exception ("Error loading <" + path + ">:", ex);
+                       }
+               }
+               /// <summary>
+               /// Create an instance of a GraphicObject linked to this interface but not added to the GraphicTree
+               /// </summary>
+               /// <returns>new instance of graphic object created</returns>
+               /// <param name="path">path of the iml file to load</param>
+               public virtual Widget CreateTemplateInstance (string path, Type declaringType)
+               {
+                       try {
+                               if (!Templates.ContainsKey (path))
+                                       Templates [path] = new Instantiator (this, GetTemplateStreamFromPath(path, declaringType), path);
+                               return Templates [path].CreateInstance ();
+                       } catch (Exception ex) {
+                               throw new Exception ("Error loading Template <" + path + ">:", ex);
+                       }
+               }
+               /// <summary>
+               /// Fetch instantiator from cache or create it.
+               /// </summary>
+               /// <returns>new Instantiator</returns>
+               /// <param name="path">path of the iml file to load</param>
+               public Instantiator GetInstantiator(string path){
+                       if (!Instantiators.ContainsKey(path))
+                               Instantiators [path] = new Instantiator(this, path);
+                       return Instantiators [path];
+               }
+               /// <summary>Item templates are derived from instantiator, this function
+               /// try to fetch the requested one in the cache or create it.
+               /// They have additional properties for recursivity and
+               /// custom display per item type</summary>
+               public virtual ItemTemplate GetItemTemplate(string path, Type declaringType){
+                       if (!ItemTemplates.ContainsKey(path))
+                               ItemTemplates [path] = new ItemTemplate(this, path, declaringType);
+                       return ItemTemplates [path] as ItemTemplate;
+               }
+               #endregion
+
+               #region focus
+               Widget _activeWidget;   //button is pressed on widget
+               Widget _hoverWidget;            //mouse is over
+               Widget _focusedWidget;  //has keyboard (or other perif) focus
+
+               /// <summary>Widget is focused and button is down or another perif action is occuring
+               /// , it can not lose focus while Active</summary>
+               public Widget ActiveWidget
+               {
+                       get { return _activeWidget; }
+                       set
+                       {
+                               if (_activeWidget == value)
+                                       return;
+
+                               if (_activeWidget != null)
+                                       _activeWidget.IsActive = false;
+
+                               _activeWidget = value;
+
+                               #if DEBUG_FOCUS
+                               NotifyValueChanged("ActiveWidget", _activeWidget);
+                               #endif
+
+                               if (_activeWidget != null)
+                               {
+                                       _activeWidget.IsActive = true;
+                                       #if DEBUG_FOCUS
+                                       NotifyValueChanged("ActiveWidget", _activeWidget);
+                                       Debug.WriteLine("Active => " + _activeWidget.ToString());
+                               }else
+                                       Debug.WriteLine("Active => null");
+                                       #else
+                               }
+                                       #endif
+                       }
+               }
+               /// <summary>Pointer is over the widget</summary>
+               public virtual Widget HoverWidget
+               {
+                       get { return _hoverWidget; }
+                       set {
+                               if (_hoverWidget == value)
+                                       return;
+
+                               if (_hoverWidget != null)
+                                       _hoverWidget.IsHover = false;
+
+                               _hoverWidget = value;
+
+                               if (FocusOnHover) {
+                                       Widget w = _hoverWidget;  //previous hover widget 
+                                       while (w != null) {
+                                               if (w.Focusable) {
+                                                       FocusedWidget = w;
+                                                       break;
+                                               }
+                                               w = w.focusParent;
+                                       }
+                               }
+
+                               #if DEBUG_FOCUS
+                               NotifyValueChanged ("HoverWidget", _hoverWidget);
+                               #endif
+                               /*
+                               if (_hoverWidget != null)
+                               {
+                                       _hoverWidget.IsHover = true;
+                                       #if DEBUG_FOCUS
+                                       Debug.WriteLine("Hover => " + _hoverWidget.ToString());
+                                       }else
+                                       Debug.WriteLine("Hover => null");
+                                       #else
+                               }
+                                       #endif
+                                       */
+                       }
+               }
+               /// <summary>Widget has the keyboard or mouse focus</summary>
+               public Widget FocusedWidget {
+                       get { return _focusedWidget; }
+                       set {
+                               if (_focusedWidget == value)
+                                       return;
+                               if (_focusedWidget != null)
+                                       _focusedWidget.HasFocus = false;
+                               _focusedWidget = value;
+                               #if DEBUG_FOCUS
+                               NotifyValueChanged("FocusedWidget", _focusedWidget);
+                               #endif
+                               if (_focusedWidget != null)
+                                       _focusedWidget.HasFocus = true;
+                       }
+               }
+               #endregion
+
+               #region UPDATE Loops
+               /// <summary>Enqueue Graphic object for Repaint, DrawingQueue is locked because
+               /// GraphObj's property Set methods could trigger an update from another thread
+               /// Once in that queue, that means that the layouting of obj and childs have succeed,
+               /// the next step when dequeued will be clipping registration</summary>
+               public void EnqueueForRepaint(Widget g)
+               {                       
+                       lock (ClippingMutex) {
+                               if (g.IsQueueForClipping)
+                                       return;
+                               #if DEBUG_LOG
+                               DebugLog.AddEvent(DbgEvtType.GOEnqueueForRepaint, g);
+                               #endif  
+                               ClippingQueue.Enqueue (g);
+                               g.IsQueueForClipping = true;
+                       }
+               }
+               /// <summary>Main Update loop, executed in this interface thread, protected by the UpdateMutex
+               /// Steps:
+               ///     - execute device Repeat events
+               ///     - Layouting
+               ///     - Clipping
+               ///     - Drawing
+               /// Result: the Interface bitmap is drawn in memory (byte[] bmp) and a dirtyRect and bitmap are available
+               /// </summary>
+               public void Update(){
+
+                       /*CrowThread[] tmpThreads;
+                       lock (CrowThreads) {
+                               tmpThreads = new CrowThread[CrowThreads.Count];
+                               Array.Copy (CrowThreads.ToArray (), tmpThreads, CrowThreads.Count);
+                       }
+                       for (int i = 0; i < tmpThreads.Length; i++)
+                               tmpThreads [i].CheckState ();*/
+                       if (mouseRepeatTimer.ElapsedMilliseconds > 0) {
+                               if (_hoverWidget != null && _hoverWidget.MouseRepeat) {
+                                       int repeatCount = (int)mouseRepeatTimer.ElapsedMilliseconds / DeviceRepeatInterval - mouseRepeatCount;
+                                       for (int i = 0; i < repeatCount; i++)
+                                               _hoverWidget.onMouseDown (_hoverWidget, lastMouseDownEvent);
+                                       mouseRepeatCount += repeatCount;
+                               }
+                       } else if (lastMouseDown.ElapsedMilliseconds > DeviceRepeatDelay) 
+                               mouseRepeatTimer.Start ();
+
+                       if (!Monitor.TryEnter (UpdateMutex))
+                               return;
+
+                       #if MEASURE_TIME
+                       updateMeasure.StartCycle();
+                       #endif
+
+                       /*#if DEBUG_LOG
+                       DebugLog.AddEvent (DbgEvtType.IFaceUpdate);
+                       #endif*/
+
+                       processLayouting ();
+
+                       clippingRegistration ();
+
+                       processDrawing ();
+
+                       #if MEASURE_TIME
+                       updateMeasure.StopCycle();
+                       #endif
+
+                       Monitor.Exit (UpdateMutex);
+               }
+               /// <summary>Layouting loop, this is the first step of the udpate and process registered
+               /// Layouting queue items. Failing LQI's are requeued in this cycle until MaxTry is reached which
+               /// trigger an enqueue for the next Update Cycle</summary>
+               protected virtual void processLayouting(){
+                       #if MEASURE_TIME
+                       layoutingMeasure.StartCycle();
+                       #endif
+                       if (Monitor.TryEnter (LayoutMutex)) {
+                               #if DEBUG_LOG
+                               if (LayoutingQueue.Count > 0)
+                                       DebugLog.AddEvent (DbgEvtType.IFaceStartLayouting);
+                               #endif
+                               DiscardQueue = new Queue<LayoutingQueueItem> ();
+                               //Debug.WriteLine ("======= Layouting queue start =======");
+                               LayoutingQueueItem lqi;
+                               while (LayoutingQueue.Count > 0) {
+                                       lqi = LayoutingQueue.Dequeue ();
+                                       lqi.ProcessLayouting ();
+                               }
+                               LayoutingQueue = DiscardQueue;
+                               Monitor.Exit (LayoutMutex);
+                               DiscardQueue = null;
+                       }
+                       /*#if DEBUG_LOG
+                       DebugLog.AddEvent (DbgEvtType.IFaceStartLayouting);
+                       #endif*/
+                       #if MEASURE_TIME
+                       layoutingMeasure.StopCycle();
+                       #endif
+               }
+               /// <summary>Degueue Widget to clip from DrawingQueue and register the last painted slot and the new one
+               /// Clipping rectangles are added at each level of the tree from leef to root, that's the way for the painting
+               /// operation to known if it should go down in the tree for further graphic updates and repaints</summary>
+               void clippingRegistration(){
+                       #if MEASURE_TIME
+                       clippingMeasure.StartCycle();
+                       #endif
+                       #if DEBUG_LOG
+                       if (ClippingQueue.Count > 0)
+                               DebugLog.AddEvent (DbgEvtType.IFaceStartClipping);
+                       #endif
+                       Widget g = null;
+                       while (ClippingQueue.Count > 0) {
+                               lock (ClippingMutex) {
+                                       g = ClippingQueue.Dequeue ();
+                                       g.IsQueueForClipping = false;
+                               }
+                               g.ClippingRegistration ();
+                       }
+                       /*#if DEBUG_LOG
+                       DebugLog.AddEvent (DbgEvtType.IFaceEndClipping);
+                       #endif*/
+                       #if MEASURE_TIME
+                       clippingMeasure.StopCycle();
+                       #endif
+               }
+               Color clippingStrokeColor = Color.Magenta.AdjustAlpha(0.8);
+               /// <summary>Clipping Rectangles drive the drawing process. For compositing, each object under a clip rectangle should be
+               /// repainted. If it contains also clip rectangles, its cache will be update, or if not cached a full redraw will take place</summary>
+               void processDrawing(){
+                       #if MEASURE_TIME
+                       drawingMeasure.StartCycle();
+                       #endif
+                       #if DEBUG_LOG
+                       if (!clipping.IsEmpty)
+                               DebugLog.AddEvent (DbgEvtType.IFaceStartDrawing);
+                       #endif
+                       if (DragImage != null)
+                               clipping.AddRectangle(new Rectangle (DragImageX, DragImageY, DragImageWidth, DragImageHeight));
+
+                       lock (RenderMutex) {
+                               using (ctx = new Context (surf)) {
+                                       if (!clipping.IsEmpty) {
+                                               IsDirty = true;
+
+                                               clipping.clearAndClip (ctx);
+
+                                               for (int i = GraphicTree.Count - 1; i >= 0; i--) {
+                                                       Widget p = GraphicTree[i];
+                                                       if (!p.Visible)
+                                                               continue;
+                                                       if (!clipping.intersect (p.Slot))
+                                                               continue;
+
+                                                       //ctx.Save ();
+                                                       p.Paint (ref ctx);
+                                                       //ctx.Restore ();
+                                               }
+
+#if DEBUG_CLIP_RECTANGLE
+                                       clippingStrokeColor.R += 0.1f;
+                                       if (clippingStrokeColor.R > 1f)
+                                               clippingStrokeColor.R = 0;
+                                       ctx.LineWidth = 1;
+                                       clipping.stroke (ctx, clippingStrokeColor);
+                                       ctx.Stroke ();
+#endif
+                                               //clipping.stroke (ctx, new Color (1, 0, 0));
+                                               clipping.Reset ();
+                                               //}
+                                               //surf.WriteToPng (@"/mnt/data/test.png");
+
+                                       }
+                               }
+                       }
+                       /*#if DEBUG_LOG
+                       DebugLog.AddEvent (DbgEvtType.IFaceEndDrawing);
+                       #endif*/
+                       #if MEASURE_TIME
+                       drawingMeasure.StopCycle();
+                       #endif
+               }
+               #endregion
+
+               #region GraphicTree handling
+               /// <summary>Add widget to the Graphic tree of this interface and register it for layouting</summary>
+               public Widget AddWidget(Widget g)
+               {
+                       g.Parent = this;
+                       int ptr = 0;
+                       Window newW = g as Window;
+                       if (newW != null) {
+                               while (ptr < GraphicTree.Count) {
+                                       Window w = GraphicTree [ptr] as Window;
+                                       if (w == null)
+                                               break;
+                                       if (newW.AlwaysOnTop || !w.AlwaysOnTop)
+                                               break;
+                                       
+                                       ptr++;
+                               }
+                       }
+
+                       lock (UpdateMutex)
+                               GraphicTree.Insert (ptr, g);
+
+                       g.RegisteredLayoutings = LayoutingType.None;
+                       g.RegisterForLayouting (LayoutingType.Sizing | LayoutingType.ArrangeChildren);
+
+                       return g;
+               }
+               /// <summary>Set visible state of widget to false and delete if from the graphic tree</summary>
+               public void DeleteWidget(Widget g)
+               {
+                       lock (UpdateMutex) {
+                               RegisterClip (g.ScreenCoordinates (g.LastPaintedSlot));
+                               GraphicTree.Remove (g);
+                               g.Parent = null;
+                               g.Dispose ();
+                       }
+               }
+               /// <summary>Set visible state of widget to false and remove if from the graphic tree</summary>
+               public void RemoveWidget(Widget g)
+               {
+//                     if (g.Contains(HoverWidget)) {
+//                             while (HoverWidget != g.focusParent) {
+//                                     HoverWidget.onMouseLeave (HoverWidget, null);
+//                                     HoverWidget = HoverWidget.focusParent;
+//                             }
+//                     }
+                       lock (UpdateMutex) {
+                               RegisterClip (g.ScreenCoordinates (g.LastPaintedSlot));
+                               GraphicTree.Remove (g);
+                               g.Parent = null;
+                       }
+               }
+               /// <summary> Remove all Graphic objects from top container </summary>
+               public void ClearInterface()
+               {
+                       lock (UpdateMutex) {
+                               while (GraphicTree.Count > 0) {
+                                       //TODO:parent is not reset to null because object will be added
+                                       //to ObjectToRedraw list, and without parent, it fails
+                                       Widget g = GraphicTree [0];
+                                       RegisterClip (g.ScreenCoordinates (g.LastPaintedSlot));
+                                       GraphicTree.RemoveAt (0);
+                                       g.Dispose ();
+                               }
+                       }
+                       #if DEBUG_LAYOUTING
+                       LQIsTries = new List<LQIList>();
+                       curLQIsTries = new LQIList();
+                       LQIs = new List<LQIList>();
+                       curLQIs = new LQIList();
+                       #endif
+               }
+               /// <summary> Put widget on top of other root widgets</summary>
+               public void PutOnTop(Widget g, bool isOverlay = false)
+               {
+                       int ptr = 0;
+                       Window newW = g as Window;
+                       if (newW != null) {
+                               while (ptr < GraphicTree.Count) {
+                                       Window w = GraphicTree [ptr] as Window;
+                                       if (w != null) {
+                                               if (newW.AlwaysOnTop || !w.AlwaysOnTop)
+                                                       break;
+                                       }
+                                       ptr++;
+                               }
+                       }
+                       if (GraphicTree.IndexOf(g) > ptr)
+                       {
+                               lock (UpdateMutex) {
+                                       GraphicTree.Remove (g);
+                                       GraphicTree.Insert (ptr, g);
+                               }
+                               EnqueueForRepaint (g);
+                       }
+               }
+
+               /// <summary>Search a Graphic object in the tree named 'nameToFind'</summary>
+               public Widget FindByName (string nameToFind)
+               {
+                       foreach (Widget w in GraphicTree) {
+                               Widget r = w.FindByName (nameToFind);
+                               if (r != null)
+                                       return r;
+                       }
+                       return null;
+               }
+               #endregion
+
+               /// <summary>
+               /// Resize the interface. This function should be called by the host
+               /// when window resize event occurs. 
+               /// </summary>
+               /// <param name="bounds">bounding box of the interface</param>
+               public virtual void ProcessResize(Rectangle bounds){
+                       lock (UpdateMutex) {
+                               clientRectangle = bounds;
+                               surf?.Dispose ();
+                               surf = new Surface (dev, ClientRectangle.Width, ClientRectangle.Height);
+
+                               foreach (Widget g in GraphicTree)
+                                       g.RegisterForLayouting (LayoutingType.All);
+
+                               RegisterClip (clientRectangle);
+                       }
+               }
+
+               #region Mouse and Keyboard Handling
+
+               public MouseState Mouse;
+               Stopwatch lastMouseDown = new Stopwatch (), mouseRepeatTimer = new Stopwatch ();
+               int mouseRepeatCount;
+               MouseButtonEventArgs lastMouseDownEvent;
+
+               //public MouseCursors MouseCursor {
+               //      set {
+               //              //backend.SetCursor (value);
+               //      }
+               //}
+               /// <summary>Processes mouse move events from the root container, this function
+               /// should be called by the host on mouse move event to forward events to crow interfaces</summary>
+               /// <returns>true if mouse is in the interface</returns>
+               public virtual bool ProcessMouseMove(int x, int y)
+               {
+                       int deltaX = x - Mouse.X;
+                       int deltaY = y - Mouse.Y;
+                       Mouse.X = x;
+                       Mouse.Y = y;
+                       MouseMoveEventArgs e = new MouseMoveEventArgs (x, y, deltaX, deltaY) {
+                               Mouse = Mouse
+                       };
+
+                       if (armedClick != null) {
+                               armedClick.onMouseClick (armedClick, armedClickEventArgs);
+                               armedClick = null;
+                       }
+
+                       if (ActiveWidget != null && DragAndDropOperation == null) {
+                               //TODO, ensure object is still in the graphic tree
+                               //send move evt even if mouse move outside bounds
+                               _activeWidget.onMouseMove (this, e);
+                               return true;
+                       }
+
+                       if (DragAndDropOperation != null)//drag source cant have hover event, so move has to be handle here
+                               DragAndDropOperation.DragSource.onMouseMove (this, e);                  
+
+                       if (_hoverWidget != null) {
+                               resetTooltip ();
+                               //check topmost graphicobject first
+                               Widget tmp = _hoverWidget;
+                               Widget topc = null;
+                               while (tmp is Widget) {
+                                       topc = tmp;
+                                       tmp = tmp.focusParent;
+                               }
+                               int idxhw = GraphicTree.IndexOf (topc);
+                               if (idxhw != 0) {
+                                       int i = 0;
+                                       while (i < idxhw) {
+                                               if (!GraphicTree [i].isPopup) {
+                                                       if (GraphicTree [i].MouseIsIn (e.Position)) {
+                                                               while (_hoverWidget != null) {
+                                                                       _hoverWidget.onMouseLeave (_hoverWidget, e);
+                                                                       HoverWidget = _hoverWidget.focusParent;
+                                                               }
+
+                                                               GraphicTree [i].checkHoverWidget (e);
+                                                               _hoverWidget.onMouseMove (_hoverWidget, e);
+                                                               return true;
+                                                       }
+                                               }
+                                               i++;
+                                       }
+                               }
+
+                               if (_hoverWidget.MouseIsIn (e.Position)) {
+                                       _hoverWidget.checkHoverWidget (e);
+                                       _hoverWidget.onMouseMove (_hoverWidget, e);
+                                       return true;
+                               } else {
+                                       _hoverWidget.onMouseLeave (_hoverWidget, e);
+                                       //seek upward from last focused graph obj's
+                                       while (_hoverWidget.focusParent != null) {
+                                               HoverWidget = _hoverWidget.focusParent;
+                                               if (_hoverWidget.MouseIsIn (e.Position)) {
+                                                       _hoverWidget.checkHoverWidget (e);
+                                                       _hoverWidget.onMouseMove (_hoverWidget, e);
+                                                       return true;
+                                               } else
+                                                       _hoverWidget.onMouseLeave (_hoverWidget, e);
+                                       }
+                               }
+                       }
+
+                       //top level graphic obj's parsing
+                       lock (GraphicTree) {
+                               for (int i = 0; i < GraphicTree.Count; i++) {
+                                       Widget g = GraphicTree [i];
+                                       if (g.MouseIsIn (e.Position)) {
+                                               g.checkHoverWidget (e);
+                                               if (g is Window)
+                                                       PutOnTop (g);
+                                               _hoverWidget.onMouseMove (_hoverWidget, e);
+                                               return true;
+                                       }
+                               }
+                       }
+                       HoverWidget = null;
+                       return false;
+               }
+               /// <summary>
+               /// Forward the mouse up event from the host to the crow interface
+               /// </summary>
+               /// <returns>return true, if interface handled the event, false otherwise.</returns>
+               /// <param name="button">Button index</param>
+               public bool ProcessMouseButtonUp(Crow.MouseButton button)
+               {
+                       Mouse.DisableBit ((int)button);
+                       lastMouseDown.Reset ();
+                       mouseRepeatTimer.Reset ();
+
+                       MouseButtonEventArgs e = new MouseButtonEventArgs (button) { Mouse = Mouse };
+                       if (_activeWidget == null)
+                               return false;
+
+                       _activeWidget.onMouseUp (_activeWidget, e);
+
+                       if (armedClick != null) {
+                               if (lastClickTime.ElapsedMilliseconds <= DoubleClick) {
+                                       armedClick.onMouseDoubleClick (armedClick, armedClickEventArgs);
+                                       ActiveWidget = null;
+                               } else
+                                       armedClick.onMouseClick (armedClick, armedClickEventArgs);
+                               armedClick = null;
+                       }
+
+                       Widget target = _activeWidget;
+                       while (target != null) {
+                               if (target.hasDoubleClick) {
+                                       armedClick = _activeWidget;
+                                       armedClickEventArgs = e;
+                                       lastClickTime.Restart ();
+                                       break;
+                               } else if (target.hasClick) {
+                                       _activeWidget.onMouseClick (_activeWidget, e);
+                                       break;
+                               } else
+                                       target = target.focusParent;
+                       }
+                       if (target == null)
+                               _activeWidget?.onMouseClick (_activeWidget, e);
+
+                       //                      GraphicObject lastActive = _activeWidget;
+                       ActiveWidget = null;
+//                     if (!lastActive.MouseIsIn (Mouse.Position)) {
+//                             ProcessMouseMove (Mouse.X, Mouse.Y);
+//                     }
+                       return true;
+               }
+               /// <summary>
+               /// Forward the mouse down event from the host to the crow interface
+               /// </summary>
+               /// <returns>return true, if interface handled the event, false otherwise.</returns>
+               /// <param name="button">Button index</param>
+               public bool ProcessMouseButtonDown(MouseButton button)
+               {
+                       Mouse.EnableBit ((int)button);
+                       lastMouseDown.Start ();
+                       mouseRepeatCount = 0;
+
+                       if (_hoverWidget == null)
+                               return false;
+
+                       lastMouseDownEvent = new MouseButtonEventArgs (button) { Mouse = Mouse };
+
+                       _hoverWidget.onMouseDown (_hoverWidget, lastMouseDownEvent);
+
+                       if (!FocusOnHover) {
+                               Widget w = _hoverWidget;  //previous hover widget 
+                               while (w != null) {
+                                       if (w.Focusable) {
+                                               FocusedWidget = w;
+                                               break;
+                                       }
+                                       w = w.focusParent;
+                               }
+                       }
+
+                       ActiveWidget = _hoverWidget;
+                       return true;
+               }
+               /// <summary>
+               /// Forward the mouse wheel event from the host to the crow interface
+               /// </summary>
+               /// <returns>return true, if interface handled the event, false otherwise.</returns>
+               public bool ProcessMouseWheelChanged(float delta)
+               {
+                       Mouse.SetScrollRelative (0, delta);
+                       MouseWheelEventArgs e = new MouseWheelEventArgs () { Mouse = Mouse, DeltaPrecise = delta };
+
+                       if (HoverWidget == null)
+                               return false;
+                       HoverWidget.onMouseWheel (this, e);
+                       return true;
+               }
+
+               public bool ProcessKeyPress (char c)
+               {
+                       if (_focusedWidget == null)
+                               return false;
+                       _focusedWidget.onKeyPress (this, new KeyPressEventArgs (c));
+                       return true;
+               }
+
+               public bool ProcessKeyUp (Key key)
+               {
+                       if (_focusedWidget == null)
+                               return false;
+                       _focusedWidget.onKeyUp (this, new KeyEventArgs (key, false));
+                       return true;
+               }
+               public bool ProcessKeyDown (Key key)
+               {
+                       lastKeyDownEvt = new KeyEventArgs (key, true);
+
+                       if (_focusedWidget == null)
+                               return false;
+                       _focusedWidget.onKeyDown (this, new KeyEventArgs (key, false));
+                       return true;
+               }
+
+               public bool Shift {
+                       get { return false; }
+               }
+
+               public bool Ctrl {
+                       get { return false; }
+               }
+
+               public bool Alt {
+                       get { return false; }
+               }
+               public bool IsKeyDown (Key key) {
+                       return false;
+               }
+               #endregion
+
+               #region Tooltip handling
+               Stopwatch tooltipTimer = new Stopwatch();
+               Widget ToolTipContainer = null;
+               volatile bool tooltipVisible = false;
+
+               protected void initTooltip () {
+                       ToolTipContainer = CreateInstance  ("#Crow.Tooltip.template");
+                       Thread t = new Thread (toolTipThreadFunc);
+                       t.IsBackground = true;
+                       t.Start ();
+               }
+               void toolTipThreadFunc ()
+               {
+                       while(true) {
+                               if (tooltipTimer.ElapsedMilliseconds > ToolTipDelay) {
+                                       if (!tooltipVisible) {
+                                               Widget g = _hoverWidget;
+                                               while (g != null) {
+                                                       if (!string.IsNullOrEmpty (g.Tooltip)) {
+                                                               AddWidget (ToolTipContainer);
+                                                               ToolTipContainer.DataSource = g;
+                                                               ToolTipContainer.Top = Mouse.Y + 10;
+                                                               ToolTipContainer.Left = Mouse.X + 10;
+                                                               tooltipVisible = true;
+                                                               break;
+                                                       }
+                                                       g = g.LogicalParent as Widget;
+                                               }
+                                       }
+                               }
+                               Thread.Sleep (200);     
+                       }
+
+               }
+               void resetTooltip () {
+                       if (tooltipVisible) {
+                               //ToolTipContainer.DataSource = null;
+                               RemoveWidget (ToolTipContainer);
+                               tooltipVisible = false;
+                       }
+                       tooltipTimer.Restart ();
+               }
+               #endregion
+
+               #region Contextual menu
+               MenuItem ctxMenuContainer;
+               protected void initContextMenus (){
+                       ctxMenuContainer = CreateInstance  ("#Crow.ContextMenu.template") as MenuItem;
+                       ctxMenuContainer.LayoutChanged += CtxMenuContainer_LayoutChanged;
+               }
+
+               void CtxMenuContainer_LayoutChanged (object sender, LayoutingEventArgs e)
+               {
+                       Rectangle r = ctxMenuContainer.ScreenCoordinates (ctxMenuContainer.Slot);
+                       if (e.LayoutType == LayoutingType.Width || e.LayoutType == LayoutingType.X) {
+                               if (r.Right > this.clientRectangle.Right)
+                                       ctxMenuContainer.Left = this.clientRectangle.Right - ctxMenuContainer.Slot.Width;
+                       }else if (e.LayoutType == LayoutingType.Width || e.LayoutType == LayoutingType.Y) {
+                               if (r.Bottom > this.clientRectangle.Bottom)
+                                       ctxMenuContainer.Top = this.clientRectangle.Bottom - ctxMenuContainer.Slot.Height;
+                       }
+                       
+               }
+
+               public void ShowContextMenu (Widget go) {
+
+                       lock (UpdateMutex) {
+                               if (ctxMenuContainer.Parent == null)
+                                       this.AddWidget (ctxMenuContainer);
+                               else
+                                       ctxMenuContainer.IsOpened = true;
+
+                               ctxMenuContainer.isPopup = true;
+                               ctxMenuContainer.LogicalParent = go;
+                               ctxMenuContainer.DataSource = go;
+
+                               PutOnTop (ctxMenuContainer, true);
+                       }
+                       ctxMenuContainer.Left = Mouse.X - 5;
+                       ctxMenuContainer.Top = Mouse.Y - 5;
+
+                       HoverWidget = ctxMenuContainer;
+                       ctxMenuContainer.onMouseEnter (ctxMenuContainer, new MouseMoveEventArgs (Mouse.X, Mouse.Y, 0, 0));
+               }
+               #endregion
+
+               #region Device Repeat Events
+               volatile bool keyboardRepeatOn;
+               volatile int keyboardRepeatCount;
+               KeyEventArgs lastKeyDownEvt;
+
+               void keyboardRepeatThreadFunc()
+               {
+                       keyboardRepeatOn = true;
+                       Thread.Sleep (Interface.DeviceRepeatDelay);
+                       while (keyboardRepeatOn) {
+                               keyboardRepeatCount++;
+                               Thread.Sleep (Interface.DeviceRepeatInterval);
+                       }
+                       keyboardRepeatCount = 0;
+               }
+               #endregion
+
+               #region ILayoutable implementation
+               public virtual bool PointIsIn(ref Point m)
+               {
+                       return true;
+               }
+               public void RegisterClip(Rectangle r){
+                       clipping.AddRectangle (r);
+               }
+               public bool ArrangeChildren { get { return false; }}
+               public int LayoutingTries {
+                       get { throw new NotImplementedException (); }
+                       set { throw new NotImplementedException (); }
+               }
+               public LayoutingType RegisteredLayoutings {
+                       get { return LayoutingType.None; }
+                       set { throw new NotImplementedException (); }
+               }
+               public void RegisterForLayouting (LayoutingType layoutType) { throw new NotImplementedException (); }
+               public bool UpdateLayout (LayoutingType layoutType) { throw new NotImplementedException (); }
+               public Rectangle ContextCoordinates (Rectangle r) { return r;}
+               public Rectangle ScreenCoordinates (Rectangle r) { return r; }
+
+               public ILayoutable Parent {
+                       get { return null; }
+                       set { throw new NotImplementedException (); }
+               }
+               public ILayoutable LogicalParent {
+                       get { return null; }
+                       set { throw new NotImplementedException (); }
+               }
+
+               public Rectangle ClientRectangle {
+                       get { return clientRectangle; }
+               }
+               public Interface HostContainer {
+                       get { return this; }
+               }
+               public Rectangle getSlot () { return ClientRectangle; }
+               #endregion
+
+               #if MEASURE_TIME
+               public PerformanceMeasure clippingMeasure = new PerformanceMeasure("Clipping", 1);
+               public PerformanceMeasure layoutingMeasure = new PerformanceMeasure("Layouting", 1);
+               public PerformanceMeasure updateMeasure = new PerformanceMeasure("Update", 1);
+               public PerformanceMeasure drawingMeasure = new PerformanceMeasure("Drawing", 1);
+               public List<PerformanceMeasure> PerfMeasures = new List<PerformanceMeasure>();
+               #endif
+               #if DEBUG_LAYOUTING
+               public List<LQIList> LQIsTries = new List<LQIList>();
+               public LQIList curLQIsTries = new LQIList();
+               public List<LQIList> LQIs = new List<LQIList>();
+               public LQIList curLQIs = new LQIList();
+               //              public static LayoutingQueueItem[] MultipleRunsLQIs {
+               //                      get { return curUpdateLQIs.Where(l=>l.LayoutingTries>2 || l.DiscardCount > 0).ToArray(); }
+               //              }
+               public LayoutingQueueItem currentLQI;
+               #else
+               public List<LQIList> LQIs = null;//still create the var for CrowIDE
+               #endif
+       }
+}
+
diff --git a/Crow/src/ItemTemplate.cs b/Crow/src/ItemTemplate.cs
new file mode 100644 (file)
index 0000000..e4615b7
--- /dev/null
@@ -0,0 +1,280 @@
+//
+// ItemTemplate.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Reflection.Emit;
+using System.Threading;
+using System.Xml.Serialization;
+using System.Xml;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using Crow.IML;
+
+namespace Crow
+{
+       /// <summary> Test func on data, return yes if there's children </summary>
+       public delegate bool BooleanTestOnInstance(object instance);
+
+       /// <summary>
+       /// Derived from Instantiator with sub data fetching facilities for hierarchical data access.
+       /// 
+       /// ItemTemplate stores the dynamic method for instantiating the control tree defined in a valid IML file.
+       /// 
+       /// </summary>
+       public class ItemTemplate : Instantiator {
+               #if DESIGN_MODE
+               public void getIML (System.Xml.XmlDocument doc, System.Xml.XmlNode parentElem){         
+                       if (sourcePath == "#Crow.DefaultItem.template")
+                               return;
+                       
+                       XmlElement xe = doc.CreateElement("ItemTemplate");
+                       XmlAttribute xa = null;
+
+                       if (string.IsNullOrEmpty (sourcePath)) {
+                               //inline item template
+                               using (Widget go = this.CreateInstance())
+                                       go.getIML (doc, xe);
+                       } else {
+                               xa = doc.CreateAttribute ("Path");
+                               xa.Value = sourcePath;
+                               xe.Attributes.Append (xa);
+                       }
+
+                       if (strDataType != "default") {
+                               xa = doc.CreateAttribute ("DataType");
+                               xa.Value = strDataType;
+                               xe.Attributes.Append (xa);
+
+                               if (dataTest != "TypeOf"){
+                                       xa = doc.CreateAttribute ("DataTest");
+                                       xa.Value = dataTest;
+                                       xe.Attributes.Append (xa);
+                               }
+                       }
+
+                       if (!string.IsNullOrEmpty(fetchMethodName)){
+                               xa = doc.CreateAttribute ("Data");
+                               xa.Value = fetchMethodName;
+                               xe.Attributes.Append (xa);
+                       }
+                               
+                       parentElem.AppendChild (xe);
+
+                               
+               }
+               #endif
+
+               public EventHandler Expand;
+               public BooleanTestOnInstance HasSubItems;
+               string strDataType;
+               string fetchMethodName;
+               string dataTest;
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of the <see cref="Crow.ItemTemplate"/> class by parsing the file passed as argument.
+               /// </summary>
+               /// <param name="path">IML file to parse</param>
+               /// <param name="_dataType">type this item will be choosen for, or member of the data item</param>
+               /// <param name="_fetchDataMethod">for hierarchical data, method to call for children fetching</param>
+               public ItemTemplate (Interface _iface, string path, Type declaringType, string _dataTest = "TypeOf", string _dataType = "default", string _fetchDataMethod = null)
+                       : base(_iface, _iface.GetTemplateStreamFromPath (path, declaringType)) {
+                       strDataType = _dataType;
+                       fetchMethodName = _fetchDataMethod;
+                       dataTest = _dataTest;
+
+               }
+
+               /// <summary>
+               /// Initializes a new instance of the <see cref="Crow.ItemTemplate"/> class by parsing the IML fragment passed as arg.
+               /// </summary>
+               /// <param name="path">IML fragment to parse</param>
+               /// <param name="_dataType">type this item will be choosen for, or member of the data item</param>
+               /// <param name="_fetchDataMethod">for hierarchical data, method to call for children fetching</param>
+               public ItemTemplate (Interface _iface, Stream ImlFragment, string _dataTest, string _dataType, string _fetchDataMethod)
+                       :base(_iface, ImlFragment)
+               {
+                       strDataType = _dataType;
+                       fetchMethodName = _fetchDataMethod;
+                       dataTest = _dataTest;
+               }
+               /// <summary>
+               /// Initializes a new instance of the <see cref="Crow.ItemTemplate"/> class using the opened XmlReader in args.
+               /// </summary>
+               /// <param name="path">XML reader positionned before or at the root node</param>
+               /// <param name="_dataType">type this item will be choosen for, or member of the data item</param>
+               /// <param name="_fetchDataMethod">for hierarchical data, method to call for children fetching</param>
+               public ItemTemplate (Interface _iface, XmlReader reader, string _dataTest = "TypeOf" , string _dataType = null, string _fetchDataMethod = null)
+                       :base(_iface, reader)
+               {
+                       strDataType = _dataType;
+                       fetchMethodName = _fetchDataMethod;
+                       dataTest = _dataTest;
+               }
+               #endregion
+
+               /// <summary>
+               /// Creates the expand delegate.
+               /// </summary>
+               /// <param name="host">Host.</param>
+               public void CreateExpandDelegate (TemplatedGroup host){
+                       Type dataType = CompilerServices.getTypeFromName(strDataType);
+                       Type tmpGrpType = typeof(TemplatedGroup);
+                       Type evtType = typeof(EventHandler);
+
+                       MethodInfo evtInvoke = evtType.GetMethod ("Invoke");
+                       ParameterInfo [] evtParams = evtInvoke.GetParameters ();
+                       Type handlerArgsType = evtParams [1].ParameterType;
+
+                       Type [] args = { typeof(object), typeof(object), handlerArgsType };
+
+                       #region Expand dyn meth
+                       //DM is bound to templatedGroup root (arg0)
+                       //arg1 is the sender of the expand event
+                       DynamicMethod dm = new DynamicMethod ("dyn_expand_" + fetchMethodName,
+                               typeof (void), args,typeof(TemplatedGroup), true);
+
+                       System.Reflection.Emit.Label gotoEnd;
+                       System.Reflection.Emit.Label ifDataIsNull;
+                       System.Reflection.Emit.Label gotoItemsContainerNotFound;
+
+                       ILGenerator il = dm.GetILGenerator (256);
+                       il.DeclareLocal(typeof(Widget));
+
+                       gotoEnd = il.DefineLabel ();
+                       ifDataIsNull = il.DefineLabel ();
+                       gotoItemsContainerNotFound = il.DefineLabel ();
+
+                       il.Emit (OpCodes.Ldarg_1);//load sender of expand event
+                       //TODO:double check if items container could be known when expand del is created
+                       //to avoid a find by name
+                       il.Emit(OpCodes.Ldstr, "ItemsContainer");//load name to find
+                       il.Emit (OpCodes.Callvirt, CompilerServices.miFindByName);
+                       il.Emit (OpCodes.Stloc_0);//save items container as loc0
+
+                       //ensure ItemsContainer is not null
+                       il.Emit (OpCodes.Ldloc_0);
+                       il.Emit (OpCodes.Brfalse, gotoItemsContainerNotFound);
+
+                       //check that node is not already expanded
+                       il.Emit (OpCodes.Ldarg_0);//push root TemplatedGroup into the stack
+                       il.Emit (OpCodes.Ldarg_1);
+                       il.Emit (OpCodes.Call, CompilerServices.miIsAlreadyExpanded);
+                       il.Emit (OpCodes.Brtrue, gotoEnd);
+
+                       //get the dataSource of the sender
+                       il.Emit (OpCodes.Ldarg_0);//push root TemplatedGroup into the stack
+                       il.Emit (OpCodes.Ldarg_1);//load sender node of expand
+                       il.Emit (OpCodes.Callvirt, CompilerServices.miGetDataSource);
+
+                       if (fetchMethodName != "self") {//special keyword self allows the use of recurent list<<<
+                               if (dataType == null) {
+                                       //dataTest was not = TypeOF, so we have to get the type of data
+                                       //dynamically and fetch
+
+                                       il.Emit (OpCodes.Ldstr, fetchMethodName);
+                                       il.Emit (OpCodes.Call, CompilerServices.miGetDataTypeAndFetch);
+                               }else
+                                       emitGetSubData(il, dataType);                   
+                       }
+                       //set 'return' from the fetch method as 'data' of the list
+                       //il.Emit (OpCodes.Callvirt, piData.GetSetMethod ());
+                       il.Emit (OpCodes.Ldloc_0);//load second arg of loadPage, the sender node
+                       il.Emit (OpCodes.Ldstr, dataTest);//load 3rd arg, dataTest kind on subitems
+                       il.Emit (OpCodes.Callvirt, CompilerServices.miLoadPage);
+                       il.Emit (OpCodes.Br, gotoEnd);
+
+                       il.MarkLabel(gotoItemsContainerNotFound);
+                       il.EmitWriteLine("ItemsContainer not found in ItemTemplate for " + host.ToString());
+
+
+                       il.MarkLabel(gotoEnd);
+                       il.Emit (OpCodes.Ret);
+
+                       Expand = (EventHandler)dm.CreateDelegate (evtType, host);
+                       #endregion
+
+                       #region Items counting dyn method
+                       //dm is unbound, arg0 is instance of Item container to expand
+                       dm = new DynamicMethod ("dyn_count_" + fetchMethodName,
+                               typeof (bool), new Type[] {typeof(object)}, true);
+                       il = dm.GetILGenerator (256);
+
+                       //get the dataSource of the arg0
+                       il.Emit (OpCodes.Ldarg_0);
+                       il.Emit (OpCodes.Callvirt, CompilerServices.miGetDataSource);
+
+                       if (fetchMethodName != "self") {//special keyword self allows the use of recurent list<<<
+                               if (dataType == null) {
+                                       //dataTest was not = TypeOF, so we have to get the type of data
+                                       //dynamically and fetch
+
+                                       il.Emit (OpCodes.Ldstr, fetchMethodName);
+                                       il.Emit (OpCodes.Call, CompilerServices.miGetDataTypeAndFetch);
+                               }else
+                                       emitGetSubData(il, dataType);                   
+                       }
+                       
+                       il.Emit (OpCodes.Callvirt, CompilerServices.miGetColCount);
+                       il.Emit (OpCodes.Ldc_I4_0);
+                       il.Emit (OpCodes.Cgt);
+                       il.Emit (OpCodes.Ret);
+                       HasSubItems = (BooleanTestOnInstance)dm.CreateDelegate (typeof(BooleanTestOnInstance));
+                       #endregion
+               }
+               //data is on the stack
+               void emitGetSubData(ILGenerator il, Type dataType){
+                       MethodInfo miGetDatas = dataType.GetMethod (fetchMethodName, new Type[] {});
+                       if (miGetDatas == null)
+                               miGetDatas = CompilerServices.SearchExtMethod (dataType, fetchMethodName);
+
+                       if (miGetDatas == null) {//in last resort, search among properties
+                               PropertyInfo piDatas = dataType.GetProperty (fetchMethodName);
+                               if (piDatas == null) {
+                                       FieldInfo fiDatas = dataType.GetField (fetchMethodName);
+                                       if (fiDatas == null)//and among fields
+                                               throw new Exception ("Fetch data member not found in ItemTemplate: " + fetchMethodName);
+                                       il.Emit (OpCodes.Ldfld, fiDatas);
+                                       return;
+                               }
+                               miGetDatas = piDatas.GetGetMethod ();
+                               if (miGetDatas == null)
+                                       throw new Exception ("Write only property for fetching data in ItemTemplate: " + fetchMethodName);
+                       }
+            if (miGetDatas.IsStatic)
+                           il.Emit (OpCodes.Call, miGetDatas);
+            else
+                il.Emit (OpCodes.Callvirt, miGetDatas);
+        }
+
+       
+       
+       }
+}
+
diff --git a/Crow/src/LayoutingEventArgs.cs b/Crow/src/LayoutingEventArgs.cs
new file mode 100644 (file)
index 0000000..9254aec
--- /dev/null
@@ -0,0 +1,41 @@
+//
+// LayoutingEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       public class LayoutingEventArgs: EventArgs
+       {
+               public LayoutingType  LayoutType;
+
+               public LayoutingEventArgs (LayoutingType  _layoutType) : base()
+               {
+                       LayoutType = _layoutType;
+               }
+       }
+}
+
diff --git a/Crow/src/LayoutingQueueItem.cs b/Crow/src/LayoutingQueueItem.cs
new file mode 100644 (file)
index 0000000..98c04ec
--- /dev/null
@@ -0,0 +1,190 @@
+//
+// LayoutingQueueItem.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Diagnostics;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Crow
+{
+       [Flags]
+       public enum LayoutingType : byte
+       {
+               None = 0x00,
+               X = 0x01,
+               Y = 0x02,
+               Positioning = 0x03,
+               Width = 0x04,
+               Height = 0x08,
+               Sizing = 0x0C,
+               ArrangeChildren = 0x10,
+               All = 0xFF
+       }
+
+       /// <summary>
+       /// Element class of the LayoutingQueue
+       /// </summary>
+       public struct LayoutingQueueItem
+       {
+               /// <summary> Instance of widget to be layouted</summary>
+               public ILayoutable Layoutable;
+               /// <summary> Bitfield containing the element of the layout to performs (x|y|width|height)</summary>
+               public LayoutingType LayoutType;
+               /// <summary> Unsuccessfull UpdateLayout and requeueing count </summary>
+               public int LayoutingTries, DiscardCount;
+
+               #if DEBUG_LOG
+               public enum Result : byte {
+                       Unknown,
+                       Register,
+                       Success,
+                       Requeued,
+                       Discarded,
+                       Deleted,
+               }
+               public Result result;
+               public GraphicObject graphicObject {
+                       get { return Layoutable as GraphicObject; }
+               }
+               public string Name {
+                       get { return graphicObject.Name; }
+               }
+               public string FullName {
+                       get { return graphicObject.ToString(); }
+               }
+               public Measure Width {
+                       get { return graphicObject.Width; }
+               }
+               public Measure Height {
+                       get { return graphicObject.Height; }
+               }
+               public Rectangle Slot, NewSlot;
+               #endif
+
+               #region CTOR
+               public LayoutingQueueItem (LayoutingType _layoutType, ILayoutable _graphicObject)
+               {                       
+                       LayoutType = _layoutType;
+                       Layoutable = _graphicObject;
+                       Layoutable.RegisteredLayoutings |= LayoutType;
+                       LayoutingTries = 0;
+                       DiscardCount = 0;
+                       #if DEBUG_LOG
+                       Slot = Rectangle.Empty;
+                       NewSlot = Rectangle.Empty;
+                       result = Result.Register;
+                       DebugLog.AddEvent (DbgEvtType.GORegisterLayouting, this);
+                       #endif
+               }
+               #endregion
+
+
+               public void ProcessLayouting()
+               {
+                       Widget go = Layoutable as Widget;
+//                     if (go == null) {
+//                             Debug.WriteLine ("ERROR: processLayouting on something else than a graphic object: " + this.ToString ());
+//                             return;
+//                     }
+
+                       go.parentRWLock.EnterReadLock ();
+
+                       if (go.Parent == null) {//TODO:improve this
+                               //cancel layouting for object without parent, maybe some were in queue when
+                               //removed from a listbox
+                               #if DEBUG_LOG
+                               DebugLog.AddEvent (DbgEvtType.GOProcessLayoutingWithNoParent, this);
+                               #endif
+                               go.parentRWLock.ExitReadLock ();
+                               return;
+                       }
+                       #if DEBUG_LOG
+                       DbgEvent dbgEvt = DebugLog.AddEvent (DbgEvtType.GOProcessLayouting, this);
+                       #endif
+                       LayoutingTries++;
+                       if (!Layoutable.UpdateLayout (LayoutType)) {
+                               #if DEBUG_LOG
+                               dbgEvt.end = DebugLog.chrono.ElapsedTicks;
+                               #endif
+                               if (LayoutingTries < Interface.MaxLayoutingTries) {
+                                       Layoutable.RegisteredLayoutings |= LayoutType;
+                                       (Layoutable as Widget).IFace.LayoutingQueue.Enqueue (this);
+                                       #if DEBUG_LOG
+                                       result = Result.Requeued;
+                                       #endif
+                               } else if (DiscardCount < Interface.MaxDiscardCount) {
+                                       #if DEBUG_LOG
+                                       result = Result.Discarded;
+                                       #endif
+                                       LayoutingTries = 0;
+                                       DiscardCount++;
+                                       Layoutable.RegisteredLayoutings |= LayoutType;
+                                       (Layoutable as Widget).IFace.DiscardQueue.Enqueue (this);
+                               }
+                               #if DEBUG_LOG
+                               else {
+                                       result = Result.Deleted;
+                               }
+                               #endif
+                       }
+                       #if DEBUG_LOG
+                       else{
+                               result = Result.Success;
+                       }
+                       dbgEvt.data = this;
+                       #endif
+                       go.parentRWLock.ExitReadLock ();
+               }
+
+               public static implicit operator Widget(LayoutingQueueItem queueItem)
+               {
+                       return queueItem.Layoutable as Widget;
+               }
+               public static implicit operator LayoutingType(LayoutingQueueItem lqi)
+               {
+                       return lqi.LayoutType;
+               }
+               public override string ToString ()
+               {
+                       #if DEBUG_LAYOUTING
+                       return string.Format ("{2};{3} {1}->{0}", LayoutType,Layoutable.ToString(),
+                               LayoutingTries,DiscardCount);
+                       #else
+                       return string.Format ("{2};{3} {1}->{0}", LayoutType,Layoutable.ToString(),
+                               LayoutingTries, DiscardCount);
+                       #endif
+               }
+       }
+       public class LQIList : List<LayoutingQueueItem>{
+//             #if DEBUG_LAYOUTING
+//             public List<LayoutingQueueItem> GetRootLQIs(){
+//                     return this.Where (lqi => lqi.wasTriggeredBy == null).ToList ();
+//             }
+//             #endif
+       }
+}
+
diff --git a/Crow/src/Measure.cs b/Crow/src/Measure.cs
new file mode 100644 (file)
index 0000000..c40c670
--- /dev/null
@@ -0,0 +1,140 @@
+//
+// Measure.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       /// <summary>
+       /// Measurement unit
+       /// </summary>
+       public enum Unit {Undefined, Pixel, Percent, Inherit }
+       /// <summary>
+       /// Measure class allow proportional sizes as well as stretched and fit on content.
+       /// </summary>
+       public struct Measure
+       {
+               /// <summary>
+               /// Integer value of the measure
+               /// </summary>
+               public int Value;
+               /// <summary>
+               /// Measurement unit
+               /// </summary>
+               public Unit Units;
+
+               /// <summary>
+               /// Fit on content, this special measure is defined as a fixed integer set to -1 pixel
+               /// </summary>
+               public static Measure Fit = new Measure(-1,Unit.Percent);
+               /// <summary>
+               /// Stretched into parent client area. This special measure is defined as a proportional cote
+               /// set to 100 Percents
+               /// </summary>
+               public static Measure Stretched = new Measure(100, Unit.Percent);
+               public static Measure Inherit = new Measure (0, Unit.Inherit);
+               #region CTOR
+               public Measure (int _value, Unit _units = Unit.Pixel)
+               {
+                       Value = _value;
+                       Units = _units;
+               }
+               #endregion
+
+               /// <summary>
+               /// True is size is fixed in pixels, this means not proportional, stretched nor fit.
+               /// </summary>
+               public bool IsFixed { get { return Units == Unit.Pixel; }}
+               public bool IsFit { get { return Value == -1 && Units == Unit.Percent; }}
+               public bool IsRelativeToParent { get { return Value >= 0 && Units == Unit.Percent; }}
+               #region Operators
+               public static implicit operator int(Measure m){
+                       return m.Value;
+               }
+               public static implicit operator Measure(int i){
+                       return new Measure(i);
+               }
+               public static implicit operator string(Measure m){
+                       return m.ToString();
+               }
+               public static implicit operator Measure(string s){
+                       return Measure.Parse(s);
+               }
+
+               public static bool operator ==(Measure m1, Measure m2){
+                       return m1.Value == m2.Value && m1.Units == m2.Units;
+               }
+               public static bool operator !=(Measure m1, Measure m2){
+                       return !(m1.Value == m2.Value && m1.Units == m2.Units);
+               }
+               #endregion
+
+               #region Object overrides
+               public override int GetHashCode ()
+               {
+                       return Value.GetHashCode ();
+               }
+               public override bool Equals (object obj)
+               {
+                       return (obj == null || obj.GetType() != typeof(Measure)) ?
+                               false :
+                               this == (Measure)obj;
+               }
+               public override string ToString ()
+               {
+                       return Units == Unit.Inherit ? "Inherit" :
+                               Value == -1 ? "Fit" :
+                               Units == Unit.Percent ? Value == 100 ? "Stretched" :
+                               Value.ToString () + "%" : Value.ToString ();
+               }
+               #endregion
+
+               public static Measure Parse(string s){
+                       if (string.IsNullOrEmpty (s))
+                               return default(Measure);
+
+                       string st = s.Trim ();
+                       int tmp = 0;
+
+                       if (string.Equals ("Inherit", st, StringComparison.Ordinal))
+                               return Measure.Inherit;
+                       else if (string.Equals ("Fit", st, StringComparison.Ordinal))
+                               return Measure.Fit;
+                       else if (string.Equals ("Stretched", s, StringComparison.Ordinal))
+                               return Measure.Stretched;                       
+                       else {
+                               if (st.EndsWith ("%", StringComparison.Ordinal)) {
+                                       if (int.TryParse (s.Substring(0, st.Length - 1), out tmp))
+                                               return new Measure (tmp, Unit.Percent);
+                               }else if (int.TryParse (s, out tmp))
+                                       return new Measure (tmp);
+                       }
+
+                       throw new Exception ("Error parsing Measure.");
+               }
+
+       }
+}
diff --git a/Crow/src/MouseCursorChangedEventArgs.cs b/Crow/src/MouseCursorChangedEventArgs.cs
new file mode 100644 (file)
index 0000000..850ee9c
--- /dev/null
@@ -0,0 +1,39 @@
+//
+// MouseCursorChangedEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       //public class MouseCursorChangedEventArgs : EventArgs
+       //{
+       //      public XCursor NewCursor;
+       //      public MouseCursorChangedEventArgs (XCursor newCursor) : base()
+       //      {
+       //              NewCursor = newCursor;
+       //      }
+       //}
+}
diff --git a/Crow/src/ObservableList.cs b/Crow/src/ObservableList.cs
new file mode 100644 (file)
index 0000000..96bfccc
--- /dev/null
@@ -0,0 +1,47 @@
+//
+// IListChanged.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+
+namespace Crow
+{      
+       public class ObservableList<T> : List<T> , IObservableList {
+               public event EventHandler<ListChangedEventArg> ListAdd;
+               public event EventHandler<ListChangedEventArg> ListRemove;              
+
+               public void AddElement (T elem) {
+                       this.Add(elem);
+                       ListAdd.Raise (this, new ListChangedEventArg (this.Count - 1, elem));
+               }
+               public void RemoveElement (T elem) {
+                       System.Diagnostics.Debug.WriteLine ("remove elem:" + elem);
+                       int idx = this.IndexOf (elem);
+                       this.RemoveAt (idx);
+                       ListRemove.Raise (this, new ListChangedEventArg (idx, elem));
+               }
+       }
+}
+
diff --git a/Crow/src/ParsingException.cs b/Crow/src/ParsingException.cs
new file mode 100644 (file)
index 0000000..1b59698
--- /dev/null
@@ -0,0 +1,30 @@
+using System;
+
+namespace Crow.Coding
+{
+       public class ParserException : Exception
+       {
+               public int Line;
+               public int Column;
+               public string Source;
+               public ParserException(int line, int column, string txt, string source = null)
+                       : base(txt)
+               {
+                       Line = line;
+                       Column = column;
+                       Source = source;
+               }
+               public ParserException(int line, int column, string txt, Exception innerException, string source = null)
+                       : base(txt, innerException)
+               {
+                       Line = line;
+                       Column = column;
+                       Source = source;
+               }
+               public override string ToString ()
+               {
+                       return string.Format("{3}:({0},{1}): {2}", Line, Column, Message, Source);
+               }
+       }
+}
+
diff --git a/Crow/src/PerformanceMeasure.cs b/Crow/src/PerformanceMeasure.cs
new file mode 100644 (file)
index 0000000..1e80318
--- /dev/null
@@ -0,0 +1,94 @@
+//
+// PerformanceMeasure.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Diagnostics;
+
+namespace Crow
+{
+       public class PerformanceMeasure : IValueChange {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       if (ValueChanged != null)                               
+                               ValueChanged.Invoke(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               public Stopwatch timer = new Stopwatch ();
+               public string Name;
+               public long current, minimum, maximum, total, cptMeasures;
+               public long cancelLimit;
+
+               public PerformanceMeasure(string name = "unamed", long _cancelLimit = 0){
+                       Name = name;
+                       cancelLimit = _cancelLimit;
+                       ResetStats ();
+               }
+
+               public void StartCycle(){
+                       timer.Restart();
+               }
+               public void StopCycle(){
+                       timer.Stop();
+                       computeStats ();
+               }
+               public void NotifyChanges(){
+                       lock(this){
+                               if (cptMeasures == 0)
+                                       return;
+                               NotifyValueChanged("minimum", minimum);
+                               NotifyValueChanged("maximum", maximum);
+                               NotifyValueChanged("current", current);
+                               //                      NotifyValueChanged("total", total);
+                               //                      NotifyValueChanged("cptMeasures", cptMeasures);
+                               NotifyValueChanged("mean", total / cptMeasures);
+                       }
+               }
+
+               void computeStats(){                    
+                       current = timer.ElapsedMilliseconds;
+                       if (current < cancelLimit)
+                               return;
+                       cptMeasures++;
+                       total += timer.ElapsedMilliseconds;
+                       if (timer.ElapsedMilliseconds < minimum)
+                               minimum = timer.ElapsedMilliseconds;
+                       if (timer.ElapsedMilliseconds > maximum)
+                               maximum = timer.ElapsedMilliseconds;                    
+               }
+               void ResetStats(){
+                       cptMeasures = total = current = maximum = 0;
+                       minimum = long.MaxValue;
+               }
+               void onResetClick(object sender, MouseButtonEventArgs e){
+                       lock(this)
+                               ResetStats();
+               }
+       }
+}
+
diff --git a/Crow/src/Picture.cs b/Crow/src/Picture.cs
new file mode 100644 (file)
index 0000000..2b8c280
--- /dev/null
@@ -0,0 +1,152 @@
+//
+// Picture.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using vkvg;
+using System.Collections.Generic;
+
+namespace Crow
+{
+       /// <summary>
+       /// store data and dimensions for resource sharing
+       /// </summary>
+       internal class sharedPicture {
+               //TODO: restructure this whith clever conceptual classes
+               public object Data;
+               public Size Dims;
+               public sharedPicture (object _data, Size _dims){
+                       Data = _data;
+                       Dims = _dims;
+               }
+       }
+       /// <summary>
+       /// virtual class for loading and drawing picture in the interface
+       /// 
+       /// Every loaded resources are stored in a dictonary with their path as key and shared
+       /// among interface elements
+       /// </summary>
+       public abstract class Picture : Fill
+       {
+               /// <summary>
+               /// share a single store for picture resources among usage in different controls
+               /// </summary>
+               internal static Dictionary<string, sharedPicture> sharedResources = new Dictionary<string, sharedPicture>();
+
+               /// <summary>
+               /// path of the picture
+               /// </summary>
+               public string Path;
+               /// <summary>
+               /// unscaled dimensions fetched on loading
+               /// </summary>
+               public Size Dimensions;
+               /// <summary>
+               /// if true and image has to be scalled, it will be scaled in both direction
+               /// equaly
+               /// </summary>
+               public bool KeepProportions = false;
+               /// <summary>
+               /// allow or not the picture to be scalled on request by the painter
+               /// </summary>
+               public bool Scaled = true;
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of Picture.
+               /// </summary>
+               public Picture ()
+               {
+               }
+               /// <summary>
+               /// Initializes a new instance of Picture by loading the image pointed by the path argument
+               /// </summary>
+               /// <param name="path">image path, may be embedded</param>
+               public Picture (string path)
+               {
+                       Path = path;
+               }
+               #endregion
+
+               #region Image Loading
+               /// <summary>
+               /// load the image for rendering from the stream given as argument
+               /// </summary>
+               /// <param name="stream">picture stream</param>
+               //public abstract void Load(Interface iface, string path);
+               #endregion
+
+               /// <summary>
+               /// abstract method to paint the image in the rectangle given in arguments according
+               /// to the Scale and keepProportion parameters.
+               /// </summary>
+               /// <param name="gr">drawing Backend context</param>
+               /// <param name="rect">bounds of the target surface to paint</param>
+               /// <param name="subPart">used for svg only</param>
+               public abstract void Paint(Context ctx, Rectangle rect, string subPart = "");
+
+               #region Operators
+               public static implicit operator Picture(string path)
+               {
+                       if (string.IsNullOrEmpty (path))
+                               return null;
+                       
+                       Picture _pic = null;
+
+                       if (path.EndsWith (".svg", true, System.Globalization.CultureInfo.InvariantCulture)) 
+                               _pic = new SvgPicture (path);
+                       else 
+                               _pic = new BmpPicture (path);
+
+                       return _pic;
+               }
+               public static implicit operator string(Picture _pic)
+               {
+                       return _pic == null ? null : _pic.Path;
+               }
+               #endregion
+
+               public static object Parse(string path)
+               {
+                       if (string.IsNullOrEmpty (path))
+                               return null;
+                       
+                       Picture _pic = null;
+
+                       if (path.EndsWith (".svg", true, System.Globalization.CultureInfo.InvariantCulture)) 
+                               _pic = new SvgPicture (path);
+                       else 
+                               _pic = new BmpPicture (path);
+
+                       return _pic;
+               }
+               public override string ToString ()
+               {
+                       return Path;
+               }
+       }
+}
+
diff --git a/Crow/src/Point.cs b/Crow/src/Point.cs
new file mode 100644 (file)
index 0000000..27f9658
--- /dev/null
@@ -0,0 +1,188 @@
+//
+// Point.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Crow
+{
+    public struct Point
+    {
+        int _x;
+        int _y;
+
+        public int X
+        {
+            get { return _x; }
+            set { _x = value; }
+        }
+        public int Y
+        {
+            get { return _y; }
+            set { _y = value; }
+        }
+        public Point(int x, int y)
+        {
+            _x = x;
+            _y = y;
+        }
+
+               public int Length {
+                       get { return (int)Math.Sqrt (Math.Pow (_x, 2) + Math.Pow (_y, 2)); }
+               }
+               public double LengthD {
+                       get { return Math.Sqrt (Math.Pow (_x, 2) + Math.Pow (_y, 2)); }
+               }
+        //public static implicit operator Crow.Cairo.Point(Point p)
+        //{
+        //    return new Crow.Cairo.Point(p.X, p.Y);
+        //}
+        //public static implicit operator Crow.Cairo.PointD(Point p)
+        //{
+        //    return new Crow.Cairo.PointD(p.X, p.Y);
+        //}
+        public static implicit operator Point(int i)
+        {
+            return new Point(i, i);
+        }
+               public static implicit operator Point(vkvg.PointD p)
+        {
+            return new Point((int)p.X, (int)p.Y);
+        }
+               public static implicit operator vkvg.PointD(Point p)
+        {
+            return new vkvg.PointD(p.X, p.Y);
+        }
+        public static Point operator /(Point p, int d)
+        {
+            return new Point(p.X / d, p.Y / d);
+        }
+        public static Point operator *(Point p, int d)
+        {
+            return new Point(p.X * d, p.Y * d);
+        }
+        public static Point operator /(Point p, double d)
+        {
+            return new Point((int)(p.X / d), (int)(p.Y / d));
+        }
+        public static Point operator *(Point p, double d)
+        {
+            return new Point((int)(p.X * d), (int)(p.Y * d));
+        }
+        public static Point operator +(Point p1, Point p2)
+        {
+            return new Point(p1.X + p2.X, p1.Y + p2.Y);
+        }
+               public static Point operator +(Point p, int i)
+               {
+                       return new Point(p.X + i, p.Y + i);
+               }
+        public static Point operator -(Point p1, Point p2)
+        {
+            return new Point(p1.X - p2.X, p1.Y - p2.Y);
+        }
+        public static bool operator >=(Point p1, Point p2)
+        {
+            return p1.X >= p2.X && p1.Y >= p2.Y ? true : false;
+        }
+        public static bool operator <=(Point p1, Point p2)
+        {
+            return p1.X <= p2.X && p1.Y <= p2.Y ? true : false;
+        }
+        public static bool operator ==(Point s, int i)
+        {
+            if (s.X == i && s.Y == i)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator !=(Point s, int i)
+        {
+            if (s.X == i && s.Y == i)
+                return false;
+            else
+                return true;
+        }
+        public static bool operator >(Point s, int i)
+        {
+            if (s.X > i && s.Y > i)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator <(Point s, int i)
+        {
+            if (s.X < i && s.Y < i)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator ==(Point s1, Point s2)
+        {
+            if (s1.X == s2.X  && s1.Y == s2.Y)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator !=(Point s1, Point s2)
+        {
+            if (s1.X == s2.X && s1.Y == s2.Y)
+                return false;
+            else
+                return true;
+        }
+
+        public override string ToString()
+        {
+                       return string.Format("({0},{1})", X, Y);
+        }
+
+        public override bool Equals(object obj)
+        {
+            return base.Equals(obj);
+        }
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+               public static Point Parse(string s)
+               {
+                       if (string.IsNullOrEmpty (s))
+                               return default(Point);
+                       string[] d = s.Trim().Split(',');
+                       if (d.Length == 2)
+                               return new Point (int.Parse (d [0]), int.Parse (d [1]));
+                       else if (d.Length == 1) {
+                               int tmp = int.Parse (d [0]);
+                               return new Point (tmp, tmp);
+                       }
+                       throw new Exception ("Crow.Point Parsing Error: " + s);
+               }
+    }
+
+}
diff --git a/Crow/src/Rectangle.cs b/Crow/src/Rectangle.cs
new file mode 100644 (file)
index 0000000..4ee7c8a
--- /dev/null
@@ -0,0 +1,244 @@
+//
+// Rectangle.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace Crow
+{
+       [StructLayout(LayoutKind.Sequential)]
+       public struct Rectangle
+    {
+               internal static Type TRectangle = typeof(Rectangle);
+
+               public int X;
+               public int Y;
+               public int Width;
+               public int Height;
+
+               #region ctor
+               public Rectangle(Point p, Size s): this (p.X, p.Y, s.Width, s.Height)
+               {
+               }
+               public Rectangle(Size s) : this (0, 0, s.Width, s.Height)
+        {
+        }
+        public Rectangle(int x, int y, int width, int height)
+        {
+                       X = x;
+                       Y = y;
+                       Width = width;
+                       Height = height;
+        }
+               #endregion
+
+               #region PROPERTIES
+               [XmlIgnore]public int Left{
+            get { return X; }
+            set { X = value; }
+        }
+               [XmlIgnore]public int Top{
+            get { return Y; }
+            set { Y = value; }
+        }
+               [XmlIgnore]public int Right{
+            get { return X + Width; }
+        }
+               [XmlIgnore]public int Bottom{
+            get { return Y + Height; }
+        }
+               [XmlIgnore]public Size Size{
+            get { return new Size(Width, Height); }
+            set
+            {
+                Width = value.Width;
+                Height = value.Height;
+            }
+        }
+               [XmlIgnore]public Point Position{
+                       get { return new Point(X, Y); }
+                       set
+                       {
+                               X = value.X;
+                               Y = value.Y;
+                       }
+               }
+               [XmlIgnore]public Point TopLeft{
+            set
+            {
+                X = value.X;
+                Y = value.Y;
+            }
+            get { return new Point(X, Y); }
+        }
+               [XmlIgnore]public Point TopRight{
+            get { return new Point(Right, Y); }
+        }
+               [XmlIgnore]public Point BottomLeft{
+            get { return new Point(X, Bottom); }
+        }
+               [XmlIgnore]public Point BottomRight{
+            get { return new Point(Right, Bottom); }
+        }
+               [XmlIgnore]public Point Center
+        {
+            get { return new Point(Left + Width / 2, Top + Height / 2); }
+        }
+               #endregion
+
+               #region FUNCTIONS
+        public void Inflate(int xDelta, int yDelta)
+        {
+            this.X -= xDelta;
+            this.Width += 2 * xDelta;
+            this.Y -= yDelta;
+            this.Height += 2 * yDelta;
+        }
+               public void Inflate(int delta)
+               {
+                       Inflate (delta, delta);
+               }
+               public Rectangle Inflated (int delta) {
+                       return Inflated (delta,delta);
+               }
+               public Rectangle Inflated (int deltaX, int deltaY) {
+                       Rectangle r = this;
+                       r.Inflate (deltaX, deltaY);
+                       return r;
+               }
+        public bool ContainsOrIsEqual(Point p)
+        {
+            return (p.X >= X && p.X <= X + Width && p.Y >= Y && p.Y <= Y + Height) ?
+                true : false;
+        }
+        public bool ContainsOrIsEqual(Rectangle r)
+        {
+            return r.TopLeft >= this.TopLeft && r.BottomRight <= this.BottomRight ? true : false;
+        }
+        public bool Intersect(Rectangle r)
+        {
+            int maxLeft = Math.Max(this.Left, r.Left);
+            int minRight = Math.Min(this.Right, r.Right);
+            int maxTop = Math.Max(this.Top, r.Top);
+            int minBottom = Math.Min(this.Bottom, r.Bottom);
+
+                       return (maxLeft < minRight) && (maxTop < minBottom) ?
+                               true : false;
+        }
+        public Rectangle Intersection(Rectangle r)
+        {
+            Rectangle result = new Rectangle();
+            
+            if (r.Left >= this.Left)
+                result.Left = r.Left;
+            else
+                result.TopLeft = this.TopLeft;
+
+            if (r.Right >= this.Right)
+                result.Width = this.Right - result.Left;
+            else
+                result.Width = r.Right - result.Left;
+
+            if (r.Top >= this.Top)
+                result.Top = r.Top;
+            else
+                result.Top = this.Top;
+
+            if (r.Bottom >= this.Bottom)
+                result.Height = this.Bottom - result.Top;
+            else
+                result.Height = r.Bottom - result.Top;
+
+            return result;
+        }
+               #endregion
+
+        #region operators
+        public static Rectangle operator +(Rectangle r1, Rectangle r2)
+        {
+            int x = Math.Min(r1.X, r2.X);
+            int y = Math.Min(r1.Y, r2.Y);
+            int x2 = Math.Max(r1.Right, r2.Right);
+            int y2 = Math.Max(r1.Bottom, r2.Bottom);
+            return new Rectangle(x, y, x2 - x, y2 - y);
+        }
+               public static Rectangle operator +(Rectangle r, Point p)
+               {
+                       return new Rectangle(r.X + p.X, r.Y + p.Y, r.Width, r.Height);
+               }
+               public static Rectangle operator -(Rectangle r, Point p)
+               {
+                       return new Rectangle(r.X - p.X, r.Y - p.Y, r.Width, r.Height);
+               }
+               public static bool operator ==(Rectangle r1, Rectangle r2)
+        {
+            return r1.TopLeft == r2.TopLeft && r1.Size == r2.Size ? true : false;
+        }
+        public static bool operator !=(Rectangle r1, Rectangle r2)
+        {
+            return r1.TopLeft == r2.TopLeft && r1.Size == r2.Size ? false : true;
+        }
+        #endregion        
+
+               public static readonly Rectangle Zero = new Rectangle(0, 0, 0, 0);
+        public static Rectangle Empty
+        {
+            get { return Zero; }
+        }
+        public override string ToString()
+        {
+            return string.Format("{0},{1},{2},{3}", X, Y, Width, Height);
+        }
+        public static Rectangle Parse(string s)
+        {
+            string[] d = s.Split(new char[] { ',' });
+            return new Rectangle(
+                int.Parse(d[0]),
+                int.Parse(d[1]),
+                int.Parse(d[2]),
+                int.Parse(d[3]));
+        }
+               public override int GetHashCode ()
+               {
+                       unchecked // Overflow is fine, just wrap
+                       {
+                               int hash = 17;
+                               // Suitable nullity checks etc, of course :)
+                               hash = hash * 23 + X.GetHashCode();
+                               hash = hash * 23 + Y.GetHashCode();
+                               hash = hash * 23 + Width.GetHashCode();
+                               hash = hash * 23 + Height.GetHashCode();
+                               return hash;
+                       }
+               }
+               public override bool Equals (object obj)
+               {
+                       return (obj == null || obj.GetType() != TRectangle) ?
+                               false :
+                               this == (Rectangle)obj;
+               }
+    }
+}
diff --git a/Crow/src/Rectangles.cs b/Crow/src/Rectangles.cs
new file mode 100644 (file)
index 0000000..e53b42c
--- /dev/null
@@ -0,0 +1,133 @@
+//
+// Rectangles.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System.Collections.Generic;
+using vkvg;
+
+namespace Crow {
+       public class Rectangles
+    {
+        public List<Rectangle> list = new List<Rectangle>();
+        public int count
+        {
+            get { return list.Count; }
+        }
+               public bool IsEmpty => list.Count == 0;
+
+        public void AddRectangle(Rectangle r)
+        {
+                       if (doesNotContain (r)) {
+                               list.Add (r);
+                               boundsUpToDate = false;
+                       }
+        }
+        public void Reset()
+        {
+            list = new List<Rectangle>();
+                       _bounds = Rectangle.Empty;
+                       boundsUpToDate = true;
+        }
+        bool doesNotContain(Rectangle r)
+        {
+            foreach (Rectangle rInList in list)
+                if (rInList.ContainsOrIsEqual(r))
+                    return false;
+            return true;
+        }
+
+        public bool intersect(Rectangle r)
+        {
+            foreach (Rectangle rInList in list)
+                if (rInList.Intersect(r))
+                    return true;
+            return false;
+        }
+               public void stroke(Context ctx, Color c)
+               {
+                       foreach (Rectangle r in list)
+                               ctx.Rectangle(r);
+
+                       ctx.SetSourceColor(c);
+
+                       ctx.LineWidth = 2;
+                       ctx.Stroke ();
+               }
+        public void clearAndClip(Context ctx)
+        {
+                       if (list.Count == 0)
+                               return;
+            foreach (Rectangle r in list)
+                ctx.Rectangle(r);
+
+                       ctx.ClipPreserve();
+                       ctx.Operator = Operator.Clear;
+            ctx.Fill();
+            ctx.Operator = Operator.Over;
+        }
+
+        public void clip(Context ctx)
+        {
+            foreach (Rectangle r in list)
+               ctx.Rectangle(r);
+
+            ctx.Clip();
+        }
+
+               Rectangle _bounds;
+               bool boundsUpToDate = true;
+               public Rectangle Bounds {
+                       get {
+                               if (!boundsUpToDate) {
+                                       if (list.Count > 0) {
+                                               _bounds = list [0];
+                                               for (int i = 1; i < list.Count; i++) {
+                                                       _bounds += list [i];
+                                               }
+                                       } else
+                                               _bounds = Rectangle.Empty;
+                                       boundsUpToDate = true;
+                               }
+                               return _bounds;
+                       }
+               }
+               public void clear(Context ctx)
+        {
+            foreach (Rectangle r in list)
+                ctx.Rectangle(r);
+            ctx.Operator = Operator.Clear;
+            ctx.Fill();
+            ctx.Operator = Operator.Over;
+        }
+               public override string ToString ()
+               {
+                       string tmp = "";
+                       foreach (Rectangle r in list) {
+                               tmp += r.ToString ();
+                       }
+                       return tmp;
+               }
+    }
+}
diff --git a/Crow/src/ReflexionExtensions.cs b/Crow/src/ReflexionExtensions.cs
new file mode 100644 (file)
index 0000000..8c0b4f2
--- /dev/null
@@ -0,0 +1,62 @@
+//
+// ReflexionExtensions.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Reflection;
+
+namespace Crow
+{
+       public static class ReflexionExtensions
+       {
+               public static string GetIcon(this MemberInfo mi)
+               {
+                       switch (mi.MemberType) {
+                       case MemberTypes.Constructor:
+                               return "ctor";
+                       case MemberTypes.Event:
+                               return "event";
+                       case MemberTypes.Field:
+                               return "field";
+                       case MemberTypes.Method:
+                               return "method";
+                       case MemberTypes.Property:
+                               return "property";
+                       case MemberTypes.TypeInfo:
+                               break;
+                       case MemberTypes.Custom:
+                               break;
+                       case MemberTypes.NestedType:
+                               break;
+                       case MemberTypes.All:
+                               break;
+                       default:
+                               return "pubfld";
+                       }
+                       return "notset";
+               }
+       }
+}
+
diff --git a/Crow/src/ScrollingEventArgs.cs b/Crow/src/ScrollingEventArgs.cs
new file mode 100644 (file)
index 0000000..3ff4206
--- /dev/null
@@ -0,0 +1,41 @@
+//
+// ScrollingEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       public class ScrollingEventArgs: EventArgs
+       {
+               public Orientation  Direction;
+
+               public ScrollingEventArgs (Orientation  _direction) : base()
+               {
+                       Direction = _direction;
+               }
+       }
+}
+
diff --git a/Crow/src/SelectionChangeEventArgs.cs b/Crow/src/SelectionChangeEventArgs.cs
new file mode 100644 (file)
index 0000000..988a697
--- /dev/null
@@ -0,0 +1,42 @@
+//
+// SelectionChangeEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       public class SelectionChangeEventArgs: EventArgs
+       {               
+               public object NewValue;
+
+
+               public SelectionChangeEventArgs (object _newValue) : base()
+               {
+                       NewValue = _newValue;
+               }
+       }
+}
+
diff --git a/Crow/src/Size.cs b/Crow/src/Size.cs
new file mode 100644 (file)
index 0000000..4d0bcb5
--- /dev/null
@@ -0,0 +1,205 @@
+//
+// Size.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Crow
+{
+    public struct Size
+    {
+        public static Size Zero
+        { get { return new Size(0, 0); } }
+
+        int _width;
+        int _height;
+
+        public Size(int width, int height)
+        {
+            _width = width;
+            _height = height;
+        }
+               public Size(int size)
+               {
+                       _width = size;
+                       _height = size;
+               }
+        public int Width
+        {
+            get { return _width; }
+            set { _width = value; }
+        }
+        public int Height
+        {
+            get { return _height; }
+            set { _height = value; }
+        }
+
+               #region operators
+               public static implicit operator Rectangle(Size s)
+               {
+                       return new Rectangle (s);
+               }
+        public static implicit operator Size(int i)
+        {
+            return new Size(i, i);
+        }
+               public static implicit operator string(Size s)
+               {
+                       return s.ToString ();
+               }
+               public static implicit operator Size(string s)
+               {
+                       return string.IsNullOrEmpty (s) ? Size.Zero : Parse (s);
+               }
+               public static bool operator ==(Size s1, Size s2)
+        {
+            if (s1.Width == s2.Width && s1.Height == s2.Height)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator !=(Size s1, Size s2)
+        {
+            if (s1.Width == s2.Width && s1.Height == s2.Height)
+                return false;
+            else
+                return true;
+        }
+        public static bool operator >(Size s1, Size s2)
+        {
+            if (s1.Width > s2.Width && s1.Height > s2.Height)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator >=(Size s1, Size s2)
+        {
+            if (s1.Width >= s2.Width && s1.Height >= s2.Height)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator <(Size s1, Size s2)
+        {
+            if (s1.Width < s2.Width)
+                if (s1.Height <= s2.Height)
+                    return true;
+                else
+                    return false;
+            else if (s1.Width == s2.Width && s1.Height < s2.Height)
+                return true;
+
+            return false;
+        }
+               public static bool operator <(Size s, int i)
+               {
+                       return s.Width < i && s.Height < i ? true : false;
+               }
+               public static bool operator <=(Size s, int i)
+               {
+                       return s.Width <= i && s.Height <= i ? true : false;
+               }
+               public static bool operator >(Size s, int i)
+               {
+                       return s.Width > i && s.Height > i ? true : false;
+               }
+               public static bool operator >=(Size s, int i)
+               {
+                       return s.Width >= i && s.Height >= i ? true : false;
+               }
+               public static bool operator <=(Size s1, Size s2)
+        {
+            if (s1.Width <= s2.Width && s1.Height <= s2.Height)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator ==(Size s, int i)
+        {
+            if (s.Width == i && s.Height == i)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator !=(Size s, int i)
+        {
+            if (s.Width == i && s.Height == i)
+                return false;
+            else
+                return true;
+               }
+               public static Size operator +(Size s1, Size s2)
+               {
+                       return new Size(s1.Width + s2.Width, s1.Height + s2.Height);
+               }
+        public static Size operator +(Size s, int i)
+        {
+            return new Size(s.Width + i, s.Height + i);
+        }
+               public static Size operator *(Size s, int i)
+               {
+                       return new Size(s.Width * i, s.Height * i);
+               }
+               public static Size operator /(Size s, int i)
+               {
+                       return new Size(s.Width / i, s.Height / i);
+               }
+               #endregion
+
+               public override int GetHashCode ()
+               {
+                       unchecked // Overflow is fine, just wrap
+                       {
+                               int hash = 17;
+                               // Suitable nullity checks etc, of course :)
+                               hash = hash * 23 + _width.GetHashCode();
+                               hash = hash * 23 + _height.GetHashCode();
+                               return hash;
+                       }
+               }
+               public override bool Equals (object obj)
+               {
+                       return (obj == null || obj.GetType() != typeof(Size)) ?
+                               false :
+                               this == (Size)obj;
+               }
+               public override string ToString()
+               {
+                       return string.Format("{0},{1}", Width, Height);
+               }
+               public static Size Parse(string s)
+               {
+                       string[] d = s.Split(new char[] { ',' });
+                       return d.Length == 1 ? new Size(int.Parse(d[0])) : new Size(
+                               int.Parse(d[0]),
+                               int.Parse(d[1]));
+               }
+       }
+
+}
diff --git a/Crow/src/SolidColor.cs b/Crow/src/SolidColor.cs
new file mode 100644 (file)
index 0000000..c19e749
--- /dev/null
@@ -0,0 +1,129 @@
+//
+// SolidColor.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+using System.Reflection;
+using System.Diagnostics;
+using vkvg;
+
+
+
+namespace Crow
+{
+       public class SolidColor : Fill
+    {
+               public Color color = Color.Transparent;
+               #region CTOR
+               public SolidColor(Color c)
+               {
+                       color = c;
+               }
+               #endregion
+
+               #region implemented abstract members of Fill
+
+               public override void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle))
+               {
+                       ctx.SetSourceColor (color);
+               }
+               public static object Parse(string s)
+               {
+                       return new SolidColor((Color)s);
+               }
+               #endregion
+
+               #region Operators
+        public static implicit operator Color(SolidColor c)
+        {
+                       return c.color;
+        }
+               public static implicit operator SolidColor(Color c)
+               {
+                       return new SolidColor (c);
+               }
+               public static bool operator ==(SolidColor left, SolidColor right)
+               {
+                       return left is SolidColor ? right is SolidColor ? true : false :
+                               left.color == right.color ? true : false;
+               }
+               public static bool operator !=(SolidColor left, SolidColor right)
+               {
+                       return left is SolidColor ? right is SolidColor ? false : true :
+                               left.color == right.color ? false : true;
+
+               }
+               public override int GetHashCode ()
+               {
+                       return color.GetHashCode();
+               }
+               public override bool Equals (object obj)
+               {
+                       if (obj is Crow.Color)
+                               return color == (Color)obj;
+                       if (obj is SolidColor)
+                               return color == (obj as SolidColor).color;
+                       return false;                   
+               }
+//             public static bool operator ==(SolidColor c, string n)
+//             {
+//                     return c.color.Name == n ? true : false;
+//             }
+//             public static bool operator !=(SolidColor c, string n)
+//             {
+//                     return c.color.Name == n ? false : true;
+//             }
+//             public static bool operator ==(string n, SolidColor c)
+//             {
+//                     return c.color.Name == n ? true : false;
+//             }
+//             public static bool operator !=(string n, SolidColor c)
+//             {
+//                     return c.color.Name == n ? false : true;
+//             }
+               public static SolidColor operator *(SolidColor c, Double f)
+               {
+                       return new SolidColor(new Color(c.color.R,c.color.G,c.color.B,c.color.A * f));
+               }
+               public static SolidColor operator +(SolidColor c1, SolidColor c2)
+               {
+                       return new SolidColor(new Color(c1.color.R + c2.color.R,c1.color.G + c2.color.G,c1.color.B + c2.color.B,c1.color.A + c2.color.A));
+               }
+               public static SolidColor operator -(SolidColor c1, SolidColor c2)
+               {
+                       return new SolidColor(new Color(c1.color.R - c2.color.R,c1.color.G - c2.color.G,c1.color.B - c2.color.B,c1.color.A - c2.color.A));
+               }
+               #endregion                                      
+
+               public override string ToString()
+               {
+                       return color.ToString ();
+               }
+    }
+}
diff --git a/Crow/src/Style.cs b/Crow/src/Style.cs
new file mode 100644 (file)
index 0000000..5ca434a
--- /dev/null
@@ -0,0 +1,61 @@
+//
+// Style.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+namespace Crow
+{
+       public struct FileLocation {
+               public string FilePath;
+               public int Line;
+               public int Column;
+               public int Length;
+
+               public FileLocation(string filePath, int line, int column, int length = 0){
+                       FilePath = filePath;
+                       Line = line;
+                       Column = column;
+                       Length = length;
+               }
+               public override string ToString ()
+               {
+                       return string.Format ("{0} ({1},{2})", FilePath, Line, Column);
+               }
+       }
+       public class Style : Dictionary<string, object>
+       {
+               #if DESIGN_MODE
+               public Dictionary<string, FileLocation> Locations = new Dictionary<string, FileLocation>();
+               #endif
+               //public Dictionary<string, Style> SubStyles;//TODO:implement substyles for all tags inside a style
+               public Style () : base()
+               {
+               }
+
+       }
+}
+
diff --git a/Crow/src/StyleReader.cs b/Crow/src/StyleReader.cs
new file mode 100644 (file)
index 0000000..16a70b8
--- /dev/null
@@ -0,0 +1,186 @@
+//
+// StyleReader.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Text.RegularExpressions;
+using Crow.Coding;
+
+namespace Crow
+{
+       /// <summary>
+       /// Parser for style files.
+       /// </summary>
+       //TODO: style key shared by different class may use only first encouneter class setter, which can cause bug.
+       public class StyleReader : StreamReader
+       {
+               enum States { init, classNames, members, value, endOfStatement }
+
+               States curState = States.init;
+
+               int column = 1;
+               int line = 1;
+
+               #region Character ValidityCheck
+               static Regex rxValidChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               static Regex rxNameStartChar = new Regex(@"_|\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}");                                                                                                                      
+               static Regex rxNameChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               static Regex rxDecimal = new Regex(@"[0-9]+");
+               static Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+");
+
+               public bool nextCharIsValidCharStartName
+               {
+                       get { return rxNameStartChar.IsMatch(new string(new char[]{PeekChar()})); }
+               }
+               public bool nextCharIsValidCharName
+               {
+                       get { return rxNameChar.IsMatch(new string(new char[]{PeekChar()})); }
+               }
+               #endregion
+
+               char ReadChar () {
+                       column++;
+                       return (Char)Read();
+               }
+               char PeekChar () {
+                       return (Char)Peek();
+               }
+               void SkipWhiteSpaceAndLineBreak (){
+                       while (!EndOfStream){                           
+                               if (!PeekChar ().IsWhiteSpaceOrNewLine ())
+                                       break;
+                               if (ReadChar () == '\n') {
+                                       line++;
+                                       column = 0;
+                               }
+                       }
+               }
+
+               public StyleReader (Dictionary<string, Style> styling, Stream stream, string resId)
+                       : base(stream)
+               {                       
+                       string styleKey = resId.Substring (0, resId.Length - 6);
+                       string token = "";
+                       List<string> targetsClasses = new List<string> ();
+                       string currentProperty = "";
+
+                       while (!EndOfStream) {
+                               SkipWhiteSpaceAndLineBreak ();
+                               if (EndOfStream)
+                                       break;
+
+                               switch (Peek()) {
+                               case '/':
+                                       ReadChar ();
+                                       if (PeekChar () != '/')
+                                               throw new ParserException (line, column, "Unexpected char '/'", resId);
+                                       ReadLine ();
+                                       break;
+                               case ',':
+                                       ReadChar ();
+                                       if (!(curState == States.init || curState == States.classNames) || string.IsNullOrEmpty (token))
+                                               throw new ParserException (line, column, "Unexpected char ','", resId);
+                                       targetsClasses.Add (token);
+                                       token = "";
+                                       curState = States.classNames;
+                                       break;
+                               case '{':
+                                       ReadChar ();
+                                       if (!(curState == States.init || curState == States.classNames) || string.IsNullOrEmpty (token))
+                                               throw new ParserException (line, column, "Unexpected char '{'", resId);
+                                       targetsClasses.Add (token);
+                                       token = "";
+                                       curState = States.members;
+                                       break;
+                               case '}':
+                                       ReadChar ();
+                                       if (curState != States.members)
+                                               throw new ParserException (line, column, "Unexpected char '}'", resId);
+                                       curState = States.classNames;
+                                       targetsClasses.Clear ();
+                                       break;
+                               case '=':
+                                       ReadChar ();
+                                       if (!(curState == States.init || curState == States.members))
+                                               throw new ParserException (line, column, "Unexpected char '='", resId);
+                                       currentProperty = token;
+                                       token = "";
+                                       curState = States.value;
+                                       break;
+                               case '"':
+                                       if (curState != States.value)
+                                               throw new ParserException (line, column, "Unexpected char '\"'", resId);                                        
+                                       ReadChar ();
+
+                                       while (!EndOfStream) {
+                                               char c = PeekChar();
+                                               if (c == '\"') {
+                                                       ReadChar ();
+                                                       break;
+                                               }
+                                               token += ReadChar();
+                                               if (c == '\\' && !EndOfStream)
+                                                       token += ReadChar();                                            
+                                       }
+                                       curState = States.endOfStatement;
+                                       break;
+                               case ';':
+                                       if (curState != States.endOfStatement)
+                                               throw new ParserException (line, column, "Unexpected end of statement", resId);                                 
+                                       ReadChar ();
+                                       foreach (string tc in targetsClasses) {
+                                               if (!styling.ContainsKey (tc))
+                                                       styling [tc] = new Style ();
+                                               else if (styling [tc].ContainsKey (currentProperty))
+                                                       continue;
+                                               styling [tc] [currentProperty] = token;
+                                               #if DESIGN_MODE
+                                               styling [tc].Locations[currentProperty] = new FileLocation(resId, line, column - token.Length - 1, token.Length);
+                                               #endif
+                                               //System.Diagnostics.Debug.WriteLine ("Style: {3} : {0}.{1} = {2}", tc, currentProperty, token, resId);
+                                       }
+                                       token = "";
+                                       curState = States.members;
+                                       break;
+                               default:
+                                       if (curState == States.value)
+                                               throw new ParserException (line, column, "expecting value enclosed in '\"'", resId);
+                                       if (curState == States.endOfStatement)
+                                               throw new ParserException (line, column, "expecting end of statement", resId);
+
+                                       if (nextCharIsValidCharStartName) {
+                                               token += ReadChar();
+                                               while (nextCharIsValidCharName)
+                                                       token += ReadChar();
+                                       }
+                                       break;
+                               }
+                       }
+               }
+       }
+}
diff --git a/Crow/src/SvgPicture.cs b/Crow/src/SvgPicture.cs
new file mode 100644 (file)
index 0000000..7ecc681
--- /dev/null
@@ -0,0 +1,147 @@
+//
+// SvgPicture.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.IO;
+using vkvg;
+
+namespace Crow
+{
+       /// <summary>
+       /// Derived from FILL for loading and drawing SVG images in the interface
+       /// </summary>
+       public class SvgPicture : Picture
+       {
+               IntPtr nsvgImage;
+
+               #region CTOR
+               /// <summary>
+               /// Initializes a new instance of SvgPicture.
+               /// </summary>
+               public SvgPicture ()
+               {}
+               /// <summary>
+               /// Initializes a new instance of SvgPicture by loading the SVG file pointed by the path argument
+               /// </summary>
+               /// <param name="path">image path, may be embedded</param>
+               public SvgPicture (string path) : base(path)
+               {
+                       Load ();
+               }
+               #endregion
+
+               void Load ()
+               {
+                       using (StreamReader sr = new StreamReader(Interface.CurrentInterface.GetStreamFromPath (Path))) {
+                               nsvgImage = Interface.CurrentInterface.dev.LoadSvgFragment (sr.ReadToEnd ());
+                       }
+
+                       int w, h;
+                       NativeMethods.nsvg_get_size (nsvgImage, out w, out h);
+                       Dimensions.Width = w;
+                       Dimensions.Height = h;
+               }
+
+               public void LoadSvgFragment (string fragment) {
+                       throw new NotImplementedException ();
+                       /*hSVG = new Rsvg.Handle (System.Text.Encoding.Unicode.GetBytes(fragment));
+                       Dimensions = new Size (hSVG.Dimensions.Width, hSVG.Dimensions.Height);*/
+               }
+
+               #region implemented abstract members of Fill
+
+               public override void SetAsSource (Context ctx, Rectangle bounds = default(Rectangle))
+               {
+                       if (nsvgImage == IntPtr.Zero)
+                               return;
+                       throw new NotImplementedException ();
+                       /*float widthRatio = 1f;
+                       float heightRatio = 1f;
+
+                       if (Scaled){
+                               widthRatio = (float)bounds.Width / Dimensions.Width;
+                               heightRatio = (float)bounds.Height / Dimensions.Height;
+                       }
+
+                       if (KeepProportions) {
+                               if (widthRatio < heightRatio)
+                                       heightRatio = widthRatio;
+                               else
+                                       widthRatio = heightRatio;
+                       }
+
+                       using (Surface tmp = new Surface (Interface.CurrentInterface.dev, bounds.Width, bounds.Height)) {
+                               using (Context gr = new Context (tmp)) {
+                                       gr.Translate (bounds.Left, bounds.Top);
+                                       gr.Scale (widthRatio, heightRatio);
+                                       gr.Translate ((bounds.Width / widthRatio - Dimensions.Width) / 2, (bounds.Height / heightRatio - Dimensions.Height) / 2);
+                                       gr.SetSourceSurface (svgSurface, 0, 0);
+                                       gr.Paint ();
+                               }
+                               ctx.SetSource (tmp);
+                       }*/
+               }
+               #endregion
+
+               /// <summary>
+               /// paint the image in the rectangle given in arguments according
+               /// to the Scale and keepProportion parameters.
+               /// </summary>
+               /// <param name="gr">drawing Backend context</param>
+               /// <param name="rect">bounds of the target surface to paint</param>
+               /// <param name="subPart">limit rendering to svg part named 'subPart'</param>
+               public override void Paint (Context gr, Rectangle rect, string subPart = "")
+               {
+                       if (nsvgImage == IntPtr.Zero)
+                               return;
+
+                       float widthRatio = 1f;
+                       float heightRatio = 1f;
+
+                       if (Scaled) {
+                               widthRatio = (float)rect.Width / Dimensions.Width;
+                               heightRatio = (float)rect.Height / Dimensions.Height;
+                       }
+                       if (KeepProportions) {
+                               if (widthRatio < heightRatio)
+                                       heightRatio = widthRatio;
+                               else
+                                       widthRatio = heightRatio;
+                       }
+
+                       gr.Save ();
+
+                       gr.Translate (rect.Left, rect.Top);
+                       gr.Scale (widthRatio, heightRatio);
+                       gr.Translate ((rect.Width / widthRatio - Dimensions.Width) / 2, (rect.Height / heightRatio - Dimensions.Height) / 2);
+
+                       gr.RenderSvg (nsvgImage, subPart);
+
+                       gr.Restore ();
+               }
+       }
+}
+
diff --git a/Crow/src/TextChangeEventArgs.cs b/Crow/src/TextChangeEventArgs.cs
new file mode 100644 (file)
index 0000000..33ca405
--- /dev/null
@@ -0,0 +1,41 @@
+//
+// TextChangeEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       public class TextChangeEventArgs: EventArgs
+       {
+               public String Text;
+
+               public TextChangeEventArgs (string _newValue) : base()
+               {
+                       Text = _newValue;
+               }
+       }
+}
+
diff --git a/Crow/src/ValueChangeEventArgs.cs b/Crow/src/ValueChangeEventArgs.cs
new file mode 100644 (file)
index 0000000..e8293de
--- /dev/null
@@ -0,0 +1,44 @@
+//
+// ValueChangeEventArgs.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace Crow
+{
+       public class ValueChangeEventArgs: EventArgs
+       {
+               public string MemberName;
+               public object NewValue;
+
+
+               public ValueChangeEventArgs (string _memberName, object _newValue) : base()
+               {
+                       MemberName = _memberName;
+                       NewValue = _newValue;
+               }
+       }
+}
+
diff --git a/Crow/src/debug/DbgEventTypeColors.cs b/Crow/src/debug/DbgEventTypeColors.cs
new file mode 100644 (file)
index 0000000..35ffe23
--- /dev/null
@@ -0,0 +1,77 @@
+//
+// DbgEventTypeColors.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using vkvg;
+using System.Linq;
+
+namespace Crow
+{
+       #if DEBUG_LOG
+       public class DbgEventTypeColors : GraphicObject
+       {
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                       gr.SetFontSize (Font.Size);
+                       gr.FontOptions = Interface.FontRenderingOptions;
+                       gr.Antialias = Interface.Antialias;
+
+                       DbgEvtType[] types = DbgLogViewer.colors.Keys.ToArray ();
+                       Color[] colors = DbgLogViewer.colors.Values.ToArray ();
+
+                       Rectangle r = ClientRectangle;
+                       FontExtents fe = gr.FontExtents;
+
+                       double penY = fe.Height + r.Top;
+                       double penX = (double)r.Left;
+
+
+                       for (int i = 0; i < types.Length; i++) {
+                               string n = types [i].ToString();
+                               Color c = colors[i];
+                               Foreground.SetAsSource (gr);
+
+                               gr.MoveTo (penX + 25.0, penY - fe.Descent);
+                               gr.ShowText (n);
+
+                               Rectangle rc = new Rectangle((int)penX, (int)(penY - fe.Height), 20, (int)fe.Height);
+                               rc.Inflate (-2);
+                               gr.Rectangle (rc);
+                               gr.StrokePreserve ();
+
+                               gr.SetSourceColor (c);
+                               gr.Fill ();
+
+                               penY += fe.Height;
+
+                       }
+               }
+       }
+       #endif
+}
+
diff --git a/Crow/src/debug/DbgLogViewer.cs b/Crow/src/debug/DbgLogViewer.cs
new file mode 100644 (file)
index 0000000..eeadd00
--- /dev/null
@@ -0,0 +1,646 @@
+//
+// DbgLogViewer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using vkvg;
+
+#if DEBUG_LOG
+namespace Crow
+{
+       public class DbgLogViewer : ScrollingObject
+       {
+               public static Dictionary<DbgEvtType,Color> colors;
+
+               public static Configuration colorsConf = new Configuration("dbgcolor.conf");
+
+               #region debug viewer private classes
+               public class DbgData {
+                       public int objInstanceNum;
+                       public LayoutingType layout;
+                       public LayoutingQueueItem.Result result;
+
+                       public DbgData (int _obj) {
+                               objInstanceNum = _obj;
+                       }
+               }
+               public class DbgEvent {
+                       public long begin, end;
+                       public DbgEvtType type;
+                       public DbgData data = null;
+
+                       public DbgEvent() {}
+
+                       public static DbgEvent Parse (string str) {
+                               if (str == null)
+                                       return null;
+                               string[] tmp = str.Trim().Split(';');
+
+                               DbgEvent evt = new DbgEvent ();
+                               evt.begin = long.Parse (tmp [0]);
+                               evt.end = long.Parse (tmp [1]);
+                               evt.type = (DbgEvtType)Enum.Parse (typeof(DbgEvtType), tmp [2]);
+
+                               if (evt.type.HasFlag (DbgEvtType.GraphicObject)) {
+                                       evt.data = new DbgData (int.Parse (tmp [3]));
+                                       if (evt.type.HasFlag (DbgEvtType.GOLayouting)) {
+                                               evt.data.layout = (LayoutingType)Enum.Parse (typeof(LayoutingType), tmp [4]);
+                                               if (evt.type == DbgEvtType.GOProcessLayouting)
+                                                       evt.data.result = (LayoutingQueueItem.Result)Enum.Parse (typeof(LayoutingQueueItem.Result), tmp [5]);                                                                           
+                                       }
+                               }
+                               return evt;
+                       }
+               }
+               class DbgGo {
+                       public int listIndex;//prevent doing an IndexOf on list for each event to know y pos on screen
+                       public int instanceNum;//class instantiation order, used to bind events to objs
+                       public string name;
+                       //0 is the main graphic tree, for other obj tree not added to main tree, it range from 1->n
+                       //useful to track events for obj shown later, not on start
+                       public int treeIndex;
+                       public int yIndex;//index in parenting, the whole main graphic tree is one continuous suite
+                       public int xLevel;//depth
+
+                       public List<DbgEvent> events = new List<DbgEvent>();
+
+                       public static DbgGo Parse (string str) {
+                               DbgGo g = new DbgGo ();
+                               if (str == null)
+                                       return null;
+                               string[] tmp = str.Trim().Split(';');
+                               g.instanceNum = int.Parse (tmp [0]);
+                               g.name = tmp [1];
+                               g.yIndex = int.Parse (tmp [2]);
+                               g.xLevel = int.Parse (tmp [3]);
+                               return g;
+                       }
+
+               }
+               #endregion
+
+               public static void reloadColors () {
+                       colors = new Dictionary<DbgEvtType, Color>();
+                       foreach (string n in colorsConf.Names) {
+                               DbgEvtType t = (DbgEvtType)Enum.Parse (typeof(DbgEvtType), n);
+                               Color c = colorsConf.Get<Color> (n);
+                               colors.Add (t, c);
+                       }
+
+               }
+               #region CTOR
+               static DbgLogViewer() {
+                       reloadColors ();
+               }
+               protected DbgLogViewer () : base(){}
+               public DbgLogViewer (Interface iface) : base(iface){}
+               #endregion
+
+               FontExtents fe;
+
+               double xScale = 1.0/512.0, yScale = 1.0, leftMargin, topMargin = 0.0;
+               string logFile;
+
+               List<DbgEvent> events;//global events
+               List<DbgGo> objs;
+
+               long currentTick = 0, selStart = -1, selEnd = -1, minTicks = 0, maxTicks = 0, visibleTicks = 0;
+               int currentLine = -1;
+               int visibleLines;
+
+               public string LogFile {
+                       get { return logFile; }
+                       set {
+                               if (logFile == value)
+                                       return;
+                               logFile = value;
+
+                               loadDebugFile ();
+
+
+                               NotifyValueChanged ("LogFile", logFile);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               public double XScale {
+                       get { return xScale; }
+                       set {
+                               if (xScale == value)
+                                       return;
+                               xScale = value;
+                               NotifyValueChanged ("XScale", xScale);
+                               updateVisibleTicks ();
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               public double YScale {
+                       get { return yScale; }
+                       set {
+                               if (yScale == value)
+                                       return;
+                               yScale = value;
+                               NotifyValueChanged ("YScale", yScale);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+
+
+               void storeEvent (DbgEvent evt) {
+                       if (evt.data == null)//global events
+                               events.Add (evt);
+                       else {
+                               DbgGo go = objs.Where (o => o.instanceNum == evt.data.objInstanceNum).FirstOrDefault ();
+                               if (go == null)
+                                       Console.WriteLine ("Unknown instance: " + evt.data.objInstanceNum);
+                               else
+                                       go.events.Add (evt);                                            
+                       }
+               }
+
+               void loadDebugFile() {
+                       if (!File.Exists (logFile))
+                               return;
+
+                       events = new List<DbgEvent>();
+                       objs = new List<DbgGo> ();
+                       minTicks = maxTicks = 0;
+                       leftMargin = topMargin = 0.0;
+
+                       using (ImageSurface img = new ImageSurface (Format.Argb32, 1, 1)) {
+                               using (Context gr = new Context (img)) {
+                                       double maxNameWidth = 0.0;
+
+                                       gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                                       gr.SetFontSize (Font.Size);
+
+                                       using (StreamReader s = new StreamReader (logFile)) {
+                                               if (s.ReadLine () != "[GraphicObjects]")                                        
+                                                       return;                         
+                                               while (!s.EndOfStream) {
+                                                       string l = s.ReadLine ();
+                                                       if (l == "[Events]")
+                                                               break;
+                                                       DbgGo o = DbgGo.Parse (l);
+                                                       objs.Add (o);
+                                                       double nameWidth = gr.TextExtents (o.name).Width + 5.0 * o.xLevel;
+                                                       if (nameWidth > maxNameWidth)
+                                                               maxNameWidth = nameWidth;
+                                               }
+                                               if (!s.EndOfStream) {
+                                                       DbgEvent firstEvt = DbgEvent.Parse (s.ReadLine ());
+                                                       storeEvent (firstEvt);
+                                                       minTicks = firstEvt.begin;
+                                               }
+
+                                               if (!s.EndOfStream) {
+                                                       while (true) {
+                                                               DbgLogViewer.DbgEvent evt = DbgEvent.Parse (s.ReadLine ());
+                                                               storeEvent (evt);
+                                                               if (s.EndOfStream) {
+                                                                       maxTicks = evt.end;
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                       }
+
+                                       leftMargin = 2.5 + maxNameWidth;
+
+                                       fe = gr.FontExtents;
+
+                                       topMargin = 2.0 * fe.Height;
+
+                                       updateVisibleLines ();
+                                       updateVisibleTicks ();
+                               }
+                       }
+
+               }
+               void updateVisibleLines(){
+                       visibleLines = (int)Math.Floor (((double)ClientRectangle.Height - topMargin) / fe.Height);
+                       NotifyValueChanged ("VisibleLines", visibleLines);
+                       updateMaxScrollY ();
+               }
+               void updateVisibleTicks() {
+                       visibleTicks = Math.Max (0, (long)((double)(ClientRectangle.Width - leftMargin) / XScale));
+                       NotifyValueChanged ("VisibleTicks", visibleTicks);
+                       updateMaxScrollX ();
+               }
+               /*
+               void updateVisibleColumns(){
+                       visibleColumns = (int)Math.Floor ((double)(ClientRectangle.Width - leftMargin)/ fe.MaxXAdvance);
+                       NotifyValueChanged ("VisibleColumns", visibleColumns);
+                       updateMaxScrollX ();
+               }
+               void updateMaxScrollX () {
+                       MaxScrollX = Math.Max (0, buffer.longestLineCharCount - visibleColumns);
+                       if (buffer.longestLineCharCount > 0)
+                               NotifyValueChanged ("ChildWidthRatio", Slot.Width * visibleColumns / buffer.longestLineCharCount);                      
+               }*/
+
+               void updateMaxScrollX () {
+                       if (objs == null)
+                               MaxScrollX = 0;
+                       else                            
+                               MaxScrollX =  (int)Math.Max(0L, maxTicks - minTicks - visibleTicks);
+               }
+               void updateMaxScrollY () {
+                       if (objs == null)
+                               MaxScrollY = 0;
+                       else                            
+                               MaxScrollY =  Math.Max(0, objs.Count - visibleLines);
+               }
+
+
+               public override Font Font {
+                       get { return base.Font; }
+                       set {
+                               base.Font = value;
+                               loadDebugFile ();
+                       }
+               }
+
+               public override int ScrollY {
+                       get {
+                               return base.ScrollY;
+                       }
+                       set {
+                               base.ScrollY = value;
+
+                               if (objs == null)
+                                       return;
+                               
+                               Rectangle cb = ClientRectangle;
+                               cb.Left += (int)leftMargin;
+                               cb.Width -= (int)leftMargin;
+                               cb.Y += (int)topMargin;
+                               cb.Height -= (int)topMargin;
+
+                               if (mousePos.Y < cb.Top || mousePos.Y > cb.Bottom)
+                                       currentLine = -1;
+                               else
+                                       currentLine = (int)((double)(mousePos.Y - cb.Top) / fe.Height) + ScrollY;
+
+                               NotifyValueChanged ("CurrentLine", currentLine);
+
+                       }
+               }
+
+
+
+               protected override void onDraw (Cairo.Context gr)
+               {
+                       base.onDraw (gr);
+
+                       gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                       gr.SetFontSize (Font.Size);
+                       gr.FontOptions = Interface.FontRenderingOptions;
+                       gr.Antialias = Cairo.Antialias.None;
+
+                       if (objs == null)
+                               return;
+
+                       gr.LineWidth = 1.0;
+
+                       Rectangle cb = ClientRectangle;
+
+                       double penY = topMargin + ClientRectangle.Top;
+
+                       for (int i = 0; i < visibleLines; i++) {
+                               if (i + ScrollY >= objs.Count)
+                                       break;
+                               DbgGo g = objs [i + ScrollY];
+
+
+                               foreach (DbgEvent evt in g.events) {
+                                       
+
+                                       if (evt.end - minTicks <= ScrollX)
+                                               continue;
+                                       if (evt.begin - minTicks > ScrollX + visibleTicks)
+                                               break;
+
+                                       double x = xScale * (evt.begin - minTicks - ScrollX) ;
+                                       double w = Math.Max (Math.Max(2.0, 2.0 * xScale), (double)(evt.end - evt.begin) * xScale);
+                                       if (x < 0.0) {
+                                               w += x;
+                                               x = 0.0;
+                                       }
+                                       x += leftMargin + cb.Left;
+                                       double rightDiff = x + w - cb.Right;
+                                       if (rightDiff > 0)
+                                               w -= rightDiff;
+                                       //if (x + w > cb.Right)
+                                       //      continue;
+
+                                       Color c = Color.Black;
+
+                                       if (evt.type == DbgEvtType.GOProcessLayouting) {                                                        
+                                               switch (evt.data.result) {
+                                               case LayoutingQueueItem.Result.Success:
+                                                       c = Crow.Color.Green;
+                                                       break;
+                                               case LayoutingQueueItem.Result.Deleted:
+                                                       c = Crow.Color.Red;
+                                                       break;
+                                               case LayoutingQueueItem.Result.Discarded:
+                                                       c = Crow.Color.OrangeRed;
+                                                       break;
+                                               case LayoutingQueueItem.Result.Requeued:
+                                                       c = Crow.Color.Orange;
+                                                       break;
+                                               }
+                                       } else if (colors.ContainsKey (evt.type))
+                                               c = colors [evt.type];
+                                       else
+                                               System.Diagnostics.Debugger.Break ();
+
+                                       gr.SetSourceColor (c);
+
+                                       gr.Rectangle (x, penY, w, fe.Height);
+                                       gr.Fill ();
+                               }
+
+                               penY += fe.Height;
+
+                               gr.SetSourceColor (Crow.Color.Jet);
+                               gr.MoveTo (cb.X, penY - 0.5);
+                               gr.LineTo (cb.Right, penY - 0.5);
+                               gr.Stroke ();
+
+                               double penX = 5.0 * g.xLevel + cb.Left;
+
+                               if (g.yIndex == 0)
+                                       gr.SetSourceColor (Crow.Color.LightSalmon);
+                               else
+                                       Foreground.SetAsSource (gr);
+
+                               gr.MoveTo (penX, penY - gr.FontExtents.Descent);
+                               gr.ShowText (g.name);
+
+                               gr.SetSourceColor (Crow.Color.White);
+                               gr.MoveTo (cb.X, penY - gr.FontExtents.Descent);
+                               gr.ShowText ((i+ ScrollY).ToString());
+
+                       }
+
+
+                       gr.MoveTo (cb.Left, topMargin - 0.5 + cb.Top);
+                       gr.LineTo (cb.Right, topMargin - 0.5 + cb.Top);
+
+                       gr.MoveTo (leftMargin + cb.Left, cb.Top);
+                       gr.LineTo (leftMargin + cb.Left, cb.Bottom);
+                       gr.SetSourceColor (Crow.Color.Grey);
+
+                       penY = topMargin + ClientRectangle.Top;
+
+                       //graduation
+                       int largeGrad = int.Parse ("1" + new string ('0', visibleTicks.ToString ().Length - 1));
+                       int smallGrad = Math.Max (1, largeGrad / 10);
+
+                       long firstVisibleTicks = minTicks + ScrollX;
+                       long curGrad = firstVisibleTicks - firstVisibleTicks % smallGrad + smallGrad;
+
+                       long gg = curGrad - ScrollX - minTicks;
+                       while (gg < visibleTicks ) {
+                               double x = (double)gg * xScale + leftMargin + cb.Left;
+
+                               gr.MoveTo (x, penY - 0.5);
+                               if (curGrad % largeGrad == 0) { 
+                                       gr.LineTo (x, penY - 8.5);
+                                       string str = curGrad.ToString ();
+                                       TextExtents te = gr.TextExtents (str);
+                                       gr.RelMoveTo (-0.5 * te.Width, -2.0);
+                                       gr.ShowText (str);
+                               }else
+                                       gr.LineTo (x, penY - 2.5);
+
+                               curGrad += smallGrad;
+                               gg = curGrad - ScrollX - minTicks;
+                       }
+
+                       gr.Stroke ();
+
+                       //global events
+                       foreach (DbgEvent evt in events) {
+                               if (evt.begin - minTicks <= ScrollX)
+                                       continue;
+                               double x = xScale * (evt.begin - minTicks - ScrollX) ;
+                               x += leftMargin + cb.Left;
+
+                               gr.SetSourceColor (Crow.Color.Yellow);
+                               gr.MoveTo (x, penY);
+                               gr.LineTo (x, cb.Bottom);
+                               gr.Stroke ();
+                               string s = evt.type.ToString () [10].ToString ();
+                               Cairo.TextExtents te = gr.TextExtents (s);
+                               gr.Rectangle (x - 0.5 * te.Width , penY - te.Height, te.Width, te.Height);
+                               gr.Fill ();
+                               gr.MoveTo (x- 0.5 * te.Width, penY - gr.FontExtents.Descent);
+                               gr.SetSourceColor (Crow.Color.Jet);
+                               gr.ShowText (s);
+
+                       }
+
+               }
+               public override void Paint (ref Cairo.Context ctx)
+               {
+                       base.Paint (ref ctx);
+
+                       Rectangle r = new Rectangle(mousePos.X, 0, 1, Slot.Height);
+                       Rectangle ctxR = ContextCoordinates (r);
+                       Rectangle cb = ClientRectangle;
+
+                       ctx.Rectangle (ctxR);
+                       ctx.SetSourceColor (Color.CornflowerBlue);
+                       ctx.Fill();
+
+                       ctx.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                       ctx.SetFontSize (Font.Size);
+                       ctx.FontOptions = Interface.FontRenderingOptions;
+                       ctx.Antialias = Interface.Antialias;
+
+                       ctx.MoveTo (ctxR.X, ctxR.Y + fe.Height);
+                       ctx.ShowText (currentTick.ToString ());
+
+                       ctx.Operator = Cairo.Operator.Add;
+
+                       if (currentLine >= 0) {
+                               r = new Rectangle (cb.Left, (currentLine + 2 - ScrollY) * (int)fe.Height + cb.Top, cb.Width, (int)fe.Height);
+
+                               ctx.Operator = Cairo.Operator.Add;
+                               ctx.SetSourceRGBA (0.1, 0.1, 0.1, 0.4);
+                               ctx.Rectangle (ContextCoordinates (r));
+                               ctx.Fill ();
+                       }
+
+                       if (selStart < 0) {
+                               ctx.Operator = Cairo.Operator.Over;
+                               return;
+                       }
+                       double selStartX = (double)(selStart - ScrollX - minTicks) * xScale + leftMargin + cb.Left;
+                       double selEndX = (selEnd >= 0) ? (double)(selEnd - ScrollX - minTicks) * xScale + leftMargin + cb.Left :
+                               (double)(currentTick - ScrollX - minTicks) * xScale + leftMargin + cb.Left;
+
+                       if (selStartX < selEndX) {
+                               ctxR.X = (int)selStartX;
+                               ctxR.Width = (int)(selEndX - selStartX);
+                       } else {
+                               ctxR.X = (int)selEndX;
+                               ctxR.Width = (int)(selStartX - selEndX);
+                       }
+
+                       ctxR.Width = Math.Max (1, ctxR.Width);
+                       ctx.Rectangle (ctxR);
+                       //ctx.SetSourceColor (Color.LightYellow);
+                       ctx.SetSourceColor (Color.Jet);
+                       ctx.Fill();
+                       ctx.Operator = Cairo.Operator.Over;
+
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+                       switch (layoutType) {
+                       case LayoutingType.Width:
+                               updateVisibleTicks ();
+                               break;
+                       case LayoutingType.Height:
+                               updateVisibleLines ();
+                               break;
+                       }
+               }
+
+               Point mousePos;
+               void updateMouseLocalPos(Point mPos){
+                       Rectangle r = ScreenCoordinates (Slot);
+                       Rectangle cb = ClientRectangle;
+                       cb.Left += (int)leftMargin;
+                       cb.Width -= (int)leftMargin;
+                       cb.Y += (int)topMargin;
+                       cb.Height -= (int)topMargin;
+
+                       mousePos = mPos - r.Position;
+
+                       mousePos.X = Math.Max(cb.X, mousePos.X);
+                       mousePos.X = Math.Min(cb.Right, mousePos.X);
+
+                       if (mousePos.Y < cb.Top || mousePos.Y > cb.Bottom)
+                               currentLine = -1;
+                       else
+                               currentLine = (int)((double)(mousePos.Y - cb.Top) / fe.Height) + ScrollY;
+
+                       NotifyValueChanged ("CurrentLine", currentLine);
+                       
+                       mousePos.Y = Math.Max(cb.Y, mousePos.Y);
+                       mousePos.Y = Math.Min(cb.Bottom, mousePos.Y);
+
+                       currentTick = (int)((double)(mousePos.X - cb.X) / xScale) + minTicks + ScrollX;
+
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (sender, e);
+                       currentLine = -1;
+                       currentTick = 0;
+               }
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+                       updateMouseLocalPos (e.Position);
+
+                       if (selStart >= 0 && IFace.Mouse.IsButtonDown(MouseButton.Left))
+                               selEnd = currentTick;
+
+                       if (RegisteredLayoutings == LayoutingType.None && !IsDirty)
+                               IFace.EnqueueForRepaint (this);
+                       
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseDown (sender, e);
+
+                       selStart = currentTick;
+                       selEnd = -1;
+
+                       RegisterForRedraw ();
+               }
+               public override void onMouseUp (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+                       if (selStart == currentTick) {
+                               selStart = -1;
+                               selEnd = -1;
+                       }else
+                               selEnd = currentTick;
+                       RegisterForRedraw ();
+               }
+
+               /// <summary> Process scrolling vertically, or if shift is down, vertically </summary>
+               public override void onMouseWheel (object sender, MouseWheelEventArgs e)
+               {                       
+                       //base.onMouseWheel (sender, e);
+
+                       if (IFace.Shift)
+                               ScrollX -= (int)((double)(e.Delta * MouseWheelSpeed) / xScale);
+                       else if (IFace.Ctrl) {
+                               if (e.Delta > 0) {
+                                       XScale *= 2.0;
+                               } else {
+                                       if (MaxScrollX > 0)
+                                               XScale *= 0.5;
+                               }
+                               ScrollX = (int)(currentTick - (int)((double)Math.Max(0, mousePos.X - (int)leftMargin) / xScale) - minTicks);
+                       }else
+                               ScrollY -= e.Delta * MouseWheelSpeed;
+               }
+
+               public override void onKeyDown (object sender, KeyEventArgs e)
+               {
+                       base.onKeyDown (sender, e);
+
+                       if (e.Key == Key.F3) {
+                               if (selEnd < 0)
+                                       return;
+                               if (selEnd < selStart)
+                                       zoom (selEnd, selStart);
+                               else
+                                       zoom (selStart, selEnd);
+                               selEnd = selStart = -1;
+                       }
+               }
+
+               void zoom (long start, long end) {                                              
+                       //Rectangle cb = ClientRectangle;
+                       //cb.X += (int)leftMargin;
+                       XScale = ((double)ClientRectangle.Width - leftMargin)/(end - start);
+                       ScrollX = (int)(start - minTicks);
+               }
+       }
+}
+#endif
+
diff --git a/Crow/src/debug/DebugLogger.cs b/Crow/src/debug/DebugLogger.cs
new file mode 100644 (file)
index 0000000..ecd7f69
--- /dev/null
@@ -0,0 +1,177 @@
+//
+// CrowDebugger.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using vkvg;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+
+#if DEBUG_LOG
+namespace Crow
+{
+       /*public class LayoutingEvent : DbgEvent {
+               public List<LayoutingQueueItem> lqis = new List<LayoutingQueueItem>();
+
+       }*/
+       [Flags]
+       public enum DbgEvtType {
+               ////9 nth bit set for iface event
+               IFace                                                   = 0x0100,
+               IFaceStartLayouting                             = 0x0101,
+               IFaceEndLayouting                               = 0x0102,
+               IFaceStartClipping                              = 0x0103,
+               IFaceEndClipping                                = 0x0104,
+               IFaceStartDrawing                               = 0x0105,
+               IFaceEndDrawing                                 = 0x0106,
+               IFaceUpdate                                             = 0x0107,
+               //10 nth bit set for graphic obj
+               GraphicObject                                   = 0x0200,
+               GOClassCreation                                 = 0x0201,
+               GOInitialization                                = 0x0202,
+               GOClippingRegistration                  = 0x0203,
+               GORegisterClip                                  = 0x0204,
+               GORegisterForGraphicUpdate              = 0x0205,
+               GOEnqueueForRepaint                             = 0x0206,
+               GOLayouting                                             = 0x0400,
+               GORegisterLayouting                             = 0x0607,
+               GOProcessLayoutingWithNoParent  = 0x0608,
+               GOProcessLayouting                              = 0x0609,
+               GODraw                                                  = 0x020a,
+               GORecreateCache                                 = 0x020b,
+               GOUpdateCacheAndPaintOnCTX              = 0x020c,
+               GOPaint                                                 = 0x020d,
+               GONewDataSource                                 = 0x020e,
+               GOLock                                                  = 0x0800,
+               GOLockUpdate                                    = 0x0a01,
+               GOLockClipping                                  = 0x0a02,
+               GOLockRender                                    = 0x0a03,
+               GOLockLayouting                                 = 0x0a04,
+       }
+
+       /// <summary>
+       /// debug events as recorded, another class is used in the viewer
+       /// </summary>
+       public class DbgEvent {
+               public long begin, end;
+               public DbgEvtType type;
+               public object data = null;
+
+               public DbgEvent() {}
+                       
+               public DbgEvent(long timeStamp, DbgEvtType evt, object _data = null) {                  
+                       data = _data;
+                       type = evt;
+                       begin = timeStamp;
+                       end = timeStamp;
+               }
+
+               public override string ToString ()
+               {
+                       GraphicObject go = data as GraphicObject;
+                       if (go != null)
+                               return string.Format ("{0};{1};{2};{3}", begin, end, type, GraphicObject.GraphicObjects.IndexOf(go).ToString());
+                       if (!(data is LayoutingQueueItem))
+                               return string.Format ("{0};{1};{2}", begin, end, type);
+                       LayoutingQueueItem lqi = (LayoutingQueueItem)data;
+                       if (type == DbgEvtType.GOProcessLayouting)
+                               return string.Format ("{0};{1};{2};{3};{4};{5}", begin, end, type, GraphicObject.GraphicObjects.IndexOf(lqi.graphicObject).ToString(), lqi.LayoutType.ToString(), lqi.result.ToString());                       
+                       return string.Format ("{0};{1};{2};{3};{4}", begin, end, type, GraphicObject.GraphicObjects.IndexOf(lqi.graphicObject).ToString(), lqi.LayoutType.ToString());
+                       
+               }
+       }
+
+       public static class DebugLog
+       {
+               static Surface surf;
+               static Context ctx;
+
+               static Crow.Rectangle bounds = new Crow.Rectangle(0,0,8182,4096);
+               static double penX = 1.0;
+               static double ySpacing = 10.0;
+               static double xPenStart = 250.0;
+               static double xResolution = 0.001; //per tick
+               public static Stopwatch chrono = Stopwatch.StartNew();
+
+               public static List<DbgEvent> events = new List<DbgEvent>();
+               public static DbgEvent currentEvent = null;
+
+               public static DbgEvent AddEvent (DbgEvtType evtType, object data = null) {
+                       DbgEvent evt = new DbgEvent(chrono.ElapsedTicks, evtType, data);
+                       events.Add (evt);
+                       return evt;
+               }
+
+               static int y, level;
+
+               static void parseTree (GraphicObject go) {
+                       if (go == null)
+                               return;
+
+
+                       go.yIndex = y++;
+                       go.xLevel = level++;
+
+                       Group gr = go as Group;
+                       if (gr != null) {
+                               foreach (GraphicObject g in gr.Children) {
+                                       parseTree (g);
+                               }
+                       } else {
+                               PrivateContainer pc = go as PrivateContainer;
+                               if (pc != null)
+                                       parseTree (pc.getTemplateRoot);                         
+                       }
+                       level--;                
+               }
+
+               public static void save(Interface iface) {
+                       y = 1;
+                       level = 0;
+
+                       foreach (GraphicObject go in iface.GraphicTree) 
+                               parseTree (go);                 
+
+                       using (StreamWriter s = new StreamWriter("debug.log")){
+                               s.WriteLine ("[GraphicObjects]");
+                               lock (GraphicObject.GraphicObjects) {
+                                       GraphicObject.GraphicObjects = GraphicObject.GraphicObjects.OrderBy (o => o.yIndex).ToList();
+                                       for (int i = 0; i < GraphicObject.GraphicObjects.Count; i++) {
+                                               GraphicObject g = GraphicObject.GraphicObjects [i];
+                                               s.WriteLine ("{0};{1};{2};{3}", i, g.GetType ().Name, g.yIndex, g.xLevel);      
+                                       }
+                               }
+                               s.WriteLine ("[Events]");
+
+                               foreach (DbgEvent e in events)
+                                       if (e != null)
+                                               s.WriteLine (e.ToString ());
+                       }
+               }
+       }
+}
+#endif
+
diff --git a/Crow/src/rsvg/DimensionData.cs b/Crow/src/rsvg/DimensionData.cs
new file mode 100644 (file)
index 0000000..66aab91
--- /dev/null
@@ -0,0 +1,24 @@
+//Copyright GPL2
+namespace Rsvg {
+
+       using System;
+       using System.Collections;
+       using System.Runtime.InteropServices;
+
+       [StructLayout(LayoutKind.Sequential)]
+       public struct DimensionData {
+
+               public int Width;
+               public int Height;
+               public double Em;
+               public double Ex;
+
+               public static Rsvg.DimensionData Zero = new Rsvg.DimensionData ();
+
+               public static Rsvg.DimensionData New(IntPtr raw) {
+                       if (raw == IntPtr.Zero)
+                               return Rsvg.DimensionData.Zero;
+                       return (Rsvg.DimensionData) Marshal.PtrToStructure (raw, typeof (Rsvg.DimensionData));
+               }
+       }
+}
diff --git a/Crow/src/rsvg/Global.cs b/Crow/src/rsvg/Global.cs
new file mode 100644 (file)
index 0000000..6591701
--- /dev/null
@@ -0,0 +1,41 @@
+// This file was generated by the Gtk# code generator.
+// Any changes made will be lost if regenerated.
+
+namespace Rsvg {
+
+       using System;
+       using System.Runtime.InteropServices;
+
+#region Autogenerated code
+       public class Global {
+
+               [DllImport("rsvg-2")]
+               static extern void rsvg_set_default_dpi_x_y(double dpi_x, double dpi_y);
+
+               public static void SetDefaultDpiXY(double dpi_x, double dpi_y) {
+                       rsvg_set_default_dpi_x_y(dpi_x, dpi_y);
+               }
+
+               [DllImport("rsvg-2")]
+               static extern int rsvg_error_quark();
+
+               public static int ErrorQuark {
+                       get {
+                               int raw_ret = rsvg_error_quark();
+                               int ret = raw_ret;
+                               return ret;
+                       }
+               }
+
+               [DllImport("rsvg-2")]
+               static extern void rsvg_set_default_dpi(double dpi);
+
+               public static double DefaultDpi {
+                       set {
+                               rsvg_set_default_dpi(value);
+                       }
+               }
+
+#endregion
+       }
+}
diff --git a/Crow/src/rsvg/Handle.cs b/Crow/src/rsvg/Handle.cs
new file mode 100644 (file)
index 0000000..bf565e8
--- /dev/null
@@ -0,0 +1,125 @@
+//Copyright GPL2
+using vkvg;
+
+
+namespace Rsvg {
+
+       using System;
+       using System.Collections;
+       using System.Runtime.InteropServices;
+
+       public class Handle {
+
+               public IntPtr Raw;
+
+               [DllImport("rsvg-2")]
+               static extern IntPtr rsvg_handle_new();
+
+               public Handle ()
+               {
+                       Raw = rsvg_handle_new();
+               }
+
+               [DllImport("rsvg-2")]
+               static extern unsafe IntPtr rsvg_handle_new_from_data(byte[] data, UIntPtr n_data, out IntPtr error);
+
+               public unsafe Handle (byte[] data)
+               {
+                       if (GetType () != typeof (Handle)) {
+                               throw new InvalidOperationException ("Can't override this constructor.");
+                       }
+                       IntPtr error = IntPtr.Zero;
+                       Raw = rsvg_handle_new_from_data(data, new UIntPtr ((ulong) (data == null ? 0 : data.Length)), out error);
+                       if (error != IntPtr.Zero) throw new Exception (error.ToString());
+               }
+
+               [DllImport("rsvg-2")]
+               static extern unsafe IntPtr rsvg_handle_new_from_file(string file_name, out IntPtr error);
+
+               public unsafe Handle (string file_name)
+               {
+                       IntPtr error = IntPtr.Zero;
+                       Raw = rsvg_handle_new_from_file(file_name, out error);
+                       if (error != IntPtr.Zero) throw new Exception (error.ToString());
+               }
+
+               [DllImport("rsvg-2")]
+               static extern IntPtr rsvg_handle_get_base_uri(IntPtr raw);
+
+               [DllImport("rsvg-2")]
+               static extern void rsvg_handle_set_dpi(IntPtr raw, double dpi);
+
+               public double Dpi {
+                       set {
+                               rsvg_handle_set_dpi(Raw, value);
+                       }
+               }
+
+               [DllImport("rsvg-2")]
+               static extern void rsvg_handle_render_cairo(IntPtr raw, IntPtr cr);
+
+               public void RenderCairo(Context cr) {
+                       unsafe{
+                               rsvg_handle_render_cairo (Raw, cr == null ? IntPtr.Zero : cr.Handle);
+                       }
+               }
+
+               [DllImport("rsvg-2")]
+               static extern void rsvg_handle_set_dpi_x_y(IntPtr raw, double dpi_x, double dpi_y);
+
+               public void SetDpiXY(double dpi_x, double dpi_y) {
+                       rsvg_handle_set_dpi_x_y(Raw, dpi_x, dpi_y);
+               }
+
+               [DllImport("rsvg-2")]
+               static extern void rsvg_handle_get_dimensions(IntPtr raw, IntPtr dimension_data);
+
+               public Rsvg.DimensionData Dimensions {
+                       get {
+                               Rsvg.DimensionData dimension_data;
+                               IntPtr native_dimension_data = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (Rsvg.DimensionData)));
+                               rsvg_handle_get_dimensions(Raw, native_dimension_data);
+                               dimension_data = Rsvg.DimensionData.New (native_dimension_data);
+                               Marshal.FreeHGlobal (native_dimension_data);
+                               return dimension_data;
+                       }
+               }
+
+               [DllImport("rsvg-2")]
+               static extern unsafe bool rsvg_handle_close(IntPtr raw, out IntPtr error);
+
+               public unsafe bool Close() {
+                       IntPtr error = IntPtr.Zero;
+                       bool raw_ret = rsvg_handle_close(Raw, out error);
+                       if (error != IntPtr.Zero) throw new Exception (error.ToString());
+                       return raw_ret;
+               }
+
+               [DllImport("rsvg-2")]
+               static extern IntPtr rsvg_handle_get_title(IntPtr raw);
+
+               public string Title {
+                       get {
+                               IntPtr raw_ret = rsvg_handle_get_title(Raw);
+                               return "not supported";
+                       }
+               }
+
+               [DllImport("rsvg-2")]
+               static extern void rsvg_handle_render_cairo_sub(IntPtr raw, IntPtr cr, string id);
+
+               public void RenderCairoSub(Context cr, string id) {
+                       rsvg_handle_render_cairo_sub(Raw, cr == null ? IntPtr.Zero : cr.Handle, id);
+               }
+
+               [DllImport("rsvg-2")]
+               static extern IntPtr rsvg_handle_get_metadata(IntPtr raw);
+
+               public string Metadata {
+                       get {
+                               IntPtr raw_ret = rsvg_handle_get_metadata(Raw);
+                               return "not supported";
+                       }
+               }
+       }
+}
diff --git a/Crow/src/vkvg/Context.cs b/Crow/src/vkvg/Context.cs
new file mode 100644 (file)
index 0000000..6b71b3a
--- /dev/null
@@ -0,0 +1,275 @@
+//
+// Context.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2018-2019 jp
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Text;
+
+namespace vkvg {
+       public class Context: IDisposable
+       {
+
+               IntPtr handle = IntPtr.Zero;
+
+               public Context (Surface surf)
+               {
+                       handle = NativeMethods.vkvg_create (surf.Handle);
+               }
+               ~Context ()
+               {
+                       Dispose (false);
+               }
+
+               public IntPtr Handle { get { return handle; }}
+
+               public void AddReference () {
+                       NativeMethods.vkvg_reference (handle);
+               }
+               public uint References () => NativeMethods.vkvg_get_reference_count (handle);
+
+               public double LineWidth {                       
+                       set { NativeMethods.vkvg_set_line_width (handle, (float)value); }
+               }
+               public uint FontSize {
+                       set { NativeMethods.vkvg_set_font_size (handle, value); }
+               }
+               public string FontFace {
+                       set { NativeMethods.vkvg_select_font_face (handle, value); }
+               }
+               public Operator Operator {
+                       set { NativeMethods.vkvg_set_operator (handle, value); }
+                       get { return NativeMethods.vkvg_get_operator (handle); }
+               }
+               public FillRule FillRule {
+                       set { NativeMethods.vkvg_set_fill_rule (handle, value); }
+                       get { return NativeMethods.vkvg_get_fill_rule (handle); }
+               }
+               public FontExtents FontExtents {
+                       get {
+                               FontExtents f_extents;
+                               NativeMethods.vkvg_font_extents (handle, out f_extents);
+                               return f_extents;
+                       }
+               }
+               public TextExtents TextExtents(string s)
+               {
+                       TextExtents extents = default(TextExtents);
+                       if (!string.IsNullOrEmpty(s))
+                               NativeMethods.vkvg_text_extents (handle, TerminateUtf8(s), out extents);
+                       return extents;
+               }
+               public Matrix Matrix {
+                       get {
+                               Matrix m;
+                               NativeMethods.vkvg_get_matrix (handle, out m);
+                               return m;
+                       }
+                       set {
+                               NativeMethods.vkvg_set_matrix (handle, ref value);
+                       }
+               }
+               public void ShowText (string txt) {
+                       NativeMethods.vkvg_show_text (handle, txt);
+               }
+               public void ShowText (TextRun textRun) {
+                       NativeMethods.vkvg_show_text_run (handle, textRun.Handle);
+               }
+               public void Save () {
+                       NativeMethods.vkvg_save (handle);
+               }
+               public void Restore () {
+                       NativeMethods.vkvg_restore (handle);
+               }
+               public void Flush () {
+                       NativeMethods.vkvg_flush (handle);
+               }
+               public void Clear () {
+                       NativeMethods.vkvg_clear (handle);
+               }
+               public void Paint () {
+                       NativeMethods.vkvg_paint (handle);
+               }
+               public void Arc (float xc, float yc, float radius, float a1, float a2) {
+                       NativeMethods.vkvg_arc (handle, xc, yc, radius, a1, a2);
+               }
+               public void Arc (double xc, double yc, double radius, double a1, double a2) {
+                       NativeMethods.vkvg_arc (handle, (float)xc, (float)yc, (float)radius, (float)a1, (float)a2);
+               }
+               public void ArcNegative (float xc, float yc, float radius, float a1, float a2) {
+                       NativeMethods.vkvg_arc_negative (handle, xc, yc, radius, a1, a2);
+               }
+               public void Rectangle (float x, float y, float width, float height) {
+                       NativeMethods.vkvg_rectangle (handle, x, y, width, height);
+               }
+               public void Scale (float sx, float sy) {
+                       NativeMethods.vkvg_scale (handle, sx, sy);
+               }
+               public void Translate (float dx, float dy) {
+                       NativeMethods.vkvg_translate (handle, dx, dy);
+               }
+               public void Rotate (float alpha) {
+                       NativeMethods.vkvg_rotate (handle, alpha);
+               }
+               public void ArcNegative (double xc, double yc, double radius, double a1, double a2) {
+                       NativeMethods.vkvg_arc_negative (handle, (float)xc, (float)yc, (float)radius, (float)a1, (float)a2);
+               }
+               public void Rectangle (double x, double y, double width, double height) {
+                       NativeMethods.vkvg_rectangle (handle, (float)x, (float)y, (float)width, (float)height);
+               }
+               public void Scale (double sx, double sy) {
+                       NativeMethods.vkvg_scale (handle, (float)sx, (float)sy);
+               }
+               public void Translate (double dx, double dy) {
+                       NativeMethods.vkvg_translate (handle, (float)dx, (float)dy);
+               }
+               public void Rotate (double alpha) {
+                       NativeMethods.vkvg_rotate (handle, (float)alpha);
+               }
+
+               public void Fill () {
+                       NativeMethods.vkvg_fill (handle);
+               }
+               public void FillPreserve () {
+                       NativeMethods.vkvg_fill_preserve (handle);
+               }
+               public void Stroke () {
+                       NativeMethods.vkvg_stroke (handle);
+               }
+               public void StrokePreserve () {
+                       NativeMethods.vkvg_stroke_preserve (handle);
+               }
+               public void Clip () {
+                       NativeMethods.vkvg_clip (handle);
+               }
+               public void ClipPreserve () {
+                       NativeMethods.vkvg_clip_preserve (handle);
+               }
+               public void ResetClip () {
+                       NativeMethods.vkvg_reset_clip (handle);
+               }
+               public void NewPath () {
+                       NativeMethods.vkvg_new_path (handle);
+               }
+               public void NewSubPath () {
+                       NativeMethods.vkvg_new_sub_path (handle);
+               }
+               public void ClosePath () {
+                       NativeMethods.vkvg_close_path (handle);
+               }
+               public void MoveTo (PointD p){
+                       NativeMethods.vkvg_move_to (handle, (float)p.X, (float)p.Y);
+               }
+               public void MoveTo (Point p){
+                       NativeMethods.vkvg_move_to (handle, p.X, p.Y);
+               }
+               public void MoveTo (float x, float y){
+                       NativeMethods.vkvg_move_to (handle, x, y);
+               }
+               public void RelMoveTo (float x, float y){
+                       NativeMethods.vkvg_rel_move_to (handle, x, y);
+               }
+               public void LineTo (float x, float y){
+                       NativeMethods.vkvg_line_to (handle, x, y);
+               }
+               public void LineTo (Point p){
+                       NativeMethods.vkvg_line_to (handle, p.X, p.Y);
+               }
+               public void LineTo (PointD p){
+                       NativeMethods.vkvg_line_to (handle, (float)p.X, (float)p.Y);
+               }
+               public void RelLineTo (float x, float y){
+                       NativeMethods.vkvg_rel_line_to (handle, x, y);
+               }
+               public void CurveTo (float x1, float y1, float x2, float y2, float x3, float y3){
+                       NativeMethods.vkvg_curve_to (handle, x1, y1, x2, y2, x3, y3);
+               }
+               public void RelCurveTo (float x1, float y1, float x2, float y2, float x3, float y3){
+                       NativeMethods.vkvg_rel_curve_to (handle, x1, y1, x2, y2, x3, y3);
+               }
+
+               public void MoveTo (double x, double y){
+                       NativeMethods.vkvg_move_to (handle, (float)x, (float)y);
+               }
+               public void RelMoveTo (double x, double y){
+                       NativeMethods.vkvg_rel_move_to (handle, (float)x, (float)y);
+               }
+               public void LineTo (double x, double y){
+                       NativeMethods.vkvg_line_to (handle, (float)x, (float)y);
+               }
+               public void RelLineTo (double x, double y){
+                       NativeMethods.vkvg_rel_line_to (handle, (float)x, (float)y);
+               }
+               public void CurveTo (double x1, double y1, double x2, double y2, double x3, double y3){
+                       NativeMethods.vkvg_curve_to (handle, (float)x1, (float)y1, (float)x2, (float)y2, (float)x3, (float)y3);
+               }
+               public void RelCurveTo (double x1, double y1, double x2, double y2, double x3, double y3){
+                       NativeMethods.vkvg_rel_curve_to (handle, (float)x1, (float)y1, (float)x2, (float)y2, (float)x3, (float)y3);
+               }
+
+               public void SetSource (Pattern pat) {
+                       NativeMethods.vkvg_set_source (handle, pat.Handle);
+               }
+               public void SetSource (float r, float g, float b, float a = 1f) {
+                       NativeMethods.vkvg_set_source_rgba (handle, r, g, b, a);
+               }
+               public void SetSource (double r, double g, double b, double a = 1.0) {
+                       NativeMethods.vkvg_set_source_rgba (handle, (float)r, (float)g, (float)b, (float)a);
+               }
+               public void SetSource (Surface surf, float x = 0f, float y = 0f) {
+                       NativeMethods.vkvg_set_source_surface (handle, surf.Handle, x, y);
+               }
+               public void SetSourceSurface (Surface surf, float x = 0f, float y = 0f) {
+                       NativeMethods.vkvg_set_source_surface (handle, surf.Handle, x, y);
+               }
+               public void RenderSvg (IntPtr nsvgImage, string subId = null) {
+                       NativeMethods.vkvg_render_svg (handle, nsvgImage, subId);
+               }
+               internal static byte[] TerminateUtf8(string s)
+               {
+                       // compute the byte count including the trailing \0
+                       var byteCount = Encoding.UTF8.GetMaxByteCount(s.Length + 1);
+                       var bytes = new byte[byteCount];
+                       Encoding.UTF8.GetBytes(s, 0, s.Length, bytes, 0);
+                       return bytes;
+               }
+
+               #region IDisposable implementation
+               public void Dispose ()
+               {
+                       Dispose (true);
+                       GC.SuppressFinalize (this);
+               }
+
+               protected virtual void Dispose (bool disposing)
+               {
+                       if (!disposing || handle == IntPtr.Zero)
+                               return;
+
+                       NativeMethods.vkvg_destroy (handle);
+                       handle = IntPtr.Zero;
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/vkvg/Device.cs b/Crow/src/vkvg/Device.cs
new file mode 100644 (file)
index 0000000..8d3c7f5
--- /dev/null
@@ -0,0 +1,87 @@
+//
+// Context.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2018 jp
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace vkvg
+{
+       public class Device: IDisposable
+       {
+
+               IntPtr handle = IntPtr.Zero;
+
+               #region CTORS & DTOR
+               public Device (IntPtr instance, IntPtr phy, IntPtr dev, uint qFamIdx, SampleCount samples = SampleCount.Sample_1, uint qIndex = 0)
+               {
+                       handle = NativeMethods.vkvg_device_create_multisample (instance, phy, dev, qFamIdx, qIndex, samples, false);
+               }
+               ~Device ()
+               {
+                       Dispose (false);
+               }
+               #endregion
+
+               public void GetDpy (out int hdpy, out int vdpy) {
+                       NativeMethods.vkvg_device_get_dpy (handle, out hdpy, out vdpy);
+               }
+               public void SetDpy (int hdpy, int vdpy) {
+                       NativeMethods.vkvg_device_set_dpy (handle, hdpy, vdpy);
+               }
+               public void AddReference () {
+                       NativeMethods.vkvg_device_reference (handle);
+               }
+               public uint References () => NativeMethods.vkvg_device_get_reference_count (handle);
+
+               public IntPtr Handle { get { return handle; }}
+
+               public IntPtr LoadSvg (string path) {
+                       return NativeMethods.nsvg_load_file (handle, path);
+               }
+               public void DestroySvg (IntPtr nsvgImage) {
+                       NativeMethods.nsvg_destroy (nsvgImage);
+               }
+               public IntPtr LoadSvgFragment (string fragment) {
+                       return NativeMethods.nsvg_load (handle, Context.TerminateUtf8(fragment));
+               }
+
+               #region IDisposable implementation
+               public void Dispose ()
+               {
+                       Dispose (true);
+                       GC.SuppressFinalize (this);
+               }
+
+               protected virtual void Dispose (bool disposing)
+               {
+                       if (!disposing || handle == IntPtr.Zero)
+                               return;
+
+                       NativeMethods.vkvg_device_destroy (handle);
+                       handle = IntPtr.Zero;
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/vkvg/Enums.cs b/Crow/src/vkvg/Enums.cs
new file mode 100644 (file)
index 0000000..a72b078
--- /dev/null
@@ -0,0 +1,143 @@
+//
+// Enums.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2019 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace vkvg {
+       public enum Status {
+               Success = 0,
+               NoMemory,
+               InvalidRestore,
+               InvalidPopGroup,
+               NoCurrentPoint,
+               InvalidMatrix,
+               InvalidStatus,
+               NullPointer,
+               InvalidString,
+               InvalidPathData,
+               ReadError,
+               WriteError,
+               SurfaceFinished,
+               SurfaceTypeMismatch,
+               PatternTypeMismatch,
+               InvalidContent,
+               InvalidFormat,
+               InvalidVisual,
+               FileNotFound,
+               InvalidDash
+       }
+
+       public enum Direction {
+               Horizontal = 0,
+               Vertical = 1
+       }
+
+       public enum Format {
+               ARGB32,
+               RGB24,
+               A8,
+               A1
+       }
+
+       public enum Extend {
+               None,
+               Repeat,
+               Reflect,
+               Pad
+       }
+
+       public enum Filter {
+               Fast,
+               Good,
+               Best,
+               Nearest,
+               Bilinear,
+               Gaussian,
+       }
+
+       public enum PatternType {
+               Solid,
+               Surface,
+               Linear,
+               Radial,
+               Mesh,
+               RasterSource,
+       }
+
+       public enum Operator {
+               Clear,
+               Source,
+               Over,
+               In,
+               Out,
+               Atop,
+
+               Dest,
+               DestOver,
+               DestIn,
+               DestOut,
+               DestAtop,
+
+               Xor,
+               Add,
+               Saturate,
+       }
+
+       public enum FontSlant {
+               Normal,
+               Italic,
+               Oblique
+       }
+       public enum FontWeight {
+               Normal,
+               Bold,
+       }
+
+       public enum SampleCount {
+               Sample_1 = 0x00000001,
+               Sample_2 = 0x00000002,
+               Sample_4 = 0x00000004,
+               Sample_8 = 0x00000008,
+               Sample_16 = 0x00000010,
+               Sample_32 = 0x00000020,
+               Sample_64 = 0x00000040
+       }
+
+       public enum LineCap {
+               Butt,
+               Round,
+               Square
+       }
+
+       public enum LineJoin {
+               Miter,
+               Round,
+               Bevel
+       }
+       public enum FillRule {
+               EvenOdd,
+               NonZero,
+       }
+}
\ No newline at end of file
diff --git a/Crow/src/vkvg/FontExtents.cs b/Crow/src/vkvg/FontExtents.cs
new file mode 100644 (file)
index 0000000..c7f793d
--- /dev/null
@@ -0,0 +1,104 @@
+//
+// Mono.Cairo.FontExtents.cs
+//
+// Authors: Duncan Mak (duncan@ximian.com)
+//          Hisham Mardam Bey (hisham.mardambey@gmail.com)
+//
+// (C) Ximian, Inc. 2003
+//
+// This is a simplistic binding of the Cairo API to C#. All functions
+// in cairo.h are transcribed into their C# equivelants
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace vkvg
+{
+       [StructLayout (LayoutKind.Sequential)]
+       public struct FontExtents
+       {
+               float ascent;
+               float descent;
+               float height;
+               float maxXAdvance;
+               float maxYAdvance;
+               
+               public float Ascent {
+                       get { return ascent; }
+                       set { ascent = value; }
+               }
+               
+               public float Descent {
+                       get { return descent; }
+                       set { descent = value; }
+               }
+               
+               public float Height {
+                       get { return height; }
+                       set { height = value; }
+               }
+               
+               public float MaxXAdvance {
+                       get { return maxXAdvance; }
+                       set { maxXAdvance = value; }
+               }
+               
+               public float MaxYAdvance {
+                       get { return maxYAdvance; }
+                       set { maxYAdvance = value; }
+               }
+
+               public FontExtents (float ascent, float descent, float height, float maxXAdvance, float maxYAdvance)
+               {
+                       this.ascent = ascent;
+                       this.descent = descent;
+                       this.height = height;
+                       this.maxXAdvance = maxXAdvance;
+                       this.maxYAdvance = maxYAdvance;
+               }
+
+               public override bool Equals (object obj)
+               {
+                       if (obj is FontExtents)
+                               return this == (FontExtents) obj;
+                       return false;
+               }
+
+               public override int GetHashCode ()
+               {
+                       return (int) Ascent ^ (int) Descent ^ (int) Height ^ (int) MaxXAdvance ^ (int) MaxYAdvance;
+               }
+
+               public static bool operator == (FontExtents extents, FontExtents other)
+               {
+                       return extents.Ascent == other.Ascent && extents.Descent == other.Descent && extents.Height == other.Height && extents.MaxXAdvance == other.MaxXAdvance && extents.MaxYAdvance == other.MaxYAdvance;
+               }
+
+               public static bool operator != (FontExtents extents, FontExtents other)
+               {
+                       return !(extents == other);
+               }
+       }
+}
diff --git a/Crow/src/vkvg/Matrix.cs b/Crow/src/vkvg/Matrix.cs
new file mode 100644 (file)
index 0000000..54859e4
--- /dev/null
@@ -0,0 +1,113 @@
+//
+// Matrix.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2019 jp
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+namespace vkvg {
+       public struct Matrix {
+               float xx; float yx;
+               float xy; float yy;
+               float x0; float y0;
+
+               public float XX { get { return xx; } set { xx = value; } }
+               public float YX { get { return yx; } set { yx = value; } }
+               public float XY { get { return xy; } set { xy = value; } }
+               public float YY { get { return yy; } set { yy = value; } }
+               public float X0 { get { return x0; } set { x0 = value; } }
+               public float Y0 { get { return y0; } set { y0 = value; } }
+
+               public static Matrix Create (float xx, float yx, float xy, float yy, float x0, float y0) {
+                       Matrix tmp;
+                       NativeMethods.vkvg_matrix_init (out tmp, xx, yx, xy, yy, x0, y0);
+                       return tmp;
+               }
+               public static Matrix CreateTranslation (float tx, float ty) {
+                       Matrix tmp;
+                       NativeMethods.vkvg_matrix_init_translate (out tmp, tx, ty);
+                       return tmp;
+               }
+               public static Matrix CreateRotation (float radian) {
+                       Matrix tmp;
+                       NativeMethods.vkvg_matrix_init_rotate (out tmp, radian);
+                       return tmp;
+               }
+               public static Matrix CreateScale (float sx, float sy) {
+                       Matrix tmp;
+                       NativeMethods.vkvg_matrix_init_scale (out tmp, sx, sy);
+                       return tmp;
+               }
+               public static Matrix Identity {
+                       get {
+                               Matrix tmp;
+                               NativeMethods.vkvg_matrix_init_identity (out tmp);
+                               return tmp;
+                       }
+               }
+
+               public void Translate (float tx, float ty) {
+                       Matrix tmp = this;
+                       NativeMethods.vkvg_matrix_translate (ref tmp, tx, ty);
+                       xx = tmp.xx; yx = tmp.yx;
+                       xy = tmp.xy; yy = tmp.yy;
+                       x0 = tmp.x0; y0 = tmp.y0;
+               }
+               public void Rotate (float radian) {
+                       Matrix tmp = this;
+                       NativeMethods.vkvg_matrix_rotate (ref tmp, radian);
+                       xx = tmp.xx; yx = tmp.yx;
+                       xy = tmp.xy; yy = tmp.yy;
+                       x0 = tmp.x0; y0 = tmp.y0;
+               }
+               public void Scale (float sx, float sy) {
+                       Matrix tmp = this;
+                       NativeMethods.vkvg_matrix_scale (ref tmp, sx, sy);
+                       xx = tmp.xx; yx = tmp.yx;
+                       xy = tmp.xy; yy = tmp.yy;
+                       x0 = tmp.x0; y0 = tmp.y0;
+               }
+               public void Invert () {
+                       Matrix tmp = this;
+                       NativeMethods.vkvg_matrix_invert (ref tmp);
+                       xx = tmp.xx; yx = tmp.yx;
+                       xy = tmp.xy; yy = tmp.yy;
+                       x0 = tmp.x0; y0 = tmp.y0;
+               }
+               public void TransformDistance (ref float dx, ref float dy) {
+                       NativeMethods.vkvg_matrix_transform_distance (ref this, ref dx, ref dy);
+               }
+               public void TransformPoint (ref float px, ref float py) {
+                       NativeMethods.vkvg_matrix_transform_distance (ref this, ref px, ref py);
+               }
+
+               public static Matrix operator *(Matrix a, Matrix b) {
+                       Matrix tmp;
+                       NativeMethods.vkvg_matrix_multiply (out tmp, ref a, ref b);
+                       return tmp;
+               }
+
+               public override string ToString () {
+                       return string.Format ($"({xx};{yx};{xy};{yy};{x0};{y0})");
+               }
+       }
+}
diff --git a/Crow/src/vkvg/NativeMethods.cs b/Crow/src/vkvg/NativeMethods.cs
new file mode 100644 (file)
index 0000000..7039a9a
--- /dev/null
@@ -0,0 +1,287 @@
+//
+// NativeMethods.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2018-2019 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Runtime.InteropServices;
+
+namespace vkvg
+{
+       internal static class NativeMethods
+       {
+               const string libvkvg = "vkvg";
+
+               #region Device
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_device_create (IntPtr instance, IntPtr phy, IntPtr dev, uint qFamIdx, uint qIndex);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_device_destroy (IntPtr device);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_device_create_multisample (IntPtr inst, IntPtr phy, IntPtr vkdev, uint qFamIdx, uint qIndex, SampleCount samples, bool deferredResolve);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_device_reference (IntPtr dev);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern uint vkvg_device_get_reference_count (IntPtr dev);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_device_set_dpy (IntPtr dev, int hdpy, int vdpy);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_device_get_dpy (IntPtr dev, out int hdpy, out int vdpy);
+               #endregion
+
+               #region Context
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_create (IntPtr surface);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_destroy (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_flush (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_new_path (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_new_sub_path (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_close_path (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_line_to (IntPtr ctx, float x, float y);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_rel_line_to (IntPtr ctx, float x, float y);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_move_to (IntPtr ctx, float x, float y);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_rel_move_to (IntPtr ctx, float x, float y);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_arc (IntPtr ctx, float xc, float yc, float radius, float a1, float a2);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_arc_negative (IntPtr ctx, float xc, float yc, float radius, float a1, float a2);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_curve_to (IntPtr ctx, float x1, float y1, float x2, float y2, float x3, float y3);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_rel_curve_to (IntPtr ctx, float x1, float y1, float x2, float y2, float x3, float y3);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_rectangle (IntPtr ctx, float x, float y, float width, float height);
+
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_scale (IntPtr ctx, float sx, float sy);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_translate (IntPtr ctx, float dx, float dy);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_rotate (IntPtr ctx, float alpha);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_transform (IntPtr ctx, ref Matrix matrix);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_matrix (IntPtr ctx, ref Matrix matrix);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_get_matrix (IntPtr ctx, out Matrix matrix);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_identity_matrix (IntPtr ctx);
+
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_stroke (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_stroke_preserve (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_clip (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_clip_preserve (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_reset_clip (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_fill (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_fill_preserve (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_paint (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_source_rgba (IntPtr ctx, float r, float g, float b, float a);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_line_width (IntPtr ctx, float width);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_line_cap (IntPtr ctx, LineCap cap);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_line_join (IntPtr ctx, LineJoin join);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_operator (IntPtr ctx, Operator op);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern FillRule vkvg_get_fill_rule (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_fill_rule (IntPtr ctx, FillRule fr);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern Operator vkvg_get_operator (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_source_surface(IntPtr ctx, IntPtr surf, float x, float y);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_source(IntPtr ctx, IntPtr pattern);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_font_extents (IntPtr ctx, out FontExtents extents);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_text_extents (IntPtr ctx, byte[] utf8, out TextExtents extents);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_select_font_face (IntPtr ctx, string name);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_set_font_size (IntPtr ctx, uint size);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_show_text (IntPtr ctx, string text);
+
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_save (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_restore (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_clear (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern float vkvg_get_line_width (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern LineCap vkvg_get_line_cap (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern LineJoin vkvg_get_line_join (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_get_source (IntPtr ctx);
+
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_reference (IntPtr ctx);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern uint vkvg_get_reference_count (IntPtr ctx);
+               #endregion
+
+               #region TextRun
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_text_run_create (IntPtr ctx, byte[] utf8);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_text_run_destroy (IntPtr textRun);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_show_text_run (IntPtr ctx, IntPtr textRun);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_text_run_get_extents (IntPtr textRun, out TextExtents extents);
+               #endregion
+
+               #region Pattern
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_pattern_create ();
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_pattern_reference (IntPtr pat);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern uint vkvg_pattern_get_reference_count(IntPtr pat);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_pattern_create_rgba (float r, float g, float b, float a);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_pattern_create_rgb (float r, float g, float b);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_pattern_create_for_surface (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_pattern_create_linear (float x0, float y0, float x1, float y1);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_pattern_create_radial (float cx0, float cy0, float radius0,
+                                             float cx1, float cy1, float radius1);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_pattern_destroy (IntPtr pat);
+
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_pattern_add_color_stop (IntPtr pat, float offset, float r, float g, float b, float a);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_pattern_set_extend (IntPtr pat, Extend extend);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_pattern_set_filter (IntPtr pat, Filter filter);
+
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern Extend vkvg_pattern_get_extend (IntPtr pat);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern Filter vkvg_pattern_get_filter (IntPtr pat);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern PatternType vkvg_pattern_get_type (IntPtr pat);
+               #endregion
+
+               #region Matrices
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_init_identity (out Matrix matrix);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_init (out Matrix matrix,
+           float xx, float yx,
+           float xy, float yy,
+           float x0, float y0);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_init_translate (out Matrix matrix, float tx, float ty);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_init_scale (out Matrix matrix, float sx, float sy);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_init_rotate (out Matrix matrix, float radians);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_translate (ref Matrix matrix, float tx, float ty);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_scale (ref Matrix matrix, float sx, float sy);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_rotate (ref Matrix matrix, float radians);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_multiply (out Matrix result, ref Matrix a, ref Matrix b);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_transform_distance (ref Matrix matrix, ref float dx, ref float dy);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_transform_point (ref Matrix matrix, ref float x, ref float y);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_matrix_invert (ref Matrix matrix);
+               #endregion
+
+               #region Surface
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_surface_create (IntPtr device, uint width, uint height);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_surface_create_from_image (IntPtr dev, string filePath);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_surface_create_from_svg (IntPtr dev, string filePath);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_surface_create_from_svg_fragment (IntPtr dev, byte[] filePath);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_surface_create_from_bitmap  (IntPtr dev, ref byte[] data, uint width, uint height);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void     vkvg_surface_destroy (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_surface_get_vk_image (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern int vkvg_surface_get_width (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern int vkvg_surface_get_height (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_surface_clear (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern IntPtr vkvg_surface_reference (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern uint vkvg_surface_get_reference_count (IntPtr surf);
+               [DllImport (libvkvg, CallingConvention=CallingConvention.Cdecl)]
+               internal static extern void vkvg_surface_write_to_png (IntPtr surf, [MarshalAs(UnmanagedType.LPStr)]string path);
+               #endregion
+
+               #region NSVG
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern IntPtr nsvg_load_file (IntPtr dev, string filePath);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern IntPtr nsvg_load (IntPtr dev, byte[] fragment);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern void nsvg_destroy (IntPtr nsvgImage);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern void nsvg_get_size (IntPtr nsvgImage, out int width, out int height);
+               [DllImport (libvkvg, CallingConvention = CallingConvention.Cdecl)]
+               internal static extern void vkvg_render_svg (IntPtr ctx, IntPtr nsvgImage, string subId);
+               #endregion
+       }
+}
+
diff --git a/Crow/src/vkvg/Pattern.cs b/Crow/src/vkvg/Pattern.cs
new file mode 100644 (file)
index 0000000..7ca3df2
--- /dev/null
@@ -0,0 +1,100 @@
+//
+// Pattern.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2019 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+namespace vkvg {
+       public class Pattern : IDisposable {
+
+               IntPtr handle = IntPtr.Zero;
+
+               #region CTORS & DTOR
+               protected Pattern (IntPtr handle) {
+                       this.handle = handle;
+               }
+               public Pattern () {
+                       handle = NativeMethods.vkvg_pattern_create ();
+               }
+               public Pattern (float r, float g, float b) {
+                       handle = NativeMethods.vkvg_pattern_create_rgb (r, g, b);
+               }
+               public Pattern (float r, float g, float b, float a) {
+                       handle = NativeMethods.vkvg_pattern_create_rgba (r, g, b, a);
+               }
+               public Pattern (Surface surf) {
+                       handle = NativeMethods.vkvg_pattern_create_for_surface (surf.Handle);
+               }
+
+               ~Pattern () {
+                       Dispose (false);
+               }
+               #endregion
+
+               public static Pattern CreateLinearGradient (float x0, float y0, float x1, float y1) {
+                       return new Pattern (NativeMethods.vkvg_pattern_create_linear (x0, y0, x1, y1));
+               }
+               public static Pattern CreateRadialGradient (float cx0, float cy0, float radius0,
+                                                                                                        float cx1, float cy1, float radius1) {
+                       return new Pattern (NativeMethods.vkvg_pattern_create_radial (cx0, cy0, radius0, cx1, cy1, radius1));
+               }
+
+               public void AddReference () {
+                       NativeMethods.vkvg_pattern_reference (handle);
+               }
+               public uint References () => NativeMethods.vkvg_pattern_get_reference_count (handle);
+
+               public IntPtr Handle { get { return handle; } }
+
+               public Extend Extend {
+                       set { NativeMethods.vkvg_pattern_set_extend (handle, value); }
+                       get { return NativeMethods.vkvg_pattern_get_extend (handle); }
+               }
+               public Filter Filter {
+                       set { NativeMethods.vkvg_pattern_set_filter (handle, value); }
+                       get { return NativeMethods.vkvg_pattern_get_filter (handle); }
+               }
+
+               public void AddColorStop (float offset, float r, float g, float b, float a = 1f) {
+                       NativeMethods.vkvg_pattern_add_color_stop (handle, offset, r, g, b, a);
+               }
+               public void AddColorStop (float offset, Crow.Color c) {
+                       NativeMethods.vkvg_pattern_add_color_stop (Handle, offset, (float)c.R, (float)c.G, (float)c.B, (float)c.A);
+               }
+
+               #region IDisposable implementation
+               public void Dispose () {
+                       Dispose (true);
+                       GC.SuppressFinalize (this);
+               }
+
+               protected virtual void Dispose (bool disposing) {
+                       if (!disposing || handle == IntPtr.Zero)
+                               return;
+
+                       NativeMethods.vkvg_pattern_destroy (handle);
+                       handle = IntPtr.Zero;
+               }
+               #endregion
+       }
+}
\ No newline at end of file
diff --git a/Crow/src/vkvg/Point.cs b/Crow/src/vkvg/Point.cs
new file mode 100644 (file)
index 0000000..a30e231
--- /dev/null
@@ -0,0 +1,180 @@
+//
+// Point.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+
+namespace vkvg {
+       public struct Point
+    {
+        int _x;
+        int _y;
+
+        public int X
+        {
+            get { return _x; }
+            set { _x = value; }
+        }
+        public int Y
+        {
+            get { return _y; }
+            set { _y = value; }
+        }
+        public Point(int x, int y)
+        {
+            _x = x;
+            _y = y;
+        }
+
+               public int Length {
+                       get { return (int)Math.Sqrt (Math.Pow (_x, 2) + Math.Pow (_y, 2)); }
+               }
+               public double LengthD {
+                       get { return Math.Sqrt (Math.Pow (_x, 2) + Math.Pow (_y, 2)); }
+               }
+        public static implicit operator PointD(Point p)
+        {
+            return new PointD(p.X, p.Y);
+        }
+        public static implicit operator System.Drawing.Point(Point p)
+        {
+            return new System.Drawing.Point(p.X, p.Y);
+        }
+        public static implicit operator Point(System.Drawing.Point p)
+        {
+            return new Point(p.X, p.Y);
+        }
+        public static implicit operator Point(int i)
+        {
+            return new Point(i, i);
+        }
+        public static Point operator /(Point p, int d)
+        {
+            return new Point(p.X / d, p.Y / d);
+        }
+        public static Point operator *(Point p, int d)
+        {
+            return new Point(p.X * d, p.Y * d);
+        }
+        public static Point operator /(Point p, double d)
+        {
+            return new Point((int)(p.X / d), (int)(p.Y / d));
+        }
+        public static Point operator *(Point p, double d)
+        {
+            return new Point((int)(p.X * d), (int)(p.Y * d));
+        }
+        public static Point operator +(Point p1, Point p2)
+        {
+            return new Point(p1.X + p2.X, p1.Y + p2.Y);
+        }
+               public static Point operator +(Point p, int i)
+               {
+                       return new Point(p.X + i, p.Y + i);
+               }
+        public static Point operator -(Point p1, Point p2)
+        {
+            return new Point(p1.X - p2.X, p1.Y - p2.Y);
+        }
+        public static bool operator >=(Point p1, Point p2)
+        {
+            return p1.X >= p2.X && p1.Y >= p2.Y ? true : false;
+        }
+        public static bool operator <=(Point p1, Point p2)
+        {
+            return p1.X <= p2.X && p1.Y <= p2.Y ? true : false;
+        }
+        public static bool operator ==(Point s, int i)
+        {
+            if (s.X == i && s.Y == i)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator !=(Point s, int i)
+        {
+            if (s.X == i && s.Y == i)
+                return false;
+            else
+                return true;
+        }
+        public static bool operator >(Point s, int i)
+        {
+            if (s.X > i && s.Y > i)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator <(Point s, int i)
+        {
+            if (s.X < i && s.Y < i)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator ==(Point s1, Point s2)
+        {
+            if (s1.X == s2.X  && s1.Y == s2.Y)
+                return true;
+            else
+                return false;
+        }
+        public static bool operator !=(Point s1, Point s2)
+        {
+            if (s1.X == s2.X && s1.Y == s2.Y)
+                return false;
+            else
+                return true;
+        }
+
+        public override string ToString()
+        {
+                       return string.Format("({0},{1})", X, Y);
+        }
+
+        public override bool Equals(object obj)
+        {
+            return base.Equals(obj);
+        }
+        public override int GetHashCode()
+        {
+            return base.GetHashCode();
+        }
+               public static Point Parse(string s)
+               {
+                       if (string.IsNullOrEmpty (s))
+                               return default(Point);
+                       string[] d = s.Trim().Split(',');
+                       if (d.Length == 2)
+                               return new Point (int.Parse (d [0]), int.Parse (d [1]));
+                       else if (d.Length == 1) {
+                               int tmp = int.Parse (d [0]);
+                               return new Point (tmp, tmp);
+                       }
+                       throw new Exception ("Crow.Point Parsing Error: " + s);
+               }
+    }
+
+}
diff --git a/Crow/src/vkvg/PointD.cs b/Crow/src/vkvg/PointD.cs
new file mode 100644 (file)
index 0000000..a36f817
--- /dev/null
@@ -0,0 +1,58 @@
+//
+// Mono.Context.cs
+//
+// Author:
+//   Duncan Mak (duncan@ximian.com)
+//   Miguel de Icaza (miguel@novell.com)
+//   Hisham Mardam Bey (hisham.mardambey@gmail.com)
+//   Alp Toker (alp@atoker.com)
+//
+// (C) Ximian Inc, 2003.
+// (C) Novell Inc, 2003.
+//
+// This is an OO wrapper API for the Cairo API.
+//
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+namespace vkvg {
+
+       public struct PointD
+       {
+               public PointD (double x, double y)
+               {
+                       this.x = x;
+                       this.y = y;
+               }
+
+               double x, y;
+               public double X {
+                       get { return x; }
+                       set { x = value; }
+               }
+
+               public double Y {
+                       get { return y; }
+                       set { y = value; }
+               }
+       }
+}
diff --git a/Crow/src/vkvg/Surface.cs b/Crow/src/vkvg/Surface.cs
new file mode 100644 (file)
index 0000000..f88b19b
--- /dev/null
@@ -0,0 +1,108 @@
+//
+// Context.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2018 jp
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace vkvg
+{
+       public class Surface: IDisposable
+       {               
+               IntPtr handle = IntPtr.Zero;
+               Device vkvgDev;
+
+               public Surface (Device device, int width, int heigth)
+               {
+                       vkvgDev = device;
+                       handle = NativeMethods.vkvg_surface_create (device.Handle, (uint)width, (uint)heigth);
+               }
+               public Surface (Device device, ref byte[] data, int width, int heigth)
+               {
+                       vkvgDev = device;
+                       handle = NativeMethods.vkvg_surface_create (device.Handle, (uint)width, (uint)heigth);
+               }
+               public Surface (Device device, string imgPath) {
+                       vkvgDev = device;
+                       if (string.Compare(System.IO.Path.GetExtension(imgPath), ".svg", StringComparison.OrdinalIgnoreCase) == 0)
+                               handle = NativeMethods.vkvg_surface_create_from_svg (device.Handle, imgPath);
+                       else
+                               handle = NativeMethods.vkvg_surface_create_from_image (device.Handle, imgPath);
+               }
+
+               Surface (IntPtr devHandle, int width, int heigth)
+               {
+                       handle = NativeMethods.vkvg_surface_create (devHandle, (uint)width, (uint)heigth);
+               }
+               ~Surface ()
+               {
+                       Dispose (false);
+               }
+
+               public IntPtr Handle { get { return handle; }}
+               public IntPtr VkImage { get { return NativeMethods.vkvg_surface_get_vk_image (handle); }}
+               public int Width { get { return NativeMethods.vkvg_surface_get_width (handle); }}
+               public int Height { get { return NativeMethods.vkvg_surface_get_height (handle); }}
+
+               public void AddReference () {
+                       NativeMethods.vkvg_surface_reference (handle);
+               }
+               public uint References () => NativeMethods.vkvg_surface_get_reference_count (handle);
+
+//             public Surface CreateSimilar (uint width, uint height) {
+//                     return new Surface (handle, width, height);
+//             }
+//             public Surface CreateSimilar (int width, int height) {
+//                     return new Surface (handle, (uint)width, (uint)height);
+//             }
+
+               public void Flush () {
+                       throw new NotImplementedException ();
+               }
+
+               public void WriteToPng (string path) {
+                       NativeMethods.vkvg_surface_write_to_png (handle, path);
+               }
+               public void Clear () {
+                       NativeMethods.vkvg_surface_clear (handle);
+               }
+
+               #region IDisposable implementation
+               public void Dispose ()
+               {
+                       Dispose (true);
+                       GC.SuppressFinalize (this);
+               }
+
+               protected virtual void Dispose (bool disposing)
+               {
+                       if (!disposing || handle == IntPtr.Zero)
+                               return;
+
+                       NativeMethods.vkvg_surface_destroy (handle);
+                       handle = IntPtr.Zero;
+               }
+               #endregion
+       }
+}
+
diff --git a/Crow/src/vkvg/TextExtents.cs b/Crow/src/vkvg/TextExtents.cs
new file mode 100644 (file)
index 0000000..2305d9a
--- /dev/null
@@ -0,0 +1,98 @@
+//
+// Mono.Cairo.TextExtents.cs
+//
+// Authors:
+//   Duncan Mak (duncan@ximian.com)
+//   Hisham Mardam Bey (hisham.mardambey@gmail.com)
+//
+// (C) Ximian, Inc. 2003
+// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace vkvg
+{
+       [StructLayout (LayoutKind.Sequential)]
+       public struct TextExtents
+       {
+               float xbearing;
+               float ybearing;
+               float width;
+               float height;
+               float xadvance;
+               float yadvance;
+               
+               public float XBearing {
+                       get { return xbearing; }
+                       set { xbearing = value; }
+               }
+               
+               public float YBearing {
+                       get { return ybearing; }
+                       set { ybearing = value; }
+               }
+               
+               public float Width {
+                       get { return width; }
+                       set { width = value; }
+               }
+               
+               public float Height {
+                       get { return height; }
+                       set { height = value; }
+               }
+               
+               public float XAdvance {
+                       get { return xadvance; }
+                       set { xadvance = value; }
+               }
+               
+               public float YAdvance {
+                       get { return yadvance; }
+                       set { yadvance = value; }
+               }
+
+               public override bool Equals (object obj)
+               {
+                       if (obj is TextExtents)
+                               return this == (TextExtents)obj;
+                       return false;
+               }
+
+               public override int GetHashCode ()
+               {
+                       return (int)XBearing ^ (int)YBearing ^ (int)Width ^ (int)Height ^ (int)XAdvance ^ (int)YAdvance;
+               }
+
+               public static bool operator == (TextExtents extents, TextExtents other)
+               {
+                       return extents.XBearing == other.XBearing && extents.YBearing == other.YBearing && extents.Width == other.Width && extents.Height == other.Height && extents.XAdvance == other.XAdvance && extents.YAdvance == other.YAdvance;
+               }
+
+               public static bool operator != (TextExtents extents, TextExtents other)
+               {
+                       return !(extents == other);
+               }
+       }
+}
diff --git a/Crow/src/vkvg/TextRun.cs b/Crow/src/vkvg/TextRun.cs
new file mode 100644 (file)
index 0000000..e748d7f
--- /dev/null
@@ -0,0 +1,75 @@
+//
+// TextRun.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2019 jp
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+namespace vkvg {
+       public class TextRun : IDisposable {
+
+               IntPtr handle = IntPtr.Zero;
+
+               #region CTORS & DTOR
+               protected TextRun(IntPtr handle) {
+                       this.handle = handle;
+               }
+               public TextRun(string text) {
+                       handle = NativeMethods.vkvg_text_run_create (handle, Context.TerminateUtf8(text));
+               }
+
+               ~TextRun() {
+                       Dispose (false);
+               }
+               #endregion
+
+               //public void AddReference () {
+               //      NativeMethods.vkvg_pattern_reference (handle);
+               //}
+               //public uint References () => NativeMethods.vkvg_pattern_get_reference_count (handle);
+
+               public IntPtr Handle { get { return handle; } }
+
+               public TextExtents Extents {
+                       get {
+                               TextExtents extents;
+                               NativeMethods.vkvg_text_run_get_extents (handle, out extents);
+                               return extents;
+                       }
+               }
+
+               #region IDisposable implementation
+               public void Dispose () {
+                       Dispose (true);
+                       GC.SuppressFinalize (this);
+               }
+
+               protected virtual void Dispose (bool disposing) {
+                       if (!disposing || handle == IntPtr.Zero)
+                               return;
+
+                       NativeMethods.vkvg_text_run_destroy (handle);
+                       handle = IntPtr.Zero;
+               }
+               #endregion
+       }
+}
\ No newline at end of file
diff --git a/CrowIDE/CrowIDE.NetStd.csproj b/CrowIDE/CrowIDE.NetStd.csproj
new file mode 100644 (file)
index 0000000..0872a62
--- /dev/null
@@ -0,0 +1,55 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+
+    <OutputType>Exe</OutputType>
+    <RootNamespace>Crow.Coding</RootNamespace>
+    <AssemblyName>CrowIDE</AssemblyName>
+    <StartupObject>Crow.Coding.CrowIDE</StartupObject>
+        
+    <OutputPath>$(SolutionDir)build/$(Configuration)</OutputPath>
+    <IntermediateOutputPath>$(SolutionDir)build/obj/$(Configuration)</IntermediateOutputPath>  
+              
+    <EnableDefaultItems>false</EnableDefaultItems>
+    <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <DefineConstants>TRACE;NETSTANDARD2_0;DEBUG;NETCOREAPP2_0</DefineConstants>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Remove="icons\blank-file2.svg" />
+  </ItemGroup>
+  <ItemGroup>
+
+    <PackageReference Include="System.CodeDom" Version="4.5.0" />
+<!--<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.10.0" />-->
+        
+    <Compile Include="src\**\*.cs" Exclude="src\ProjectTree\CSProjectFile.cs" />  
+        
+    <ProjectReference Include="..\Crow\Crow.NetStd.csproj" />
+        
+    <EmbeddedResource Include="icons\*.*">
+      <LogicalName>icons.%(Filename)%(Extension)</LogicalName>
+    </EmbeddedResource>
+
+    <EmbeddedResource Include="ui\**\*.crow" />
+    <EmbeddedResource Include="ui\**\*.itemp" />
+  
+    <EmbeddedResource Include="ui\**\*.template">
+      <LogicalName>Crow.Coding.%(Filename).template</LogicalName>
+    </EmbeddedResource> 
+
+    <EmbeddedResource Include="DefaultTemplateOverrides\*.*">
+      <LogicalName>Crow.%(Filename).template</LogicalName>
+    </EmbeddedResource>
+        
+    <EmbeddedResource Include="IDE.style" />
+  </ItemGroup>
+    
+  <ItemGroup>
+    <Folder Include="src\msbuild\" />
+  </ItemGroup>
+</Project>
diff --git a/CrowIDE/CrowIDE.csproj b/CrowIDE/CrowIDE.csproj
new file mode 100644 (file)
index 0000000..c0c44ed
--- /dev/null
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{B6D911CD-1D09-42FC-B300-9187190F2AE1}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>CrowIDE</RootNamespace>
+    <AssemblyName>CrowIDE</AssemblyName>
+    <OutputPath>$(SolutionDir)build/$(Configuration)</OutputPath>
+    <IntermediateOutputPath>$(SolutionDir)build/obj/$(Configuration)</IntermediateOutputPath>
+    <ReleaseVersion>0.8.0</ReleaseVersion>
+    <StartupObject>Crow.Coding.CrowIDE</StartupObject>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <DefineConstants>DEBUG;</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
+    <OutputPath>$(SolutionDir)build\$(Configuration)</OutputPath>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>true</Optimize>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>0</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
+    <OutputPath>$(SolutionDir)build\$(Configuration)</OutputPath>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+    <Reference Include="System.Drawing" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <ProjectReference Include="..\Crow\Crow.csproj">
+      <Project>{C2980F9B-4798-4C05-99E2-E174810F7C7B}</Project>
+      <Name>Crow</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="src\**\*.cs" Exclude="src\ProjectTree\CSProjectFile.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="ui\" />
+    <Folder Include="src\" />
+    <Folder Include="images\" />
+    <Folder Include="ui\ItemTemplates\" />
+    <Folder Include="src\MemberView\" />
+    <Folder Include="ui\DockWindows\" />
+    <Folder Include="ui\editors\" />
+    <Folder Include="src\Editors\" />
+    <Folder Include="src\Editors\Parsers\" />
+    <Folder Include="src\Editors\CodeBuffer\" />
+    <Folder Include="src\ProjectTree\" />
+    <Folder Include="src\Editors\Parsers2\" />
+    <Folder Include="src\ProjectTree\msbuild\" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="IDE.style" />
+    <EmbeddedResource Include="icons\**\*.svg" />
+
+    <EmbeddedResource Include="images\save.svg" />
+    <EmbeddedResource Include="ui\MembersView.template">
+      <LogicalName>Crow.Coding.MembersView.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\LQIsExplorer.crow" />
+    <EmbeddedResource Include="ui\MemberView.crow" />
+    <EmbeddedResource Include="ui\ProjectProperties.crow" />
+    <EmbeddedResource Include="ui\TreeExpandable.template">
+      <LogicalName>Crow.Coding.TreeExpandable.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\ProjectTree.template">
+      <LogicalName>Crow.Coding.ProjectTree.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\CrowIDE.crow" />
+    <EmbeddedResource Include="DefaultTemplateOverrides\TabItem.template">
+      <LogicalName>Crow.TabItem.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DefaultTemplateOverrides\MenuItem.template">
+      <LogicalName>Crow.MenuItem.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="DefaultTemplateOverrides\ContextMenu.template">
+      <LogicalName>Crow.ContextMenu.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\Options.crow" />
+    <EmbeddedResource Include="ui\IcoBut.template" />
+    <EmbeddedResource Include="ui\MembersItem.template">
+      <LogicalName>Crow.Coding.MembersItem.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\ItemTemplates\Enum.template">
+      <LogicalName>Crow.Coding.Enum.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\ItemTemplates\Fill.template">
+      <LogicalName>Crow.Coding.Fill.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\DockWindows\winEditor.crow" />
+    <EmbeddedResource Include="ui\DockWindows\winErrors.crow" />
+    <EmbeddedResource Include="ui\DockWindows\winSolution.crow" />
+    <EmbeddedResource Include="ui\DockWindows\winProperties.crow" />
+    <EmbeddedResource Include="ui\DockWindows\winToolbox.crow" />
+    <EmbeddedResource Include="ui\DockWindows\toolboxBut.template" />
+    <EmbeddedResource Include="ui\editors\EditPane.template">
+      <LogicalName>Crow.Coding.EditPane.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\editors\EditPaneItems.template">
+      <LogicalName>Crow.Coding.EditPaneItems.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\editors\IMLEdit.itemp" />
+    <EmbeddedResource Include="ui\editors\SourceEditor.crow" />
+    <EmbeddedResource Include="ui\editors\SrcEdit.itemp" />
+    <EmbeddedResource Include="ui\editors\SvgEdit.itemp" />
+    <EmbeddedResource Include="ui\DockWindows\winGTExplorer.crow" />
+    <EmbeddedResource Include="ui\DockWindows\GTreeExpITemp.crow" />
+    <EmbeddedResource Include="ui\NewFile.crow" />
+    <EmbeddedResource Include="ui\DockWindows\winSchema.crow" />
+    <EmbeddedResource Include="ui\DockWindows\WinSchemaItem.template" />
+    <EmbeddedResource Include="ui\editors\TextEditor.crow">
+      <LogicalName>Crow.Coding.ui.TextEditor.crow</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\DockWindows\winStyleView.crow" />
+    <EmbeddedResource Include="ui\CategoryExp.template">
+      <LogicalName>Crow.Coding.CategoryExp.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\DockWindows\winDesign.crow" />
+    <EmbeddedResource Include="ui\editors\EditTabItem.template">
+      <LogicalName>Crow.Coding.EditTabItem.template</LogicalName>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="ui\test.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+</Project>
diff --git a/CrowIDE/CrowIDE.sln b/CrowIDE/CrowIDE.sln
new file mode 100644 (file)
index 0000000..49e1e02
--- /dev/null
@@ -0,0 +1,17 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrowIDE", "CrowIDE.csproj", "{B6D911CD-1D09-42FC-B300-9187190F2AE1}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|Any CPU = Debug|Any CPU
+               Release|Any CPU = Release|Any CPU
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {B6D911CD-1D09-42FC-B300-9187190F2AE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {B6D911CD-1D09-42FC-B300-9187190F2AE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {B6D911CD-1D09-42FC-B300-9187190F2AE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {B6D911CD-1D09-42FC-B300-9187190F2AE1}.Release|Any CPU.Build.0 = Release|Any CPU
+       EndGlobalSection
+EndGlobal
diff --git a/CrowIDE/CrowIDE.userprefs b/CrowIDE/CrowIDE.userprefs
new file mode 100644 (file)
index 0000000..0f4ab21
--- /dev/null
@@ -0,0 +1,19 @@
+<Properties StartupConfiguration="{B6D911CD-1D09-42FC-B300-9187190F2AE1}|Default">
+  <MonoDevelop.Ide.Workbench />
+  <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug" />
+  <MonoDevelop.Ide.DebuggingService.Breakpoints>
+    <BreakpointStore />
+  </MonoDevelop.Ide.DebuggingService.Breakpoints>
+  <MonoDevelop.Ide.DebuggingService.PinnedWatches>
+    <Watch file="../src/GraphicObjects/Shape.cs" line="42" offsetX="508" offsetY="265" expression="c" liveUpdate="False" />
+    <Watch file="../src/GraphicObjects/Shape.cs" line="48" offsetX="524" offsetY="319" expression="tmp" liveUpdate="False" />
+    <Watch file="../src/GraphicObjects/Slider.cs" line="88" offsetX="534" offsetY="788" expression="value" liveUpdate="False" />
+    <Watch file="src/SourceEditor/SourceEditor.cs" line="632" offsetX="703" offsetY="8806" expression="cl.Tokens [t]" liveUpdate="False" />
+    <Watch file="src/SourceEditor/CSharpParser.cs" line="202" offsetX="590" offsetY="1493" expression="currentTok" liveUpdate="False" />
+    <Watch file="src/SourceEditor/Parser.cs" line="258" offsetX="328" offsetY="3348" expression="tmp" liveUpdate="False" />
+    <Watch file="src/SourceEditor/SourceEditor.cs" line="629" offsetX="835" offsetY="9513" expression="lineIndex" liveUpdate="False" />
+    <Watch file="src/SourceEditor/BufferParser.cs" line="90" offsetX="544" offsetY="972" expression="SyntacticTreeMaxDepth" liveUpdate="False" />
+  </MonoDevelop.Ide.DebuggingService.PinnedWatches>
+  <MultiItemStartupConfigurations />
+  <MonoDevelop.Ide.ItemProperties.CrowIDE PreferredExecutionTarget="MonoDevelop.Default" />
+</Properties>
\ No newline at end of file
diff --git a/CrowIDE/DefaultTemplateOverrides/ContextMenu.template b/CrowIDE/DefaultTemplateOverrides/ContextMenu.template
new file mode 100644 (file)
index 0000000..38e6b7b
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<MenuItem MinimumSize="20,20" Height="Fit" Width="160" Caption="Context Menu" Data="{ContextCommands}" Orientation="Vertical"
+       IsOpened ="true" Visible="{/IsOpened}" SelectionBackground="Transparent">
+       <Template>              
+               <Border Background="DimGrey" Foreground="Black" CornerRadius="2">
+                       <GenericStack Orientation="{./Orientation}" Name="ItemsContainer" Margin="2"/>
+               </Border>               
+       </Template>
+       <ItemTemplate>
+               <MenuItem Command="{}" Width="150" PopWidth="120" SelectionBackground="Transparent" IsEnabled="{CanExecute}">
+                       <Template>
+                               <Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
+                                       Foreground = "{./Foreground}" CanPop="{./HasChildren}" MouseDown="./onMI_Click"
+                                       IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}">
+                                       <Template>
+                                               <Border Name="border1"
+                                                               CornerRadius="0"
+                                                               MouseEnter="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"
+                                                               MouseLeave="{Foreground=Transparent}"
+                                                               MouseDown="{Foreground=vgradient|0:Black|0.05:Grey|0.85:Grey|1:White}"
+                                                               MouseUp="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"
+                                                               MinimumSize = "60,0"
+                                                               Foreground="Transparent"
+                                                               Background="{./Background}">
+                                                               <HorizontalStack Spacing="5">
+                                                                       <Image Height="14" Width="14" Picture="{Icon}" />
+                                                                       <Label Text="{./Caption}"
+                                                                               Foreground="{./Foreground}"
+                                                                               Margin="1" HorizontalAlignment="Left"
+                                                                               Font="{./Font}" />
+                                                               </HorizontalStack>
+                                               </Border>
+                                       </Template>
+                                       <Border Foreground="DimGrey" Width="{../PopWidth}" Height="{../PopHeight}" Background="DimGrey">
+                                               <VerticalStack Name="ItemsContainer"/>
+                                       </Border>
+                               </Popper>
+                       </Template>
+               </MenuItem>
+       </ItemTemplate>
+</MenuItem>
+
diff --git a/CrowIDE/DefaultTemplateOverrides/MenuItem.template b/CrowIDE/DefaultTemplateOverrides/MenuItem.template
new file mode 100644 (file)
index 0000000..2ed8496
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
+       Foreground = "{./Foreground}" CanPop="{./HasChildren}"
+       IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}" IsEnabled="{./IsEnabled}">
+       <Template>
+               <CheckBox IsChecked="{²./IsPopped}" Caption="{./Caption}" Background="{./Background}" Foreground="{./Foreground}">
+                       <Template>
+                               <Border Name="border1" ForwardMouseEvents="true"
+                                               MouseEnter="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"
+                                               MouseLeave="{Foreground=Transparent}"
+                                               MouseDown="{Foreground=vgradient|0:Black|0.05:Grey|0.85:Grey|1:White}"
+                                               MouseUp="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}"
+                                               MinimumSize = "40,0"
+                                               Foreground="Transparent"
+                                               Background="{./Background}">
+                                               <HorizontalStack HorizontalAlignment="Left" Margin="1">
+                                                       <Image Width="10" Height="10" Picture="{../../../../../Icon}"/>
+                                                       <Label Text="{./Caption}"
+                                                               Foreground="{./Foreground}"
+                                                               Font="{./Font}" />
+                                               </HorizontalStack>
+                               </Border>
+                       </Template>
+               </CheckBox>
+       </Template>
+       <Border Foreground="DimGrey" Width="{../PopWidth}" Height="{../PopHeight}" Background="Jet">
+               <VerticalStack Name="ItemsContainer"/>
+       </Border>
+</Popper>
diff --git a/CrowIDE/DefaultTemplateOverrides/TabItem.template b/CrowIDE/DefaultTemplateOverrides/TabItem.template
new file mode 100644 (file)
index 0000000..c07119b
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<GenericStack Orientation="Vertical" Spacing="0"               
+               MouseEnter="{caption.Foreground=White}"
+               MouseLeave="{caption.Foreground=Grey}">
+       <HorizontalStack Margin="2" Left="{./TabOffset}"
+               Name="TabTitle"
+               HorizontalAlignment="Left"
+               Height="{./TabHeight}"
+               Width="{./TabWidth}">
+               <Label Name="caption" Text="{./Caption}" Foreground="Grey" Width="Stretched"/>
+               <Border CornerRadius="5" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Icons.exit2.svg"
+                                MouseClick="./butCloseTabClick"/>
+               </Border>
+       </HorizontalStack>
+       <Container Name="Content"/>
+</GenericStack>
+
diff --git a/CrowIDE/IDE.style b/CrowIDE/IDE.style
new file mode 100644 (file)
index 0000000..5b5054a
--- /dev/null
@@ -0,0 +1,64 @@
+Label {    
+    Foreground="Black";
+}
+icon {
+       Width="14";
+       Height="14";
+}
+MemberViewLabel {
+       Margin="1";
+       Height="Fit";
+       Width="50%";
+       Background="White";
+}
+MemberViewHStack {
+       Focusable="true";
+       Height="Fit";
+       Spacing="1";
+       MouseEnter="{Background=SteelBlue}";
+       MouseLeave="{Background=Transparent}";
+}
+
+IcoBut {
+       Template = "#Crow.Coding.IcoBut.template";
+       MinimumSize = "10,10";
+       Width = "8";
+       Height = "14";
+       Background = "Black";
+}
+
+WinSchema {
+       Template="#Crow.Coding.ui.DockWindows.WinSchemaItem.template";
+       Focusable = "true";
+       MinimumSize="150,50";
+       Width = "Fit";
+       Height = "Fit";
+}
+TabItem {
+       AllowDrag="false";
+       Background="Grey";
+       SelectedBackground="0.9,0.9,0.91,1.0";
+    Foreground="Black";
+}
+TreeItemBorder {
+       CornerRadius="2";
+       Margin="0";
+       //Focusable="true";
+       Height="Fit";
+       Width="Stretched";
+       Foreground="Transparent";
+       MouseEnter="{Foreground=DimGrey}";
+       MouseLeave="{Foreground=Transparent}";
+}
+TreeIcon {
+       Margin="0";
+       Width="14";
+       Height="14";
+}
+Splitter {
+       Thickness="1";
+       Background="RoyalBlue";
+}
+DockWindow {
+    Background="0.98,0.98,0.99,0.9";
+}
diff --git a/CrowIDE/icons/basic_floppydisk.svg b/CrowIDE/icons/basic_floppydisk.svg
new file mode 100644 (file)
index 0000000..55d901d
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
+<g>
+       <polygon fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" points="63,63 1,63 1,1 51,1 63,13         "/>
+</g>
+<rect x="7" y="31" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" width="50" height="32"/>
+<line fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="14" y1="39" x2="50" y2="39"/>
+<line fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="14" y1="47" x2="50" y2="47"/>
+<line fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="14" y1="55" x2="50" y2="55"/>
+<rect x="15" y="1" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" width="34" height="19"/>
+<rect x="38" y="5" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" width="5" height="11"/>
+</svg>
diff --git a/CrowIDE/icons/binding.svg b/CrowIDE/icons/binding.svg
new file mode 100644 (file)
index 0000000..04f669e
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14.9 1.1c-1.4-1.4-3.7-1.4-5.1 0l-4.4 4.3c-1.4 1.5-1.4 3.7 0 5.2 0.1 0.1 0.3 0.2 0.4 0.3l1.5-1.5c-0.1-0.1-0.3-0.2-0.4-0.3-0.6-0.6-0.6-1.6 0-2.2l4.4-4.4c0.6-0.6 1.6-0.6 2.2 0s0.6 1.6 0 2.2l-1.3 1.3c0.4 0.8 0.5 1.7 0.4 2.5l2.3-2.3c1.5-1.4 1.5-3.7 0-5.1z"></path>
+<path fill="#dddddd" d="M10.2 5.1l-1.5 1.5c0 0 0.3 0.2 0.4 0.3 0.6 0.6 0.6 1.6 0 2.2l-4.4 4.4c-0.6 0.6-1.6 0.6-2.2 0s-0.6-1.6 0-2.2l1.3-1.3c-0.4-0.8-0.1-1.3-0.4-2.5l-2.3 2.3c-1.4 1.4-1.4 3.7 0 5.1s3.7 1.4 5.1 0l4.4-4.4c1.4-1.4 1.4-3.7 0-5.1-0.2-0.1-0.4-0.3-0.4-0.3z"></path>
+</svg>
diff --git a/CrowIDE/icons/blank-file.svg b/CrowIDE/icons/blank-file.svg
new file mode 100644 (file)
index 0000000..5880a3a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#ffffff" d="M 10,0 H 2 V 16 H 14 V 4 Z"/>
+<path fill="#444444" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"/>
+</svg>
diff --git a/CrowIDE/icons/center-align.svg b/CrowIDE/icons/center-align.svg
new file mode 100644 (file)
index 0000000..92e3fac
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M5 0h6v3h-6v-3z"></path>
+<path fill="#FFFFFF" d="M1 4h14v3h-14v-3z"></path>
+<path fill="#FFFFFF" d="M3 8h10v3h-10v-3z"></path>
+<path fill="#FFFFFF" d="M0 12h16v3h-16v-3z"></path>
+</svg>
diff --git a/CrowIDE/icons/cogwheel.svg b/CrowIDE/icons/cogwheel.svg
new file mode 100644 (file)
index 0000000..c104c47
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M15.2 6l-1.1-0.2c-0.1-0.2-0.1-0.4-0.2-0.6l0.6-0.9 0.5-0.7-2.6-2.6-0.7 0.5-0.9 0.6c-0.2-0.1-0.4-0.1-0.6-0.2l-0.2-1.1-0.2-0.8h-3.6l-0.2 0.8-0.2 1.1c-0.2 0.1-0.4 0.1-0.6 0.2l-0.9-0.6-0.7-0.4-2.5 2.5 0.5 0.7 0.6 0.9c-0.2 0.2-0.2 0.4-0.3 0.6l-1.1 0.2-0.8 0.2v3.6l0.8 0.2 1.1 0.2c0.1 0.2 0.1 0.4 0.2 0.6l-0.6 0.9-0.5 0.7 2.6 2.6 0.7-0.5 0.9-0.6c0.2 0.1 0.4 0.1 0.6 0.2l0.2 1.1 0.2 0.8h3.6l0.2-0.8 0.2-1.1c0.2-0.1 0.4-0.1 0.6-0.2l0.9 0.6 0.7 0.5 2.6-2.6-0.5-0.7-0.6-0.9c0.1-0.2 0.2-0.4 0.2-0.6l1.1-0.2 0.8-0.2v-3.6l-0.8-0.2zM15 9l-1.7 0.3c-0.1 0.5-0.3 1-0.6 1.5l0.9 1.4-1.4 1.4-1.4-0.9c-0.5 0.3-1 0.5-1.5 0.6l-0.3 1.7h-2l-0.3-1.7c-0.5-0.1-1-0.3-1.5-0.6l-1.4 0.9-1.4-1.4 0.9-1.4c-0.3-0.5-0.5-1-0.6-1.5l-1.7-0.3v-2l1.7-0.3c0.1-0.5 0.3-1 0.6-1.5l-1-1.4 1.4-1.4 1.4 0.9c0.5-0.3 1-0.5 1.5-0.6l0.4-1.7h2l0.3 1.7c0.5 0.1 1 0.3 1.5 0.6l1.4-0.9 1.4 1.4-0.9 1.4c0.3 0.5 0.5 1 0.6 1.5l1.7 0.3v2z"></path>
+<path fill="#FFFFFF" d="M8 4.5c-1.9 0-3.5 1.6-3.5 3.5s1.6 3.5 3.5 3.5 3.5-1.6 3.5-3.5c0-1.9-1.6-3.5-3.5-3.5zM8 10.5c-1.4 0-2.5-1.1-2.5-2.5s1.1-2.5 2.5-2.5 2.5 1.1 2.5 2.5c0 1.4-1.1 2.5-2.5 2.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/compile.svg b/CrowIDE/icons/compile.svg
new file mode 100644 (file)
index 0000000..c1a14e7
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M12 7v-2l-1.2-0.4c-0.1-0.3-0.2-0.7-0.4-1l0.6-1.2-1.5-1.3-1.1 0.5c-0.3-0.2-0.6-0.3-1-0.4l-0.4-1.2h-2l-0.4 1.2c-0.3 0.1-0.7 0.2-1 0.4l-1.1-0.5-1.4 1.4 0.6 1.2c-0.2 0.3-0.3 0.6-0.4 1l-1.3 0.3v2l1.2 0.4c0.1 0.3 0.2 0.7 0.4 1l-0.5 1.1 1.4 1.4 1.2-0.6c0.3 0.2 0.6 0.3 1 0.4l0.3 1.3h2l0.4-1.2c0.3-0.1 0.7-0.2 1-0.4l1.2 0.6 1.4-1.4-0.6-1.2c0.2-0.3 0.3-0.6 0.4-1l1.2-0.4zM3 6c0-1.7 1.3-3 3-3s3 1.3 3 3c0 1.7-1.3 3-3 3s-3-1.3-3-3z"></path>
+<path fill="#FFFFFF" d="M7.5 6c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5z"></path>
+<path fill="#FFFFFF" d="M16 3v-1h-0.6c0-0.2-0.1-0.4-0.2-0.5l0.4-0.4-0.7-0.7-0.4 0.4c-0.2-0.1-0.3-0.2-0.5-0.2v-0.6h-1v0.6c-0.2 0-0.4 0.1-0.5 0.2l-0.4-0.4-0.7 0.7 0.4 0.4c-0.1 0.2-0.2 0.3-0.2 0.5h-0.6v1h0.6c0 0.2 0.1 0.4 0.2 0.5l-0.4 0.4 0.7 0.7 0.4-0.4c0.2 0.1 0.3 0.2 0.5 0.2v0.6h1v-0.6c0.2 0 0.4-0.1 0.5-0.2l0.4 0.4 0.7-0.7-0.4-0.4c0.1-0.2 0.2-0.3 0.2-0.5h0.6zM13.5 3.5c-0.6 0-1-0.4-1-1s0.4-1 1-1 1 0.4 1 1c0 0.6-0.4 1-1 1z"></path>
+<path fill="#FFFFFF" d="M15.4 11.8c-0.1-0.3-0.2-0.6-0.4-0.9l0.3-0.6-0.7-0.7-0.5 0.4c-0.3-0.2-0.6-0.3-0.9-0.4l-0.2-0.6h-1l-0.2 0.6c-0.3 0.1-0.6 0.2-0.9 0.4l-0.6-0.3-0.7 0.7 0.3 0.6c-0.2 0.3-0.3 0.6-0.4 0.9l-0.5 0.1v1l0.6 0.2c0.1 0.3 0.2 0.6 0.4 0.9l-0.3 0.6 0.7 0.7 0.6-0.3c0.3 0.2 0.6 0.3 0.9 0.4l0.1 0.5h1l0.2-0.6c0.3-0.1 0.6-0.2 0.9-0.4l0.6 0.3 0.7-0.7-0.4-0.5c0.2-0.3 0.3-0.6 0.4-0.9l0.6-0.2v-1l-0.6-0.2zM12.5 14c-0.8 0-1.5-0.7-1.5-1.5s0.7-1.5 1.5-1.5 1.5 0.7 1.5 1.5-0.7 1.5-1.5 1.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/copy-file.svg b/CrowIDE/icons/copy-file.svg
new file mode 100644 (file)
index 0000000..63c2dd3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M13 3h-3l-3-3h-7v13h6v3h10v-10l-3-3zM7 1l2 2h-2v-2zM1 12v-11h5v3h3v8h-8zM15 15h-8v-2h3v-9h2v3h3v8zM13 6v-2l2 2h-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/cs-file.svg b/CrowIDE/icons/cs-file.svg
new file mode 100644 (file)
index 0000000..5ddb69a
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg">
+
+ <g class="layer">
+  <title>Layer 1</title>
+  <path d="m10,0l-8,0l0,16l12,0l0,-12l-4,-4z" fill="#ffffff" id="svg_1"/>
+  <path d="m10,0l-8,0l0,16l12,0l0,-12l-4,-4zm-1,5l4,0l0,10l-10,0l0,-14l6,0l0,4zm1,-1l0,-3l3,3l-3,0z" fill="#444444" id="svg_2"/>
+  <text fill="#007f00" font-family="Monospace" font-size="16" font-style="normal" font-weight="bold" id="svg_4" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(0.69828, 0, 0, 0.877654, 0.704781, 2.22646)" x="7.714503" xml:space="preserve" y="12.444685">c</text>
+  <text fill="#007f00" font-family="Monospace" font-size="7" font-style="normal" font-weight="bold" id="svg_5" stroke="#000000" stroke-width="0" text-anchor="middle" transform="matrix(0.999951, 0, 0, 0.975655, -2.14552, 0.0604767)" x="12.987902" xml:space="preserve" y="11.031572">#</text>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/CrowIDE/icons/curly-brackets.svg b/CrowIDE/icons/curly-brackets.svg
new file mode 100644 (file)
index 0000000..89ef798
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M2.1 3.1c0.2 1.3 0.4 1.6 0.4 2.9 0 0.8-1.5 1.5-1.5 1.5v1c0 0 1.5 0.7 1.5 1.5 0 1.3-0.2 1.6-0.4 2.9-0.3 2.1 0.8 3.1 1.8 3.1s2.1 0 2.1 0v-2c0 0-1.8 0.2-1.8-1 0-0.9 0.2-0.9 0.4-2.9 0.1-0.9-0.5-1.6-1.1-2.1 0.6-0.5 1.2-1.1 1.1-2-0.3-2-0.4-2-0.4-2.9 0-1.2 1.8-1.1 1.8-1.1v-2c0 0-1 0-2.1 0s-2.1 1-1.8 3.1z"></path>
+<path fill="#dddddd" d="M13.9 3.1c-0.2 1.3-0.4 1.6-0.4 2.9 0 0.8 1.5 1.5 1.5 1.5v1c0 0-1.5 0.7-1.5 1.5 0 1.3 0.2 1.6 0.4 2.9 0.3 2.1-0.8 3.1-1.8 3.1s-2.1 0-2.1 0v-2c0 0 1.8 0.2 1.8-1 0-0.9-0.2-0.9-0.4-2.9-0.1-0.9 0.5-1.6 1.1-2.1-0.6-0.5-1.2-1.1-1.1-2 0.2-2 0.4-2 0.4-2.9 0-1.2-1.8-1.1-1.8-1.1v-2c0 0 1 0 2.1 0s2.1 1 1.8 3.1z"></path>
+</svg>
diff --git a/CrowIDE/icons/drawsvg.svg b/CrowIDE/icons/drawsvg.svg
new file mode 100644 (file)
index 0000000..36ef290
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1120px" height="670px" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0  1120 670" preserveAspectRatio="xMidYMid meet" ><rect id="svgEditorBackground" x="0" y="0" width="1120" height="670" style="fill: none; stroke: none;"/><line id="e1_line" x1="432" y1="118" x2="291" y2="273" style="stroke:black;fill:none;stroke-width:1px;"/><line id="e2_line" x1="291" y1="270" x2="397" y2="402" style="stroke:black;fill:none;stroke-width:1px;"/><polyline style="stroke:black;fill:none;stroke-width:10px;stroke-linecap:round;stroke-linejoin:round;" id="e3_polyline" points="685,138 683,138 596,275 694,413"/></svg>
\ No newline at end of file
diff --git a/CrowIDE/icons/edit.svg b/CrowIDE/icons/edit.svg
new file mode 100644 (file)
index 0000000..73569d8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M16 4c0 0 0-1-1-2s-1.9-1-1.9-1l-1.1 1.1v-2.1h-12v16h12v-8l4-4zM6.3 11.4l-0.6-0.6 0.3-1.1 1.5 1.5-1.2 0.2zM7.2 9.5l-0.6-0.6 5.2-5.2c0.2 0.1 0.4 0.3 0.6 0.5zM14.1 2.5l-0.9 1c-0.2-0.2-0.4-0.3-0.6-0.5l0.9-0.9c0.1 0.1 0.3 0.2 0.6 0.4zM11 15h-10v-14h10v2.1l-5.9 5.9-1.1 4.1 4.1-1.1 2.9-3v6z"></path>
+</svg>
diff --git a/CrowIDE/icons/eraser.svg b/CrowIDE/icons/eraser.svg
new file mode 100644 (file)
index 0000000..5dd73ba
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8.1 14l6.4-7.2c0.6-0.7 0.6-1.8-0.1-2.5l-2.7-2.7c-0.3-0.4-0.8-0.6-1.3-0.6h-1.8c-0.5 0-1 0.2-1.4 0.6l-6.7 7.6c-0.6 0.7-0.6 1.9 0.1 2.5l2.7 2.7c0.3 0.4 0.8 0.6 1.3 0.6h11.4v-1h-7.9zM6.8 13.9c0 0 0-0.1 0 0l-2.7-2.7c-0.4-0.4-0.4-0.9 0-1.3l3.4-3.9h-1l-3 3.3c-0.6 0.7-0.6 1.7 0.1 2.4l2.3 2.3h-1.3c-0.2 0-0.4-0.1-0.6-0.2l-2.8-2.8c-0.3-0.3-0.3-0.8 0-1.1l3.5-3.9h1.8l3.5-4h1l-3.5 4 3.1 3.7-3.5 4c-0.1 0.1-0.2 0.1-0.3 0.2z"></path>
+</svg>
diff --git a/CrowIDE/icons/expand-arrows-1.svg b/CrowIDE/icons/expand-arrows-1.svg
new file mode 100644 (file)
index 0000000..5a77b1d
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M5.3 6.7l1.4-1.4-3-3 1.3-1.3h-4v4l1.3-1.3z"></path>
+<path fill="#dddddd" d="M6.7 10.7l-1.4-1.4-3 3-1.3-1.3v4h4l-1.3-1.3z"></path>
+<path fill="#dddddd" d="M10.7 9.3l-1.4 1.4 3 3-1.3 1.3h4v-4l-1.3 1.3z"></path>
+<path fill="#dddddd" d="M11 1l1.3 1.3-3 3 1.4 1.4 3-3 1.3 1.3v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/file-code.svg b/CrowIDE/icons/file-code.svg
new file mode 100644 (file)
index 0000000..2dc00db
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"></path>
+<path fill="#FFFFFF" d="M6.2 13h-0.7l-2-2.5 2-2.5h0.7l-2 2.5z"></path>
+<path fill="#FFFFFF" d="M9.8 13h0.7l2-2.5-2-2.5h-0.7l2 2.5z"></path>
+<path fill="#FFFFFF" d="M6.7 14h0.6l2.1-7h-0.8z"></path>
+</svg>
diff --git a/CrowIDE/icons/file.svg b/CrowIDE/icons/file.svg
new file mode 100644 (file)
index 0000000..9d06b00
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M9 5h5v11h-12v-16h7v5zM10 4v-4l4 4h-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/font-file.svg b/CrowIDE/icons/font-file.svg
new file mode 100644 (file)
index 0000000..20beac1
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"></path>
+<path fill="#FFFFFF" d="M5 7v2h2v5h2v-5h2v-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/light-bulb.svg b/CrowIDE/icons/light-bulb.svg
new file mode 100644 (file)
index 0000000..4193a75
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M11.7 1.9c-1-1.2-2.6-1.9-4.2-1.9s-3.2 0.7-4.2 1.9c-1 1.1-1.4 2.6-1.2 4 0.2 1.5 0.8 2.6 2.1 3.7 0.5 0.4 0.7 0.8 0.9 1.2 0 0.1 0.1 0.2 0.1 0.3-0.1 0.1-0.2 0.2-0.2 0.4 0 0.3 0.2 0.5 0.5 0.5-0.3 0-0.5 0.2-0.5 0.5s0.2 0.5 0.5 0.5c-0.3 0-0.5 0.2-0.5 0.5s0.2 0.5 0.5 0.5c-0.3 0-0.5 0.2-0.5 0.5s0.2 0.5 0.5 0.5h0.5c0 0.5 0.7 1 1.5 1s1.5-0.5 1.5-1h0.5c0.3 0 0.5-0.2 0.5-0.5s-0.2-0.5-0.5-0.5c0.3 0 0.5-0.2 0.5-0.5s-0.2-0.5-0.5-0.5c0.3 0 0.5-0.2 0.5-0.5s-0.2-0.5-0.5-0.5c0.3 0 0.5-0.2 0.5-0.5 0-0.2-0.1-0.3-0.2-0.4 0-0.1 0.1-0.1 0.1-0.2 0.2-0.4 0.4-0.8 0.9-1.2 1.3-1.1 1.9-2.2 2.1-3.8 0.2-1.4-0.2-2.8-1.2-4zM12 5.8c-0.2 1.3-0.7 2.2-1.8 3.2-0.6 0.5-0.9 1-1.2 1.4-0.2 0.5-0.3 0.6-0.5 0.6h-2c-0.2 0-0.3-0.1-0.5-0.6-0.2-0.4-0.5-1-1.1-1.6-1.3-1.1-1.6-2-1.8-3-0.2-1.1 0.2-2.3 0.9-3.2 0.9-1 2.2-1.6 3.5-1.6s2.6 0.6 3.5 1.6c0.7 0.9 1.1 2.1 1 3.2z"></path>
+<path fill="#FFFFFF" d="M11 5h-1c0-0.7-0.8-2-2-2v-1c1.8 0 3 1.8 3 3z"></path>
+</svg>
diff --git a/CrowIDE/icons/magic-wand.svg b/CrowIDE/icons/magic-wand.svg
new file mode 100644 (file)
index 0000000..8b40691
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 5h3v1h-3v-1z"></path>
+<path fill="#dddddd" d="M5 0h1v3h-1v-3z"></path>
+<path fill="#dddddd" d="M6 11h-1v-2.5l1 1z"></path>
+<path fill="#dddddd" d="M11 6h-1.5l-1-1h2.5z"></path>
+<path fill="#dddddd" d="M3.131 7.161l0.707 0.707-2.97 2.97-0.707-0.707 2.97-2.97z"></path>
+<path fill="#dddddd" d="M10.131 0.161l0.707 0.707-2.97 2.97-0.707-0.707 2.97-2.97z"></path>
+<path fill="#dddddd" d="M0.836 0.199l3.465 3.465-0.707 0.707-3.465-3.465 0.707-0.707z"></path>
+<path fill="#dddddd" d="M6.1 4.1l-2.1 2 9.8 9.9 2.2-2.1-9.9-9.8zM6.1 5.5l2.4 2.5-0.6 0.6-2.5-2.5 0.7-0.6z"></path>
+</svg>
diff --git a/CrowIDE/icons/magnet.svg b/CrowIDE/icons/magnet.svg
new file mode 100644 (file)
index 0000000..10335f6
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M11 0h5v4h-5v-4z"></path>
+<path fill="#dddddd" d="M11 5v3c0 1.6-1.4 3-3 3s-3-1.4-3-3v-3h-5v3c0 4.4 3.6 8 8 8s8-3.6 8-8v-3h-5z"></path>
+<path fill="#dddddd" d="M0 0h5v4h-5v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/move-arrows.svg b/CrowIDE/icons/move-arrows.svg
new file mode 100644 (file)
index 0000000..ecbb2f9
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 8l-3-3v2h-4v-4h2l-3-3-3 3h2v4h-4v-2l-3 3 3 3v-2h4v4h-2l3 3 3-3h-2v-4h4v2z"></path>
+</svg>
diff --git a/CrowIDE/icons/open-folder-1.svg b/CrowIDE/icons/open-folder-1.svg
new file mode 100644 (file)
index 0000000..9029469
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14 6v-2h-7l-1-2h-4l-1 2h-1v11h14l2-9h-2zM14.9 7l-1.6 7-11.9-0.1 2.3-6.9h11.2zM1 5h0.6l1-2h2.6l1.2 2h6.6v1h-10l-2 5.9v-6.9z"></path>
+</svg>
diff --git a/CrowIDE/icons/open.svg b/CrowIDE/icons/open.svg
new file mode 100644 (file)
index 0000000..bd8d7d9
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M6 5v6h4v-6h2l-4-5-4 5z"></path>
+<path fill="#FFFFFF" d="M13 2h-2l0.9 1h0.4l2.6 8h-3.9v2h-6v-2h-3.9l2.6-8h0.4l0.9-1h-2l-3 9v5h16v-5z"></path>
+</svg>
diff --git a/CrowIDE/icons/paint-brush.svg b/CrowIDE/icons/paint-brush.svg
new file mode 100644 (file)
index 0000000..2bdd5be
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M5.6 11.6l-1.2-1.2c-0.8-0.2-2-0.1-2.7 1-0.8 1.1-0.3 2.8-1.7 4.6 0 0 3.5 0 4.8-1.3 1.2-1.2 1.2-2.2 1-3l-0.2-0.1z"></path>
+<path fill="#dddddd" d="M5.8 8.1c-0.2 0.3-0.5 0.7-0.7 1 0 0.2-0.1 0.3-0.2 0.4l1.5 1.5c0.1-0.1 0.3-0.2 0.4-0.3 0.3-0.2 0.7-0.4 1-0.7 0.4 0 0.6-0.2 0.8-0.4l-2.2-2.2c-0.2 0.2-0.4 0.4-0.6 0.7z"></path>
+<path fill="#dddddd" d="M15.8 0.2c-0.3-0.3-0.7-0.3-1-0.1 0 0-3 2.5-5.9 5.1-0.4 0.4-0.7 0.7-1.1 1-0.2 0.2-0.4 0.4-0.6 0.5l2.1 2.1c0.2-0.2 0.4-0.4 0.5-0.7 0.3-0.4 0.6-0.7 0.9-1.1 2.5-3 5.1-5.9 5.1-5.9 0.3-0.2 0.3-0.6 0-0.9z"></path>
+</svg>
diff --git a/CrowIDE/icons/palette.svg b/CrowIDE/icons/palette.svg
new file mode 100644 (file)
index 0000000..8e425f7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 7.1c0-2.7-1.3-7.1-7.3-7.1s-8.5 7.4-7.5 9.9c0.8 1.9 2.5 0.1 3.1 1 1.8 2.5-2 3.8 0.1 4.7 2.5 1.1 11.6 0.4 11.6-8.5zM4.5 9c-0.9 0-1.5-0.7-1.5-1.5s0.6-1.5 1.5-1.5 1.5 0.7 1.5 1.5-0.7 1.5-1.5 1.5zM6 3.5c0-0.8 0.6-1.5 1.5-1.5s1.5 0.7 1.5 1.5-0.7 1.5-1.5 1.5-1.5-0.7-1.5-1.5zM8.5 14c-0.9 0-1.5-0.7-1.5-1.5s0.6-1.5 1.5-1.5 1.5 0.7 1.5 1.5-0.7 1.5-1.5 1.5zM11 4.5c0-0.8 0.6-1.5 1.5-1.5s1.5 0.7 1.5 1.5-0.7 1.5-1.5 1.5-1.5-0.7-1.5-1.5zM12.5 11c-0.8 0-1.5-0.7-1.5-1.5s0.6-1.5 1.5-1.5 1.5 0.7 1.5 1.5-0.7 1.5-1.5 1.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/paragraph.svg b/CrowIDE/icons/paragraph.svg
new file mode 100644 (file)
index 0000000..826aa63
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M5.5 0c-2.5 0-4.5 2-4.5 4.5s2 4.5 4.5 4.5h2.5v7h2v-14h1v14h2v-14h2v-2h-9.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/paste-on-document.svg b/CrowIDE/icons/paste-on-document.svg
new file mode 100644 (file)
index 0000000..b0a705e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M13 4h-3v-4h-10v14h6v2h10v-9l-3-3zM3 1h4v1h-4v-1zM15 15h-8v-10h5v3h3v7zM13 7v-2l2 2h-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/pin.svg b/CrowIDE/icons/pin.svg
new file mode 100644 (file)
index 0000000..b36340b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M11 6.5v-5.5h1v-1h-8v1h1v5.5c0 0-2 1.5-2 3.5 0 0.5 1.9 0.7 4 0.7v2.2c0 0.7 0.2 1.4 0.5 2.1l0.5 1 0.5-1c0.3-0.6 0.5-1.3 0.5-2.1v-2.2c2.1 0 4-0.3 4-0.7 0-2-2-3.5-2-3.5zM7 6.6c0 0-0.5 0.3-1.6 1.4-1 1-1.5 1.9-1.5 1.9s0.1-1 0.8-1.9c0.9-1.1 1.3-1.4 1.3-1.4v-5.6h1v5.6z"></path>
+</svg>
diff --git a/CrowIDE/icons/previous.svg b/CrowIDE/icons/previous.svg
new file mode 100644 (file)
index 0000000..566c8a3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M0 7.9l6-4.9v3c0 0 1.1 0 2 0 8 0 8 8 8 8s-1-4-7.8-4c-1.1 0-1.8 0-2.2 0v2.9l-6-5z"></path>
+</svg>
diff --git a/CrowIDE/icons/question.svg b/CrowIDE/icons/question.svg
new file mode 100644 (file)
index 0000000..fb8e3d3
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M9 11h-3c0-3 1.6-4 2.7-4.6 0.4-0.2 0.7-0.4 0.9-0.6 0.5-0.5 0.3-1.2 0.2-1.4-0.3-0.7-1-1.4-2.3-1.4-2.1 0-2.5 1.9-2.5 2.3l-3-0.4c0.2-1.7 1.7-4.9 5.5-4.9 2.3 0 4.3 1.3 5.1 3.2 0.7 1.7 0.4 3.5-0.8 4.7-0.5 0.5-1.1 0.8-1.6 1.1-0.9 0.5-1.2 1-1.2 2z"></path>
+<path fill="#FFFFFF" d="M9.5 14c0 1.105-0.895 2-2 2s-2-0.895-2-2c0-1.105 0.895-2 2-2s2 0.895 2 2z"></path>
+</svg>
diff --git a/CrowIDE/icons/redo.svg b/CrowIDE/icons/redo.svg
new file mode 100644 (file)
index 0000000..59fcc90
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 7.9l-6-4.9v3c-0.5 0-1.1 0-2 0-8 0-8 8-8 8s1-4 7.8-4c1.1 0 1.8 0 2.2 0v2.9l6-5z"></path>
+</svg>
diff --git a/CrowIDE/icons/reply.svg b/CrowIDE/icons/reply.svg
new file mode 100644 (file)
index 0000000..d008cb3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M16 8c0-5-4.9-5-4.9-5h-5.1v-3l-6 6 6 6v-3h5.2c3.5 0 1.8 7 1.8 7s3-4.1 3-8z"></path>
+</svg>
diff --git a/CrowIDE/icons/save.svg b/CrowIDE/icons/save.svg
new file mode 100644 (file)
index 0000000..6aa6714
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M10 6v-6h-4v6h-2l4 5 4-5z"></path>
+<path fill="#FFFFFF" d="M13 1h-2v1h1.3l2.6 8h-3.9v2h-6v-2h-3.9l2.6-8h1.3v-1h-2l-3 9v5h16v-5z"></path>
+</svg>
diff --git a/CrowIDE/icons/scissors.svg b/CrowIDE/icons/scissors.svg
new file mode 100644 (file)
index 0000000..4b5a225
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M16 3.1c0 0-2.1-1.1-3.5-1-0.3 0-0.5 0.1-0.7 0.2l-4.3 3.4-1.8-1.5c0.1-0.3 0.2-0.6 0.3-1 0.1-1.8-1.4-3.4-3.3-3.2-1.2 0.1-2.3 1-2.6 2.2-0.3 1.3 0.2 2.5 1.2 3.2l3.3 2.6-3.3 2.6c-1 0.7-1.5 1.9-1.2 3.2 0.3 1.2 1.4 2 2.6 2.2 1.9 0.2 3.4-1.4 3.2-3.2 0-0.3-0.1-0.7-0.3-1l1.8-1.5 4.3 3.4c0.2 0.1 0.4 0.2 0.7 0.2 1.4 0.1 3.5-1 3.5-1l-5.7-4.9 5.8-4.9zM2.8 4.6c-0.9-0.1-1.6-0.9-1.5-1.8s0.9-1.6 1.8-1.5c0.9 0.1 1.6 0.9 1.5 1.8 0 0.9-0.9 1.6-1.8 1.5zM3.1 14.7c-0.9 0.1-1.7-0.6-1.8-1.5s0.6-1.7 1.5-1.8c0.9-0.1 1.7 0.6 1.8 1.5s-0.6 1.7-1.5 1.8zM12.4 3.2c0 0 0.1 0 0.2 0 0.4 0 0.9 0.1 1.4 0.2l-6.8 5.7-0.9-1.1 6.1-4.8zM14 12.6c-0.5 0.2-1 0.3-1.4 0.2-0.1 0-0.2 0-0.2 0l-4-3.2 1-0.9 4.6 3.9z"></path>
+</svg>
diff --git a/CrowIDE/icons/search.svg b/CrowIDE/icons/search.svg
new file mode 100644 (file)
index 0000000..4a931b3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M15.7 14.3l-4.2-4.2c-0.2-0.2-0.5-0.3-0.8-0.3 0.8-1 1.3-2.4 1.3-3.8 0-3.3-2.7-6-6-6s-6 2.7-6 6 2.7 6 6 6c1.4 0 2.8-0.5 3.8-1.4 0 0.3 0 0.6 0.3 0.8l4.2 4.2c0.2 0.2 0.5 0.3 0.7 0.3s0.5-0.1 0.7-0.3c0.4-0.3 0.4-0.9 0-1.3zM6 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/share-arrow.svg b/CrowIDE/icons/share-arrow.svg
new file mode 100644 (file)
index 0000000..e0eb246
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M10 3h-5.1c0 0-4.9 0-4.9 5 0 3.9 3 8 3 8s-1.7-7 1.8-7h5.2v3l6-6-6-6v3z"></path>
+</svg>
diff --git a/CrowIDE/icons/sign-out.svg b/CrowIDE/icons/sign-out.svg
new file mode 100644 (file)
index 0000000..c5951fc
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M9 4v-3h-9v14h9v-3h-1v2h-7v-12h7v2z"></path>
+<path fill="#FFFFFF" d="M16 8l-5-4v2h-5v4h5v2z"></path>
+</svg>
diff --git a/CrowIDE/icons/text-file.svg b/CrowIDE/icons/text-file.svg
new file mode 100644 (file)
index 0000000..eafca90
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"></path>
+<path fill="#FFFFFF" d="M4 7h8v1h-8v-1z"></path>
+<path fill="#FFFFFF" d="M4 9h8v1h-8v-1z"></path>
+<path fill="#FFFFFF" d="M4 11h8v1h-8v-1z"></path>
+</svg>
diff --git a/CrowIDE/icons/text-label.svg b/CrowIDE/icons/text-label.svg
new file mode 100644 (file)
index 0000000..8fa9196
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M12.5 4.9c-1.4 0-2.5 0.8-2.6 0.9l1.2 1.6c0 0 0.7-0.5 1.4-0.5 1.4 0 1.5 1.2 1.5 1.6-0.4-0.1-1.1-0.3-2-0.1-1.4 0.3-2.8 2-2.1 3.9 0.7 1.8 3.1 2.1 4.1 0.6v1h2v-5.3c0-2.7-1.9-3.7-3.5-3.7zM11.5 11.4c-0.1-1.9 1.5-1.9 2.5-1.8v1c0 1.2-2.3 2.3-2.5 0.8z"></path>
+<path fill="#FFFFFF" d="M6.9 14h2.1l-3.2-12h-2.7l-3.1 12h2.1l1-4h2.7l1.1 4zM3.6 8l0.8-3.2 0.9 3.2h-1.7z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Border.svg b/CrowIDE/icons/toolbox/Crow.Border.svg
new file mode 100644 (file)
index 0000000..09eb7ac
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14 2v-2h-14v14h2v2h14v-14h-2zM13 13h-12v-12h12v12z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Button.svg b/CrowIDE/icons/toolbox/Crow.Button.svg
new file mode 100644 (file)
index 0000000..01f5c6c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15.7 5.3l-1-1c-0.2-0.2-0.4-0.3-0.7-0.3h-13c-0.6 0-1 0.4-1 1v5c0 0.3 0.1 0.6 0.3 0.7l1 1c0.2 0.2 0.4 0.3 0.7 0.3h13c0.6 0 1-0.4 1-1v-5c0-0.3-0.1-0.5-0.3-0.7zM14 10h-13v-5h13v5z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.CheckBox.svg b/CrowIDE/icons/toolbox/Crow.CheckBox.svg
new file mode 100644 (file)
index 0000000..2f0b083
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M13 0.9l-1 1.1h-12v14h14v-10.5l1.7-2-2.7-2.6zM6.5 11.7l-4.2-4.2 1.4-1.4 2.7 2.7 6.6-6.6 1.4 1.4-7.9 8.1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.ColorPicker.svg b/CrowIDE/icons/toolbox/Crow.ColorPicker.svg
new file mode 100644 (file)
index 0000000..517a26a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15 1c-1.8-1.8-3.7-0.7-4.6 0.1-0.4 0.4-0.7 0.9-0.7 1.5v0c0 1.1-1.1 1.8-2.1 1.5l-0.1-0.1-0.7 0.8 0.7 0.7-6 6-0.8 2.3-0.7 0.7 1.5 1.5 0.8-0.8 2.3-0.8 6-6 0.7 0.7 0.7-0.6-0.1-0.2c-0.3-1 0.4-2.1 1.5-2.1v0c0.6 0 1.1-0.2 1.4-0.6 0.9-0.9 2-2.8 0.2-4.6zM3.9 13.6l-2 0.7-0.2 0.1 0.1-0.2 0.7-2 5.8-5.8 1.5 1.5-5.9 5.7z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.ComboBox.svg b/CrowIDE/icons/toolbox/Crow.ComboBox.svg
new file mode 100644 (file)
index 0000000..1cb88fa
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15 4h-14c-0.6 0-1 0.4-1 1v6c0 0.6 0.4 1 1 1h14c0.6 0 1-0.4 1-1v-6c0-0.6-0.4-1-1-1zM10 11h-9v-6h9v6zM13 8.4l-2-1.4h4l-2 1.4z"></path>
+<path fill="#dddddd" d="M2 6h1v4h-1v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Container.svg b/CrowIDE/icons/toolbox/Crow.Container.svg
new file mode 100644 (file)
index 0000000..d7d1dc8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15 1h-14v14h14v-14zM14 14h-12v-12h12v12z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.DirectoryView.svg b/CrowIDE/icons/toolbox/Crow.DirectoryView.svg
new file mode 100644 (file)
index 0000000..9029469
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14 6v-2h-7l-1-2h-4l-1 2h-1v11h14l2-9h-2zM14.9 7l-1.6 7-11.9-0.1 2.3-6.9h11.2zM1 5h0.6l1-2h2.6l1.2 2h6.6v1h-10l-2 5.9v-6.9z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Docker.svg b/CrowIDE/icons/toolbox/Crow.Docker.svg
new file mode 100644 (file)
index 0000000..e38a283
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 2v13h15v-13h-15zM13 3h1v1h-1v-1zM7 14h-6v-9h6v9zM14 14h-6v-9h6v9z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Expandable.svg b/CrowIDE/icons/toolbox/Crow.Expandable.svg
new file mode 100644 (file)
index 0000000..1c56d56
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15 4h-14c-0.6 0-1 0.4-1 1v6c0 0.6 0.4 1 1 1h14c0.6 0 1-0.4 1-1v-6c0-0.6-0.4-1-1-1zM12 9l-2-2h4l-2 2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.FileDialog.svg b/CrowIDE/icons/toolbox/Crow.FileDialog.svg
new file mode 100644 (file)
index 0000000..25142ea
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M11 2h-6v4h6v-4zM9 4h-2v-1h2v1z"></path>
+<path fill="#dddddd" d="M3 0v16h2v-1h6v1h2v-16h-10zM12 14h-8v-6h8v6zM12 7h-8v-6h8v6z"></path>
+<path fill="#dddddd" d="M11 9h-6v4h6v-4zM9 11h-2v-1h2v1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Grid.svg b/CrowIDE/icons/toolbox/Crow.Grid.svg
new file mode 100644 (file)
index 0000000..6151f97
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 0v16h16v-16h-16zM5 15h-4v-4h4v4zM5 10h-4v-4h4v4zM5 5h-4v-4h4v4zM10 15h-4v-4h4v4zM10 10h-4v-4h4v4zM10 5h-4v-4h4v4zM15 15h-4v-4h4v4zM15 10h-4v-4h4v4zM15 5h-4v-4h4v4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Group.svg b/CrowIDE/icons/toolbox/Crow.Group.svg
new file mode 100644 (file)
index 0000000..eae67f6
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 7h7v-7h-7v7zM1 1h5v5h-5v-5z"></path>
+<path fill="#dddddd" d="M9 0v7h7v-7h-7zM15 6h-5v-5h5v5z"></path>
+<path fill="#dddddd" d="M0 16h7v-7h-7v7zM1 10h5v5h-5v-5z"></path>
+<path fill="#dddddd" d="M9 16h7v-7h-7v7zM10 10h5v5h-5v-5z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.GroupBox.svg b/CrowIDE/icons/toolbox/Crow.GroupBox.svg
new file mode 100644 (file)
index 0000000..e469779
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M1 4h-1v-4h4v1h-3z"></path>
+<path fill="#dddddd" d="M12 1v-1h4v4h-1v-3z"></path>
+<path fill="#dddddd" d="M15 12h1v4h-4v-1h3z"></path>
+<path fill="#dddddd" d="M4 15v1h-4v-4h1v3z"></path>
+<path fill="#dddddd" d="M13 3v10h-10v-10h10zM14 2h-12v12h12v-12z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.HorizontalStack.svg b/CrowIDE/icons/toolbox/Crow.HorizontalStack.svg
new file mode 100644 (file)
index 0000000..f8e7025
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 0v16h16v-16h-16zM5 15h-4v-14h4v14zM10 15h-4v-14h4v14zM15 15h-4v-14h4v14z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.IMLContainer.svg b/CrowIDE/icons/toolbox/Crow.IMLContainer.svg
new file mode 100644 (file)
index 0000000..b5687ba
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M5.2 14l4.5-12h1.1l-4.5 12z"></path>
+<path fill="#dddddd" d="M11.1 13h1.2l3.7-5-3.7-5h-1.3l3.8 5z"></path>
+<path fill="#dddddd" d="M4.9 13h-1.2l-3.7-5 3.7-5h1.3l-3.8 5z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Image.svg b/CrowIDE/icons/toolbox/Crow.Image.svg
new file mode 100644 (file)
index 0000000..11356c0
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 14h-16v-12h16v12zM1 13h14v-10h-14v10z"></path>
+<path fill="#dddddd" d="M2 10v2h12v-1c0 0 0.2-1.7-2-2-1.9-0.3-2.2 0.6-3.8 0.6-1.1 0-0.9-1.6-3.2-1.6-1.7 0-3 2-3 2z"></path>
+<path fill="#dddddd" d="M13 6c0 1.105-0.895 2-2 2s-2-0.895-2-2c0-1.105 0.895-2 2-2s2 0.895 2 2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Label.svg b/CrowIDE/icons/toolbox/Crow.Label.svg
new file mode 100644 (file)
index 0000000..65bb85b
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M12.5 4.9c-1.4 0-2.5 0.8-2.6 0.9l1.2 1.6c0 0 0.7-0.5 1.4-0.5 1.4 0 1.5 1.2 1.5 1.6-0.4-0.1-1.1-0.3-2-0.1-1.4 0.3-2.8 2-2.1 3.9 0.7 1.8 3.1 2.1 4.1 0.6v1h2v-5.3c0-2.7-1.9-3.7-3.5-3.7zM11.5 11.4c-0.1-1.9 1.5-1.9 2.5-1.8v1c0 1.2-2.3 2.3-2.5 0.8z"></path>
+<path fill="#dddddd" d="M6.9 14h2.1l-3.2-12h-2.7l-3.1 12h2.1l1-4h2.7l1.1 4zM3.6 8l0.8-3.2 0.9 3.2h-1.7z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.ListBox.svg b/CrowIDE/icons/toolbox/Crow.ListBox.svg
new file mode 100644 (file)
index 0000000..40d1673
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 1h3v3h-3v-3z"></path>
+<path fill="#dddddd" d="M0 6h3v3h-3v-3z"></path>
+<path fill="#dddddd" d="M0 11h3v3h-3v-3z"></path>
+<path fill="#dddddd" d="M5 1h11v3h-11v-3z"></path>
+<path fill="#dddddd" d="M5 6h11v3h-11v-3z"></path>
+<path fill="#dddddd" d="M5 11h11v3h-11v-3z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Menu.svg b/CrowIDE/icons/toolbox/Crow.Menu.svg
new file mode 100644 (file)
index 0000000..b6b2111
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15 2v2h-9v-2h9zM16 1h-11v4h11v-4z"></path>
+<path fill="#dddddd" d="M0 1h4v4h-4v-4z"></path>
+<path fill="#dddddd" d="M15 7v2h-9v-2h9zM16 6h-11v4h11v-4z"></path>
+<path fill="#dddddd" d="M0 6h4v4h-4v-4z"></path>
+<path fill="#dddddd" d="M15 12v2h-9v-2h9zM16 11h-11v4h11v-4z"></path>
+<path fill="#dddddd" d="M0 11h4v4h-4v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.MenuItem.svg b/CrowIDE/icons/toolbox/Crow.MenuItem.svg
new file mode 100644 (file)
index 0000000..c8bd847
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15 7v2h-9v-2h9zM16 6h-11v4h11v-4z"></path>
+<path fill="#dddddd" d="M0 6h4v4h-4v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.MessageBox.svg b/CrowIDE/icons/toolbox/Crow.MessageBox.svg
new file mode 100644 (file)
index 0000000..16ebd72
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 1c3.9 0 7 3.1 7 7s-3.1 7-7 7-7-3.1-7-7 3.1-7 7-7zM8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8v0z"></path>
+<path fill="#dddddd" d="M7 6h2v7h-2v-7z"></path>
+<path fill="#dddddd" d="M7 3h2v2h-2v-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.ProgressBar.svg b/CrowIDE/icons/toolbox/Crow.ProgressBar.svg
new file mode 100644 (file)
index 0000000..884f185
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 5v6h16v-6h-16zM15 10h-14v-4h14v4z"></path>
+<path fill="#dddddd" d="M2 7h7v2h-7v-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.RadioButton.svg b/CrowIDE/icons/toolbox/Crow.RadioButton.svg
new file mode 100644 (file)
index 0000000..6c33e84
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 4c-2.2 0-4 1.8-4 4s1.8 4 4 4 4-1.8 4-4-1.8-4-4-4z"></path>
+<path fill="#dddddd" d="M8 1c3.9 0 7 3.1 7 7s-3.1 7-7 7-7-3.1-7-7 3.1-7 7-7zM8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8v0z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.ScrollBar.svg b/CrowIDE/icons/toolbox/Crow.ScrollBar.svg
new file mode 100644 (file)
index 0000000..91a1f84
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M2 2h1v4h-1v-4z"></path>
+<path fill="#dddddd" d="M1 0c-0.6 0-1 0.4-1 1v14c0 0.6 0.4 1 1 1h15v-16h-15zM13 15h-12v-14h12v14zM15 15v0h-1v-1h1v1zM15 13h-1v-10h1v10zM15 2h-1v-1h1v1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Scroller.svg b/CrowIDE/icons/toolbox/Crow.Scroller.svg
new file mode 100644 (file)
index 0000000..bbc9719
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 0v16h16v-16h-16zM15 15h-14v-6h3v1l3-2-3-2v1h-3v-6h6v3h-1l2 3 2-3h-1v-3h6v14z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Shape.svg b/CrowIDE/icons/toolbox/Crow.Shape.svg
new file mode 100644 (file)
index 0000000..de5dd37
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 0l-8 8 8 8 8-8-8-8zM2 8l6-6 6 6-6 6-6-6z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Slider.svg b/CrowIDE/icons/toolbox/Crow.Slider.svg
new file mode 100644 (file)
index 0000000..fe41c2b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 6h-3.6c-0.7-1.2-2-2-3.4-2s-2.8 0.8-3.4 2h-5.6v4h5.6c0.7 1.2 2 2 3.4 2s2.8-0.8 3.4-2h3.6v-4zM1 9v-2h4.1c0 0.3-0.1 0.7-0.1 1s0.1 0.7 0.1 1h-4.1zM9 11c-1.7 0-3-1.3-3-3s1.3-3 3-3 3 1.3 3 3c0 1.7-1.3 3-3 3z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Spinner.svg b/CrowIDE/icons/toolbox/Crow.Spinner.svg
new file mode 100644 (file)
index 0000000..5fa848a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M11 7h-6l3-4z"></path>
+<path fill="#dddddd" d="M5 9h6l-3 4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Splitter.svg b/CrowIDE/icons/toolbox/Crow.Splitter.svg
new file mode 100644 (file)
index 0000000..9fcd9dd
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M7 0h2v16h-2v-16z"></path>
+<path fill="#dddddd" d="M3 5l-3 3 3 3v-2h3v-2h-3z"></path>
+<path fill="#dddddd" d="M16 8l-3-3v2h-3v2h3v2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.TabItem.svg b/CrowIDE/icons/toolbox/Crow.TabItem.svg
new file mode 100644 (file)
index 0000000..a9aaed3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M7 4l-1-2h-4l-1 2h-1v11h16v-11h-9zM15 14h-14v-9h0.6l1-2h2.6l1.2 2h8.6v9z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.TabView.svg b/CrowIDE/icons/toolbox/Crow.TabView.svg
new file mode 100644 (file)
index 0000000..942358b
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14 4v-2h-14v13h16v-11h-2zM10 3h3v1h-3v-1zM6 3h3v1h-3v-1zM15 14h-14v-11h4v2h10v9z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.TemplatedContainer.svg b/CrowIDE/icons/toolbox/Crow.TemplatedContainer.svg
new file mode 100644 (file)
index 0000000..34a0aa2
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 0l-8 2v10l8 4 8-4v-10l-8-2zM14.4 2.6l-5.9 2.2-6.6-2.2 6.1-1.6 6.4 1.6zM1 11.4v-8.1l7 2.4v9.2l-7-3.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.TemplatedGroup.svg b/CrowIDE/icons/toolbox/Crow.TemplatedGroup.svg
new file mode 100644 (file)
index 0000000..14ea6f3
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M11 6.6v0-3.8l-4-1.8-4 1.8v4.2l-3 1.3v4.4l4 1.8 3.5-1.5 3.5 1.6 4-1.8v-4.5l-4-1.7zM7 2.1l2.8 1.2-2.7 1.1-2.6-1.2 2.5-1.1zM7 5v2.9l-3-1.3v-3l3 1.4zM4 13.5l-3-1.3v-3l3 1.4v2.9zM4 10l-2.6-1.2 2.6-1.1 2.8 1.2-2.8 1.1zM11 13.5l-3-1.3v-3l3 1.4v2.9zM11 10l-2.6-1.2 2.6-1.1 2.8 1.2-2.8 1.1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.TextBox.svg b/CrowIDE/icons/toolbox/Crow.TextBox.svg
new file mode 100644 (file)
index 0000000..c1fc2bb
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 5c0-0.6-0.4-1-1-1h-14c-0.6 0-1 0.4-1 1v6c0 0.6 0.4 1 1 1h14c0.6 0 1-0.4 1-1v-6zM15 11h-14v-6h14v6z"></path>
+<path fill="#dddddd" d="M2 6h1v4h-1v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.TreeView.svg b/CrowIDE/icons/toolbox/Crow.TreeView.svg
new file mode 100644 (file)
index 0000000..b863291
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 10v-4h-11v1h-2v-3h9v-4h-12v4h2v10h3v2h11v-4h-11v1h-2v-5h2v2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.VerticalStack.svg b/CrowIDE/icons/toolbox/Crow.VerticalStack.svg
new file mode 100644 (file)
index 0000000..c3c3ec9
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M16 0h-16v16h16v-16zM1 5v-4h14v4h-14zM1 10v-4h14v4h-14zM1 15v-4h14v4h-14z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Window.svg b/CrowIDE/icons/toolbox/Crow.Window.svg
new file mode 100644 (file)
index 0000000..74b0a24
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 4v11h16v-14h-16v3zM14 2h1v1h-1v-1zM1 4h14v10h-14v-10z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/Crow.Wrapper.svg b/CrowIDE/icons/toolbox/Crow.Wrapper.svg
new file mode 100644 (file)
index 0000000..9e69e41
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 6h4v4h-4v-4z"></path>
+<path fill="#dddddd" d="M6 6h4v4h-4v-4z"></path>
+<path fill="#dddddd" d="M12 6h4v4h-4v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/bar-chart.svg b/CrowIDE/icons/toolbox/bar-chart.svg
new file mode 100644 (file)
index 0000000..ff86c96
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 15h15v1h-15v-1z"></path>
+<path fill="#dddddd" d="M0 11h3v3h-3v-3z"></path>
+<path fill="#dddddd" d="M4 9h3v5h-3v-5z"></path>
+<path fill="#dddddd" d="M8 5h3v9h-3v-9z"></path>
+<path fill="#dddddd" d="M12 0h3v14h-3v-14z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/bar-menu.svg b/CrowIDE/icons/toolbox/bar-menu.svg
new file mode 100644 (file)
index 0000000..87ec061
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 1h16v3h-16v-3z"></path>
+<path fill="#dddddd" d="M0 6h16v3h-16v-3z"></path>
+<path fill="#dddddd" d="M0 11h16v3h-16v-3z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/bullets.svg b/CrowIDE/icons/toolbox/bullets.svg
new file mode 100644 (file)
index 0000000..81fb1f0
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 2.5v0c0 0.8 0.7 1.5 1.5 1.5v0c0.8 0 1.5-0.7 1.5-1.5v0c0-0.8-0.7-1.5-1.5-1.5v0c-0.8 0-1.5 0.7-1.5 1.5z"></path>
+<path fill="#dddddd" d="M0 7.5v0c0 0.8 0.7 1.5 1.5 1.5v0c0.8 0 1.5-0.7 1.5-1.5v0c0-0.8-0.7-1.5-1.5-1.5v0c-0.8 0-1.5 0.7-1.5 1.5z"></path>
+<path fill="#dddddd" d="M0 12.5v0c0 0.8 0.7 1.5 1.5 1.5v0c0.8 0 1.5-0.7 1.5-1.5v0c0-0.8-0.7-1.5-1.5-1.5v0c-0.8 0-1.5 0.7-1.5 1.5z"></path>
+<path fill="#dddddd" d="M5 1h11v3h-11v-3z"></path>
+<path fill="#dddddd" d="M5 6h11v3h-11v-3z"></path>
+<path fill="#dddddd" d="M5 11h11v3h-11v-3z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/calendar.svg b/CrowIDE/icons/toolbox/calendar.svg
new file mode 100644 (file)
index 0000000..9ceaa1e
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14 1v3h-3v-3h-6v3h-3v-3h-2v15h16v-15h-2zM3 15h-2v-2h2v2zM3 12h-2v-2h2v2zM3 9h-2v-2h2v2zM6 15h-2v-2h2v2zM6 12h-2v-2h2v2zM6 9h-2v-2h2v2zM9 15h-2v-2h2v2zM9 12h-2v-2h2v2zM9 9h-2v-2h2v2zM12 15h-2v-2h2v2zM12 12h-2v-2h2v2zM12 9h-2v-2h2v2zM15 15h-2v-2h2v2zM15 12h-2v-2h2v2zM15 9h-2v-2h2v2z"></path>
+<path fill="#dddddd" d="M3 0h1v3h-1v-3z"></path>
+<path fill="#dddddd" d="M12 0h1v3h-1v-3z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/check-square-1.svg b/CrowIDE/icons/toolbox/check-square-1.svg
new file mode 100644 (file)
index 0000000..e198007
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14 6.2v7.8h-12v-12h10.5l1-1h-12.5v14h14v-9.8z"></path>
+<path fill="#dddddd" d="M7.9 10.9l-4.2-4.2 1.5-1.4 2.7 2.8 6.7-6.7 1.4 1.4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/database.svg b/CrowIDE/icons/toolbox/database.svg
new file mode 100644 (file)
index 0000000..65a8f06
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14 2.5c0 0.828-2.686 1.5-6 1.5s-6-0.672-6-1.5c0-0.828 2.686-1.5 6-1.5s6 0.672 6 1.5z"></path>
+<path fill="#dddddd" d="M8 5c-3.3 0-6-0.7-6-1.5v3c0 0.8 2.7 1.5 6 1.5s6-0.7 6-1.5v-3c0 0.8-2.7 1.5-6 1.5z"></path>
+<path fill="#dddddd" d="M8 9c-3.3 0-6-0.7-6-1.5v3c0 0.8 2.7 1.5 6 1.5s6-0.7 6-1.5v-3c0 0.8-2.7 1.5-6 1.5z"></path>
+<path fill="#dddddd" d="M8 13c-3.3 0-6-0.7-6-1.5v3c0 0.8 2.7 1.5 6 1.5s6-0.7 6-1.5v-3c0 0.8-2.7 1.5-6 1.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/ellipsis.svg b/CrowIDE/icons/toolbox/ellipsis.svg
new file mode 100644 (file)
index 0000000..cff94cc
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M6 0h4v4h-4v-4z"></path>
+<path fill="#dddddd" d="M6 6h4v4h-4v-4z"></path>
+<path fill="#dddddd" d="M6 12h4v4h-4v-4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/exclamation-circle-1.svg b/CrowIDE/icons/toolbox/exclamation-circle-1.svg
new file mode 100644 (file)
index 0000000..cc1b268
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 1c3.9 0 7 3.1 7 7s-3.1 7-7 7-7-3.1-7-7 3.1-7 7-7zM8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8v0z"></path>
+<path fill="#dddddd" d="M7 3h2v7h-2v-7z"></path>
+<path fill="#dddddd" d="M7 11h2v2h-2v-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/exclamation-circle.svg b/CrowIDE/icons/toolbox/exclamation-circle.svg
new file mode 100644 (file)
index 0000000..b140e7c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 0c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zM9 13h-2v-2h2v2zM9 10h-2v-7h2v7z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/file-code.svg b/CrowIDE/icons/toolbox/file-code.svg
new file mode 100644 (file)
index 0000000..a2fd2d1
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"></path>
+<path fill="#dddddd" d="M6.2 13h-0.7l-2-2.5 2-2.5h0.7l-2 2.5z"></path>
+<path fill="#dddddd" d="M9.8 13h0.7l2-2.5-2-2.5h-0.7l2 2.5z"></path>
+<path fill="#dddddd" d="M6.7 14h0.6l2.1-7h-0.8z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/grab.svg b/CrowIDE/icons/toolbox/grab.svg
new file mode 100644 (file)
index 0000000..25bc571
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M12.6 4c-0.2 0-0.4 0-0.6 0 0-0.2-0.2-0.6-0.4-0.8s-0.5-0.4-1.1-0.4c-0.2 0-0.4 0-0.6 0.1-0.1-0.2-0.2-0.3-0.3-0.5-0.2-0.2-0.5-0.4-1.1-0.4-0.8 0-1.2 0.5-1.4 1-0.1 0-0.3-0.1-0.5-0.1-0.5 0-0.8 0.2-1.1 0.4-0.5 0.6-0.5 1.4-0.5 1.5v0.4c-0.6 0-1.1 0.2-1.4 0.5-0.6 0.7-0.6 1.6-0.6 2.8 0 0.2 0 0.5 0 0.7 0 1.4 0.7 2.1 1.4 2.8l0.3 0.4c1.3 1.2 2.5 1.6 5.1 1.6 2.9 0 4.2-1.6 4.2-5.1v-2.5c0-0.7-0.2-2.1-1.4-2.4zM10.5 3.8c0.4 0 0.5 0.4 0.5 0.6v0.8c0 0.3 0.2 0.5 0.4 0.5 0.3 0 0.5-0.1 0.5-0.4 0 0 0-0.4 0.4-0.3 0.6 0.2 0.7 1.1 0.7 1.3 0 0 0 0 0 0v2.6c0 3.4-1.3 4.1-3.2 4.1-2.4 0-3.3-0.3-4.3-1.3-0.1-0.1-0.2-0.2-0.4-0.4-0.7-0.7-1.1-1.1-1.1-2.1 0-0.2 0-0.3 0-0.6 0-1 0-1.8 0.3-2.1 0.1-0.2 0.4-0.3 0.7-0.3v0.8l-0.3 1.2c0 0.1 0 0.1 0.1 0.1 0.1 0.1 0.2 0 0.2 0l1-1.2c0 0 0-0.1 0-0.1v-2c0-0.1 0-0.6 0.2-0.8 0.1-0.1 0.2-0.2 0.4-0.2 0.3 0 0.4 0.2 0.4 0.4v0.4c0 0.2 0.2 0.5 0.5 0.5s0.5-0.3 0.5-0.5v-1.3c0-0.1 0-0.5 0.5-0.5 0.3 0 0.5 0.2 0.5 0.5v1.2c0 0.3 0.2 0.6 0.5 0.6s0.5-0.3 0.5-0.5v-0.5c0-0.3 0.2-0.5 0.5-0.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/hard-drive-1.svg b/CrowIDE/icons/toolbox/hard-drive-1.svg
new file mode 100644 (file)
index 0000000..a71a524
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M13 1h-10l-2.7 8h15.4z"></path>
+<path fill="#dddddd" d="M0 10v5h16v-5h-16zM3 13h-1v-1h1v1zM7 13h-3v-1h3v1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/hash.svg b/CrowIDE/icons/toolbox/hash.svg
new file mode 100644 (file)
index 0000000..82196fb
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M15 6v-2h-2.6l0.6-2.8-2-0.4-0.7 3.2h-3l0.7-2.8-2-0.4-0.7 3.2h-3.3v2h2.9l-0.9 4h-3v2h2.6l-0.6 2.8 2 0.4 0.7-3.2h3l-0.7 2.8 2 0.4 0.7-3.2h3.3v-2h-2.9l0.9-4h3zM9 10h-3l1-4h3l-1 4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/info.svg b/CrowIDE/icons/toolbox/info.svg
new file mode 100644 (file)
index 0000000..a8c90f4
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M7 5h3v11h-3v-11z"></path>
+<path fill="#dddddd" d="M10.5 2c0 1.105-0.895 2-2 2s-2-0.895-2-2c0-1.105 0.895-2 2-2s2 0.895 2 2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/layout.svg b/CrowIDE/icons/toolbox/layout.svg
new file mode 100644 (file)
index 0000000..3d59d76
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 0v16h16v-16h-16zM1 3h4v12h-4v-12zM15 15h-9v-12h9v12z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/line-list.svg b/CrowIDE/icons/toolbox/line-list.svg
new file mode 100644 (file)
index 0000000..ec15f7b
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 1h3v2h-3v-2z"></path>
+<path fill="#dddddd" d="M0 5h3v2h-3v-2z"></path>
+<path fill="#dddddd" d="M0 9h3v2h-3v-2z"></path>
+<path fill="#dddddd" d="M0 13h3v2h-3v-2z"></path>
+<path fill="#dddddd" d="M4 1h12v2h-12v-2z"></path>
+<path fill="#dddddd" d="M4 5h12v2h-12v-2z"></path>
+<path fill="#dddddd" d="M4 9h12v2h-12v-2z"></path>
+<path fill="#dddddd" d="M4 13h12v2h-12v-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/list.svg b/CrowIDE/icons/toolbox/list.svg
new file mode 100644 (file)
index 0000000..9aad88f
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M4 0h12v4h-12v-4z"></path>
+<path fill="#dddddd" d="M4 6h12v4h-12v-4z"></path>
+<path fill="#dddddd" d="M4 12h12v4h-12v-4z"></path>
+<path fill="#dddddd" d="M1 0l-0.9 0.5 0.2 0.7 0.7-0.3v3.1h1v-4z"></path>
+<path fill="#dddddd" d="M2.2 13.9c0.3-0.2 0.5-0.5 0.5-0.8 0-0.5-0.4-1-1.3-1-0.5 0-1 0.1-1.2 0.3h-0.1l0.2 0.8 0.1-0.1c0.1-0.1 0.4-0.2 0.7-0.2s0.4 0.1 0.4 0.3c0 0.4-0.5 0.4-0.6 0.4h-0.4v0.7h0.4c0.3 0 0.6 0.1 0.6 0.4 0 0.2-0.2 0.4-0.6 0.4s-0.7-0.2-0.8-0.2l-0.1-0.1v0.9h0.1c0.2 0.2 0.6 0.3 1.1 0.3 1 0 1.6-0.5 1.6-1.2 0-0.4-0.2-0.8-0.6-0.9z"></path>
+<path fill="#dddddd" d="M0.1 6.4l0.3 1c0 0 0.7-0.6 1.2-0.3 1.1 0.8-1.6 2.4-1.6 2.4v0.5h3v-1h-1.2c0.6-0.5 1.2-1.2 1-1.9-0.5-1.9-2.7-0.7-2.7-0.7z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/modal-list.svg b/CrowIDE/icons/toolbox/modal-list.svg
new file mode 100644 (file)
index 0000000..f1d8f70
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 4v11h16v-14h-16v3zM14 2h1v1h-1v-1zM1 4h14v10h-14v-10z"></path>
+<path fill="#dddddd" d="M3 6h2v1h-2v-1z"></path>
+<path fill="#dddddd" d="M6 6h7v1h-7v-1z"></path>
+<path fill="#dddddd" d="M3 8h2v1h-2v-1z"></path>
+<path fill="#dddddd" d="M6 8h7v1h-7v-1z"></path>
+<path fill="#dddddd" d="M3 10h2v1h-2v-1z"></path>
+<path fill="#dddddd" d="M6 10h7v1h-7v-1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/options.svg b/CrowIDE/icons/toolbox/options.svg
new file mode 100644 (file)
index 0000000..a56f6be
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M5 3.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5z"></path>
+<path fill="#dddddd" d="M3.5 0c-1.9 0-3.5 1.6-3.5 3.5s1.6 3.5 3.5 3.5 3.5-1.6 3.5-3.5-1.6-3.5-3.5-3.5zM3.5 6c-1.4 0-2.5-1.1-2.5-2.5s1.1-2.5 2.5-2.5 2.5 1.1 2.5 2.5c0 1.4-1.1 2.5-2.5 2.5z"></path>
+<path fill="#dddddd" d="M3.5 8c-1.9 0-3.5 1.6-3.5 3.5s1.6 3.5 3.5 3.5 3.5-1.6 3.5-3.5c0-1.9-1.6-3.5-3.5-3.5zM3.5 14c-1.4 0-2.5-1.1-2.5-2.5s1.1-2.5 2.5-2.5 2.5 1.1 2.5 2.5c0 1.4-1.1 2.5-2.5 2.5z"></path>
+<path fill="#dddddd" d="M8 2h8v3h-8v-3z"></path>
+<path fill="#dddddd" d="M8 10h8v3h-8v-3z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/package.svg b/CrowIDE/icons/toolbox/package.svg
new file mode 100644 (file)
index 0000000..07f8b37
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 0l-8 2v10l8 4 8-4v-10l-8-2zM8 1l2.1 0.5-5.9 1.9-2.3-0.8 6.1-1.6zM8 14.9l-7-3.5v-8.1l3 1v3.4l1 0.3v-3.3l3 1v9.2zM8.5 4.8l-2.7-0.9 6.2-1.9 2.4 0.6-5.9 2.2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/padding.svg b/CrowIDE/icons/toolbox/padding.svg
new file mode 100644 (file)
index 0000000..d93b246
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 0v16h16v-16h-16zM15 3h-1v1h1v1h-1v1h1v1h-1v1h1v1h-1v1h1v1h-1v1h1v1h-1v1h1v1h-1v-1h-1v1h-1v-1h-1v1h-1v-1h-1v1h-1v-1h-1v1h-1v-1h-1v1h-1v-1h-1v1h-1v-1h-1v-1h1v-1h-1v-1h1v-1h-1v-1h1v-1h-1v-1h1v-1h-1v-1h1v-1h-1v-1h1v-1h-1v-1h1v1h1v-1h1v1h1v-1h1v1h1v-1h1v1h1v-1h1v1h1v-1h1v1h1v-1h1v1h1v1z"></path>
+<path fill="#dddddd" d="M3 2h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M4 3h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M6 3h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M5 2h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M7 2h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M9 2h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M8 3h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M10 3h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M12 3h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M11 2h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M13 2h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M12 5h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M13 4h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M12 7h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M13 6h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M12 9h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M13 8h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M12 11h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M13 10h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M12 13h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M13 12h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M2 3h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M3 4h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M2 5h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M3 6h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M2 7h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M3 8h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M2 9h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M3 10h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M2 11h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M2 13h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M3 12h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M4 11h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M4 13h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M5 12h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M6 13h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M7 12h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M9 12h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M8 13h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M11 12h1v1h-1v-1z"></path>
+<path fill="#dddddd" d="M10 13h1v1h-1v-1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/picture-file.svg b/CrowIDE/icons/toolbox/picture-file.svg
new file mode 100644 (file)
index 0000000..c45a6ad
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"></path>
+<path fill="#dddddd" d="M4 11.5v2.5h8v-1.7c0 0 0.1-1.3-1.3-1.5-1.3-0.2-1.5 0.4-2.5 0.5-0.8 0-0.6-1.3-2.2-1.3-1.2 0-2 1.5-2 1.5z"></path>
+<path fill="#dddddd" d="M12 8.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5c0-0.828 0.672-1.5 1.5-1.5s1.5 0.672 1.5 1.5z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/pointer.svg b/CrowIDE/icons/toolbox/pointer.svg
new file mode 100644 (file)
index 0000000..605c0e2
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M11.6 5c-0.2 0-0.5 0-0.6 0 0-0.2-0.2-0.6-0.4-0.8s-0.6-0.4-1.1-0.4c-0.2 0-0.4 0-0.6 0.1-0.1-0.2-0.2-0.3-0.3-0.5-0.2-0.2-0.5-0.4-1.1-0.4-0.2 0-0.4 0-0.5 0.1v-1.7c0-0.6-0.4-1.4-1.4-1.4-0.4 0-0.8 0.2-1.1 0.4-0.5 0.6-0.5 1.4-0.5 1.4v4.3c-0.6 0.1-1.1 0.3-1.4 0.6-0.6 0.7-0.6 1.6-0.6 2.8 0 0.2 0 0.5 0 0.7 0 1.4 0.7 2.1 1.4 2.8l0.3 0.4c1.3 1.2 2.4 1.6 5.1 1.6 2.9 0 4.2-1.6 4.2-5.1v-2.5c0-0.7-0.2-2.1-1.4-2.4zM12 7.4v2.6c0 3.4-1.3 4.1-3.2 4.1-2.4 0-3.3-0.3-4.3-1.3-0.1-0.1-0.2-0.2-0.4-0.4-0.7-0.8-1.1-1.2-1.1-2.2 0-0.2 0-0.5 0-0.7 0-1 0-1.7 0.3-2.1 0.1-0.1 0.4-0.2 0.7-0.2v0.5l-0.3 1.5c0 0.1 0 0.1 0.1 0.2s0.2 0 0.2 0l1-1.2c0-0.1 0-0.2 0-0.2v-6.2c0-0.1 0-0.5 0.2-0.7 0.1 0 0.2-0.1 0.4-0.1 0.3 0 0.4 0.3 0.4 0.4v3.1c0 0 0 0 0 0v1.2c0 0.3 0.2 0.6 0.5 0.6s0.5-0.3 0.5-0.5v-1.3c0 0 0 0 0 0 0-0.1 0.1-0.5 0.5-0.5 0.3 0 0.5 0.1 0.5 0.4v1.3c0 0.3 0.2 0.6 0.5 0.6s0.5-0.3 0.5-0.5v-0.7c0-0.1 0.1-0.3 0.5-0.3 0.2 0 0.3 0.1 0.3 0.1 0.2 0.1 0.2 0.4 0.2 0.4v0.8c0 0.3 0.2 0.5 0.4 0.5 0.3 0 0.5-0.1 0.5-0.4 0-0.1 0.1-0.2 0.2-0.3 0 0 0.1 0 0.2 0 0.6 0.2 0.7 1.2 0.7 1.5 0-0.1 0-0.1 0 0z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/puzzle-piece.svg b/CrowIDE/icons/toolbox/puzzle-piece.svg
new file mode 100644 (file)
index 0000000..b09c47e
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M14.9 0.9c-1.1-1-2.5-1.3-3.1-0.4-0.7 1.1 0.5 1.7-0.3 2.5-0.5 0.6-2-0.8-2-0.8l-0.8-0.8-1.4 1.4c-0.6 0.7-2.1 1.5-2.6 1.1-0.7-0.6 0.1-1.8-0.5-2.6-0.7-1-2.1-0.8-3 0.3-1 1.1-1.4 2.4-0.5 3 1.1 0.7 1.9-0.3 2.7 0.5 0.4 0.4-0.2 1.7-0.5 2.1l-2.3 2.3 6.5 6.5 1.7-1.7c0.7-0.7 1.5-2 1.1-2.4-0.6-0.7-1.7 0.1-2.5-0.4-1-0.7-0.8-2 0.3-3s2.5-1.3 3.1-0.4c0.7 1.1-0.4 1.8 0.4 2.6 0.4 0.4 1.6-0.2 2-0.6l2.1-2.1-1.1-1.1c-0.6-0.6-1.9-2-1.4-2.5 0.6-0.7 1.7 0.2 2.5-0.4 0.9-0.8 0.6-2.1-0.4-3.1z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/refresh-file.svg b/CrowIDE/icons/toolbox/refresh-file.svg
new file mode 100644 (file)
index 0000000..248e420
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M10 0h-8v16h12v-12l-4-4zM13 15h-10v-14h6v4h4v10zM10 4v-3l3 3h-3z"></path>
+<path fill="#dddddd" d="M4.7 7.7l-0.7-0.7v3h3l-1.2-1.2c0.4-0.8 1.3-1.3 2.2-1.3 1.4 0 2.5 1.1 2.5 2.5h1.5c0-2.2-1.8-4-4-4-1.3 0-2.5 0.7-3.3 1.7z"></path>
+<path fill="#dddddd" d="M9.8 11.8c-0.5 0.5-1.1 0.8-1.8 0.7-1 0-1.9-0.6-2.3-1.5h-1.6c0.4 1.7 2 3 3.8 3 1.1 0 2.1-0.5 2.8-1.2l1.3 1.2v-3h-3l0.8 0.8z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/sliders.svg b/CrowIDE/icons/toolbox/sliders.svg
new file mode 100644 (file)
index 0000000..81f72d1
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M7 0h2v3h-2v-3z"></path>
+<path fill="#dddddd" d="M6 4v3h1v9h2v-9h1v-3z"></path>
+<path fill="#dddddd" d="M2 0h2v8h-2v-8z"></path>
+<path fill="#dddddd" d="M1 9v3h1v4h2v-4h1v-3z"></path>
+<path fill="#dddddd" d="M12 0h2v10h-2v-10z"></path>
+<path fill="#dddddd" d="M11 11v3h1v2h2v-2h1v-3z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/split-browser-1.svg b/CrowIDE/icons/toolbox/split-browser-1.svg
new file mode 100644 (file)
index 0000000..4dfd93a
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 15h15v-13h-15v13zM13 3h1v1h-1v-1zM14 14h-13v-4h13v4zM14 9h-13v-4h13v4z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/table.svg b/CrowIDE/icons/toolbox/table.svg
new file mode 100644 (file)
index 0000000..0b42122
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 1v15h16v-15h-16zM5 15h-4v-2h4v2zM5 12h-4v-2h4v2zM5 9h-4v-2h4v2zM5 6h-4v-2h4v2zM10 15h-4v-2h4v2zM10 12h-4v-2h4v2zM10 9h-4v-2h4v2zM10 6h-4v-2h4v2zM15 15h-4v-2h4v2zM15 12h-4v-2h4v2zM15 9h-4v-2h4v2zM15 6h-4v-2h4v2z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/tasks.svg b/CrowIDE/icons/toolbox/tasks.svg
new file mode 100644 (file)
index 0000000..8793c88
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M6 0h10v4h-10v-4z"></path>
+<path fill="#dddddd" d="M6 6h10v4h-10v-4z"></path>
+<path fill="#dddddd" d="M6 12h10v4h-10v-4z"></path>
+<path fill="#dddddd" d="M3 1v2h-2v-2h2zM4 0h-4v4h4v-4z"></path>
+<path fill="#dddddd" d="M3 13v2h-2v-2h2zM4 12h-4v4h4v-4z"></path>
+<path fill="#dddddd" d="M5.3 5.9l-0.6-0.8-0.9 0.9h-3.8v4h4v-2.8l1.3-1.3zM2.7 7l-0.7 0.7-0.8-0.7h1.5zM1 8.2l0.9 0.8h-0.9v-0.8zM3 9h-0.9l0.9-0.9v0.9z"></path>
+</svg>
diff --git a/CrowIDE/icons/toolbox/warning.svg b/CrowIDE/icons/toolbox/warning.svg
new file mode 100644 (file)
index 0000000..f5a2573
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M8 1l-8 14h16l-8-14zM8 13c-0.6 0-1-0.4-1-1s0.4-1 1-1 1 0.4 1 1c0 0.6-0.4 1-1 1zM7 10v-4h2v4h-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/tools.svg b/CrowIDE/icons/tools.svg
new file mode 100644 (file)
index 0000000..5326f19
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M10.3 8.2l-0.9 0.9 0.9 0.9-1.2 1.2 4.3 4.3c0.6 0.6 1.5 0.6 2.1 0s0.6-1.5 0-2.1l-5.2-5.2zM14.2 15c-0.4 0-0.8-0.3-0.8-0.8 0-0.4 0.3-0.8 0.8-0.8s0.8 0.3 0.8 0.8c0 0.5-0.3 0.8-0.8 0.8z"></path>
+<path fill="#FFFFFF" d="M3.6 8l0.9-0.6 1.5-1.7 0.9 0.9 0.9-0.9-0.1-0.1c0.2-0.5 0.3-1 0.3-1.6 0-2.2-1.8-4-4-4-0.6 0-1.1 0.1-1.6 0.3l2.9 2.9-2.1 2.1-2.9-2.9c-0.2 0.5-0.3 1-0.3 1.6 0 2.1 1.6 3.7 3.6 4z"></path>
+<path fill="#FFFFFF" d="M8 10.8l0.9-0.8-0.9-0.9 5.7-5.7 1.2-0.4 1.1-2.2-0.7-0.7-2.3 1-0.5 1.2-5.6 5.7-0.9-0.9-0.8 0.9c0 0 0.8 0.6-0.1 1.5-0.5 0.5-1.3-0.1-2.8 1.4-0.5 0.5-2.1 2.1-2.1 2.1s-0.6 1 0.6 2.2 2.2 0.6 2.2 0.6 1.6-1.6 2.1-2.1c1.4-1.4 0.9-2.3 1.3-2.7 0.9-0.9 1.6-0.2 1.6-0.2zM4.9 10.4l0.7 0.7-3.8 3.8-0.7-0.7z"></path>
+</svg>
diff --git a/CrowIDE/icons/trash.svg b/CrowIDE/icons/trash.svg
new file mode 100644 (file)
index 0000000..e73a5e3
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M2 5v1h1v9c0 0 1.1 1 4.5 1s4.5-1 4.5-1v-9h1v-1h-11zM6 14h-1v-7h1v7zM8 14h-1v-7h1v7zM10 14h-1v-7h1v7z"></path>
+<path fill="#dddddd" d="M12 3c0 0 0-0.5-2-0.8v-0.7c0-0.8-0.7-1.5-1.5-1.5h-2c-0.8 0-1.5 0.7-1.5 1.5v0.7c-1.6 0.3-2 0.8-2 0.8h-1v1h11v-1h-1zM6 1.5c0-0.3 0.2-0.5 0.5-0.5h2c0.2 0 0.5 0.2 0.5 0.5v0.6c0-0.1-0.9-0.1-1.5-0.1s-1.1 0-1.5 0.1v-0.6z"></path>
+</svg>
diff --git a/CrowIDE/icons/undo.svg b/CrowIDE/icons/undo.svg
new file mode 100644 (file)
index 0000000..f78f134
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#dddddd" d="M0 7.9l6-4.9v3c0 0 1.1 0 2 0 8 0 8 8 8 8s-1-4-7.8-4c-1.1 0-1.8 0-2.2 0v2.9l-6-5z"></path>
+</svg>
diff --git a/CrowIDE/icons/xml-file.svg b/CrowIDE/icons/xml-file.svg
new file mode 100644 (file)
index 0000000..0420435
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#ffffff" d="M 10,0 H 2 V 16 H 14 V 4 Z"/>
+<path fill="#444444" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"/>
+<text x="3" y="12" fill="darkorange" font-stretch="condensed" font-family="mono" font-size="6px" font-weight="bold">&lt;/&gt;</text>
+</svg>
\ No newline at end of file
diff --git a/CrowIDE/icons/zoom-in.svg b/CrowIDE/icons/zoom-in.svg
new file mode 100644 (file)
index 0000000..60c41d1
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M15.7 14.3l-4.2-4.2c-0.2-0.2-0.5-0.3-0.8-0.3 0.8-1 1.3-2.4 1.3-3.8 0-3.3-2.7-6-6-6s-6 2.7-6 6 2.7 6 6 6c1.4 0 2.8-0.5 3.8-1.4 0 0.3 0 0.6 0.3 0.8l4.2 4.2c0.2 0.2 0.5 0.3 0.7 0.3s0.5-0.1 0.7-0.3c0.4-0.3 0.4-0.9 0-1.3zM6 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z"></path>
+<path fill="#FFFFFF" d="M7 3h-2v2h-2v2h2v2h2v-2h2v-2h-2z"></path>
+</svg>
diff --git a/CrowIDE/icons/zoom-out.svg b/CrowIDE/icons/zoom-out.svg
new file mode 100644 (file)
index 0000000..bd4eec3
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M15.7 14.3l-4.2-4.2c-0.2-0.2-0.5-0.3-0.8-0.3 0.8-1 1.3-2.4 1.3-3.8 0-3.3-2.7-6-6-6s-6 2.7-6 6 2.7 6 6 6c1.4 0 2.8-0.5 3.8-1.4 0 0.3 0 0.6 0.3 0.8l4.2 4.2c0.2 0.2 0.5 0.3 0.7 0.3s0.5-0.1 0.7-0.3c0.4-0.3 0.4-0.9 0-1.3zM6 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z"></path>
+<path fill="#FFFFFF" d="M3 5h6v2h-6v-2z"></path>
+</svg>
diff --git a/CrowIDE/images/save.svg b/CrowIDE/images/save.svg
new file mode 100644 (file)
index 0000000..7bdc551
--- /dev/null
@@ -0,0 +1,3421 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.0" width="128" height="128" id="svg2">
+  <defs id="defs5">
+    <linearGradient id="linearGradient28132">
+      <stop id="stop28134" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop28136" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient28077">
+      <stop id="stop28079" style="stop-color:#7a7a7a;stop-opacity:1" offset="0"/>
+      <stop id="stop28081" style="stop-color:#000000;stop-opacity:0.4909091" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient28069">
+      <stop id="stop28071" style="stop-color:#868385;stop-opacity:1" offset="0"/>
+      <stop id="stop28073" style="stop-color:#4a4949;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient28059">
+      <stop id="stop28061" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop28063" style="stop-color:#000000;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient28049">
+      <stop id="stop28051" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop28053" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient27983">
+      <stop id="stop27985" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop27987" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient27973">
+      <stop id="stop27975" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop27977" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient27933">
+      <stop id="stop27935" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop27937" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient17395">
+      <stop id="stop17397" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop17399" style="stop-color:#ffffff;stop-opacity:0.80000001" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient17383">
+      <stop id="stop17385" style="stop-color:#202020;stop-opacity:1" offset="0"/>
+      <stop id="stop17387" style="stop-color:#202020;stop-opacity:0.76363635" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3275">
+      <stop id="stop3277" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop3279" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3215">
+      <stop id="stop3217" style="stop-color:#8a8a8a;stop-opacity:1" offset="0"/>
+      <stop id="stop3219" style="stop-color:#c6c6c6;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3136">
+      <stop id="stop3138" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3140" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3088">
+      <stop id="stop3090" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3092" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3033">
+      <stop id="stop3035" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3037" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3706">
+      <stop id="stop3708" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop3710" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3577">
+      <stop id="stop3579" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop3581" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3468">
+      <stop id="stop3470" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3472" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3446">
+      <stop id="stop3448" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3451" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3111">
+      <stop id="stop3113" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3603" style="stop-color:#ffffff;stop-opacity:0.69818181" offset="0.5"/>
+      <stop id="stop3115" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3077">
+      <stop id="stop3079" style="stop-color:#d0ced9;stop-opacity:1" offset="0"/>
+      <stop id="stop3087" style="stop-color:#ecf1f9;stop-opacity:1" offset="0.25"/>
+      <stop id="stop3085" style="stop-color:#ffffff;stop-opacity:1" offset="0.5"/>
+      <stop id="stop3081" style="stop-color:#c6d5e3;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3317">
+      <stop id="stop3319" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop3321" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3174">
+      <stop id="stop3176" style="stop-color:#2e2a2b;stop-opacity:1" offset="0"/>
+      <stop id="stop3182" style="stop-color:#4c494a;stop-opacity:1" offset="0.33497536"/>
+      <stop id="stop3214" style="stop-color:#5b595a;stop-opacity:1" offset="0.66748768"/>
+      <stop id="stop3178" style="stop-color:#6b696a;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient x1="-97.742668" y1="1937.9885" x2="-97.742668" y2="1895.421" id="linearGradient3250" xlink:href="#linearGradient3174" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.5599786,0,0,2.5827101,317.24891,-4887.3657)"/>
+    <filter id="filter3444" height="2.5930088" y="-0.79650438" width="1.1419513" x="-0.070975639">
+      <feGaussianBlur id="feGaussianBlur3446" stdDeviation="2.9868914" inkscape:collect="always"/>
+    </filter>
+    <clipPath id="clipPath3008">
+      <rect width="78.12355" height="55.395592" rx="1.133948" ry="1.133948" x="24.680513" y="-68.245476" id="rect3010" style="opacity:0.265625;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.39999992;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    </clipPath>
+    <radialGradient cx="100.30548" cy="42.449028" r="38" fx="100.30548" fy="42.449028" id="radialGradient3083" xlink:href="#linearGradient3077" gradientUnits="userSpaceOnUse" gradientTransform="matrix(4.5705286,7.2649243e-7,-2.9846211e-7,1.8569392,-416.60853,-84.720552)"/>
+    <filter id="filter3105">
+      <feGaussianBlur id="feGaussianBlur3107" stdDeviation="0.66759571" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="64.801826" cy="63.781319" r="34.041004" fx="64.801826" fy="63.781319" id="radialGradient3117" xlink:href="#linearGradient3111" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.1398365,0,0,1.0706638e-2,-9.061664,63.098436)"/>
+    <clipPath id="clipPath3215">
+      <path d="M 11.375,-167.68125 C 8.4215521,-167.68125 8,-167.31718 8,-164.3375 L 8,-163.55625 C 8,-166.53593 8.4215521,-166.86875 11.375,-166.86875 L 116.625,-166.86875 C 119.57845,-166.86875 120,-166.53593 120,-163.55625 L 120,-164.3375 C 120,-167.31718 119.57845,-167.68125 116.625,-167.68125 L 11.375,-167.68125 z" id="path3217" style="opacity:1;fill:url(#linearGradient3219);fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"/>
+    </clipPath>
+    <linearGradient x1="-98.926186" y1="1892.9656" x2="-98.926186" y2="1897.0332" id="linearGradient3219" xlink:href="#linearGradient3317" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.5599786,0,0,2.5827101,317.24891,-5063.043)"/>
+    <filter height="1.4537807" y="-0.22689034" width="1.0142819" x="-0.0071409685" id="filter3371">
+      <feGaussianBlur id="feGaussianBlur3373" stdDeviation="0.33324519" inkscape:collect="always"/>
+    </filter>
+    <filter id="filter3417">
+      <feGaussianBlur id="feGaussianBlur3419" stdDeviation="0.11145486" inkscape:collect="always"/>
+    </filter>
+    <linearGradient x1="69.913269" y1="-96.5" x2="70.020454" y2="-67.843079" id="linearGradient3453" xlink:href="#linearGradient3446" gradientUnits="userSpaceOnUse" gradientTransform="translate(5.89968e-2,131.40729)"/>
+    <linearGradient x1="107.06239" y1="-26.262714" x2="107.06239" y2="134.55173" id="linearGradient3474" xlink:href="#linearGradient3468" gradientUnits="userSpaceOnUse" gradientTransform="translate(9.4,0.6)"/>
+    <filter height="1.3748291" y="-0.1874145" width="1.0467155" x="-0.023357728" id="filter3565">
+      <feGaussianBlur id="feGaussianBlur3567" stdDeviation="1.0149838" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="28.481363" cy="164.13387" r="52.144646" fx="28.481363" fy="164.13387" id="radialGradient3583" xlink:href="#linearGradient3577" gradientUnits="userSpaceOnUse" gradientTransform="matrix(5.4915792,-0.1150427,2.6103208e-3,0.1246041,-128.35474,104.82482)"/>
+    <filter height="1.2405112" y="-0.12025558" width="1.1380129" x="-0.069006473" id="filter3659">
+      <feGaussianBlur id="feGaussianBlur3661" stdDeviation="1.9228365" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="64.801826" cy="63.781319" r="34.041004" fx="64.801826" fy="63.781319" id="radialGradient3692" xlink:href="#linearGradient3111" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.0552043,0,0,2.2032141e-2,0.5328457,76.944704)"/>
+    <radialGradient cx="84" cy="91.983192" r="32" fx="84" fy="91.983192" id="radialGradient3704" xlink:href="#linearGradient3468" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.6210279,0,37.87587)"/>
+    <linearGradient x1="47.608696" y1="104.35009" x2="47.608696" y2="176.35008" id="linearGradient3712" xlink:href="#linearGradient3706" gradientUnits="userSpaceOnUse"/>
+    <filter height="2.2481999" y="-0.62409997" width="1.0121166" x="-0.0060582431" id="filter3726">
+      <feGaussianBlur id="feGaussianBlur3728" stdDeviation="0.18955201" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="118.16644" cy="9.119606" r="1.284445" fx="118.16644" fy="9.119606" id="radialGradient3039" xlink:href="#linearGradient3033" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.2088257,0.9583181,-1.4021168,1.7686352,-11.9962,-120.41039)"/>
+    <filter id="filter3077">
+      <feGaussianBlur id="feGaussianBlur3079" stdDeviation="0.10453397" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="118.16644" cy="9.119606" r="1.284445" fx="118.16644" fy="9.119606" id="radialGradient3084" xlink:href="#linearGradient3033" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.2088257,0.9583181,-1.4021168,1.7686352,-11.0962,-120.71039)"/>
+    <radialGradient cx="104.09375" cy="9" r="0.46875" fx="104.09375" fy="9" id="radialGradient3094" xlink:href="#linearGradient3088" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.8,-0.4640388,1.9104855)"/>
+    <filter id="filter3120">
+      <feGaussianBlur id="feGaussianBlur3122" stdDeviation="0.025961538" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="104.09375" cy="9" r="0.46875" fx="104.09375" fy="9" id="radialGradient3126" xlink:href="#linearGradient3088" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,0.8,-80.464039,1.9104855)"/>
+    <linearGradient x1="-37.195274" y1="42.336197" x2="-12.625" y2="106.7981" id="linearGradient3142" xlink:href="#linearGradient3136" gradientUnits="userSpaceOnUse" gradientTransform="translate(126.8,0)"/>
+    <filter id="filter3192">
+      <feGaussianBlur id="feGaussianBlur3194" stdDeviation="0.0231875" inkscape:collect="always"/>
+    </filter>
+    <clipPath id="clipPath3199">
+      <path d="M 18.189713,132.42089 C 16.770505,132.42089 15.627213,133.56419 15.627213,134.98339 L 15.627213,172.16667 L 87.627215,172.16667 L 87.627215,134.98339 C 87.627215,133.56419 86.483925,132.42089 85.064715,132.42089 L 18.189713,132.42089 z" id="path3201" style="fill:#000000;fill-opacity:0.12831858;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    </clipPath>
+    <linearGradient x1="64" y1="120.0697" x2="56" y2="96.315643" id="linearGradient3221" xlink:href="#linearGradient3215" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0103538,0,-1.3128784)"/>
+    <filter height="1.1857692" y="-0.092884615" width="1.2476923" x="-0.12384615" id="filter3271">
+      <feGaussianBlur id="feGaussianBlur3273" stdDeviation="1.2384615" inkscape:collect="always"/>
+    </filter>
+    <linearGradient x1="68" y1="120" x2="36" y2="84" id="linearGradient3281" xlink:href="#linearGradient3275" gradientUnits="userSpaceOnUse"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient17389" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.04831,98.650809)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient17391" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.86565,81.869097)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient17393" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.65627,76.131701)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient17401" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.35341,75.348463)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient17403" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.98917,83.339266)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17405" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.98299,64.593236)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17927" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-169.06714,86.432831)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient17929" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.83916,54.919294)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient17931" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.88342,62.800233)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient17933" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.71623,79.165529)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient17935" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.84517,54.21146)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient17937" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.53241,97.806917)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17939" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.24534,81.048567)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient17941" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.70361,55.279303)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient17943" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.6284,97.067631)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient17945" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.34854,61.711899)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient17947" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.66265,52.483914)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient17949" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.59014,59.510188)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17951" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.46624,60.173404)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient17953" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.87629,58.336657)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient17955" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.58009,67.154481)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient17957" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.73496,62.400106)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient17959" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.35161,73.551175)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient17961" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.89594,66.58864)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17963" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.13384,84.814934)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient17965" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.91271,77.941165)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient17967" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.20449,51.17675)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient17969" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.06524,69.064619)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient17971" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.52359,92.856996)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient17973" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.43503,94.662593)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17975" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.85757,64.997276)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient17977" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.75931,67.251671)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient17979" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.65593,78.369252)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient17981" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.62706,51.493137)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient17983" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.93824,68.322369)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient17985" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.53268,55.235233)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17987" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.21066,71.47352)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient17989" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.5919,56.467526)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient17991" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.71564,74.930868)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient17993" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.4736,53.559868)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient17995" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.55832,61.067038)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient17997" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.31207,66.681291)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient17999" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.10403,67.750684)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18001" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.33468,72.447586)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18003" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.26012,87.91266)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18005" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.40056,82.048109)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18007" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.0213,62.520599)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18009" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.36835,56.244802)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18011" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.08718,57.926553)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18013" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.79114,57.080862)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18015" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.03918,48.584498)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18017" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.6183,63.700535)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18019" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.93757,95.476082)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18021" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.02547,77.574321)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18023" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.21364,48.418007)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18025" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.70823,82.23261)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18027" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.15255,92.772183)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18029" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.65169,79.498937)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18031" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.49456,78.16038)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18033" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.67608,84.861682)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18035" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.26899,52.027937)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18037" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.45628,86.592803)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18039" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.00836,90.316584)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18041" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.89546,82.204785)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18043" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.56485,49.076767)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18045" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.43699,83.788635)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18047" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.40557,82.936981)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18049" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.93802,93.778176)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18051" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.19068,89.201266)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18053" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.13798,52.027419)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18055" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.45937,84.129612)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18057" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.56245,48.654412)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18059" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.63529,65.193646)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18061" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.98125,77.181558)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18063" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.69936,101.45983)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18065" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.28009,95.000749)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18067" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.7688,89.934128)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18069" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.73667,49.776232)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18071" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.71492,87.099601)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18073" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.40761,55.73509)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18075" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.59256,76.129457)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18077" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.50428,70.646216)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18079" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.1711,87.719524)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18081" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.57429,74.288249)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18083" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.27965,65.898402)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18085" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.29621,93.400413)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18087" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.27056,70.316108)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18089" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.20777,48.563152)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18091" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.39529,83.572253)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18093" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.81164,57.257035)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18095" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.89446,53.860035)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18097" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.88926,94.901194)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18099" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.34424,94.619712)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18101" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.08388,70.672254)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18103" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.9536,55.272771)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18105" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.64822,51.584368)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18107" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.34619,56.086318)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18109" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.27079,87.813541)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18111" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.02855,64.950753)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18113" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.72777,47.537589)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18115" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.50256,86.101458)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18117" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.31555,49.887473)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18119" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.22916,94.031526)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18121" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.47311,67.000704)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18123" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.55203,62.073911)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18125" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.18659,61.00993)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18127" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.54179,61.764079)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18129" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.42695,88.75579)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18131" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.73423,88.006441)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18133" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.64361,58.908237)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18135" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.96634,55.970755)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18137" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.50462,92.061954)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient18139" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.43236,57.658044)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient18141" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.54487,89.80346)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient18143" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.63109,94.239208)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient18145" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.39712,73.965174)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient18147" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.64656,71.246105)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient18149" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.26639,58.537091)"/>
+    <clipPath id="clipPath25065">
+      <path d="M -283.36245,66.003757 C -284.5397,66.003757 -285.48745,66.951507 -285.48745,68.128757 L -285.48745,105.94751 L -230.0812,105.94751 L -230.0812,68.128757 C -230.0812,66.951507 -231.02895,66.003757 -232.2062,66.003757 L -283.36245,66.003757 z M -277.1437,69.347507 L -263.0187,69.347507 C -262.49915,69.347507 -262.0812,69.765457 -262.0812,70.285007 L -262.0812,96.410007 C -262.0812,96.929557 -262.49915,97.347507 -263.0187,97.347507 L -277.1437,97.347507 C -277.66325,97.347507 -278.0812,96.929557 -278.0812,96.410007 L -278.0812,70.285007 C -278.0812,69.76546 -277.66325,69.347507 -277.1437,69.347507 z" id="path25067" style="opacity:1;fill:url(#linearGradient25069);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    </clipPath>
+    <linearGradient x1="52" y1="112" x2="52" y2="80" id="linearGradient25069" xlink:href="#linearGradient3215" gradientUnits="userSpaceOnUse" gradientTransform="translate(-318.0812,-14.652496)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25071" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.38211,96.058611)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25073" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.17339,68.78127)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25075" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.16644,100.32021)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25077" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.0724,74.753533)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25079" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.8528,53.860792)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25081" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.06483,97.785398)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25083" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.80022,50.494008)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25085" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.04164,84.576711)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25087" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.52819,76.538651)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25089" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.65959,57.539347)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25091" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.86203,66.719957)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25093" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.8179,50.386062)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25095" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.05855,74.425415)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25097" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.12915,42.23811)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25099" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.66068,93.444381)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25101" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.70143,51.859788)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25103" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.98631,53.268073)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25105" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.37167,89.887836)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25107" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.74685,64.326802)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25109" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.8959,81.54662)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25111" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.29278,47.198913)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25113" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.711,91.667267)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25115" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.69501,98.782896)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25117" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.34776,95.10665)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25119" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.74429,53.915931)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25121" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.55698,53.16276)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25123" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.95662,47.486179)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25125" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.35779,58.642553)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25127" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.23431,45.441149)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25129" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.86474,74.954131)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25131" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.10867,97.34097)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25133" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.25958,46.78729)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25135" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.81379,94.9744)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25137" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.94383,78.792993)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25139" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.57868,84.007476)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25141" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.90486,92.071216)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25143" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.00999,71.757639)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25145" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.61023,87.451829)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25147" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.28284,81.593319)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25149" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.0861,90.515961)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25151" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.78528,75.738299)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25153" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.05801,67.184614)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25155" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.88883,54.629747)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25157" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.78443,79.523126)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25159" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.08719,80.115126)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25161" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.49501,50.253965)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25163" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.25412,62.696544)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25165" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.45523,79.406263)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25167" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.41942,54.610361)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25169" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.5503,80.159362)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25171" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.74779,82.303681)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25173" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.25995,94.08089)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25175" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.0894,95.830634)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25177" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.55239,43.484478)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25179" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.02703,76.389395)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25181" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.01949,89.014582)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25183" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.5417,72.608952)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25185" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.02746,79.641932)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25187" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.10405,89.937584)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25189" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.01422,68.861646)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25191" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.34232,64.508541)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25193" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.1797,58.959427)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25195" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.06036,98.049416)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25197" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.04789,60.240488)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25199" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.66368,52.21739)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25201" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.81342,73.677919)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25203" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.27374,88.937138)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25205" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.28503,78.626899)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25207" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.77725,94.296605)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25209" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.03812,59.050813)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25211" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.04593,71.103629)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25213" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.33961,87.338103)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25215" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.90676,91.613815)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25217" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.58716,82.306123)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25219" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.97587,82.888964)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25221" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.63853,48.592378)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25223" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.17805,82.032511)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25225" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.34891,75.185611)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25227" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.37818,58.417957)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25229" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.67765,55.742352)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25231" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.4097,62.833675)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25233" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.35607,79.408455)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25235" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.7447,68.787837)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25237" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.94661,55.287673)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25239" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.17737,55.539508)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25241" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.80814,74.829959)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25243" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-173.23561,52.533322)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25245" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.80864,97.942226)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25247" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.04119,65.636136)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25249" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.16068,85.874483)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25251" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.2966,78.103089)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25253" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.2253,63.940556)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25255" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.24862,54.096019)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25257" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.54865,65.626587)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25259" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.0947,48.525423)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25261" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.75331,51.284339)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25263" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.13564,72.571239)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25265" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.09768,73.231703)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25267" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.70515,102.75344)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25269" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.38314,101.07037)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25271" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.05661,63.96836)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25273" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.94209,72.979553)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25275" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.86084,73.351613)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25277" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.08696,78.669612)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25279" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.46218,61.658045)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25281" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.01556,70.609094)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25283" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.60137,85.269477)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25285" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.85815,87.158859)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25287" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.93834,73.09266)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25289" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.51219,76.968198)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25291" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.62389,53.714891)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25293" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.81095,65.65574)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25295" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.1174,79.920498)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25297" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.31182,94.22334)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25299" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.82608,79.603251)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25301" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.74465,86.802406)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25303" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.19678,55.049012)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25305" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.27319,62.663747)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25307" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.00246,99.797565)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25309" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.49681,62.469135)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25311" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.01015,67.065542)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25313" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.2218,88.255847)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25315" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.62659,100.49906)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25317" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.88673,89.25093)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25319" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.76579,78.929875)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25321" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.1367,69.744078)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25323" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.16539,96.80496)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25325" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.50604,95.25611)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25327" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.0547,101.92665)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25329" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.95849,84.566088)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25331" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.91109,56.112126)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25333" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.89562,74.202974)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25335" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.53845,92.086584)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25337" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.9649,56.388537)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25339" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.0286,75.756506)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25341" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.89374,87.521709)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25343" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.8761,68.273979)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25345" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.26228,47.180868)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25347" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.91805,83.030339)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25349" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.90486,89.074686)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25351" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.74266,61.23647)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25353" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.07618,77.989104)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25355" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.99922,82.379721)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25357" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.25102,78.974994)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25359" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.92593,66.582197)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25361" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.87488,90.973141)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25363" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.14427,53.878791)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25365" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.63365,51.02227)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25367" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.63774,97.263187)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25369" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.66009,78.261234)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25371" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.12648,63.541393)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25373" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.44656,90.883629)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25375" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.10606,66.63253)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25377" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.24541,89.879804)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25379" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.75451,73.741383)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25381" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.04198,85.944877)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25383" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.59922,93.062511)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25385" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.33442,48.916147)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25387" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.42778,87.747819)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25389" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.87795,46.102846)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25391" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.76042,57.778219)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25393" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.28711,55.089283)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25395" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.00493,80.55014)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25397" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.76301,84.467965)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25399" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.09758,65.661454)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25401" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.60272,91.234744)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25403" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.19726,69.665254)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25405" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.48891,52.819633)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25407" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.66919,94.582064)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25409" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.80325,85.619929)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25411" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.57968,57.069825)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25413" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.58682,65.503385)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25415" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.14174,48.577251)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25417" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.67014,82.861539)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25419" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.77739,87.621414)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25421" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.58356,90.808782)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25423" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.22748,49.22511)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25425" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.88045,89.331479)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25427" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.08206,73.679835)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25429" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.92333,98.779166)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25431" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.80519,81.754991)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25433" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.48779,69.946426)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25435" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.6343,67.002042)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25437" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.36223,86.555487)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25439" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.98491,53.461282)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25441" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.63347,60.740732)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25443" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.49112,93.886238)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25445" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.0295,46.463347)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25447" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.39578,80.802235)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25449" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.25661,74.119006)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25451" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.82125,56.065217)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25453" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.21644,57.806455)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25455" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.1716,43.752105)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25457" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.03293,67.790618)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25459" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.11879,70.91176)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25461" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.04165,79.077835)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25463" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.39124,76.195736)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25465" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.90693,79.587908)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25467" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.22061,47.99961)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25469" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.39882,62.582495)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25471" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.67782,102.12202)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25473" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.47238,73.923449)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25475" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.9026,64.745496)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25477" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.81868,77.281724)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25479" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.12565,63.352013)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25481" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.33163,97.086604)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25483" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.76353,85.066104)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25485" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.89508,54.203911)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25487" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.54305,67.199939)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25489" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.27681,72.403163)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25491" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.02385,88.069533)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25493" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.76838,88.78592)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25495" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.32961,56.208973)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25497" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.37873,88.863579)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25499" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.97817,91.731797)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25501" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.47633,50.134554)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25503" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.90923,69.227596)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25505" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.88412,67.106252)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25507" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.40947,74.939971)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25509" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.4478,57.634612)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25511" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.51182,92.809539)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25513" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.80362,50.410836)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25515" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.02572,65.891626)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25517" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.66411,84.453632)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25519" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.32685,59.734527)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25521" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.87078,59.219945)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25523" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.10721,59.642293)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25525" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.87107,95.50353)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25527" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.33115,96.648737)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25529" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.96561,51.859787)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25531" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.44773,78.310106)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25533" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.55415,72.470695)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25535" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.81771,87.843085)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25537" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.59479,45.717249)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25539" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.54047,71.618169)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25541" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.89265,55.938324)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25543" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.50631,73.919704)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25545" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.76911,49.792033)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25547" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.2194,64.311435)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25549" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.45637,61.709902)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25551" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.49561,43.100523)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25553" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.64006,66.916448)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25555" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.83152,80.672031)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25557" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.79432,71.297676)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25559" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.925,100.26332)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25561" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.38018,63.48345)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25563" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.42613,90.671813)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25565" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.09766,43.021663)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25567" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.71879,94.060061)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25569" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.43313,100.4486)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25571" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.93287,84.710556)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25573" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.02746,65.316537)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25575" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.81323,83.133066)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25577" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.82007,62.36345)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25579" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.39029,94.105045)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25581" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.13426,58.170705)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25583" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.18474,75.349434)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25585" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.20203,48.845529)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25587" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.03562,55.758101)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25589" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.29811,52.259728)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25591" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-170.6151,77.618141)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25593" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.05919,91.908055)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25595" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.60563,78.470723)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25597" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.903,89.769672)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25599" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.24145,45.861223)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25601" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.53475,43.795964)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25603" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-173.77556,48.95078)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25605" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.2318,87.681518)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25607" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.58276,55.747252)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25609" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.78469,79.944157)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25611" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.86844,50.278288)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25613" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.91709,47.248874)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25615" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.95266,76.765426)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25617" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.94025,78.21498)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25619" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.68773,56.303855)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25621" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.42025,72.239281)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25623" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.77142,70.608768)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25625" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.62663,85.751899)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25627" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.42123,91.671771)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25629" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.10816,83.461099)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25631" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.671,50.936341)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25633" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.8437,76.600442)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25635" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.54453,86.838596)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25637" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.60334,44.432277)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25639" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.19863,77.925457)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25641" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.81916,94.114099)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25643" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.90901,62.531869)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25645" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.70763,73.774118)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25647" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.46635,77.168898)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25649" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.52156,69.213722)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25651" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.16458,66.538678)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25653" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.12069,62.394789)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25655" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.52721,90.396189)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25657" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.04492,54.904169)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25659" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.45617,81.829262)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25661" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.64673,71.55417)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25663" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.44925,62.441034)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25665" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.12965,56.246736)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25667" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.92528,53.299937)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25669" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.2057,95.742977)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25671" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.29121,86.984918)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25673" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.07831,65.831275)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25675" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.34249,98.138056)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25677" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.4937,75.046925)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25679" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.1355,90.678068)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25681" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.25941,94.504639)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25683" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.67862,58.096074)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25685" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.17987,88.526706)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25687" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.87076,85.072027)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25689" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.44615,99.129507)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25691" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.03251,52.847877)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25693" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.31058,78.926478)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25695" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.38729,76.478332)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25697" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.77608,48.930248)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25699" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.78137,65.224321)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25701" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.75188,76.831363)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25703" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.11667,99.752269)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25705" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.04074,83.076253)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25707" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.40607,61.643761)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25709" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.68623,81.637039)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25711" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.6966,82.312204)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25713" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.87099,85.200996)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25715" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.14815,80.964882)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25717" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-170.25356,56.87887)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25719" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.98002,90.303091)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25721" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.64409,62.66442)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25723" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-170.07904,58.945199)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25725" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.74295,74.927436)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25727" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.72421,60.663158)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25729" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.21981,74.741939)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25731" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.31423,69.448412)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25733" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.84608,68.815406)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25735" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.18009,72.228015)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25737" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.34991,69.38326)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25739" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.3173,94.625498)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25741" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.62702,57.437192)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25743" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.44646,93.781072)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25745" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.76175,81.46759)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25747" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.78404,49.42172)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25749" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.81022,99.158159)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25751" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.52567,99.957901)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25753" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.57132,57.231352)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25755" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.75051,83.271844)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25757" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.11784,89.955784)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25759" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.2487,58.800202)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25761" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.694,60.709343)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25763" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.11199,96.768099)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25765" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-173.40943,62.401395)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25767" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.45206,78.631553)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25769" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.26711,66.539263)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25771" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.70911,70.352217)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25773" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.40295,95.35491)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25775" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.94716,50.093518)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25777" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.64272,72.150133)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25779" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.62647,81.143023)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25781" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.14228,54.86069)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25783" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.29509,58.719807)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25785" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.30549,66.017408)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25787" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.31534,83.536696)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25789" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.74634,54.54358)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25791" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.81598,71.036429)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25793" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.37822,50.882072)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25795" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.54397,95.704671)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25797" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.10988,80.137108)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25799" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.12294,94.958668)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25801" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.14566,48.90426)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25803" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.47119,69.295949)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25805" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.10648,68.840038)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25807" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.91314,91.117042)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25809" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.0356,46.698952)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25811" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.94624,73.379187)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25813" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.57653,93.149875)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25815" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.55881,53.111903)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25817" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.09461,51.13869)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25819" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.26013,97.389846)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25821" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.54159,74.940044)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25823" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.07562,92.952027)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25825" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.89693,60.272946)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25827" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.98046,78.793425)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25829" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.86916,51.559013)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25831" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.32905,85.452556)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25833" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.54228,90.635746)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25835" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.44461,57.766641)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25837" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.24108,68.261244)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25839" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.16236,61.104509)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25841" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.34105,58.960917)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25843" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.2905,83.175482)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25845" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.15465,75.135647)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25847" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.9938,55.97573)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25849" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.90553,96.057791)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25851" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.96328,66.21203)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25853" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.76821,93.599068)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25855" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.95708,55.921228)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25857" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.1816,60.903275)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25859" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.30553,80.478416)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25861" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.10752,50.516123)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25863" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.50403,78.72218)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25865" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.70184,79.141059)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25867" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.8086,77.286836)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25869" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.89896,54.508566)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25871" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.13152,96.866027)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25873" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.73149,77.585866)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25875" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.52509,44.701208)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25877" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.61234,70.479666)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25879" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.8115,63.378045)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25881" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.42213,58.729505)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25883" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.04973,100.68876)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25885" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.26572,51.814988)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25887" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.19359,93.559083)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25889" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.29907,41.550704)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25891" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.34885,49.193737)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25893" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.37881,67.984252)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25895" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.28267,59.49831)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25897" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.05311,53.805192)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25899" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.5602,81.313378)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25901" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.9489,83.375827)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25903" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.45863,89.337988)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25905" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.30777,89.488645)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25907" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.26991,68.026294)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25909" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.197,44.08644)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25911" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.57626,59.327194)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25913" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.05568,56.498296)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25915" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.83245,75.470348)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25917" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.85895,100.97328)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25919" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.25345,68.350558)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25921" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.79683,55.060749)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25923" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.63195,50.962423)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25925" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.29248,92.765928)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25927" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.70545,69.466989)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25929" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.15384,88.371961)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25931" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.74113,95.148243)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25933" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.89802,91.894132)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25935" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.17488,61.734911)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25937" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.98542,55.171014)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25939" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.40944,81.128571)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25941" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.77183,67.275714)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25943" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.54992,51.391434)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25945" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.84487,57.530592)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25947" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.32101,72.460262)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25949" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.13057,89.796131)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25951" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.63146,66.984367)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25953" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.47995,98.363352)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25955" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.85622,95.006691)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25957" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.62809,70.570403)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25959" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.29674,82.688109)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25961" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.9558,59.196439)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25963" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.90801,84.960554)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25965" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.0659,80.248099)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25967" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.02201,56.40529)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25969" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.47597,59.319721)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25971" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.91338,81.832351)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25973" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.67642,97.511173)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25975" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.77997,66.826761)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25977" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.21696,55.204814)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25979" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.28156,99.194668)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25981" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.16497,91.936968)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25983" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.96732,57.902306)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25985" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.66966,94.451773)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25987" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.86723,80.633635)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient25989" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.87851,84.513313)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient25991" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.09357,60.622522)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient25993" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.42322,60.924173)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient25995" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.51572,47.316547)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient25997" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.41057,59.199964)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient25999" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.64963,47.837809)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26001" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.77568,100.63515)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26003" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.58237,45.460225)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26005" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.36492,92.067389)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26007" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.75397,54.890055)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26009" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.15973,82.806109)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26011" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.91485,69.195625)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26013" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.89556,98.504519)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26015" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.19639,89.863388)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26017" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.32418,81.88167)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26019" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.20665,97.838212)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26021" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.94344,90.752694)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26023" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.16996,82.180245)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26025" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.31052,57.231976)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26027" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.94962,51.183241)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26029" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.42874,66.896446)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26031" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.65024,96.875921)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26033" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.308,55.386706)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26035" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-168.67373,60.753257)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26037" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.50822,51.075751)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26039" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.52894,58.762284)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26041" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.94959,91.684887)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26043" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.26789,84.877056)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26045" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.05805,94.476969)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26047" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.56355,86.41264)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26049" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.13517,77.175513)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26051" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.02597,58.035693)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26053" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.14971,93.175794)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26055" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.25824,88.410331)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26057" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.79815,59.03502)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26059" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.94424,100.56856)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26061" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.38437,47.090204)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26063" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.70144,67.344287)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26065" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.50104,73.092261)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26067" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.91998,71.783425)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26069" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.65277,74.03124)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26071" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.11602,99.243278)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26073" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.81905,83.115296)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26075" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.53041,58.04325)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26077" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.71379,53.569638)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26079" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.73995,56.014834)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26081" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.52662,45.024141)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26083" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.19677,82.692683)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26085" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.8594,73.102465)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26087" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.59595,65.436866)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26089" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.99607,60.382145)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26091" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.61424,94.167518)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26093" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.99055,58.222766)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26095" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.75284,57.913561)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26097" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.88775,81.060687)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26099" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.3816,64.33263)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26101" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.89851,53.909031)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26103" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.17448,62.102049)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26105" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.73853,57.030866)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26107" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.17331,73.768629)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26109" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.11883,81.414662)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26111" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.68982,64.458518)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26113" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.10479,96.180089)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26115" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.91423,82.147877)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26117" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.78875,74.985805)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26119" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.62906,96.421111)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26121" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.61017,90.04855)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26123" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.21485,44.978928)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26125" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.57813,77.832142)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26127" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.49023,74.683485)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26129" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.73713,47.320861)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26131" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.16616,84.789256)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26133" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.12103,100.13712)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26135" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.46258,85.337301)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26137" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.95687,96.57967)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26139" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.89762,43.598589)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26141" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.00975,52.562994)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26143" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.29583,89.579706)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26145" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.03831,46.741795)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26147" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.03618,89.022991)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26149" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.58455,96.869575)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26151" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.40275,53.81825)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26153" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.89983,65.779625)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26155" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.54855,79.720058)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26157" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.66431,70.024915)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26159" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.40935,72.453765)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26161" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.64538,74.917475)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26163" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.72972,48.706565)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26165" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.94438,74.846626)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26167" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.21313,101.54873)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26169" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.98842,76.692321)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26171" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.2709,100.69639)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26173" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.9594,72.450047)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26175" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.20383,59.035082)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26177" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.12744,53.794548)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26179" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.98869,53.142207)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26181" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.13628,98.100518)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26183" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.56781,94.919393)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26185" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.12461,95.97926)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26187" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.35399,55.220506)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26189" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.62563,82.907266)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26191" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-169.49627,98.714929)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26193" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.96478,58.525976)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26195" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.45519,97.424779)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26197" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.98701,92.818729)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26199" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.83196,91.179346)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26201" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.12249,56.157795)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26203" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.78724,61.715517)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26205" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.17592,66.548739)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26207" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.60827,71.560403)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26209" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.63961,99.402208)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26211" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.02711,87.232951)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26213" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.98141,75.110907)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26215" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.72915,90.927929)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26217" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.92879,97.252538)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26219" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.72492,56.317052)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26221" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.6908,88.473853)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26223" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.04456,69.276317)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26225" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.42003,78.754986)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26227" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.48178,71.059478)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26229" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.4398,89.404901)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26231" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.08727,100.23941)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26233" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-169.81385,88.623736)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26235" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.35265,81.097498)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26237" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.49542,80.736363)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26239" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.82391,102.62995)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26241" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.68584,69.035616)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26243" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.8909,91.25955)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26245" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.51204,43.292758)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26247" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.58826,92.533231)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26249" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.91765,93.825399)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26251" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.18391,67.189922)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26253" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.23566,61.001922)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26255" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.59135,67.428878)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26257" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.32576,85.901619)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26259" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.88665,79.910358)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26261" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.29826,52.507608)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26263" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.91739,98.245721)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26265" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.86528,73.586258)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26267" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.69827,64.588411)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26269" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.77836,48.821272)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26271" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.31001,52.850576)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26273" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.32314,53.194791)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26275" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.31448,58.892835)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26277" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.85686,93.462001)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26279" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.9758,86.814968)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26281" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-170.48695,94.50283)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26283" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.77448,73.905739)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26285" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.11146,91.445987)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26287" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.43543,88.270935)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26289" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.26511,63.034765)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26291" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.87736,49.880397)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26293" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.32143,91.272568)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26295" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.90065,86.616652)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26297" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.60436,53.461688)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26299" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.43582,70.048052)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26301" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.39886,49.361679)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26303" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.75499,81.637997)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26305" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.69395,77.737543)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26307" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.90078,68.517067)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26309" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.238,65.742941)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26311" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.82817,74.89994)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26313" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.96281,90.303768)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26315" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.94621,83.816846)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26317" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.09277,92.359799)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26319" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.04693,42.296234)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26321" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.81511,95.382853)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26323" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.35982,68.031212)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26325" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.57305,65.633167)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26327" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.72023,78.376137)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26329" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.71531,95.386817)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26331" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.76606,70.613992)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26333" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.92549,77.294246)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26335" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.3949,93.826772)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26337" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.56505,76.919073)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26339" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.36489,89.107953)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26341" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.96918,73.353203)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26343" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.50662,49.932981)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26345" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.85232,43.463212)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26347" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.80296,61.002647)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26349" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.45749,54.539732)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26351" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.19833,61.363868)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26353" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.89152,67.193431)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26355" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.23817,56.717644)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26357" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.69815,65.891141)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26359" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.42673,47.889739)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26361" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.37493,80.774838)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26363" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.5567,71.713477)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26365" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.46176,58.968814)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26367" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.09506,75.675963)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26369" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.77836,88.047292)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26371" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.58104,72.677987)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26373" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.40127,56.120337)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26375" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.88109,99.349973)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26377" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.90521,76.321763)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26379" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.77391,73.143969)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26381" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.45078,68.894473)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26383" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.34401,73.508028)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26385" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.01549,98.843449)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26387" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.45871,54.292015)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26389" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.02899,63.064932)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26391" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.96409,49.99785)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26393" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.13609,59.196361)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26395" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.09141,102.17008)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26397" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.26954,70.133057)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26399" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.73524,96.505891)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26401" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.41006,68.527705)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26403" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.60542,60.727199)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26405" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.43104,53.430483)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26407" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-170.32042,92.259938)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26409" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.6568,68.338744)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26411" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.66507,53.368637)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26413" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.15419,84.625236)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26415" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.35996,85.892578)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26417" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.95352,73.071673)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26419" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.59911,52.768718)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26421" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.04709,68.472085)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26423" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.73392,95.242565)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26425" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.91053,53.860252)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26427" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.961,94.592686)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26429" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.02644,95.825107)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26431" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.84879,59.021262)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26433" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.29974,64.380676)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26435" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.59404,97.507151)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26437" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.12866,71.287185)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26439" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.69166,91.939584)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26441" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.92339,44.953255)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26443" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.56343,52.22804)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26445" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.63368,48.017753)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26447" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.02668,62.411475)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26449" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.42675,58.566706)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26451" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.33318,46.059348)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26453" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.13567,58.757321)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26455" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.57474,100.96913)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26457" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.97263,46.082625)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26459" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.32669,67.279158)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26461" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.76226,59.46013)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26463" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.45756,71.652658)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26465" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.58738,67.526028)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26467" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.47772,96.355565)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26469" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.16172,62.355435)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26471" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.98759,49.311847)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26473" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.58199,67.883424)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26475" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.25718,51.466042)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26477" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.80047,42.984038)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26479" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.26636,52.927194)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26481" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.5903,87.902473)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26483" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.57186,74.960311)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26485" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.46051,84.348265)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26487" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.88495,91.390387)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26489" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.04437,49.478819)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26491" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.50689,56.699134)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26493" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.49716,54.758095)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26495" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.2186,63.383976)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26497" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.99597,64.615185)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26499" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.72593,54.306593)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26501" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.6354,82.192618)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26503" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.72677,55.965991)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26505" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.74684,93.348705)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26507" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.11095,98.355157)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26509" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.41642,58.129447)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26511" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.81562,60.402738)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26513" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.48888,67.582417)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26515" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.11081,52.39427)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26517" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.87595,73.453053)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26519" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.74565,94.623539)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26521" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.46457,73.105186)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26523" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.20061,75.219563)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26525" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.39882,83.93047)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26527" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.23296,85.458922)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26529" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.18903,54.684773)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26531" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.29115,65.385264)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26533" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.01924,57.108653)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26535" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.23811,93.415943)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26537" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.82636,92.995696)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26539" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.68705,51.525738)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26541" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.45861,61.014299)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26543" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.82901,51.479338)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26545" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.42642,61.330648)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26547" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.6842,73.453246)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26549" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.58525,66.465893)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26551" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.65937,68.581665)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26553" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.65553,87.989401)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26555" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.63622,51.559167)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26557" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.38301,92.658321)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26559" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.06131,89.702831)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26561" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.07053,52.322113)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26563" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.23187,71.007622)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26565" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.67469,80.249936)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26567" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.02737,96.164018)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26569" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.42304,93.151821)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26571" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.55154,48.490688)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26573" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.11645,54.391145)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26575" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.3394,80.019154)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26577" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.89769,96.314695)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26579" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.88531,49.529028)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26581" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.85806,86.512638)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26583" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.36352,70.500382)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26585" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.76024,70.321758)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26587" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.00964,53.501083)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26589" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.02392,69.637928)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26591" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.42011,62.360143)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26593" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.54394,65.259638)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26595" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.69392,86.017179)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26597" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.56186,64.985879)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26599" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.64496,56.82673)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26601" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.66833,86.746129)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26603" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.78226,85.95013)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26605" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.24824,72.365237)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26607" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.15693,63.896508)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26609" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.30288,80.624838)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26611" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.02397,72.263928)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26613" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.03842,70.252906)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26615" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.67534,93.586753)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26617" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.23822,59.113575)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26619" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.84416,89.554328)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26621" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.00951,84.592508)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26623" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.61788,91.38449)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26625" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.41408,97.937064)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26627" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.74698,97.735057)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26629" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.89324,94.469438)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26631" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.50418,58.701932)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26633" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.8596,44.794286)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26635" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.66711,51.755713)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26637" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.39911,73.751137)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26639" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.57062,50.664985)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26641" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.99916,69.832004)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26643" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.80681,94.021697)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26645" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.11165,94.957536)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26647" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.13101,67.590716)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26649" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.16655,58.136705)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26651" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.66747,82.325226)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26653" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.04692,48.675928)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26655" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.0267,46.756689)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26657" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.44269,56.526845)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26659" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.75759,93.703667)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26661" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.15057,64.973857)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26663" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.12993,47.849245)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26665" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.40412,74.531046)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26667" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.29494,77.499106)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26669" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.01155,79.499492)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26671" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.8569,48.353139)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26673" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.29418,60.754963)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26675" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.91676,52.290803)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26677" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.59185,67.100203)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26679" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.50241,48.87804)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26681" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.60132,60.533927)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26683" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.53892,94.433567)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26685" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.09794,48.828103)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26687" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.57013,82.682983)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26689" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.76597,83.949033)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26691" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.41993,88.546402)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26693" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.13572,41.787681)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26695" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.2046,93.907054)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26697" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.39272,97.495864)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26699" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.13122,82.505099)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26701" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.19993,78.552961)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26703" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.72661,92.537514)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26705" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.13729,85.11606)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26707" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.9277,84.964934)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26709" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.50066,62.492006)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26711" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.73891,99.746001)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26713" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.2192,85.015978)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26715" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.28973,54.49741)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26717" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.89829,91.53533)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26719" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.52714,88.219852)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26721" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.127,72.901326)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26723" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.7262,77.373646)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26725" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.36687,57.304014)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26727" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.3269,89.768624)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26729" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.96267,95.156223)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26731" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.8186,59.507254)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26733" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.42245,76.670179)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26735" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.3597,74.818794)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26737" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-173.16566,83.292056)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26739" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.41349,62.868961)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26741" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.53911,76.582523)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26743" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.07409,78.455391)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26745" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.44513,72.724965)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26747" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.32481,80.052048)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26749" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.17019,93.569393)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26751" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.13774,79.803506)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26753" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.25357,58.474889)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26755" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-173.63833,61.961568)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26757" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-260.13253,96.203313)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26759" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.19565,54.751181)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26761" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.63476,52.889621)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26763" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.37497,62.196116)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26765" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.98695,42.068143)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26767" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.13319,58.588144)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26769" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.82398,98.448223)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26771" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.34805,45.208615)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26773" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.40748,48.825207)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26775" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.32017,48.215713)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26777" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.64056,47.270949)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26779" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.57535,55.331806)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26781" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.82305,83.233524)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26783" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.73142,91.108762)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26785" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.90855,74.865231)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26787" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.05043,84.496449)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26789" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.58459,61.751464)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26791" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.14596,54.424693)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26793" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.72812,74.904465)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26795" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.33155,100.14082)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26797" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.97193,89.39845)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26799" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.54809,98.186606)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26801" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.13964,82.361444)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26803" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.26848,72.117728)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26805" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.62859,99.526146)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26807" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.59623,53.871792)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26809" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.80598,69.166711)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26811" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.62474,48.787047)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26813" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.75345,54.240746)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26815" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.98752,67.876902)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26817" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.87876,99.123473)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26819" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.61416,49.531959)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26821" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-169.16456,75.169359)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26823" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.23696,94.313255)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26825" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.84062,82.983714)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26827" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.01685,52.493784)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26829" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.27146,65.60472)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26831" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.88539,78.432125)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26833" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-170.0056,55.437687)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26835" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.09645,96.57678)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26837" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.28814,83.132852)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26839" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.92543,100.63432)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26841" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.75459,93.615295)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26843" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.81267,76.598283)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26845" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.97243,65.554836)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26847" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.11098,78.060595)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26849" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.16023,50.367691)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26851" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.09602,47.509494)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26853" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.83567,48.407023)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26855" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.9713,90.760856)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26857" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.79418,74.074289)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26859" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.43577,43.332912)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26861" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.81327,79.099323)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26863" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.00449,94.083539)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26865" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.72126,53.408845)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26867" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.91972,50.59402)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26869" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.55979,61.669974)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26871" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.4726,78.824903)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26873" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.59763,53.619283)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26875" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.49684,51.026235)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26877" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.85444,49.641287)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26879" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.88381,46.625689)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26881" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.59828,48.962924)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26883" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.23879,89.017315)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26885" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.23683,73.082304)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26887" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.78688,97.803018)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26889" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.30024,72.56641)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26891" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.45358,67.925848)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26893" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.11391,49.244629)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26895" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.59331,54.91602)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26897" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.98258,93.006514)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26899" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.0406,73.285834)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26901" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.68471,55.729024)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26903" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.25009,62.909781)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26905" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.96538,51.964452)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26907" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.40219,48.541983)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26909" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.79974,49.135089)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26911" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.42489,55.403287)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26913" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.85561,98.609587)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26915" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.64675,95.536323)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26917" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.88588,66.792578)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26919" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.20914,43.457729)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26921" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.7775,59.436448)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26923" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.42544,67.928941)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26925" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.39275,56.094044)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26927" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.32934,47.507026)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26929" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.96646,52.423282)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26931" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.21976,74.8022)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26933" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.88266,41.815936)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26935" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.24918,78.518997)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26937" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.39568,89.980882)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26939" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.42916,94.635184)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26941" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.71388,88.271429)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26943" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.32837,88.617969)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26945" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.36292,61.565947)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26947" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.03473,80.857534)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26949" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.02853,59.90518)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26951" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.85935,46.662372)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26953" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.90877,86.371204)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26955" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.34812,58.661015)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26957" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.15893,64.234779)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26959" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.59054,92.636764)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26961" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.40673,81.751939)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26963" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.53017,98.088555)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26965" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.48704,62.034599)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26967" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.83137,51.828938)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26969" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.006,73.061615)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26971" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.07541,75.576698)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26973" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.65465,58.645614)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26975" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.86415,95.785422)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26977" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.88074,52.043047)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26979" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.30588,68.913181)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26981" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.2829,73.774293)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26983" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.80454,68.145279)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26985" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.17494,67.113967)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26987" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.66985,54.392166)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient26989" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.88847,93.637588)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient26991" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.03066,73.675414)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient26993" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.06557,55.925664)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient26995" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.5447,83.559618)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient26997" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.71731,50.554901)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient26999" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.07803,65.559852)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27001" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-176.45447,90.161169)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27003" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.7531,48.033577)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27005" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.16031,47.967923)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27007" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.53537,53.997638)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27009" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.47562,89.229685)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27011" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.26156,83.952679)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27013" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.68998,56.521744)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27015" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.86286,69.171286)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27017" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.54466,89.382028)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27019" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.08195,46.87524)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27021" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.0621,87.935662)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27023" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.3626,52.442573)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27025" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.42473,76.507755)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27027" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.53228,72.686821)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27029" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.29684,96.025376)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27031" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-168.88852,72.260417)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27033" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.49294,81.663317)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27035" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.70952,82.014123)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27037" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.67126,94.803721)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27039" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.63545,67.542586)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27041" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.92638,95.414083)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27043" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.70623,91.7262)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27045" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.37697,79.695679)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27047" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.20392,93.233867)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27049" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.71903,60.287723)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27051" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.02161,76.867306)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27053" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.42568,55.353147)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27055" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.92188,63.576552)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27057" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.9187,92.942361)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27059" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.39752,51.243918)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27061" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.69192,59.804687)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27063" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.51508,65.169586)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27065" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.25668,71.859799)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27067" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.18018,47.753546)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27069" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.48528,86.274435)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27071" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.60975,90.283974)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27073" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.0405,47.926017)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27075" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.33325,65.496812)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27077" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.81389,56.478834)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27079" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.49509,92.598888)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27081" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.13202,75.764768)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27083" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.65004,53.119399)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27085" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-168.30515,71.365268)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27087" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.84295,96.176021)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27089" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.09341,43.681222)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27091" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.76605,102.45759)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27093" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.26758,59.881431)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27095" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.13229,99.369038)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27097" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.98228,83.05717)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27099" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.51677,73.080526)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27101" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.83872,53.045346)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27103" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.76763,93.592923)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27105" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.85753,47.641127)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27107" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.58626,50.668684)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27109" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.4069,81.262723)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27111" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.24921,79.5565)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27113" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.24494,71.067549)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27115" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.75189,50.231633)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27117" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.24434,67.14382)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27119" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.39405,69.786388)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27121" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.87732,88.400952)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27123" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.01247,45.337134)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27125" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.39061,93.604926)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27127" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.48454,50.217383)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27129" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.39395,51.765841)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27131" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.25533,56.205039)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27133" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.47816,62.048213)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27135" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.50064,52.310424)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27137" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.06861,81.446812)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27139" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.44734,90.179264)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27141" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.19114,56.493832)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27143" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.63145,73.571373)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27145" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.76286,73.427755)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27147" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.35129,69.495692)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27149" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.69785,71.126726)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27151" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.1162,78.513566)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27153" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.80517,67.452178)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27155" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.05264,98.221228)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27157" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.33798,52.073688)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27159" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.4885,49.09578)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27161" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.91622,66.613438)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27163" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.55953,62.212819)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27165" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.40228,58.703143)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27167" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.44557,61.922664)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27169" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.75543,55.062425)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27171" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.79794,56.817966)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27173" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.80249,46.383038)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27175" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.45649,79.39155)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27177" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.65817,98.525973)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27179" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.49252,86.65376)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27181" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.03005,63.616941)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27183" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.60675,86.836585)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27185" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.46391,61.275552)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27187" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.40339,103.07046)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27189" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.53363,47.761835)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27191" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.0782,91.999649)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27193" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.75617,57.089151)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27195" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.69444,79.661631)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27197" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.30338,49.239175)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27199" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.8518,65.758393)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27201" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.25918,65.382044)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27203" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.32333,56.70231)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27205" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.91028,75.726513)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27207" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.59383,70.351584)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27209" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.1034,54.435877)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27211" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.51601,95.192673)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27213" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.43965,80.028121)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27215" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.59322,76.343647)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27217" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.18344,47.610142)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27219" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.39095,43.639795)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27221" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.92671,68.771652)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27223" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.21166,92.648675)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27225" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.17735,71.794053)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27227" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.63236,47.52766)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27229" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.16081,44.41662)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27231" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.00261,90.128253)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27233" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.92227,43.55991)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27235" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.32533,49.972242)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27237" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.10997,89.14704)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27239" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.30227,60.285538)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27241" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.76842,77.390421)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27243" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.6665,62.558809)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27245" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.38184,82.872731)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27247" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.61765,96.52765)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27249" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.72541,51.47113)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27251" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.54138,53.545465)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27253" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.86173,52.774178)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27255" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.71077,43.880661)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27257" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.09393,89.496547)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27259" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.06203,66.59722)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27261" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.48757,91.970496)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27263" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.06744,64.277019)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27265" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.99988,52.392496)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27267" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.04893,50.604921)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27269" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.65616,73.939693)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27271" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.01359,69.767063)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27273" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.78541,97.601017)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27275" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.97623,59.497332)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27277" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.62014,72.269821)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27279" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.66247,76.179903)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27281" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.49072,44.982129)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27283" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.04212,91.48411)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27285" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.30554,82.579974)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27287" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.03744,54.986725)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27289" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.36851,70.543028)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27291" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.97446,50.204559)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27293" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.93491,65.972144)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27295" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.37111,77.804346)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27297" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.81671,69.086974)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27299" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.38225,78.498775)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27301" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.91362,60.616454)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27303" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.66797,46.953719)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27305" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.55395,70.518223)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27307" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.07622,83.963307)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27309" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.87336,58.408898)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27311" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.1624,69.371136)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27313" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.19766,61.537071)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27315" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.24193,92.054032)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27317" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.57792,85.804146)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27319" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.91185,72.680429)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27321" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.21114,54.390718)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27323" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.425,58.312746)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27325" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.75555,54.81788)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27327" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.02179,89.657359)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27329" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.34862,76.778873)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27331" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-169.69843,96.395674)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27333" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.41247,98.459073)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27335" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-205.64167,99.407929)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27337" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.55057,71.155806)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27339" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.99484,42.637907)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27341" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.28505,55.87091)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27343" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.59065,90.220947)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27345" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.80267,84.26335)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27347" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.0481,69.504368)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27349" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.70248,70.584924)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27351" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.60597,71.929613)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27353" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.26451,61.650553)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27355" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.07096,61.27863)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27357" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.51102,59.166309)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27359" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.7622,71.153328)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27361" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.03042,69.238498)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27363" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.0127,72.966632)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27365" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.16327,93.601756)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27367" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.65317,86.450568)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27369" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.63188,88.665087)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27371" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.79384,53.28071)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27373" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-172.74532,63.571401)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27375" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.36995,98.386192)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27377" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.87674,71.675146)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27379" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-177.63154,56.464275)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27381" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-226.30959,100.32155)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27383" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.89624,76.824878)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27385" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.89333,59.036414)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27387" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.15441,79.028562)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27389" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.17175,82.356747)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27391" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.40338,71.852443)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27393" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.32571,78.574712)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27395" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.27469,82.10326)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27397" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.74472,92.858382)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27399" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.39287,43.722363)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27401" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.91341,58.102918)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27403" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.0014,102.05417)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27405" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.70591,86.082562)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27407" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.67988,73.064213)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27409" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.69945,93.694066)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27411" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.81662,92.427571)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27413" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.6518,97.097598)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27415" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.17079,99.725263)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27417" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.32322,57.339996)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27419" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.08888,90.37825)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27421" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.81039,97.796346)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27423" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.75166,49.166841)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27425" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.59494,76.576066)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27427" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.15051,97.084599)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27429" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.48403,101.42318)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27431" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.43478,67.779459)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27433" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.22419,53.68767)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27435" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.39505,77.294326)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27437" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.41919,63.575869)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27439" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.78438,100.27467)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27441" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.61177,77.533893)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27443" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-248.64022,70.853269)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27445" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-194.55297,95.290354)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27447" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.07855,79.238468)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27449" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.65079,77.687797)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27451" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.02062,95.590901)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27453" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.96278,49.586168)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27455" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.76927,45.050973)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27457" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.51603,60.583904)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27459" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.6906,62.896975)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27461" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.38112,93.672405)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27463" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.79225,91.745447)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27465" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.44269,51.903418)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27467" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.81928,67.525668)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27469" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.72833,73.448474)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27471" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.40508,60.974073)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27473" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.05455,87.628991)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27475" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-214.93588,99.420661)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27477" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.88648,81.120501)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27479" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.86504,86.770173)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27481" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.13681,93.182029)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27483" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.73521,43.869682)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27485" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.0881,84.61171)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27487" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.46233,54.843602)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27489" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.6321,73.541725)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27491" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.32357,55.670436)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27493" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.91557,46.204655)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27495" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.9719,91.231164)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27497" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.69165,59.134301)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27499" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-204.46456,65.903504)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27501" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.46929,90.501004)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27503" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.24033,81.588013)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27505" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.82874,79.876219)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27507" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.42978,93.090415)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27509" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.61435,90.058372)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27511" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.98492,100.36541)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27513" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.9321,48.867215)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27515" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-221.90345,55.127806)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27517" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.50047,56.752685)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27519" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.57486,42.693569)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27521" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.24764,56.266412)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27523" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.66904,75.110959)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27525" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.52155,62.944166)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27527" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.6552,81.070833)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27529" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.68383,61.281742)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27531" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.22425,49.58798)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27533" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.5244,86.671087)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27535" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.15446,47.974507)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27537" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-179.76731,79.287042)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27539" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.15219,46.775348)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27541" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-170.08445,95.691504)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27543" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.70082,55.18296)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27545" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-235.3063,79.701222)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27547" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-173.49142,61.200645)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27549" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.76269,63.163291)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27551" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.04973,55.765566)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27553" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.38488,76.892807)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27555" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-192.26932,93.768386)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27557" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-206.22819,47.398248)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27559" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.57728,63.124516)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27561" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.63133,50.924622)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27563" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-181.13129,45.932102)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27565" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.04168,82.928417)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27567" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.8057,74.82315)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27569" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.39228,70.354617)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27571" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.13287,61.835684)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27573" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.60438,69.14573)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27575" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.81305,49.90574)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27577" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.21594,91.217105)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27579" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.19728,84.062432)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27581" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.9291,92.821144)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27583" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-174.03933,58.077371)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27585" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-259.60605,49.964956)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27587" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.38271,65.26114)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27589" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.78933,53.963431)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27591" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-222.30792,89.913488)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27593" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.44719,64.11581)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27595" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.51248,92.923726)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27597" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.3718,63.91343)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27599" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.42852,92.383231)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27601" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-197.76597,73.805175)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27603" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.96429,98.739247)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27605" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.5644,67.666933)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27607" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.17004,83.93924)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27609" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.16036,64.890456)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27611" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.18946,50.145956)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27613" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.60101,93.847542)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27615" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.13068,83.539022)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27617" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-237.16829,96.832506)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27619" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.0358,102.55861)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27621" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.50379,92.037363)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27623" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.71694,50.290692)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27625" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.47726,61.12236)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27627" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-220.67564,85.75803)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27629" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.99966,93.434097)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27631" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.09472,77.736566)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27633" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.51741,86.140447)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27635" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-255.83897,90.975822)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27637" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.21035,74.418667)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27639" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.86655,42.609709)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27641" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.6819,88.413202)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27643" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.87855,53.0696)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27645" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.77414,100.67582)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27647" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.3602,81.96574)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27649" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.09159,47.566903)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27651" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-244.68274,79.474551)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27653" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.48495,94.626364)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27655" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-230.37711,46.555566)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27657" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-207.8809,69.086841)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27659" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.6635,60.352803)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27661" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-199.95466,72.099926)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27663" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.21111,88.011876)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27665" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-228.83231,53.316376)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27667" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-251.84369,65.005735)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27669" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-217.9989,84.981571)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27671" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.58639,90.28221)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27673" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.47176,73.80615)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27675" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.75774,91.16306)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27677" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.16251,77.140677)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27679" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.52545,61.924834)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27681" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.0902,47.953693)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27683" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-224.93112,65.923658)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27685" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-182.70327,50.510667)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27687" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.52473,96.774009)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27689" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.08273,85.522736)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27691" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-254.53941,71.551229)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27693" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.45404,70.624355)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27695" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-219.9827,86.295303)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27697" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.54892,92.148972)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27699" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.9395,55.93824)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27701" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.46854,45.740705)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27703" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.59022,53.978766)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27705" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.99056,75.23682)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27707" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-195.6356,50.811083)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27709" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.03312,97.129739)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27711" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.53792,97.993185)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27713" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-201.83949,92.077517)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27715" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.1949,48.230903)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27717" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.80275,63.060718)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27719" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-236.97292,71.188488)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27721" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.14657,68.359108)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27723" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-252.42977,50.332265)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27725" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.24824,73.086246)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27727" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.76036,51.632528)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27729" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.27915,51.806225)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27731" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.78673,89.143551)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27733" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-246.85919,71.873986)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27735" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.70566,42.473075)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27737" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-223.34795,53.497344)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27739" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.79936,49.45235)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27741" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.00608,48.228358)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27743" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-180.05346,52.476784)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27745" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-188.12808,54.081591)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27747" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.12163,60.597171)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27749" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.42381,59.130803)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27751" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.10873,63.050103)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27753" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.32857,55.884135)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27755" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.70162,54.331071)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27757" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-233.56882,84.0983)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27759" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.36178,46.74517)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27761" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-245.78346,50.453108)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27763" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.92705,87.02696)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27765" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.25513,53.96114)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27767" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.08563,91.112785)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27769" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-250.58453,74.274969)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27771" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.62858,65.665589)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27773" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.65329,79.940039)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27775" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-242.76626,77.12677)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27777" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.29766,67.797527)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27779" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.80633,45.766603)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27781" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.01509,96.010002)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27783" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-256.83557,56.520808)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27785" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.34907,95.535144)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27787" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-234.79617,96.412337)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27789" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-243.46954,66.478543)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27791" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-239.44943,89.33075)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27793" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-210.67063,68.294369)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27795" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-196.01207,61.20943)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27797" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-183.73846,87.445554)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27799" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-198.91904,70.247864)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27801" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-253.48082,99.563156)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27803" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.4407,45.611464)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27805" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-175.85378,66.384985)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27807" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.52721,46.698474)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27809" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-231.80022,47.896807)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27811" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-258.80727,102.88663)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27813" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-193.76038,73.863831)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27815" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.93098,47.204356)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27817" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.6804,65.256119)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27819" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-200.22945,55.767241)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27821" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-187.54617,48.169583)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27823" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-184.51632,77.705709)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27825" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.52519,80.579242)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27827" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.0888,93.519977)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27829" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-227.76835,93.562585)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27831" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-189.36747,60.812258)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27833" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-240.29986,51.075908)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27835" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.85083,56.279579)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27837" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.33677,64.543745)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27839" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.11549,62.724424)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27841" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-171.11813,68.243802)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27843" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-229.9637,81.829271)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27845" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.71646,80.73381)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27847" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.97031,59.434907)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27849" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-215.03427,47.761811)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27851" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.2947,83.727191)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27853" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-218.08309,98.542115)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27855" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.91882,68.097545)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27857" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.72297,62.6757)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27859" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-257.77392,49.448992)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27861" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-202.44367,88.139277)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27863" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-247.07915,68.960728)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27865" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.11148,71.847331)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27867" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-211.72353,74.3722)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27869" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-209.20403,73.58001)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27871" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-241.05235,102.50404)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27873" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-212.43746,85.588314)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27875" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.6801,69.436624)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27877" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-238.46415,55.915574)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27879" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.24972,91.450947)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27881" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-232.67721,79.344433)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27883" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-169.30184,50.246818)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27885" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-190.80369,91.46636)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27887" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-191.87594,52.952389)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27889" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-178.79273,64.86767)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27891" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-186.33654,86.19453)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27893" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-249.07836,54.07525)"/>
+    <linearGradient x1="-287.55518" y1="52.066509" x2="-224.06104" y2="52.066509" id="linearGradient27895" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-216.99045,71.632159)"/>
+    <linearGradient x1="-281.29733" y1="56.950672" x2="-165.60368" y2="56.950672" id="linearGradient27897" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-213.6111,98.159425)"/>
+    <linearGradient x1="-303.8866" y1="63.208508" x2="-188.19296" y2="63.208508" id="linearGradient27899" xlink:href="#linearGradient17383" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-185.45905,77.759546)"/>
+    <linearGradient x1="-287.55518" y1="71.908424" x2="-224.06104" y2="71.908424" id="linearGradient27901" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-203.7514,72.150342)"/>
+    <linearGradient x1="-281.29733" y1="76.792587" x2="-165.60368" y2="76.792587" id="linearGradient27903" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-208.73003,67.384443)"/>
+    <linearGradient x1="-303.8866" y1="83.050423" x2="-188.19296" y2="83.050423" id="linearGradient27905" xlink:href="#linearGradient17395" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0.1674014,0,0,0.1674014,-225.42247,74.315027)"/>
+    <filter id="filter27927">
+      <feGaussianBlur id="feGaussianBlur27929" stdDeviation="0.071512502" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="59.983643" cy="120.82638" r="29.457615" fx="59.983643" fy="120.82638" id="radialGradient27939" xlink:href="#linearGradient27933" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.8793038,-5.0037745e-7,5.9254638e-8,0.2083586,-52.74385,95.651194)"/>
+    <filter height="2.1329556" y="-0.56647772" width="1.1115345" x="-0.055767238" id="filter27965">
+      <feGaussianBlur id="feGaussianBlur27967" stdDeviation="1.3689748" inkscape:collect="always"/>
+    </filter>
+    <linearGradient x1="-80.095642" y1="78.43882" x2="-89.987785" y2="115.78114" id="linearGradient27979" xlink:href="#linearGradient27973" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0103538,0,-1.3128784)"/>
+    <linearGradient x1="86.693916" y1="100.83184" x2="90.051781" y2="100.83184" id="linearGradient27989" xlink:href="#linearGradient27983" gradientUnits="userSpaceOnUse" gradientTransform="translate(1,0)"/>
+    <filter height="1.0452234" y="-0.022611663" width="1.5097902" x="-0.25489509" id="filter28003">
+      <feGaussianBlur id="feGaussianBlur28005" stdDeviation="0.35662617" inkscape:collect="always"/>
+    </filter>
+    <filter height="1.203077" y="-0.10153846" width="1.2933333" x="-0.14666668" id="filter28031">
+      <feGaussianBlur id="feGaussianBlur28033" stdDeviation="0.55" inkscape:collect="always"/>
+    </filter>
+    <clipPath id="clipPath28041">
+      <rect width="8" height="12" rx="1.079258" ry="1.079258" x="12" y="12" id="rect28043" style="opacity:0.18359375;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    </clipPath>
+    <clipPath id="clipPath28045">
+      <rect width="8" height="12" rx="1.079258" ry="1.079258" x="12" y="12" id="rect28047" style="opacity:0.18359375;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    </clipPath>
+    <filter id="filter28101">
+      <feGaussianBlur id="feGaussianBlur28103" stdDeviation="0.04177847" inkscape:collect="always"/>
+    </filter>
+    <radialGradient cx="16" cy="18" r="4" fx="16" fy="18" id="radialGradient28110" xlink:href="#linearGradient28077" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.5,0,-9)"/>
+    <linearGradient x1="16" y1="1.5952783" x2="16" y2="18.75548" id="linearGradient28112" xlink:href="#linearGradient28049" gradientUnits="userSpaceOnUse"/>
+    <radialGradient cx="14" cy="19.699831" r="2.1500001" fx="14" fy="18.836424" id="radialGradient28114" xlink:href="#linearGradient28069" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.1062878,0,0,1.1062878,0.547091,-2.2994329)"/>
+    <linearGradient x1="11.917725" y1="17.560907" x2="11.917725" y2="20.038458" id="linearGradient28116" xlink:href="#linearGradient28059" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.1062878,0,0,1.1062878,0.547091,-2.2994329)"/>
+    <linearGradient x1="60.25" y1="122.00736" x2="60.25" y2="118.5" id="linearGradient28138" xlink:href="#linearGradient28132" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,1.0103538,0,-1.3128784)"/>
+    <linearGradient id="linearGradient3207">
+      <stop id="stop3209" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3211" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient5433">
+      <stop id="stop5435" style="stop-color:#ea3838;stop-opacity:1" offset="0"/>
+      <stop id="stop5437" style="stop-color:#c40000;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient2922">
+      <stop id="stop2924" style="stop-color:#000000;stop-opacity:1" offset="0"/>
+      <stop id="stop2926" style="stop-color:#515151;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3325">
+      <stop id="stop3327" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3329" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3623">
+      <stop id="stop3625" style="stop-color:#ffffff;stop-opacity:0.68345326" offset="0"/>
+      <stop id="stop3627" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient5826">
+      <stop id="stop5828" style="stop-color:#980000;stop-opacity:1" offset="0"/>
+      <stop id="stop5830" style="stop-color:#db5c5c;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3058">
+      <stop id="stop3060" style="stop-color:#9a7600;stop-opacity:1" offset="0"/>
+      <stop id="stop3066" style="stop-color:#e3ad00;stop-opacity:1" offset="0.09292036"/>
+      <stop id="stop3070" style="stop-color:#ffcd2c;stop-opacity:1" offset="0.5043171"/>
+      <stop id="stop3068" style="stop-color:#e3ad00;stop-opacity:1" offset="0.91571385"/>
+      <stop id="stop3062" style="stop-color:#b98d00;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient7364">
+      <stop id="stop7366" style="stop-color:#d4a100;stop-opacity:0.97647059" offset="0"/>
+      <stop id="stop7368" style="stop-color:#ffc712;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient2598">
+      <stop id="stop2600" style="stop-color:#252525;stop-opacity:1" offset="0"/>
+      <stop id="stop2606" style="stop-color:#252525;stop-opacity:1" offset="0.29354507"/>
+      <stop id="stop2608" style="stop-color:#252525;stop-opacity:1" offset="0.45366704"/>
+      <stop id="stop2602" style="stop-color:#000000;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient2257">
+      <stop id="stop2259" style="stop-color:#b4942a;stop-opacity:1" offset="0"/>
+      <stop id="stop2261" style="stop-color:#e4dcc9;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <radialGradient cx="305.02731" cy="-349" r="34.178398" id="path2489_1_" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1.1658,0,0,-1,-353.77589,-376.98677)">
+      <stop id="stop44" style="stop-color:#4b73ad;stop-opacity:1" offset="0"/>
+      <stop id="stop46" style="stop-color:#80b3ff;stop-opacity:1" offset="1"/>
+    </radialGradient>
+    <radialGradient cx="354.85159" cy="-426" r="34.1791" id="path4248_1_" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,-359.20739,-378.98677)">
+      <stop id="stop38" style="stop-color:#538bcf;stop-opacity:1" offset="0"/>
+      <stop id="stop40" style="stop-color:#80b3ff;stop-opacity:1" offset="1"/>
+    </radialGradient>
+    <radialGradient cx="354.85159" cy="-426" r="34.1791" id="path2471_1_" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-1,-359.20739,-376.98677)">
+      <stop id="stop32" style="stop-color:#538bcf;stop-opacity:1" offset="0"/>
+      <stop id="stop34" style="stop-color:#80b3ff;stop-opacity:1" offset="1"/>
+    </radialGradient>
+    <linearGradient x1="354.68549" y1="-601.27588" x2="354.68549" y2="-503.146" id="front_1_" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1,0,0,-0.6522,-359.42609,-340.63827)">
+      <stop id="stop20" style="stop-color:#b3d9ff;stop-opacity:1" offset="0"/>
+      <stop id="stop22" style="stop-color:#71a8f5;stop-opacity:1" offset="0.48629999"/>
+      <stop id="stop24" style="stop-color:#2c72c7;stop-opacity:1" offset="0.79879999"/>
+      <stop id="stop26" style="stop-color:#2c72c7;stop-opacity:1" offset="0.98000002"/>
+      <stop id="stop28" style="stop-color:#deebff;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient x1="63.4995" y1="-79.239304" x2="63.4995" y2="9.3268995" id="XMLID_1_" gradientUnits="userSpaceOnUse" gradientTransform="translate(-68.240592,44.013228)">
+      <stop id="stop6" style="stop-color:#73a3e7;stop-opacity:1" offset="0"/>
+      <stop id="stop8" style="stop-color:#83b1f5;stop-opacity:1" offset="0.13940001"/>
+      <stop id="stop10" style="stop-color:#bcd6fc;stop-opacity:1" offset="0.3689"/>
+      <stop id="stop12" style="stop-color:#659fee;stop-opacity:1" offset="0.5007"/>
+      <stop id="stop14" style="stop-color:#0066ff;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient x1="305.35327" y1="-33.695843" x2="273.56915" y2="122.91273" id="linearGradient3377" xlink:href="#linearGradient3303" gradientUnits="userSpaceOnUse"/>
+    <clipPath id="clipPath3367">
+      <path d="M 240.04888,9 C 237.09544,9 234.6888,11.347166 234.6888,14.32684 L 234.6888,111.25905 L 245.32884,121.91273 L 341.32804,121.91273 C 344.28149,121.91273 346.68786,119.56556 346.68786,116.58615 L 346.68786,14.32684 C 346.68786,11.347166 344.28149,9 341.32804,9 L 240.04888,9 z" id="path3369" style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"/>
+    </clipPath>
+    <linearGradient x1="-97.742668" y1="1937.9885" x2="-97.742668" y2="1895.421" id="linearGradient3359" xlink:href="#linearGradient3174" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.5599786,0,0,2.5827101,158.24797,-4821.2784)"/>
+    <linearGradient x1="-44.117901" y1="127.91319" x2="-43.770939" y2="119.03187" id="linearGradient3323" xlink:href="#linearGradient3317" gradientUnits="userSpaceOnUse"/>
+    <linearGradient x1="-44.802357" y1="71.894066" x2="-44.802357" y2="130.6806" id="linearGradient3309" xlink:href="#linearGradient3303" gradientUnits="userSpaceOnUse"/>
+    <linearGradient x1="92.574883" y1="122.13094" x2="53.747078" y2="76.315697" id="linearGradient3293" xlink:href="#linearGradient3270" gradientUnits="userSpaceOnUse" gradientTransform="translate(-106.875,0)"/>
+    <clipPath id="clipPath3289">
+      <path d="M -69.78125,80 C -70.381154,80 -70.875,80.470333 -70.875,81.0625 L -70.875,122.9375 C -70.875,123.52967 -70.381154,124 -69.78125,124 L -9.09375,124 C -8.493846,124 -8.000004,123.52967 -8,122.9375 L -8,81.0625 C -8,80.470333 -8.493846,80 -9.09375,80 L -69.78125,80 z" id="path3291" style="opacity:1;fill:url(#linearGradient3293);fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"/>
+    </clipPath>
+    <linearGradient x1="92.574883" y1="122.13094" x2="53.747078" y2="76.315697" id="linearGradient3285" xlink:href="#linearGradient3270" gradientUnits="userSpaceOnUse" gradientTransform="translate(-106.875,0)"/>
+    <linearGradient x1="92.574883" y1="122.13094" x2="53.747078" y2="76.315697" id="linearGradient3276" xlink:href="#linearGradient3270" gradientUnits="userSpaceOnUse"/>
+    <linearGradient x1="-97.742668" y1="1937.9885" x2="-97.742668" y2="1895.421" id="linearGradient5823" xlink:href="#linearGradient3174" gradientUnits="userSpaceOnUse" gradientTransform="matrix(2.5599786,0,0,2.5827101,325.24891,-4887.3657)"/>
+    <linearGradient id="linearGradient3163">
+      <stop id="stop3165" style="stop-color:#6b696a;stop-opacity:1" offset="0"/>
+      <stop id="stop3167" style="stop-color:#6b696a;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient5810">
+      <stop id="stop5812" style="stop-color:#2e2a2b;stop-opacity:1" offset="0"/>
+      <stop id="stop5814" style="stop-color:#4c494a;stop-opacity:1" offset="0.33497536"/>
+      <stop id="stop5816" style="stop-color:#5b595a;stop-opacity:1" offset="0.66748768"/>
+      <stop id="stop5818" style="stop-color:#6b696a;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3206">
+      <stop id="stop3208" style="stop-color:#e3e2e6;stop-opacity:1" offset="0"/>
+      <stop id="stop3216" style="stop-color:#000000;stop-opacity:0.5411765" offset="0.5"/>
+      <stop id="stop3210" style="stop-color:#000000;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3270">
+      <stop id="stop3272" style="stop-color:#a0a1a5;stop-opacity:1" offset="0"/>
+      <stop id="stop3274" style="stop-color:#ffffff;stop-opacity:1" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3303">
+      <stop id="stop3305" style="stop-color:#ffffff;stop-opacity:1" offset="0"/>
+      <stop id="stop3307" style="stop-color:#ffffff;stop-opacity:0" offset="1"/>
+    </linearGradient>
+    <linearGradient id="linearGradient3448">
+      <stop id="stop3450" style="stop-color:#cac7dc;stop-opacity:1" offset="0"/>
+      <stop id="stop3452" style="stop-color:#cac7dc;stop-opacity:0" offset="1"/>
+    </linearGradient>
+  </defs>
+  <rect width="58.91523" height="5.7999449" rx="0.72191608" ry="0.28855881" x="30.526026" y="117.92641" transform="matrix(1,0,0,1.0103538,0,-1.3128784)" id="rect27931" style="opacity:1;fill:url(#radialGradient27939);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter27965)"/>
+  <path d="M 16,121 L 30,121 L 30,120 L 88.2,120 L 88.2,121 L 116,121 L 116,117 L 12.710706,110.00228 L 16,121 z" id="path3507" style="fill:url(#radialGradient3583);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3565)"/>
+  <path d="M 16,121 L 30,121 L 30,120 L 90,120 L 90,121 L 119,121 L 119,117 L 12.710706,116.00228 L 16,121 z" id="path3390" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3444)"/>
+  <path d="M 11.361024,8 C 9.552302,8 8,9.625443 8.00094,11.32684 L 8.00094,110.25905 L 18.640979,120.91273 L 116.64018,120.91273 C 119.59363,120.91273 120,120.56556 120,117.58615 L 120,11.32684 C 120,9.513864 118.44194,8 116.64018,8 L 11.361024,8 z" id="rect2169" style="opacity:1;fill:url(#linearGradient3250);fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"/>
+  <path d="M 24.693828,-69.480939 L 24.693828,-12.824689 L 102.79383,-12.824689 L 102.79383,-69.480939 L 24.693828,-69.480939 z" transform="translate(0.3,76.483371)" clip-path="url(#clipPath3008)" id="rect2379" style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3105)"/>
+  <rect width="76" height="54" rx="1.2345035" ry="1.2345035" x="26" y="8" id="rect3325" style="opacity:1;fill:url(#radialGradient3083);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"/>
+  <rect width="3.8491483" height="53.921757" rx="0.92457408" ry="0.92457408" x="26.150852" y="8" id="rect3490" style="opacity:0.61328125;fill:#cfdce7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <rect width="3.7944784" height="53.467316" rx="0.89723921" ry="0.92457408" x="98" y="8.5" id="rect3488" style="opacity:0.546875;fill:#cfdce7;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <rect width="75.091873" height="0.7289294" x="26.018856" y="63.416855" id="rect3109" style="opacity:1;fill:url(#radialGradient3117);fill-opacity:1;stroke:none;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter3726)"/>
+  <path d="M 12.375,-168.28125 C 9.4215521,-168.28125 8,-167.91718 8,-164.9375 L 8,-164.15625 C 8,-167.13593 9.4215521,-167.46875 12.375,-167.46875 L 115.625,-167.46875 C 118.57845,-167.46875 120,-167.13593 120,-164.15625 L 120,-164.9375 C 120,-167.91718 118.57845,-168.28125 115.625,-168.28125 L 12.375,-168.28125 z" transform="translate(0,176.85148)" clip-path="url(#clipPath3215)" id="path3209" style="opacity:1;fill:#000000;fill-opacity:0.35840705;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3371)"/>
+  <path d="M 11.375,8.600468 C 9.318588,8.707659 8,9.305748 8,11.912968 L 8,12.506718 C 8,9.527038 9.421552,9.194218 12.375,9.194218 L 115.625,9.194218 C 118.57845,9.194218 120,9.527038 120,12.506718 L 120,11.912968 C 120,8.933288 118.57845,8.600468 115.625,8.600468 L 12.375,8.600468 C 12.005819,8.600468 11.668773,8.585159 11.375,8.600468 z" id="path3381" style="opacity:1;fill:#ffffff;fill-opacity:0.46902651;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3417)"/>
+  <path d="M 104.309,8.626039 C 104.20787,8.626039 104.12054,8.662959 104.02775,8.688539 C 103.92346,8.717289 103.83617,8.757269 103.7465,8.813539 C 103.66099,8.867209 103.59613,8.926839 103.52775,9.001039 C 103.49917,9.032049 103.45912,9.060729 103.434,9.094789 C 103.4003,9.135389 103.36852,9.175429 103.34025,9.219789 C 103.24682,9.388799 103.184,9.576909 103.184,9.782289 L 103.184,61.157289 L 103.59025,61.157289 L 103.59025,9.782289 C 103.59025,9.570869 103.67915,9.392209 103.77775,9.219789 L 115.68399,9.219789 C 118.63744,9.219789 120.05899,9.552609 120.05899,12.532289 L 120.05899,11.938539 C 120.05899,9.331319 118.74326,8.761729 116.68399,8.657289 L 104.559,8.657289 C 104.61259,8.649219 104.65932,8.626039 104.71525,8.626039 L 104.309,8.626039 z M 11.090247,8.657289 C 9.465055,8.810999 8.128281,9.431649 8.090247,11.532289 C 8.211314,9.472429 9.849731,9.219789 12.433997,9.219789 L 24.433997,9.219789 C 24.540585,9.397089 24.590247,9.593059 24.590247,9.813539 L 24.590247,61.188539 L 24.996497,61.188539 L 24.996497,9.813539 C 24.996497,9.593059 24.946836,9.397089 24.840247,9.219789 C 24.794983,9.144499 24.744424,9.063799 24.683997,9.001039 C 24.59027,8.895459 24.46525,8.810179 24.340247,8.751039 C 24.223908,8.695989 24.105809,8.657289 23.965247,8.657289 L 23.465247,8.657289 L 11.090247,8.657289 z M 8.090247,11.532289 C 8.087808,11.667029 8.058997,11.791209 8.058997,11.938539 L 8.058997,12.532289 C 8.058997,12.159829 8.072952,11.826559 8.090247,11.532289 z" id="path3423" style="opacity:0.26953125;fill:url(#linearGradient3453);fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1;filter:url(#filter3417)"/>
+  <path d="M 115.43114,8.6 C 118.38459,8.6 119.20614,8.932826 119.20614,11.9125 L 119.20614,115.19375 C 119.20614,118.17316 116.38459,120.50625 113.43114,120.50625 L 114.14989,120.50625 C 117.10334,120.50625 119.49364,118.17316 119.49364,115.19375 L 119.49364,11.9125 C 119.49364,8.932826 119.10334,8.6 116.14989,8.6 L 115.43114,8.6 z" id="path3455" style="opacity:1;fill:url(#linearGradient3474);fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"/>
+  <path d="M 32,16.122507 L 32,20.076133 L 96,20.076133 L 96,16.122507 L 32,16.122507 z" id="path3476" style="opacity:0.56521738;fill:#b2c6d9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+  <path d="M 32.031703,32.228578 L 32.031703,36.118982 L 96.0317,36.118982 L 96.0317,32.228578 L 32.031703,32.228578 z" id="path3478" style="opacity:0.56521738;fill:#b2c6d9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+  <path d="M 32,48.202135 L 32,52.202135 L 96,52.202135 L 96,48.202135 L 32,48.202135 z" id="path3480" style="opacity:0.56521738;fill:#b2c6d9;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"/>
+  <path d="M 101.42263,8 L 101.42263,61.80625 C 101.60563,61.704641 101.71697,61.555253 101.82888,61.40625 L 101.82888,8 L 101.42263,8 z" id="rect3492" style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <path d="M 26.108963,8 L 26.12263,61.300619 C 26.225712,61.500509 26.375099,61.638659 26.52888,61.770949 L 26.515213,8 L 26.108963,8 z" id="path3497" style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <path d="M 16.78125,130.4375 C 15.2983,130.4375 14.125,131.64205 14.125,133.125 L 14.125,175.15625 C 14.125,176.6392 15.298301,177.8125 16.78125,177.8125 L 16.9375,177.8125 C 16.529729,177.36613 16.25,176.78074 16.25,176.125 L 16.25,136.15625 C 16.25,134.76494 17.362011,133.625 18.75,133.625 L 84.34375,133.625 C 85.731742,133.625 86.84375,134.76494 86.84375,136.15625 L 86.84375,176.125 C 86.843752,176.78074 86.595271,177.36613 86.1875,177.8125 L 86.3125,177.8125 C 87.79545,177.8125 89.000002,176.6392 89,175.15625 L 89,133.125 C 89,131.64205 87.795451,130.4375 86.3125,130.4375 L 16.78125,130.4375 z" transform="translate(16.391305,-52.350088)" clip-path="url(#clipPath3199)" id="rect3626" style="fill:url(#linearGradient3712);fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter3659)"/>
+  <path d="M 34.53781,80.00784 C 33.118602,80.00784 31.97531,81.15113 31.97531,82.57034 L 32,119.71658 L 104,119.71658 L 103.97531,82.57034 C 103.97531,81.15113 102.83202,80.00784 101.41281,80.00784 L 34.53781,80.00784 z" id="path3680" style="opacity:1;fill:#000000;fill-opacity:0.12831858;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <path d="M 34.581018,80.0708 C 33.16181,80.0708 32.018518,81.2141 32.018518,82.6333 L 32.018518,119.81658 L 104,119.7 L 104,82.51672 C 104,81.09752 102.85671,79.95422 101.4375,79.95422 L 34.581018,80.0708 z" id="path3694" style="opacity:0.07421875;fill:url(#radialGradient3704);fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <path d="M 52.9375,84 C 52.41795,84 52,84.417953 52,84.9375 L 52,108 L 40.9375,108 C 40.41795,108 40,108.41795 40,108.9375 L 40,115.0625 C 40,115.58205 40.417949,116 40.9375,116 L 52.9375,116 L 63.0625,116 C 63.58205,116 64,115.58205 64,115.0625 L 64,108.9375 L 64,84.9375 C 64,84.41795 63.582051,84 63.0625,84 L 52.9375,84 z" transform="matrix(1,0,0,1.0103538,0,-1.3128784)" id="rect3226" style="opacity:1;fill:url(#linearGradient3281);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter3271)"/>
+  <rect width="69.516342" height="1.4999924" x="33.008656" y="77.600006" id="rect3669" style="opacity:0.37771738;fill:url(#radialGradient3692);fill-opacity:1;stroke:none;stroke-width:0.69999999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <path d="M 103.91096,8.735486 L 103.16096,9.422986 L 104.09846,9.485486 L 103.91096,8.735486 z" id="path3086" style="fill:url(#radialGradient3094);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3120)"/>
+  <path d="M 23.91096,8.7354857 L 23.16096,9.4229857 L 24.09846,9.4854857 L 23.91096,8.7354857 z" transform="matrix(-1,0,0,1,48.05942,0)" id="path3124" style="fill:url(#radialGradient3126);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3120)"/>
+  <path d="M 112.08125,97.375 L 112.08125,104.09375 L 110.8625,104.09375 L 109.83125,104.09375 L 114.175,111.625 L 118.51875,104.09375 L 117.4875,104.09375 L 116.26875,104.09375 L 116.26875,97.375 L 114.175,97.375 L 112.08125,97.375 z" transform="matrix(0.9875769,0,0,1,0.716891,0.2)" id="path3128" style="opacity:0.453125;fill:url(#linearGradient3142);fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:0.1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3192)"/>
+  <rect width="3.3578629" height="37.852272" x="87.693916" y="81.905701" transform="matrix(1,0,0,1.0103538,0,-1.3128784)" id="rect27981" style="opacity:0.296875;fill:url(#linearGradient27989);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter28003)"/>
+  <path d="M 34.541973,80.321631 C 33.364723,80.321631 32.416973,81.279193 32.416973,82.468632 L 32.59375,120.53579 L 88,120.53579 L 88,82.325479 C 88,81.136039 87.17725,80.321631 86,80.321631 L 34.541973,80.321631 z M 40.9375,88.353886 L 55.0625,88.353886 C 55.582051,88.353886 56,88.776164 56,89.301092 L 56,110.89955 C 56,111.42448 55.58205,111.84676 55.0625,111.84676 L 40.9375,111.84676 C 40.417949,111.84676 40,111.42448 40,110.89955 L 40,89.301092 C 40,88.776166 40.41795,88.353886 40.9375,88.353886 z" id="rect3196" style="opacity:1;fill:url(#linearGradient3221);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <g transform="matrix(1,0,0,1.0103538,313.92339,17.714654)" clip-path="url(#clipPath25065)" id="g23527" style="opacity:0.18359375;filter:url(#filter27927)">
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-290.79343" y="84.707176" id="rect17371" style="opacity:0.1875;fill:url(#linearGradient17393);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-259.9552" y="91.262184" id="rect17373" style="opacity:0.1875;fill:url(#linearGradient17391);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-256.91937" y="109.06592" id="rect17375" style="opacity:0.1875;fill:url(#linearGradient17389);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-288.12012" y="76.49028" id="rect17377" style="opacity:0.46875;fill:url(#linearGradient17405);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.07872" y="96.053925" id="rect17379" style="opacity:0.46875;fill:url(#linearGradient17403);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-269.22446" y="89.085144" id="rect17381" style="opacity:0.46875;fill:url(#linearGradient17401);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.40353" y="67.112572" id="rect17407" style="opacity:0.1875;fill:url(#linearGradient18149);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-283.73615" y="80.639206" id="rect17409" style="opacity:0.1875;fill:url(#linearGradient18147);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-255.26816" y="84.380295" id="rect17411" style="opacity:0.1875;fill:url(#linearGradient18145);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-274.76822" y="106.13625" id="rect17413" style="opacity:0.46875;fill:url(#linearGradient18143);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-281.63443" y="102.51813" id="rect17415" style="opacity:0.46875;fill:url(#linearGradient18141);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-235.30339" y="71.39473" id="rect17417" style="opacity:0.46875;fill:url(#linearGradient18139);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.64175" y="100.63744" id="rect17419" style="opacity:0.1875;fill:url(#linearGradient18137);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.05591" y="65.363846" id="rect17421" style="opacity:0.1875;fill:url(#linearGradient18135);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-267.51465" y="69.323357" id="rect17423" style="opacity:0.1875;fill:url(#linearGradient18133);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.87137" y="99.903488" id="rect17425" style="opacity:0.46875;fill:url(#linearGradient18131);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.51654" y="101.47046" id="rect17427" style="opacity:0.46875;fill:url(#linearGradient18129);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-226.41283" y="75.500755" id="rect17429" style="opacity:0.46875;fill:url(#linearGradient18127);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-295.32373" y="69.585419" id="rect17431" style="opacity:0.1875;fill:url(#linearGradient18125);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-232.6416" y="71.46701" id="rect17433" style="opacity:0.1875;fill:url(#linearGradient18123);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-231.34415" y="77.415817" id="rect17435" style="opacity:0.1875;fill:url(#linearGradient18121);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-307.36627" y="105.92856" id="rect17437" style="opacity:0.46875;fill:url(#linearGradient18119);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.40512" y="62.602127" id="rect17439" style="opacity:0.46875;fill:url(#linearGradient18117);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-226.37361" y="99.838142" id="rect17441" style="opacity:0.46875;fill:url(#linearGradient18115);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-260.8649" y="56.113068" id="rect17443" style="opacity:0.1875;fill:url(#linearGradient18113);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-269.1181" y="74.343849" id="rect17445" style="opacity:0.1875;fill:url(#linearGradient18111);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-244.14183" y="98.228653" id="rect17447" style="opacity:0.1875;fill:url(#linearGradient18109);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.48334" y="67.98336" id="rect17449" style="opacity:0.46875;fill:url(#linearGradient18107);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-286.73779" y="64.299034" id="rect17451" style="opacity:0.46875;fill:url(#linearGradient18105);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.82462" y="69.00946" id="rect17453" style="opacity:0.46875;fill:url(#linearGradient18103);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-300.22101" y="79.247726" id="rect17455" style="opacity:0.1875;fill:url(#linearGradient18101);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.43381" y="104.01281" id="rect17457" style="opacity:0.1875;fill:url(#linearGradient18099);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-244.76028" y="105.31631" id="rect17459" style="opacity:0.1875;fill:url(#linearGradient18097);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-257.03159" y="65.75708" id="rect17461" style="opacity:0.46875;fill:url(#linearGradient18095);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.90118" y="69.971687" id="rect17463" style="opacity:0.46875;fill:url(#linearGradient18093);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-305.26633" y="97.308929" id="rect17465" style="opacity:0.46875;fill:url(#linearGradient18091);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-243.34489" y="57.138626" id="rect17467" style="opacity:0.1875;fill:url(#linearGradient18089);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.36011" y="79.709198" id="rect17469" style="opacity:0.1875;fill:url(#linearGradient18087);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-278.16724" y="103.81553" id="rect17471" style="opacity:0.1875;fill:url(#linearGradient18085);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-254.41679" y="77.795441" id="rect17473" style="opacity:0.46875;fill:url(#linearGradient18083);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-227.66385" y="87.002907" id="rect17475" style="opacity:0.46875;fill:url(#linearGradient18081);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.04214" y="101.45621" id="rect17477" style="opacity:0.46875;fill:url(#linearGradient18079);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-279.64142" y="79.221695" id="rect17479" style="opacity:0.1875;fill:url(#linearGradient18077);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-240.68213" y="85.522552" id="rect17481" style="opacity:0.1875;fill:url(#linearGradient18075);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.27867" y="66.150208" id="rect17483" style="opacity:0.1875;fill:url(#linearGradient18073);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-255.85204" y="98.996635" id="rect17485" style="opacity:0.46875;fill:url(#linearGradient18071);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-231.82623" y="62.490906" id="rect17487" style="opacity:0.46875;fill:url(#linearGradient18069);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-235.63985" y="103.67081" id="rect17489" style="opacity:0.46875;fill:url(#linearGradient18067);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.41724" y="103.57622" id="rect17491" style="opacity:0.1875;fill:url(#linearGradient18065);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-287.78891" y="110.85292" id="rect17493" style="opacity:0.1875;fill:url(#linearGradient18063);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.85229" y="87.596672" id="rect17495" style="opacity:0.1875;fill:url(#linearGradient18061);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-279.77243" y="77.090691" id="rect17497" style="opacity:0.46875;fill:url(#linearGradient18059);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.65201" y="61.369072" id="rect17499" style="opacity:0.46875;fill:url(#linearGradient18057);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-256.33041" y="97.866295" id="rect17501" style="opacity:0.46875;fill:url(#linearGradient18055);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.27512" y="60.602905" id="rect17503" style="opacity:0.1875;fill:url(#linearGradient18053);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-275.28024" y="98.59436" id="rect17505" style="opacity:0.1875;fill:url(#linearGradient18051);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-268.80908" y="104.19329" id="rect17507" style="opacity:0.1875;fill:url(#linearGradient18049);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.54272" y="94.834015" id="rect17509" style="opacity:0.46875;fill:url(#linearGradient18047);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.52655" y="96.503296" id="rect17511" style="opacity:0.46875;fill:url(#linearGradient18045);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.43588" y="62.813446" id="rect17513" style="opacity:0.46875;fill:url(#linearGradient18043);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-220.03261" y="90.780258" id="rect17515" style="opacity:0.1875;fill:url(#linearGradient18041);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.0979" y="99.709679" id="rect17517" style="opacity:0.1875;fill:url(#linearGradient18039);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-304.3273" y="97.007927" id="rect17519" style="opacity:0.1875;fill:url(#linearGradient18037);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-280.40613" y="63.924969" id="rect17521" style="opacity:0.46875;fill:url(#linearGradient18035);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.76562" y="97.57634" id="rect17523" style="opacity:0.46875;fill:url(#linearGradient18033);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-240.3656" y="91.897057" id="rect17525" style="opacity:0.46875;fill:url(#linearGradient18031);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-231.78883" y="88.074402" id="rect17527" style="opacity:0.1875;fill:url(#linearGradient18029);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-251.24213" y="102.16527" id="rect17529" style="opacity:0.1875;fill:url(#linearGradient18027);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-291.57928" y="92.647728" id="rect17531" style="opacity:0.1875;fill:url(#linearGradient18025);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-254.35078" y="60.315037" id="rect17533" style="opacity:0.46875;fill:url(#linearGradient18023);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-252.11502" y="90.288979" id="rect17535" style="opacity:0.46875;fill:url(#linearGradient18021);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-248.80861" y="109.21276" id="rect17537" style="opacity:0.46875;fill:url(#linearGradient18019);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-240.75543" y="72.276009" id="rect17539" style="opacity:0.1875;fill:url(#linearGradient18017);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.12875" y="57.977592" id="rect17541" style="opacity:0.1875;fill:url(#linearGradient18015);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.66217" y="67.495979" id="rect17543" style="opacity:0.1875;fill:url(#linearGradient18013);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-239.2243" y="69.823593" id="rect17545" style="opacity:0.46875;fill:url(#linearGradient18011);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-227.45792" y="68.959457" id="rect17547" style="opacity:0.46875;fill:url(#linearGradient18009);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.89233" y="76.257271" id="rect17549" style="opacity:0.46875;fill:url(#linearGradient18007);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-284.53769" y="90.623589" id="rect17551" style="opacity:0.1875;fill:url(#linearGradient18005);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-241.34969" y="97.305748" id="rect17553" style="opacity:0.1875;fill:url(#linearGradient18003);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.20572" y="82.862694" id="rect17555" style="opacity:0.1875;fill:url(#linearGradient18001);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-227.24118" y="79.64772" id="rect17557" style="opacity:0.46875;fill:url(#linearGradient17999);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.40161" y="79.395935" id="rect17559" style="opacity:0.46875;fill:url(#linearGradient17997);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.42935" y="74.803711" id="rect17561" style="opacity:0.46875;fill:url(#linearGradient17995);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-227.61072" y="62.135342" id="rect17563" style="opacity:0.1875;fill:url(#linearGradient17993);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.80521" y="84.323967" id="rect17565" style="opacity:0.1875;fill:url(#linearGradient17991);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-281.46295" y="66.882637" id="rect17567" style="opacity:0.1875;fill:url(#linearGradient17989);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-266.34781" y="83.370567" id="rect17569" style="opacity:0.46875;fill:url(#linearGradient17987);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.62222" y="67.94989" id="rect17571" style="opacity:0.46875;fill:url(#linearGradient17985);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.8093" y="82.059044" id="rect17573" style="opacity:0.46875;fill:url(#linearGradient17983);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.76419" y="60.068611" id="rect17575" style="opacity:0.1875;fill:url(#linearGradient17981);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-263.74551" y="87.762344" id="rect17577" style="opacity:0.1875;fill:url(#linearGradient17979);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-252.63034" y="77.666779" id="rect17579" style="opacity:0.1875;fill:url(#linearGradient17977);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-277.99472" y="76.894325" id="rect17581" style="opacity:0.46875;fill:url(#linearGradient17975);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-272.5246" y="107.37724" id="rect17583" style="opacity:0.46875;fill:url(#linearGradient17973);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.39462" y="106.59368" id="rect17585" style="opacity:0.46875;fill:url(#linearGradient17971);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-301.20239" y="77.640099" id="rect17587" style="opacity:0.1875;fill:url(#linearGradient17969);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-273.29407" y="60.569847" id="rect17589" style="opacity:0.1875;fill:url(#linearGradient17967);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.78375" y="88.356277" id="rect17591" style="opacity:0.1875;fill:url(#linearGradient17965);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-252.27098" y="96.711983" id="rect17593" style="opacity:0.46875;fill:url(#linearGradient17963);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.9855" y="79.303299" id="rect17595" style="opacity:0.46875;fill:url(#linearGradient17961);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-284.22263" y="87.287857" id="rect17597" style="opacity:0.46875;fill:url(#linearGradient17959);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-282.8721" y="70.975586" id="rect17599" style="opacity:0.1875;fill:url(#linearGradient17957);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-293.66968" y="76.547577" id="rect17601" style="opacity:0.1875;fill:url(#linearGradient17955);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-225.74731" y="68.751762" id="rect17603" style="opacity:0.1875;fill:url(#linearGradient17953);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.60339" y="72.070457" id="rect17605" style="opacity:0.46875;fill:url(#linearGradient17951);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-295.67972" y="72.224846" id="rect17607" style="opacity:0.46875;fill:url(#linearGradient17949);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.53369" y="66.220589" id="rect17609" style="opacity:0.46875;fill:url(#linearGradient17947);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.48569" y="70.287376" id="rect17611" style="opacity:0.1875;fill:url(#linearGradient17945);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-232.71796" y="106.46072" id="rect17613" style="opacity:0.1875;fill:url(#linearGradient17943);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.57463" y="65.69442" id="rect17615" style="opacity:0.1875;fill:url(#linearGradient17941);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-248.38248" y="92.94561" id="rect17617" style="opacity:0.46875;fill:url(#linearGradient17939);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.62196" y="110.52157" id="rect17619" style="opacity:0.46875;fill:url(#linearGradient17937);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.71622" y="67.948135" id="rect17621" style="opacity:0.46875;fill:url(#linearGradient17935);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-304.85336" y="87.741013" id="rect17623" style="opacity:0.1875;fill:url(#linearGradient17933);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.97302" y="72.193329" id="rect17625" style="opacity:0.1875;fill:url(#linearGradient17931);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-268.71017" y="65.334404" id="rect17627" style="opacity:0.1875;fill:url(#linearGradient17929);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-217.20427" y="98.32988" id="rect17629" style="opacity:0.46875;fill:url(#linearGradient17927);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.47168" y="108.77326" id="rect17631" style="opacity:0.46875;fill:url(#linearGradient25071);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-238.04443" y="82.517944" id="rect17633" style="opacity:0.46875;fill:url(#linearGradient25073);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.30357" y="108.89568" id="rect17635" style="opacity:0.1875;fill:url(#linearGradient25075);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-239.16194" y="84.146629" id="rect17637" style="opacity:0.1875;fill:url(#linearGradient25077);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.72382" y="64.275902" id="rect17639" style="opacity:0.1875;fill:url(#linearGradient25079);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-228.20195" y="109.68244" id="rect17641" style="opacity:0.46875;fill:url(#linearGradient25081);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.8898" y="63.208668" id="rect17643" style="opacity:0.46875;fill:url(#linearGradient25083);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-293.91269" y="98.313393" id="rect17645" style="opacity:0.46875;fill:url(#linearGradient25085);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-273.66534" y="85.114136" id="rect17647" style="opacity:0.1875;fill:url(#linearGradient25087);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-252.74916" y="66.932426" id="rect17649" style="opacity:0.1875;fill:url(#linearGradient25089);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-296.73309" y="77.135086" id="rect17651" style="opacity:0.1875;fill:url(#linearGradient25091);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-267.95505" y="62.283104" id="rect17653" style="opacity:0.46875;fill:url(#linearGradient25093);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-232.14812" y="87.140076" id="rect17655" style="opacity:0.46875;fill:url(#linearGradient25095);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.00018" y="55.974785" id="rect17657" style="opacity:0.46875;fill:url(#linearGradient25097);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.79782" y="102.01984" id="rect17659" style="opacity:0.1875;fill:url(#linearGradient25099);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-248.791" y="61.252872" id="rect17661" style="opacity:0.1875;fill:url(#linearGradient25101);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.85733" y="63.683193" id="rect17663" style="opacity:0.1875;fill:url(#linearGradient25103);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-303.50882" y="101.78488" id="rect17665" style="opacity:0.46875;fill:url(#linearGradient25105);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-240.83641" y="77.041458" id="rect17667" style="opacity:0.46875;fill:url(#linearGradient25107);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-244.76694" y="95.283287" id="rect17669" style="opacity:0.46875;fill:url(#linearGradient25109);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-252.42992" y="55.774399" id="rect17671" style="opacity:0.1875;fill:url(#linearGradient25111);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-230.80057" y="101.06035" id="rect17673" style="opacity:0.1875;fill:url(#linearGradient25113);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-298.56604" y="109.198" id="rect17675" style="opacity:0.1875;fill:url(#linearGradient25115);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-284.48489" y="107.00368" id="rect17677" style="opacity:0.46875;fill:url(#linearGradient25117);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-273.83386" y="66.630585" id="rect17679" style="opacity:0.46875;fill:url(#linearGradient25119);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-277.42801" y="66.899437" id="rect17681" style="opacity:0.46875;fill:url(#linearGradient25121);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-269.09375" y="56.061657" id="rect17683" style="opacity:0.1875;fill:url(#linearGradient25123);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-294.44736" y="68.035645" id="rect17685" style="opacity:0.1875;fill:url(#linearGradient25125);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.10535" y="55.856274" id="rect17687" style="opacity:0.1875;fill:url(#linearGradient25127);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-278.00189" y="86.851196" id="rect17689" style="opacity:0.46875;fill:url(#linearGradient25129);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-256.19824" y="110.05563" id="rect17691" style="opacity:0.46875;fill:url(#linearGradient25131);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-287.13065" y="60.523964" id="rect17693" style="opacity:0.46875;fill:url(#linearGradient25133);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-253.95091" y="103.54987" id="rect17695" style="opacity:0.1875;fill:url(#linearGradient25135);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-235.0334" y="88.186096" id="rect17697" style="opacity:0.1875;fill:url(#linearGradient25137);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-265.44974" y="94.422592" id="rect17699" style="opacity:0.1875;fill:url(#linearGradient25139);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-279.04202" y="103.96825" id="rect17701" style="opacity:0.46875;fill:url(#linearGradient25141);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-285.09955" y="84.472305" id="rect17703" style="opacity:0.46875;fill:url(#linearGradient25143);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-294.48126" y="101.18851" id="rect17705" style="opacity:0.46875;fill:url(#linearGradient25145);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-272.41995" y="90.168793" id="rect17707" style="opacity:0.1875;fill:url(#linearGradient25147);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-226.17566" y="99.90905" id="rect17709" style="opacity:0.1875;fill:url(#linearGradient25149);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-272.65631" y="86.153412" id="rect17711" style="opacity:0.1875;fill:url(#linearGradient25151);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-303.19516" y="79.081665" id="rect17713" style="opacity:0.46875;fill:url(#linearGradient25153);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-260.97839" y="67.344398" id="rect17715" style="opacity:0.46875;fill:url(#linearGradient25155);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-305.65546" y="93.259796" id="rect17717" style="opacity:0.46875;fill:url(#linearGradient25157);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-291.2243" y="88.690613" id="rect17719" style="opacity:0.1875;fill:url(#linearGradient25159);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-300.58456" y="59.647064" id="rect17721" style="opacity:0.1875;fill:url(#linearGradient25161);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-253.12515" y="73.111664" id="rect17723" style="opacity:0.1875;fill:url(#linearGradient25163);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-280.59235" y="91.303307" id="rect17725" style="opacity:0.46875;fill:url(#linearGradient25165);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.509" y="67.325012" id="rect17727" style="opacity:0.46875;fill:url(#linearGradient25167);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.42133" y="93.896034" id="rect17729" style="opacity:0.46875;fill:url(#linearGradient25169);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-271.88492" y="90.879166" id="rect17731" style="opacity:0.1875;fill:url(#linearGradient25171);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-263.34952" y="103.47399" id="rect17733" style="opacity:0.1875;fill:url(#linearGradient25173);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-272.96045" y="106.24575" id="rect17735" style="opacity:0.1875;fill:url(#linearGradient25175);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-303.68954" y="55.381527" id="rect17737" style="opacity:0.46875;fill:url(#linearGradient25177);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.11661" y="89.104057" id="rect17739" style="opacity:0.46875;fill:url(#linearGradient25179);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-295.8905" y="102.75126" id="rect17741" style="opacity:0.46875;fill:url(#linearGradient25181);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-224.67885" y="81.184441" id="rect17743" style="opacity:0.1875;fill:url(#linearGradient25183);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-273.11703" y="89.035004" id="rect17745" style="opacity:0.1875;fill:url(#linearGradient25185);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-295.9751" y="100.35271" id="rect17747" style="opacity:0.1875;fill:url(#linearGradient25187);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-271.15137" y="80.75869" id="rect17749" style="opacity:0.46875;fill:url(#linearGradient25189);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.43188" y="77.223198" id="rect17751" style="opacity:0.46875;fill:url(#linearGradient25191);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-289.05075" y="72.696106" id="rect17753" style="opacity:0.46875;fill:url(#linearGradient25193);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.19749" y="106.62489" id="rect17755" style="opacity:0.1875;fill:url(#linearGradient25195);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.13745" y="69.633575" id="rect17757" style="opacity:0.1875;fill:url(#linearGradient25197);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.53471" y="62.632496" id="rect17759" style="opacity:0.1875;fill:url(#linearGradient25199);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.95056" y="85.574959" id="rect17761" style="opacity:0.46875;fill:url(#linearGradient25201);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-305.36328" y="101.6518" id="rect17763" style="opacity:0.46875;fill:url(#linearGradient25203);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-286.15607" y="92.363571" id="rect17765" style="opacity:0.46875;fill:url(#linearGradient25205);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-264.91437" y="102.87209" id="rect17767" style="opacity:0.1875;fill:url(#linearGradient25207);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.12769" y="68.443901" id="rect17769" style="opacity:0.1875;fill:url(#linearGradient25209);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-277.91699" y="81.518745" id="rect17771" style="opacity:0.1875;fill:url(#linearGradient25211);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-225.47676" y="99.235146" id="rect17773" style="opacity:0.46875;fill:url(#linearGradient25213);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.99631" y="104.32848" id="rect17775" style="opacity:0.46875;fill:url(#linearGradient25215);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-277.45819" y="96.042809" id="rect17777" style="opacity:0.46875;fill:url(#linearGradient25217);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.11304" y="91.464439" id="rect18151" style="opacity:0.1875;fill:url(#linearGradient25219);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.72809" y="57.985466" id="rect18153" style="opacity:0.1875;fill:url(#linearGradient25221);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.04907" y="92.447624" id="rect18155" style="opacity:0.1875;fill:url(#linearGradient25223);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.48605" y="87.082649" id="rect18157" style="opacity:0.46875;fill:url(#linearGradient25225);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-225.46774" y="71.132614" id="rect18159" style="opacity:0.46875;fill:url(#linearGradient25227);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-294.54868" y="69.479034" id="rect18161" style="opacity:0.46875;fill:url(#linearGradient25229);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-235.54684" y="71.409157" id="rect18163" style="opacity:0.1875;fill:url(#linearGradient25231);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-281.44562" y="88.801552" id="rect18165" style="opacity:0.1875;fill:url(#linearGradient25233);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.61575" y="79.20295" id="rect18167" style="opacity:0.1875;fill:url(#linearGradient25235);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.08376" y="67.184708" id="rect18169" style="opacity:0.46875;fill:url(#linearGradient25237);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-225.26695" y="68.254173" id="rect18171" style="opacity:0.46875;fill:url(#linearGradient25239);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-295.67917" y="88.566643" id="rect18173" style="opacity:0.46875;fill:url(#linearGradient25241);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-221.37273" y="61.108807" id="rect18175" style="opacity:0.1875;fill:url(#linearGradient25243);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-272.89822" y="107.33531" id="rect18177" style="opacity:0.1875;fill:url(#linearGradient25245);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-276.91226" y="76.051247" id="rect18179" style="opacity:0.1875;fill:url(#linearGradient25247);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-262.29782" y="97.771523" id="rect18181" style="opacity:0.46875;fill:url(#linearGradient25249);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-242.38615" y="90.817757" id="rect18183" style="opacity:0.46875;fill:url(#linearGradient25251);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.09634" y="77.677231" id="rect18185" style="opacity:0.46875;fill:url(#linearGradient25253);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-296.38574" y="62.671509" id="rect18187" style="opacity:0.1875;fill:url(#linearGradient25255);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-230.63821" y="75.019676" id="rect18189" style="opacity:0.1875;fill:url(#linearGradient25257);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-276.96573" y="58.94054" id="rect18191" style="opacity:0.1875;fill:url(#linearGradient25259);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-290.89044" y="63.18137" id="rect18193" style="opacity:0.46875;fill:url(#linearGradient25261);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.22519" y="85.285896" id="rect18195" style="opacity:0.46875;fill:url(#linearGradient25263);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-277.96872" y="86.968376" id="rect18197" style="opacity:0.46875;fill:url(#linearGradient25265);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-227.8423" y="111.32892" id="rect18199" style="opacity:0.1875;fill:url(#linearGradient25267);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.47272" y="110.46347" id="rect18201" style="opacity:0.1875;fill:url(#linearGradient25269);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.92764" y="74.383469" id="rect18203" style="opacity:0.1875;fill:url(#linearGradient25271);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-269.07919" y="84.876595" id="rect18205" style="opacity:0.46875;fill:url(#linearGradient25273);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-269.95041" y="86.066269" id="rect18207" style="opacity:0.46875;fill:url(#linearGradient25275);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.95801" y="92.406303" id="rect18209" style="opacity:0.46875;fill:url(#linearGradient25277);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-264.59933" y="70.233521" id="rect18211" style="opacity:0.1875;fill:url(#linearGradient25279);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.10513" y="80.002182" id="rect18213" style="opacity:0.1875;fill:url(#linearGradient25281);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-226.47241" y="95.684586" id="rect18215" style="opacity:0.1875;fill:url(#linearGradient25283);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.99527" y="99.055901" id="rect18217" style="opacity:0.46875;fill:url(#linearGradient25285);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.02789" y="85.807312" id="rect18219" style="opacity:0.46875;fill:url(#linearGradient25287);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-298.38324" y="90.704887" id="rect18221" style="opacity:0.46875;fill:url(#linearGradient25289);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.76099" y="62.290359" id="rect18223" style="opacity:0.1875;fill:url(#linearGradient25291);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.90051" y="75.048828" id="rect18225" style="opacity:0.1875;fill:url(#linearGradient25293);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-241.98842" y="90.335617" id="rect18227" style="opacity:0.1875;fill:url(#linearGradient25295);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.44897" y="106.12038" id="rect18229" style="opacity:0.46875;fill:url(#linearGradient25297);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-259.91562" y="92.317909" id="rect18231" style="opacity:0.46875;fill:url(#linearGradient25299);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.61569" y="100.5391" id="rect18233" style="opacity:0.46875;fill:url(#linearGradient25301);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-296.33392" y="63.624489" id="rect18235" style="opacity:0.1875;fill:url(#linearGradient25303);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.36273" y="72.056847" id="rect18237" style="opacity:0.1875;fill:url(#linearGradient25305);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-280.8735" y="110.21268" id="rect18239" style="opacity:0.1875;fill:url(#linearGradient25307);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.63394" y="74.366173" id="rect18241" style="opacity:0.46875;fill:url(#linearGradient25309);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.0997" y="79.780212" id="rect18243" style="opacity:0.46875;fill:url(#linearGradient25311);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.09283" y="101.99254" id="rect18245" style="opacity:0.46875;fill:url(#linearGradient25313);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-286.76373" y="109.07452" id="rect18247" style="opacity:0.1875;fill:url(#linearGradient25315);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.97629" y="98.64402" id="rect18249" style="opacity:0.1875;fill:url(#linearGradient25317);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-279.63684" y="89.344994" id="rect18251" style="opacity:0.1875;fill:url(#linearGradient25319);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.27385" y="81.641121" id="rect18253" style="opacity:0.46875;fill:url(#linearGradient25321);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.25494" y="109.51963" id="rect18255" style="opacity:0.46875;fill:url(#linearGradient25323);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.37708" y="108.9928" id="rect18257" style="opacity:0.46875;fill:url(#linearGradient25325);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-235.19186" y="110.50214" id="rect18259" style="opacity:0.1875;fill:url(#linearGradient25327);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.0481" y="93.95919" id="rect18261" style="opacity:0.1875;fill:url(#linearGradient25329);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.78215" y="66.527237" id="rect18263" style="opacity:0.1875;fill:url(#linearGradient25331);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-284.03275" y="86.100006" id="rect18265" style="opacity:0.46875;fill:url(#linearGradient25333);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.62799" y="104.80125" id="rect18267" style="opacity:0.46875;fill:url(#linearGradient25335);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-251.83594" y="70.125221" id="rect18269" style="opacity:0.46875;fill:url(#linearGradient25337);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.16574" y="84.331985" id="rect18271" style="opacity:0.1875;fill:url(#linearGradient25339);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.98331" y="96.91481" id="rect18273" style="opacity:0.1875;fill:url(#linearGradient25341);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-231.74715" y="78.689095" id="rect18275" style="opacity:0.1875;fill:url(#linearGradient25343);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-306.39941" y="59.077904" id="rect18277" style="opacity:0.46875;fill:url(#linearGradient25345);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-227.0076" y="95.745003" id="rect18279" style="opacity:0.46875;fill:url(#linearGradient25347);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-304.77591" y="102.81136" id="rect18281" style="opacity:0.46875;fill:url(#linearGradient25349);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-246.87979" y="69.811943" id="rect18283" style="opacity:0.1875;fill:url(#linearGradient25351);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-242.16574" y="87.382187" id="rect18285" style="opacity:0.1875;fill:url(#linearGradient25353);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.87027" y="92.79483" id="rect18287" style="opacity:0.1875;fill:url(#linearGradient25355);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-257.38815" y="90.872025" id="rect18289" style="opacity:0.46875;fill:url(#linearGradient25357);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.0155" y="79.296844" id="rect18291" style="opacity:0.46875;fill:url(#linearGradient25359);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.74591" y="104.70981" id="rect18293" style="opacity:0.46875;fill:url(#linearGradient25361);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-240.28142" y="62.454266" id="rect18295" style="opacity:0.1875;fill:url(#linearGradient25363);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-285.72321" y="60.415363" id="rect18297" style="opacity:0.1875;fill:url(#linearGradient25365);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-251.50877" y="107.67831" id="rect18299" style="opacity:0.1875;fill:url(#linearGradient25367);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.79721" y="90.158287" id="rect18301" style="opacity:0.46875;fill:url(#linearGradient25369);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.21603" y="76.256042" id="rect18303" style="opacity:0.46875;fill:url(#linearGradient25371);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-282.3176" y="104.62031" id="rect18305" style="opacity:0.46875;fill:url(#linearGradient25373);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.24321" y="75.208" id="rect18307" style="opacity:0.1875;fill:url(#linearGradient25375);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-254.33498" y="99.272896" id="rect18309" style="opacity:0.1875;fill:url(#linearGradient25377);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.62555" y="84.156494" id="rect18311" style="opacity:0.1875;fill:url(#linearGradient25379);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-249.17912" y="97.841927" id="rect18313" style="opacity:0.46875;fill:url(#linearGradient25381);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-294.68881" y="105.77716" id="rect18315" style="opacity:0.46875;fill:url(#linearGradient25383);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.20544" y="62.652821" id="rect18317" style="opacity:0.46875;fill:url(#linearGradient25385);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-264.56491" y="96.323288" id="rect18319" style="opacity:0.1875;fill:url(#linearGradient25387);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.96753" y="55.495941" id="rect18321" style="opacity:0.1875;fill:url(#linearGradient25389);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.63147" y="68.193329" id="rect18323" style="opacity:0.1875;fill:url(#linearGradient25391);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.42424" y="66.986328" id="rect18325" style="opacity:0.46875;fill:url(#linearGradient25393);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.0945" y="93.264801" id="rect18327" style="opacity:0.46875;fill:url(#linearGradient25395);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.63403" y="98.204636" id="rect18329" style="opacity:0.46875;fill:url(#linearGradient25397);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-288.23471" y="74.236923" id="rect18331" style="opacity:0.1875;fill:url(#linearGradient25399);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.69228" y="100.62784" id="rect18333" style="opacity:0.1875;fill:url(#linearGradient25401);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.0683" y="80.08036" id="rect18335" style="opacity:0.1875;fill:url(#linearGradient25403);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-291.62607" y="64.716675" id="rect18337" style="opacity:0.46875;fill:url(#linearGradient25405);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-239.75874" y="107.29673" id="rect18339" style="opacity:0.46875;fill:url(#linearGradient25407);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.67427" y="99.356606" id="rect18341" style="opacity:0.46875;fill:url(#linearGradient25409);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-234.71683" y="65.645309" id="rect18343" style="opacity:0.1875;fill:url(#linearGradient25411);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-272.67639" y="74.896492" id="rect18345" style="opacity:0.1875;fill:url(#linearGradient25413);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-253.01279" y="58.992363" id="rect18347" style="opacity:0.1875;fill:url(#linearGradient25415);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-234.80728" y="94.758575" id="rect18349" style="opacity:0.46875;fill:url(#linearGradient25417);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.86696" y="100.33606" id="rect18351" style="opacity:0.46875;fill:url(#linearGradient25419);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.45459" y="104.54546" id="rect18353" style="opacity:0.46875;fill:url(#linearGradient25421);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-274.36459" y="57.800591" id="rect18355" style="opacity:0.1875;fill:url(#linearGradient25423);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-226.97002" y="98.724579" id="rect18357" style="opacity:0.1875;fill:url(#linearGradient25425);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-250.95309" y="84.094955" id="rect18359" style="opacity:0.1875;fill:url(#linearGradient25427);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-240.06047" y="110.67622" id="rect18361" style="opacity:0.46875;fill:url(#linearGradient25429);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-262.89478" y="94.46965" id="rect18363" style="opacity:0.46875;fill:url(#linearGradient25431);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-237.35883" y="83.683098" id="rect18365" style="opacity:0.46875;fill:url(#linearGradient25433);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-271.77145" y="75.577515" id="rect18367" style="opacity:0.1875;fill:url(#linearGradient25435);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.45178" y="95.948578" id="rect18369" style="opacity:0.1875;fill:url(#linearGradient25437);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.85594" y="63.876396" id="rect18371" style="opacity:0.1875;fill:url(#linearGradient25439);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-236.77063" y="72.637779" id="rect18373" style="opacity:0.46875;fill:url(#linearGradient25441);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.58069" y="106.60091" id="rect18375" style="opacity:0.46875;fill:url(#linearGradient25443);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-268.90054" y="60.200027" id="rect18377" style="opacity:0.46875;fill:url(#linearGradient25445);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.53291" y="89.377716" id="rect18379" style="opacity:0.1875;fill:url(#linearGradient25447);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.34618" y="83.512108" id="rect18381" style="opacity:0.1875;fill:url(#linearGradient25449);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-295.69232" y="66.480316" id="rect18383" style="opacity:0.1875;fill:url(#linearGradient25451);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.35358" y="69.703491" id="rect18385" style="opacity:0.46875;fill:url(#linearGradient25453);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.26117" y="56.466759" id="rect18387" style="opacity:0.46875;fill:url(#linearGradient25455);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.90395" y="81.527306" id="rect18389" style="opacity:0.46875;fill:url(#linearGradient25457);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-280.25595" y="79.487236" id="rect18391" style="opacity:0.1875;fill:url(#linearGradient25459);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-238.13121" y="88.470932" id="rect18393" style="opacity:0.1875;fill:url(#linearGradient25461);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-250.26227" y="86.610855" id="rect18395" style="opacity:0.1875;fill:url(#linearGradient25463);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-257.04407" y="91.484947" id="rect18397" style="opacity:0.46875;fill:url(#linearGradient25465);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-255.31018" y="60.714272" id="rect18399" style="opacity:0.46875;fill:url(#linearGradient25467);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-250.26987" y="76.319176" id="rect18401" style="opacity:0.46875;fill:url(#linearGradient25469);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-271.81497" y="110.69751" id="rect18403" style="opacity:0.1875;fill:url(#linearGradient25471);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-226.56194" y="83.316528" id="rect18405" style="opacity:0.1875;fill:url(#linearGradient25473);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-266.77362" y="75.160622" id="rect18407" style="opacity:0.1875;fill:url(#linearGradient25475);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-265.95584" y="89.178764" id="rect18409" style="opacity:0.46875;fill:url(#linearGradient25477);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-255.21521" y="76.066673" id="rect18411" style="opacity:0.46875;fill:url(#linearGradient25479);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-299.20267" y="110.82329" id="rect18413" style="opacity:0.46875;fill:url(#linearGradient25481);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-252.90068" y="93.641579" id="rect18415" style="opacity:0.1875;fill:url(#linearGradient25483);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.98462" y="63.597" id="rect18417" style="opacity:0.1875;fill:url(#linearGradient25485);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-259.41406" y="77.615059" id="rect18419" style="opacity:0.1875;fill:url(#linearGradient25487);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-306.41394" y="84.300209" id="rect18421" style="opacity:0.46875;fill:url(#linearGradient25489);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-248.11342" y="100.78419" id="rect18423" style="opacity:0.46875;fill:url(#linearGradient25491);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-248.6394" y="102.52259" id="rect18425" style="opacity:0.46875;fill:url(#linearGradient25493);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-223.46675" y="64.784454" id="rect18427" style="opacity:0.1875;fill:url(#linearGradient25495);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-231.46829" y="98.256683" id="rect18429" style="opacity:0.1875;fill:url(#linearGradient25497);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-249.84923" y="102.14691" id="rect18431" style="opacity:0.1875;fill:url(#linearGradient25499);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.61346" y="62.031593" id="rect18433" style="opacity:0.46875;fill:url(#linearGradient25501);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-301.99881" y="81.942253" id="rect18435" style="opacity:0.46875;fill:url(#linearGradient25503);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.75516" y="80.842926" id="rect18437" style="opacity:0.46875;fill:url(#linearGradient25505);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.5466" y="83.51545" id="rect18439" style="opacity:0.1875;fill:url(#linearGradient25507);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-231.53737" y="67.027702" id="rect18441" style="opacity:0.1875;fill:url(#linearGradient25509);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.38284" y="103.22467" id="rect18443" style="opacity:0.1875;fill:url(#linearGradient25511);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-224.94073" y="62.307873" id="rect18445" style="opacity:0.46875;fill:url(#linearGradient25513);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.1153" y="78.606285" id="rect18447" style="opacity:0.46875;fill:url(#linearGradient25515);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-272.53516" y="98.190308" id="rect18449" style="opacity:0.46875;fill:url(#linearGradient25517);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-228.46397" y="68.309998" id="rect18451" style="opacity:0.1875;fill:url(#linearGradient25519);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-280.96036" y="68.613037" id="rect18453" style="opacity:0.1875;fill:url(#linearGradient25521);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.97824" y="70.057411" id="rect18455" style="opacity:0.1875;fill:url(#linearGradient25523);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-267.00824" y="107.40057" id="rect18457" style="opacity:0.46875;fill:url(#linearGradient25525);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-243.42072" y="109.3634" id="rect18459" style="opacity:0.46875;fill:url(#linearGradient25527);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.83664" y="65.596466" id="rect18461" style="opacity:0.46875;fill:url(#linearGradient25529);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.58488" y="86.885582" id="rect18463" style="opacity:0.1875;fill:url(#linearGradient25531);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-303.64371" y="81.863777" id="rect18465" style="opacity:0.1875;fill:url(#linearGradient25533);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.68872" y="98.258194" id="rect18467" style="opacity:0.1875;fill:url(#linearGradient25535);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.73193" y="57.614296" id="rect18469" style="opacity:0.46875;fill:url(#linearGradient25537);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.63004" y="84.332832" id="rect18471" style="opacity:0.46875;fill:url(#linearGradient25539);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-238.7637" y="69.674995" id="rect18473" style="opacity:0.46875;fill:url(#linearGradient25541);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-269.64343" y="82.495186" id="rect18475" style="opacity:0.1875;fill:url(#linearGradient25543);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-267.85864" y="59.185127" id="rect18477" style="opacity:0.1875;fill:url(#linearGradient25545);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.09042" y="74.726555" id="rect18479" style="opacity:0.1875;fill:url(#linearGradient25547);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.59351" y="73.606941" id="rect18481" style="opacity:0.46875;fill:url(#linearGradient25549);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-298.58517" y="55.815166" id="rect18483" style="opacity:0.46875;fill:url(#linearGradient25551);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.51108" y="80.653122" id="rect18485" style="opacity:0.46875;fill:url(#linearGradient25553);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-263.96866" y="89.247513" id="rect18487" style="opacity:0.1875;fill:url(#linearGradient25555);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-266.88388" y="80.690773" id="rect18489" style="opacity:0.1875;fill:url(#linearGradient25557);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.79605" y="110.67844" id="rect18491" style="opacity:0.1875;fill:url(#linearGradient25559);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-252.51732" y="75.380501" id="rect18493" style="opacity:0.46875;fill:url(#linearGradient25561);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-226.51567" y="103.38647" id="rect18495" style="opacity:0.46875;fill:url(#linearGradient25563);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.96869" y="56.758343" id="rect18497" style="opacity:0.46875;fill:url(#linearGradient25565);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-250.85594" y="102.63554" id="rect18499" style="opacity:0.1875;fill:url(#linearGradient25567);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-251.52267" y="109.84169" id="rect18501" style="opacity:0.1875;fill:url(#linearGradient25569);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-227.80392" y="95.125671" id="rect18503" style="opacity:0.1875;fill:url(#linearGradient25571);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-259.16461" y="77.213577" id="rect18505" style="opacity:0.46875;fill:url(#linearGradient25573);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.90277" y="95.847725" id="rect18507" style="opacity:0.46875;fill:url(#linearGradient25575);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-255.6911" y="76.100128" id="rect18509" style="opacity:0.46875;fill:url(#linearGradient25577);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-249.52742" y="102.68053" id="rect18511" style="opacity:0.1875;fill:url(#linearGradient25579);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-256.22385" y="67.563797" id="rect18513" style="opacity:0.1875;fill:url(#linearGradient25581);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-284.05579" y="85.764542" id="rect18515" style="opacity:0.1875;fill:url(#linearGradient25583);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.3392" y="60.742577" id="rect18517" style="opacity:0.46875;fill:url(#linearGradient25585);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-282.12518" y="68.472763" id="rect18519" style="opacity:0.46875;fill:url(#linearGradient25587);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-240.16914" y="65.996407" id="rect18521" style="opacity:0.46875;fill:url(#linearGradient25589);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-218.75221" y="86.193619" id="rect18523" style="opacity:0.1875;fill:url(#linearGradient25591);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-241.14877" y="101.30114" id="rect18525" style="opacity:0.1875;fill:url(#linearGradient25593);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-272.47665" y="88.885841" id="rect18527" style="opacity:0.1875;fill:url(#linearGradient25595);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-241.04015" y="101.66671" id="rect18529" style="opacity:0.46875;fill:url(#linearGradient25597);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-239.33102" y="58.575886" id="rect18531" style="opacity:0.46875;fill:url(#linearGradient25599);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.40578" y="57.532642" id="rect18533" style="opacity:0.46875;fill:url(#linearGradient25601);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-221.9127" y="57.526257" id="rect18919" style="opacity:0.1875;fill:url(#linearGradient25603);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.32135" y="97.074615" id="rect18921" style="opacity:0.1875;fill:url(#linearGradient25605);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.4538" y="66.162369" id="rect18923" style="opacity:0.1875;fill:url(#linearGradient25607);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-255.92183" y="91.841202" id="rect18925" style="opacity:0.46875;fill:url(#linearGradient25609);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.95801" y="62.992939" id="rect18927" style="opacity:0.46875;fill:url(#linearGradient25611);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-247.78813" y="60.985554" id="rect18929" style="opacity:0.46875;fill:url(#linearGradient25613);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-226.08983" y="85.340904" id="rect18931" style="opacity:0.1875;fill:url(#linearGradient25615);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.02982" y="87.608078" id="rect18933" style="opacity:0.1875;fill:url(#linearGradient25617);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-254.55878" y="66.718971" id="rect18935" style="opacity:0.1875;fill:url(#linearGradient25619);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-227.55739" y="84.136307" id="rect18937" style="opacity:0.46875;fill:url(#linearGradient25621);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-241.86101" y="83.323425" id="rect18939" style="opacity:0.46875;fill:url(#linearGradient25623);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-278.49765" y="99.488594" id="rect18941" style="opacity:0.46875;fill:url(#linearGradient25625);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-234.55836" y="100.24726" id="rect18943" style="opacity:0.1875;fill:url(#linearGradient25627);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.19774" y="92.854179" id="rect18945" style="opacity:0.1875;fill:url(#linearGradient25629);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-276.54205" y="61.351452" id="rect18947" style="opacity:0.1875;fill:url(#linearGradient25631);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-260.98083" y="88.497482" id="rect18949" style="opacity:0.46875;fill:url(#linearGradient25633);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.63409" y="99.553261" id="rect18951" style="opacity:0.46875;fill:url(#linearGradient25635);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-295.47437" y="58.168949" id="rect18953" style="opacity:0.46875;fill:url(#linearGradient25637);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.33575" y="86.500946" id="rect18955" style="opacity:0.1875;fill:url(#linearGradient25639);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-298.90872" y="103.5072" id="rect18957" style="opacity:0.1875;fill:url(#linearGradient25641);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.78004" y="72.946983" id="rect18959" style="opacity:0.1875;fill:url(#linearGradient25643);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-226.84477" y="85.671165" id="rect18961" style="opacity:0.46875;fill:url(#linearGradient25645);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.55591" y="89.883553" id="rect18963" style="opacity:0.46875;fill:url(#linearGradient25647);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-291.39258" y="82.950401" id="rect18965" style="opacity:0.46875;fill:url(#linearGradient25649);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.30173" y="75.114151" id="rect18967" style="opacity:0.1875;fill:url(#linearGradient25651);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-283.21027" y="71.787895" id="rect18969" style="opacity:0.1875;fill:url(#linearGradient25653);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-255.39825" y="100.81129" id="rect18971" style="opacity:0.1875;fill:url(#linearGradient25655);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-274.18207" y="66.801216" id="rect18973" style="opacity:0.46875;fill:url(#linearGradient25657);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.54575" y="94.54393" id="rect18975" style="opacity:0.46875;fill:url(#linearGradient25659);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-236.51776" y="85.290855" id="rect18977" style="opacity:0.46875;fill:url(#linearGradient25661);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.5864" y="71.016502" id="rect18979" style="opacity:0.1875;fill:url(#linearGradient25663);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-303.21921" y="65.639832" id="rect18981" style="opacity:0.1875;fill:url(#linearGradient25665);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.79636" y="63.71505" id="rect18983" style="opacity:0.1875;fill:url(#linearGradient25667);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-233.34283" y="107.64001" id="rect18985" style="opacity:0.46875;fill:url(#linearGradient25669);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-294.38077" y="99.69957" id="rect18987" style="opacity:0.46875;fill:url(#linearGradient25671);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-264.94934" y="79.567955" id="rect18989" style="opacity:0.46875;fill:url(#linearGradient25673);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.47961" y="106.71353" id="rect18991" style="opacity:0.1875;fill:url(#linearGradient25675);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.58325" y="84.44001" id="rect18993" style="opacity:0.1875;fill:url(#linearGradient25677);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.00653" y="101.09319" id="rect18995" style="opacity:0.1875;fill:url(#linearGradient25679);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.39656" y="106.40167" id="rect18997" style="opacity:0.46875;fill:url(#linearGradient25681);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.76819" y="70.810738" id="rect18999" style="opacity:0.46875;fill:url(#linearGradient25683);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-244.0509" y="102.26338" id="rect19001" style="opacity:0.46875;fill:url(#linearGradient25685);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.00787" y="93.647499" id="rect19003" style="opacity:0.1875;fill:url(#linearGradient25687);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-300.53571" y="108.52261" id="rect19005" style="opacity:0.1875;fill:url(#linearGradient25689);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-250.90356" y="63.263" id="rect19007" style="opacity:0.1875;fill:url(#linearGradient25691);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-238.44772" y="90.823517" id="rect19009" style="opacity:0.46875;fill:url(#linearGradient25693);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.47687" y="89.193001" id="rect19011" style="opacity:0.46875;fill:url(#linearGradient25695);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-272.64713" y="62.666931" id="rect19013" style="opacity:0.46875;fill:url(#linearGradient25697);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-227.9185" y="73.799789" id="rect19015" style="opacity:0.1875;fill:url(#linearGradient25699);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-288.84146" y="86.224449" id="rect19017" style="opacity:0.1875;fill:url(#linearGradient25701);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.98773" y="110.16738" id="rect19019" style="opacity:0.1875;fill:url(#linearGradient25703);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.17789" y="94.973297" id="rect19021" style="opacity:0.46875;fill:url(#linearGradient25705);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-227.49565" y="74.358421" id="rect19023" style="opacity:0.46875;fill:url(#linearGradient25707);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.55728" y="95.373718" id="rect19025" style="opacity:0.46875;fill:url(#linearGradient25709);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.83374" y="90.887688" id="rect19027" style="opacity:0.1875;fill:url(#linearGradient25711);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.96057" y="94.594093" id="rect19029" style="opacity:0.1875;fill:url(#linearGradient25713);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.0192" y="91.37999" id="rect19031" style="opacity:0.1875;fill:url(#linearGradient25715);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-218.39069" y="68.775909" id="rect19033" style="opacity:0.46875;fill:url(#linearGradient25717);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-286.06958" y="103.01775" id="rect19035" style="opacity:0.46875;fill:url(#linearGradient25719);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-303.51514" y="76.4011" id="rect19037" style="opacity:0.46875;fill:url(#linearGradient25721);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-218.21619" y="67.520676" id="rect19039" style="opacity:0.1875;fill:url(#linearGradient25723);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-279.83255" y="84.320534" id="rect19041" style="opacity:0.1875;fill:url(#linearGradient25725);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.59525" y="71.078278" id="rect19043" style="opacity:0.1875;fill:url(#linearGradient25727);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.35696" y="86.638985" id="rect19045" style="opacity:0.46875;fill:url(#linearGradient25729);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.40378" y="82.163078" id="rect19047" style="opacity:0.46875;fill:url(#linearGradient25731);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-264.71713" y="82.552078" id="rect19049" style="opacity:0.46875;fill:url(#linearGradient25733);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.31723" y="80.803482" id="rect19051" style="opacity:0.1875;fill:url(#linearGradient25735);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-286.43948" y="78.776352" id="rect19053" style="opacity:0.1875;fill:url(#linearGradient25737);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-286.18832" y="105.04062" id="rect19055" style="opacity:0.1875;fill:url(#linearGradient25739);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-287.76416" y="69.334221" id="rect19057" style="opacity:0.46875;fill:url(#linearGradient25741);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-306.53604" y="106.49574" id="rect19059" style="opacity:0.46875;fill:url(#linearGradient25743);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-250.6328" y="95.204269" id="rect19061" style="opacity:0.46875;fill:url(#linearGradient25745);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-250.92119" y="57.997192" id="rect19063" style="opacity:0.1875;fill:url(#linearGradient25747);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.89978" y="108.55125" id="rect19065" style="opacity:0.1875;fill:url(#linearGradient25749);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-269.3967" y="110.37301" id="rect19067" style="opacity:0.1875;fill:url(#linearGradient25751);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-286.70844" y="69.12841" id="rect19069" style="opacity:0.46875;fill:url(#linearGradient25753);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-294.84006" y="95.986496" id="rect19071" style="opacity:0.46875;fill:url(#linearGradient25755);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-244.98888" y="103.69247" id="rect19073" style="opacity:0.46875;fill:url(#linearGradient25757);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.38586" y="67.375679" id="rect19075" style="opacity:0.1875;fill:url(#linearGradient25759);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.78357" y="70.102432" id="rect19077" style="opacity:0.1875;fill:url(#linearGradient25761);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-258.98303" y="107.18321" id="rect19079" style="opacity:0.1875;fill:url(#linearGradient25763);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-221.54657" y="74.298431" id="rect19081" style="opacity:0.46875;fill:url(#linearGradient25765);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.54166" y="91.346199" id="rect19083" style="opacity:0.46875;fill:url(#linearGradient25767);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-296.13815" y="80.275932" id="rect19085" style="opacity:0.46875;fill:url(#linearGradient25769);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-299.84622" y="78.927689" id="rect19087" style="opacity:0.1875;fill:url(#linearGradient25771);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-252.49251" y="104.74801" id="rect19089" style="opacity:0.1875;fill:url(#linearGradient25773);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.81819" y="60.508629" id="rect19091" style="opacity:0.1875;fill:url(#linearGradient25775);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.77986" y="84.047173" id="rect19093" style="opacity:0.46875;fill:url(#linearGradient25777);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.71603" y="93.857674" id="rect19095" style="opacity:0.46875;fill:url(#linearGradient25779);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.01331" y="68.597374" id="rect19097" style="opacity:0.46875;fill:url(#linearGradient25781);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-288.43222" y="67.29528" id="rect19099" style="opacity:0.1875;fill:url(#linearGradient25783);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.39505" y="75.4105" id="rect19101" style="opacity:0.1875;fill:url(#linearGradient25785);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-227.18639" y="93.951813" id="rect19103" style="opacity:0.1875;fill:url(#linearGradient25787);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-279.88348" y="66.440628" id="rect19105" style="opacity:0.46875;fill:url(#linearGradient25789);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.90556" y="83.751076" id="rect19107" style="opacity:0.46875;fill:url(#linearGradient25791);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-243.24927" y="64.618744" id="rect19109" style="opacity:0.46875;fill:url(#linearGradient25793);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.68109" y="104.28016" id="rect19111" style="opacity:0.1875;fill:url(#linearGradient25795);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-262.19943" y="89.530205" id="rect19113" style="opacity:0.1875;fill:url(#linearGradient25797);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.99399" y="105.37378" id="rect19115" style="opacity:0.1875;fill:url(#linearGradient25799);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.28281" y="60.801304" id="rect19117" style="opacity:0.46875;fill:url(#linearGradient25801);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-289.56076" y="82.010605" id="rect19119" style="opacity:0.46875;fill:url(#linearGradient25803);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-247.97751" y="82.576714" id="rect19121" style="opacity:0.46875;fill:url(#linearGradient25805);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-277.05029" y="99.69252" id="rect19123" style="opacity:0.1875;fill:url(#linearGradient25807);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-298.12518" y="56.092049" id="rect19125" style="opacity:0.1875;fill:url(#linearGradient25809);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-306.81729" y="83.794304" id="rect19127" style="opacity:0.1875;fill:url(#linearGradient25811);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-277.71368" y="105.04692" id="rect19129" style="opacity:0.46875;fill:url(#linearGradient25813);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-269.64838" y="65.826553" id="rect19131" style="opacity:0.46875;fill:url(#linearGradient25815);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-243.96567" y="64.875366" id="rect19133" style="opacity:0.46875;fill:url(#linearGradient25817);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.39728" y="105.96532" id="rect19135" style="opacity:0.1875;fill:url(#linearGradient25819);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-259.63116" y="84.33313" id="rect19137" style="opacity:0.1875;fill:url(#linearGradient25821);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.94666" y="103.36714" id="rect19139" style="opacity:0.1875;fill:url(#linearGradient25823);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-272.03406" y="72.169991" id="rect19141" style="opacity:0.46875;fill:url(#linearGradient25825);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-226.07004" y="91.508087" id="rect19143" style="opacity:0.46875;fill:url(#linearGradient25827);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.74023" y="65.295685" id="rect19145" style="opacity:0.46875;fill:url(#linearGradient25829);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-264.46622" y="94.028046" id="rect19147" style="opacity:0.1875;fill:url(#linearGradient25831);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.63184" y="100.02885" id="rect19149" style="opacity:0.1875;fill:url(#linearGradient25833);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.31564" y="68.181747" id="rect19151" style="opacity:0.1875;fill:url(#linearGradient25835);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.37823" y="80.158287" id="rect19153" style="opacity:0.46875;fill:url(#linearGradient25837);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-267.25195" y="73.81916" id="rect19155" style="opacity:0.46875;fill:url(#linearGradient25839);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-250.21211" y="72.697601" id="rect19157" style="opacity:0.46875;fill:url(#linearGradient25841);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.42764" y="91.750961" id="rect19159" style="opacity:0.1875;fill:url(#linearGradient25843);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-287.2442" y="84.52874" id="rect19161" style="opacity:0.1875;fill:url(#linearGradient25845);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-304.86484" y="66.390846" id="rect19163" style="opacity:0.1875;fill:url(#linearGradient25847);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-225.04269" y="107.95484" id="rect19165" style="opacity:0.46875;fill:url(#linearGradient25849);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.05286" y="78.926689" id="rect19167" style="opacity:0.46875;fill:url(#linearGradient25851);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.63925" y="107.33574" id="rect19169" style="opacity:0.46875;fill:url(#linearGradient25853);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-275.09424" y="64.496719" id="rect19171" style="opacity:0.1875;fill:url(#linearGradient25855);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.27118" y="70.296356" id="rect19173" style="opacity:0.1875;fill:url(#linearGradient25857);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-241.17659" y="90.893532" id="rect19175" style="opacity:0.1875;fill:url(#linearGradient25859);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-232.24466" y="62.413158" id="rect19177" style="opacity:0.46875;fill:url(#linearGradient25861);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-286.59363" y="91.436836" id="rect19179" style="opacity:0.46875;fill:url(#linearGradient25863);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-296.57291" y="92.877731" id="rect19181" style="opacity:0.46875;fill:url(#linearGradient25865);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-225.94574" y="85.862312" id="rect19183" style="opacity:0.1875;fill:url(#linearGradient25867);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-285.98853" y="63.901665" id="rect19185" style="opacity:0.1875;fill:url(#linearGradient25869);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-295.00256" y="107.28114" id="rect19187" style="opacity:0.1875;fill:url(#linearGradient25871);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.86865" y="89.48291" id="rect19189" style="opacity:0.46875;fill:url(#linearGradient25873);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.61465" y="57.415867" id="rect19191" style="opacity:0.46875;fill:url(#linearGradient25875);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-254.48337" y="84.216339" id="rect19193" style="opacity:0.46875;fill:url(#linearGradient25877);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-258.94864" y="71.953529" id="rect19195" style="opacity:0.1875;fill:url(#linearGradient25879);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-298.51169" y="68.122597" id="rect19197" style="opacity:0.1875;fill:url(#linearGradient25881);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.92078" y="111.10387" id="rect19199" style="opacity:0.1875;fill:url(#linearGradient25883);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-299.40286" y="63.712029" id="rect19201" style="opacity:0.46875;fill:url(#linearGradient25885);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.28314" y="106.27374" id="rect19203" style="opacity:0.46875;fill:url(#linearGradient25887);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.1701" y="55.287373" id="rect19205" style="opacity:0.46875;fill:url(#linearGradient25889);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-249.48601" y="57.769218" id="rect19207" style="opacity:0.1875;fill:url(#linearGradient25891);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-267.46838" y="77.377342" id="rect19209" style="opacity:0.1875;fill:url(#linearGradient25893);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-293.15372" y="69.913437" id="rect19211" style="opacity:0.1875;fill:url(#linearGradient25895);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-290.19022" y="65.70224" id="rect19213" style="opacity:0.46875;fill:url(#linearGradient25897);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.64978" y="94.028038" id="rect19215" style="opacity:0.46875;fill:url(#linearGradient25899);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.81993" y="97.112503" id="rect19217" style="opacity:0.46875;fill:url(#linearGradient25901);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.59576" y="97.91346" id="rect19219" style="opacity:0.1875;fill:url(#linearGradient25903);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.39734" y="98.881744" id="rect19221" style="opacity:0.1875;fill:url(#linearGradient25905);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.14093" y="78.441406" id="rect19223" style="opacity:0.1875;fill:url(#linearGradient25907);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-304.33417" y="55.983482" id="rect19225" style="opacity:0.46875;fill:url(#linearGradient25909);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.66583" y="72.041855" id="rect19227" style="opacity:0.46875;fill:url(#linearGradient25911);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-304.92673" y="70.234978" id="rect19229" style="opacity:0.46875;fill:url(#linearGradient25913);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-264.9696" y="84.045815" id="rect19231" style="opacity:0.1875;fill:url(#linearGradient25915);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.9485" y="110.36636" id="rect19233" style="opacity:0.1875;fill:url(#linearGradient25917);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.12448" y="78.765671" id="rect19235" style="opacity:0.1875;fill:url(#linearGradient25919);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-268.93396" y="66.957794" id="rect19237" style="opacity:0.46875;fill:url(#linearGradient25921);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-261.72153" y="63.677078" id="rect19239" style="opacity:0.46875;fill:url(#linearGradient25923);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-234.16353" y="106.5026" id="rect19241" style="opacity:0.46875;fill:url(#linearGradient25925);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-229.84259" y="78.04248" id="rect19243" style="opacity:0.1875;fill:url(#linearGradient25927);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-252.24341" y="97.765053" id="rect19245" style="opacity:0.1875;fill:url(#linearGradient25929);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-258.61215" y="105.56336" id="rect19247" style="opacity:0.1875;fill:url(#linearGradient25931);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-257.03516" y="103.79118" id="rect19249" style="opacity:0.46875;fill:url(#linearGradient25933);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.26445" y="74.449562" id="rect19251" style="opacity:0.46875;fill:url(#linearGradient25935);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.85646" y="68.907692" id="rect19253" style="opacity:0.46875;fill:url(#linearGradient25937);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-280.54657" y="89.704041" id="rect19255" style="opacity:0.1875;fill:url(#linearGradient25939);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.86136" y="76.668816" id="rect19257" style="opacity:0.1875;fill:url(#linearGradient25941);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-285.42096" y="61.806561" id="rect19259" style="opacity:0.1875;fill:url(#linearGradient25943);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-243.98203" y="69.427635" id="rect19261" style="opacity:0.46875;fill:url(#linearGradient25945);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-242.41055" y="85.174919" id="rect19263" style="opacity:0.46875;fill:url(#linearGradient25947);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.0016" y="103.53281" id="rect19265" style="opacity:0.46875;fill:url(#linearGradient25949);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-243.7686" y="75.559853" id="rect19267" style="opacity:0.1875;fill:url(#linearGradient25951);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.5695" y="107.75644" id="rect19269" style="opacity:0.1875;fill:url(#linearGradient25953);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.72728" y="105.42181" id="rect19271" style="opacity:0.1875;fill:url(#linearGradient25955);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-306.7652" y="82.467445" id="rect19273" style="opacity:0.46875;fill:url(#linearGradient25957);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-253.38632" y="95.402771" id="rect19275" style="opacity:0.46875;fill:url(#linearGradient25959);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-240.82684" y="72.933113" id="rect19277" style="opacity:0.46875;fill:url(#linearGradient25961);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-299.04517" y="93.536026" id="rect19279" style="opacity:0.1875;fill:url(#linearGradient25963);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-270.15546" y="89.64119" id="rect19281" style="opacity:0.1875;fill:url(#linearGradient25965);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-267.89304" y="66.820396" id="rect19283" style="opacity:0.1875;fill:url(#linearGradient25967);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-301.6131" y="71.216759" id="rect19285" style="opacity:0.46875;fill:url(#linearGradient25969);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-230.00293" y="94.547012" id="rect19287" style="opacity:0.46875;fill:url(#linearGradient25971);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-258.54749" y="111.24785" id="rect19289" style="opacity:0.46875;fill:url(#linearGradient25973);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-246.9171" y="75.402245" id="rect19291" style="opacity:0.1875;fill:url(#linearGradient25975);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.30652" y="64.5979" id="rect19293" style="opacity:0.1875;fill:url(#linearGradient25977);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.15259" y="109.60979" id="rect19295" style="opacity:0.1875;fill:url(#linearGradient25979);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-294.30212" y="103.83401" id="rect19297" style="opacity:0.46875;fill:url(#linearGradient25981);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-263.05688" y="70.616966" id="rect19299" style="opacity:0.46875;fill:url(#linearGradient25983);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-240.5407" y="108.18846" id="rect19301" style="opacity:0.46875;fill:url(#linearGradient25985);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-266.00439" y="89.209114" id="rect19687" style="opacity:0.1875;fill:url(#linearGradient25987);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.96806" y="93.906403" id="rect19689" style="opacity:0.1875;fill:url(#linearGradient25989);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.9646" y="71.037643" id="rect19691" style="opacity:0.1875;fill:url(#linearGradient25991);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-234.56036" y="72.821198" id="rect19693" style="opacity:0.46875;fill:url(#linearGradient25993);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-240.60529" y="60.0312" id="rect19695" style="opacity:0.46875;fill:url(#linearGradient25995);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.2816" y="72.936653" id="rect19697" style="opacity:0.46875;fill:url(#linearGradient25997);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-285.78677" y="56.41328" id="rect19699" style="opacity:0.1875;fill:url(#linearGradient25999);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-279.86523" y="110.02824" id="rect19701" style="opacity:0.1875;fill:url(#linearGradient26001);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.45341" y="55.875343" id="rect19703" style="opacity:0.1875;fill:url(#linearGradient26003);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-306.50208" y="103.96443" id="rect19705" style="opacity:0.46875;fill:url(#linearGradient26005);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-305.84354" y="67.604721" id="rect19707" style="opacity:0.46875;fill:url(#linearGradient26007);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-235.03075" y="96.542793" id="rect19709" style="opacity:0.46875;fill:url(#linearGradient26009);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.05197" y="77.771103" id="rect19711" style="opacity:0.1875;fill:url(#linearGradient26011);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-238.98514" y="107.89761" id="rect19713" style="opacity:0.1875;fill:url(#linearGradient26013);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.06744" y="100.2785" id="rect19715" style="opacity:0.1875;fill:url(#linearGradient26015);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.4613" y="93.778717" id="rect19717" style="opacity:0.46875;fill:url(#linearGradient26017);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-274.2962" y="110.55288" id="rect19719" style="opacity:0.46875;fill:url(#linearGradient26019);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-281.81448" y="104.48936" id="rect19721" style="opacity:0.46875;fill:url(#linearGradient26021);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-282.3071" y="90.755722" id="rect19723" style="opacity:0.1875;fill:url(#linearGradient26023);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.40009" y="66.625076" id="rect19725" style="opacity:0.1875;fill:url(#linearGradient26025);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.82065" y="61.598354" id="rect19727" style="opacity:0.1875;fill:url(#linearGradient26027);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-241.56587" y="78.79348" id="rect19729" style="opacity:0.46875;fill:url(#linearGradient26029);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-305.73978" y="109.59057" id="rect19731" style="opacity:0.46875;fill:url(#linearGradient26031);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.17905" y="69.12339" id="rect19733" style="opacity:0.46875;fill:url(#linearGradient26033);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-216.81087" y="69.328728" id="rect19735" style="opacity:0.1875;fill:url(#linearGradient26035);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-245.59779" y="60.468842" id="rect19737" style="opacity:0.1875;fill:url(#linearGradient26037);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.39996" y="69.177399" id="rect19739" style="opacity:0.1875;fill:url(#linearGradient26039);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-266.0867" y="103.58194" id="rect19741" style="opacity:0.46875;fill:url(#linearGradient26041);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.35747" y="97.591721" id="rect19743" style="opacity:0.46875;fill:url(#linearGradient26043);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-284.92908" y="108.21365" id="rect19745" style="opacity:0.46875;fill:url(#linearGradient26045);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-280.70068" y="94.988106" id="rect19747" style="opacity:0.1875;fill:url(#linearGradient26047);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-243.22475" y="86.568611" id="rect19749" style="opacity:0.1875;fill:url(#linearGradient26049);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-225.897" y="68.450813" id="rect19751" style="opacity:0.1875;fill:url(#linearGradient26051);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.28683" y="105.07285" id="rect19753" style="opacity:0.46875;fill:url(#linearGradient26053);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-300.34781" y="101.12499" id="rect19755" style="opacity:0.46875;fill:url(#linearGradient26055);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.66919" y="72.771706" id="rect19757" style="opacity:0.46875;fill:url(#linearGradient26057);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.08136" y="109.14403" id="rect19759" style="opacity:0.1875;fill:url(#linearGradient26059);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-266.47391" y="56.483292" id="rect19761" style="opacity:0.1875;fill:url(#linearGradient26061);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-305.57245" y="77.759392" id="rect19763" style="opacity:0.1875;fill:url(#linearGradient26063);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-265.63818" y="84.989304" id="rect19765" style="opacity:0.46875;fill:url(#linearGradient26065);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-295.00952" y="84.498077" id="rect19767" style="opacity:0.46875;fill:url(#linearGradient26067);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.5238" y="87.767929" id="rect19769" style="opacity:0.46875;fill:url(#linearGradient26069);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-236.25314" y="107.81876" id="rect19771" style="opacity:0.1875;fill:url(#linearGradient26071);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.9086" y="92.5084" id="rect19773" style="opacity:0.1875;fill:url(#linearGradient26073);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-294.40143" y="68.458366" id="rect19775" style="opacity:0.1875;fill:url(#linearGradient26075);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-275.85092" y="65.466675" id="rect19777" style="opacity:0.46875;fill:url(#linearGradient26077);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-256.8295" y="68.729492" id="rect19779" style="opacity:0.46875;fill:url(#linearGradient26079);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.39764" y="58.76083" id="rect19781" style="opacity:0.46875;fill:url(#linearGradient26081);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-294.33389" y="91.26815" id="rect19783" style="opacity:0.1875;fill:url(#linearGradient26083);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-235.94896" y="82.49556" id="rect19785" style="opacity:0.1875;fill:url(#linearGradient26085);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.46701" y="75.851974" id="rect19787" style="opacity:0.1875;fill:url(#linearGradient26087);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-302.13321" y="72.279182" id="rect19789" style="opacity:0.46875;fill:url(#linearGradient26089);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-242.7038" y="106.88218" id="rect19791" style="opacity:0.46875;fill:url(#linearGradient26091);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-241.86159" y="71.95945" id="rect19793" style="opacity:0.46875;fill:url(#linearGradient26093);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-269.88998" y="66.489037" id="rect19795" style="opacity:0.1875;fill:url(#linearGradient26095);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.97731" y="90.453789" id="rect19797" style="opacity:0.1875;fill:url(#linearGradient26097);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-285.25266" y="74.747742" id="rect19799" style="opacity:0.1875;fill:url(#linearGradient26099);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-237.03563" y="65.806068" id="rect19801" style="opacity:0.46875;fill:url(#linearGradient26101);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-253.26402" y="74.816711" id="rect19803" style="opacity:0.46875;fill:url(#linearGradient26103);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.60954" y="70.76754" id="rect19805" style="opacity:0.46875;fill:url(#linearGradient26105);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-267.31042" y="82.344101" id="rect19807" style="opacity:0.1875;fill:url(#linearGradient26107);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-245.2084" y="90.807762" id="rect19809" style="opacity:0.1875;fill:url(#linearGradient26109);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-239.56085" y="74.873642" id="rect19811" style="opacity:0.1875;fill:url(#linearGradient26111);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-296.24194" y="108.07713" id="rect19813" style="opacity:0.46875;fill:url(#linearGradient26113);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-254.00378" y="94.862534" id="rect19815" style="opacity:0.46875;fill:url(#linearGradient26115);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-289.65979" y="88.722481" id="rect19817" style="opacity:0.46875;fill:url(#linearGradient26117);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-235.76619" y="104.99657" id="rect19819" style="opacity:0.1875;fill:url(#linearGradient26119);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-295.69971" y="99.441635" id="rect19821" style="opacity:0.1875;fill:url(#linearGradient26121);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.08588" y="55.394043" id="rect19823" style="opacity:0.1875;fill:url(#linearGradient26123);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-233.71527" y="89.729172" id="rect19825" style="opacity:0.46875;fill:url(#linearGradient26125);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.57977" y="87.39814" id="rect19827" style="opacity:0.46875;fill:url(#linearGradient26127);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.60815" y="61.057537" id="rect19829" style="opacity:0.46875;fill:url(#linearGradient26129);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-243.3033" y="93.364738" id="rect19831" style="opacity:0.1875;fill:url(#linearGradient26131);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-291.2106" y="109.53021" id="rect19833" style="opacity:0.1875;fill:url(#linearGradient26133);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-240.3336" y="95.752419" id="rect19835" style="opacity:0.1875;fill:url(#linearGradient26135);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-260.09399" y="108.47672" id="rect19837" style="opacity:0.46875;fill:url(#linearGradient26137);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-281.98718" y="56.313244" id="rect19839" style="opacity:0.46875;fill:url(#linearGradient26139);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-250.88078" y="66.299667" id="rect19841" style="opacity:0.46875;fill:url(#linearGradient26141);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-233.43297" y="98.155182" id="rect19843" style="opacity:0.1875;fill:url(#linearGradient26143);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-264.12787" y="56.134888" id="rect19845" style="opacity:0.1875;fill:url(#linearGradient26145);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-306.90723" y="99.438095" id="rect19847" style="opacity:0.1875;fill:url(#linearGradient26147);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.72171" y="108.76661" id="rect19849" style="opacity:0.46875;fill:url(#linearGradient26149);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.49231" y="66.532898" id="rect19851" style="opacity:0.46875;fill:url(#linearGradient26151);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.77087" y="79.516312" id="rect19853" style="opacity:0.46875;fill:url(#linearGradient26153);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-236.68567" y="88.295525" id="rect19855" style="opacity:0.1875;fill:url(#linearGradient26155);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-264.75388" y="79.418007" id="rect19857" style="opacity:0.1875;fill:url(#linearGradient26157);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.2804" y="82.868881" id="rect19859" style="opacity:0.1875;fill:url(#linearGradient26159);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-257.78253" y="86.814514" id="rect19861" style="opacity:0.46875;fill:url(#linearGradient26161);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-241.81927" y="61.421219" id="rect19863" style="opacity:0.46875;fill:url(#linearGradient26163);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-226.81541" y="88.583298" id="rect19865" style="opacity:0.46875;fill:url(#linearGradient26165);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.35025" y="110.12419" id="rect19867" style="opacity:0.1875;fill:url(#linearGradient26167);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-289.07797" y="86.085411" id="rect19869" style="opacity:0.1875;fill:url(#linearGradient26169);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-280.14191" y="111.1115" id="rect19871" style="opacity:0.1875;fill:url(#linearGradient26171);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-236.09656" y="84.347092" id="rect19873" style="opacity:0.46875;fill:url(#linearGradient26173);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-300.2934" y="71.749733" id="rect19875" style="opacity:0.46875;fill:url(#linearGradient26175);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.99847" y="67.531227" id="rect19877" style="opacity:0.46875;fill:url(#linearGradient26177);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.12584" y="61.71769" id="rect19879" style="opacity:0.1875;fill:url(#linearGradient26179);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.22586" y="107.49362" id="rect19881" style="opacity:0.1875;fill:url(#linearGradient26181);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-285.43884" y="105.33451" id="rect19883" style="opacity:0.1875;fill:url(#linearGradient26183);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-279.26175" y="107.8763" id="rect19885" style="opacity:0.46875;fill:url(#linearGradient26185);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-264.44354" y="67.935165" id="rect19887" style="opacity:0.46875;fill:url(#linearGradient26187);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.49667" y="96.643944" id="rect19889" style="opacity:0.46875;fill:url(#linearGradient26189);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-217.63341" y="107.29041" id="rect19891" style="opacity:0.1875;fill:url(#linearGradient26191);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-228.05434" y="67.919067" id="rect19893" style="opacity:0.1875;fill:url(#linearGradient26193);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.32623" y="107.8399" id="rect19895" style="opacity:0.1875;fill:url(#linearGradient26195);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-289.12415" y="104.71578" id="rect19897" style="opacity:0.46875;fill:url(#linearGradient26197);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.92154" y="103.894" id="rect19899" style="opacity:0.46875;fill:url(#linearGradient26199);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-234.99353" y="69.89447" id="rect19901" style="opacity:0.46875;fill:url(#linearGradient26201);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.92441" y="70.290993" id="rect19903" style="opacity:0.1875;fill:url(#linearGradient26203);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.26547" y="75.941833" id="rect19905" style="opacity:0.1875;fill:url(#linearGradient26205);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.47929" y="81.975525" id="rect19907" style="opacity:0.1875;fill:url(#linearGradient26207);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-227.77673" y="111.29926" id="rect19909" style="opacity:0.46875;fill:url(#linearGradient26209);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-263.11667" y="99.947609" id="rect19911" style="opacity:0.46875;fill:url(#linearGradient26211);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.85245" y="88.847588" id="rect19913" style="opacity:0.46875;fill:url(#linearGradient26213);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-249.8663" y="99.503418" id="rect19915" style="opacity:0.1875;fill:url(#linearGradient26215);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.01836" y="106.64564" id="rect19917" style="opacity:0.1875;fill:url(#linearGradient26217);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.59598" y="66.732162" id="rect19919" style="opacity:0.1875;fill:url(#linearGradient26219);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-223.82793" y="100.37089" id="rect19921" style="opacity:0.46875;fill:url(#linearGradient26221);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.13416" y="81.990974" id="rect19923" style="opacity:0.46875;fill:url(#linearGradient26223);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-306.29108" y="92.491669" id="rect19925" style="opacity:0.46875;fill:url(#linearGradient26225);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-291.61893" y="79.634949" id="rect19927" style="opacity:0.1875;fill:url(#linearGradient26227);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-255.52936" y="98.797989" id="rect19929" style="opacity:0.1875;fill:url(#linearGradient26229);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.95828" y="110.65452" id="rect19931" style="opacity:0.1875;fill:url(#linearGradient26231);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-217.95099" y="100.52077" id="rect19933" style="opacity:0.46875;fill:url(#linearGradient26233);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-288.4422" y="93.812157" id="rect19935" style="opacity:0.46875;fill:url(#linearGradient26235);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-277.36646" y="94.473045" id="rect19937" style="opacity:0.46875;fill:url(#linearGradient26237);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.96104" y="111.20544" id="rect19939" style="opacity:0.1875;fill:url(#linearGradient26239);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-275.77539" y="78.428696" id="rect19941" style="opacity:0.1875;fill:url(#linearGradient26241);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-227.76193" y="101.67466" id="rect19943" style="opacity:0.1875;fill:url(#linearGradient26243);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.64917" y="55.1898" id="rect19945" style="opacity:0.46875;fill:url(#linearGradient26245);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-281.67783" y="105.24789" id="rect19947" style="opacity:0.46875;fill:url(#linearGradient26247);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.7887" y="107.56207" id="rect19949" style="opacity:0.46875;fill:url(#linearGradient26249);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.32104" y="75.765396" id="rect19951" style="opacity:0.1875;fill:url(#linearGradient26251);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.3252" y="70.395012" id="rect19953" style="opacity:0.1875;fill:url(#linearGradient26253);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.4624" y="77.843994" id="rect19955" style="opacity:0.1875;fill:url(#linearGradient26255);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-246.46291" y="97.798653" id="rect19957" style="opacity:0.46875;fill:url(#linearGradient26257);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.97621" y="92.625015" id="rect19959" style="opacity:0.46875;fill:url(#linearGradient26259);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.16928" y="66.244278" id="rect19961" style="opacity:0.46875;fill:url(#linearGradient26261);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.05453" y="106.82121" id="rect19963" style="opacity:0.1875;fill:url(#linearGradient26263);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-255.95485" y="82.979355" id="rect19965" style="opacity:0.1875;fill:url(#linearGradient26265);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-296.56934" y="75.003525" id="rect19967" style="opacity:0.1875;fill:url(#linearGradient26267);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-252.9155" y="60.718307" id="rect19969" style="opacity:0.46875;fill:url(#linearGradient26269);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.39957" y="65.565224" id="rect19971" style="opacity:0.46875;fill:url(#linearGradient26271);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-288.19415" y="66.931465" id="rect19973" style="opacity:0.46875;fill:url(#linearGradient26273);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-235.45161" y="67.468315" id="rect19975" style="opacity:0.1875;fill:url(#linearGradient26275);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-251.94643" y="102.85509" id="rect19977" style="opacity:0.1875;fill:url(#linearGradient26277);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-253.84683" y="97.23008" id="rect19979" style="opacity:0.1875;fill:url(#linearGradient26279);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-218.62408" y="106.39987" id="rect19981" style="opacity:0.46875;fill:url(#linearGradient26281);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-252.86404" y="86.620399" id="rect19983" style="opacity:0.46875;fill:url(#linearGradient26283);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-268.98251" y="105.18267" id="rect19985" style="opacity:0.46875;fill:url(#linearGradient26285);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.57259" y="96.846413" id="rect19987" style="opacity:0.1875;fill:url(#linearGradient26287);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-241.35466" y="72.427864" id="rect19989" style="opacity:0.1875;fill:url(#linearGradient26289);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-243.7484" y="60.295509" id="rect19991" style="opacity:0.1875;fill:url(#linearGradient26291);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.45859" y="103.16962" id="rect19993" style="opacity:0.46875;fill:url(#linearGradient26293);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.9902" y="99.331314" id="rect19995" style="opacity:0.46875;fill:url(#linearGradient26295);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.4754" y="67.198364" id="rect19997" style="opacity:0.46875;fill:url(#linearGradient26297);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-224.57295" y="78.623528" id="rect19999" style="opacity:0.1875;fill:url(#linearGradient26299);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-300.48843" y="58.754765" id="rect20001" style="opacity:0.1875;fill:url(#linearGradient26301);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-258.62601" y="92.053108" id="rect20003" style="opacity:0.1875;fill:url(#linearGradient26303);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-268.83109" y="89.63459" id="rect20005" style="opacity:0.46875;fill:url(#linearGradient26305);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-275.99036" y="81.23172" id="rect20007" style="opacity:0.46875;fill:url(#linearGradient26307);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.10904" y="79.479607" id="rect20009" style="opacity:0.46875;fill:url(#linearGradient26309);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.9653" y="83.475426" id="rect20011" style="opacity:0.1875;fill:url(#linearGradient26311);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-257.05237" y="99.696861" id="rect20013" style="opacity:0.1875;fill:url(#linearGradient26313);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.81726" y="94.231972" id="rect20015" style="opacity:0.1875;fill:url(#linearGradient26315);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.22989" y="104.25684" id="rect20017" style="opacity:0.46875;fill:url(#linearGradient26317);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-261.13651" y="55.010883" id="rect20019" style="opacity:0.46875;fill:url(#linearGradient26319);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-239.68616" y="109.11954" id="rect20021" style="opacity:0.46875;fill:url(#linearGradient26321);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.49696" y="76.606689" id="rect20023" style="opacity:0.1875;fill:url(#linearGradient26323);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-260.6626" y="75.026268" id="rect20025" style="opacity:0.1875;fill:url(#linearGradient26325);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-286.59128" y="88.79126" id="rect20027" style="opacity:0.1875;fill:url(#linearGradient26327);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.85246" y="107.28387" id="rect20029" style="opacity:0.46875;fill:url(#linearGradient26329);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-239.85561" y="83.328651" id="rect20031" style="opacity:0.46875;fill:url(#linearGradient26331);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-243.79652" y="91.03093" id="rect20033" style="opacity:0.46875;fill:url(#linearGradient26333);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-306.53204" y="102.40226" id="rect20035" style="opacity:0.1875;fill:url(#linearGradient26335);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-243.65462" y="86.312164" id="rect20037" style="opacity:0.1875;fill:url(#linearGradient26337);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-297.23593" y="99.523064" id="rect20039" style="opacity:0.1875;fill:url(#linearGradient26339);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.10629" y="85.250237" id="rect20041" style="opacity:0.46875;fill:url(#linearGradient26341);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-259.59616" y="62.64764" id="rect20043" style="opacity:0.46875;fill:url(#linearGradient26343);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-279.72336" y="57.199894" id="rect20045" style="opacity:0.46875;fill:url(#linearGradient26345);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-237.94009" y="69.578125" id="rect20047" style="opacity:0.1875;fill:url(#linearGradient26347);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.54706" y="63.932827" id="rect20049" style="opacity:0.1875;fill:url(#linearGradient26349);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-234.06938" y="71.778969" id="rect20051" style="opacity:0.1875;fill:url(#linearGradient26351);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-233.02867" y="79.090485" id="rect20053" style="opacity:0.46875;fill:url(#linearGradient26353);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.32771" y="69.432304" id="rect20055" style="opacity:0.46875;fill:url(#linearGradient26355);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-234.56918" y="79.627808" id="rect20057" style="opacity:0.46875;fill:url(#linearGradient26357);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-277.56387" y="56.465225" id="rect20059" style="opacity:0.1875;fill:url(#linearGradient26359);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-283.46451" y="90.167923" id="rect20061" style="opacity:0.1875;fill:url(#linearGradient26361);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.4277" y="82.128593" id="rect20063" style="opacity:0.1875;fill:url(#linearGradient26363);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-243.59889" y="70.86586" id="rect20065" style="opacity:0.46875;fill:url(#linearGradient26365);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-304.18463" y="88.390617" id="rect20067" style="opacity:0.46875;fill:url(#linearGradient26367);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.64938" y="101.78397" id="rect20069" style="opacity:0.46875;fill:url(#linearGradient26369);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.71817" y="81.253448" id="rect20455" style="opacity:0.1875;fill:url(#linearGradient26371);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-240.49081" y="65.51342" id="rect20457" style="opacity:0.1875;fill:url(#linearGradient26373);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-279.75214" y="109.76508" id="rect20459" style="opacity:0.1875;fill:url(#linearGradient26375);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-267.04233" y="88.218803" id="rect20461" style="opacity:0.46875;fill:url(#linearGradient26377);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.86346" y="85.858627" id="rect20463" style="opacity:0.46875;fill:url(#linearGradient26379);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-225.32182" y="82.631157" id="rect20465" style="opacity:0.46875;fill:url(#linearGradient26381);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.48117" y="82.083504" id="rect20467" style="opacity:0.1875;fill:url(#linearGradient26383);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-280.10507" y="108.23654" id="rect20469" style="opacity:0.1875;fill:url(#linearGradient26385);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-259.32974" y="64.70713" id="rect20471" style="opacity:0.1875;fill:url(#linearGradient26387);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-284.16614" y="74.961967" id="rect20473" style="opacity:0.46875;fill:url(#linearGradient26389);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-239.05365" y="62.712513" id="rect20475" style="opacity:0.46875;fill:url(#linearGradient26391);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.00711" y="72.933044" id="rect20477" style="opacity:0.46875;fill:url(#linearGradient26393);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-287.22855" y="110.74557" id="rect20479" style="opacity:0.1875;fill:url(#linearGradient26395);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.3591" y="79.526146" id="rect20481" style="opacity:0.1875;fill:url(#linearGradient26397);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.60628" y="106.92101" id="rect20483" style="opacity:0.1875;fill:url(#linearGradient26399);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.54721" y="80.424744" id="rect20485" style="opacity:0.46875;fill:url(#linearGradient26401);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-280.69498" y="73.441864" id="rect20487" style="opacity:0.46875;fill:url(#linearGradient26403);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-286.30206" y="67.167152" id="rect20489" style="opacity:0.46875;fill:url(#linearGradient26405);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-218.45755" y="100.83543" id="rect20491" style="opacity:0.1875;fill:url(#linearGradient26407);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-275.74637" y="77.731842" id="rect20493" style="opacity:0.1875;fill:url(#linearGradient26409);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.5361" y="63.783749" id="rect20495" style="opacity:0.1875;fill:url(#linearGradient26411);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-299.29132" y="96.522278" id="rect20497" style="opacity:0.46875;fill:url(#linearGradient26413);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.44952" y="98.607231" id="rect20499" style="opacity:0.46875;fill:url(#linearGradient26415);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.82455" y="86.80835" id="rect20501" style="opacity:0.46875;fill:url(#linearGradient26417);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-219.73625" y="61.344193" id="rect20503" style="opacity:0.1875;fill:url(#linearGradient26419);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.13663" y="77.865173" id="rect20505" style="opacity:0.1875;fill:url(#linearGradient26421);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-287.60495" y="105.65768" id="rect20507" style="opacity:0.1875;fill:url(#linearGradient26423);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-282.04767" y="65.757294" id="rect20509" style="opacity:0.46875;fill:url(#linearGradient26425);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.05054" y="107.30734" id="rect20511" style="opacity:0.46875;fill:url(#linearGradient26427);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-302.89746" y="109.56179" id="rect20513" style="opacity:0.46875;fill:url(#linearGradient26429);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.98593" y="67.596725" id="rect20515" style="opacity:0.1875;fill:url(#linearGradient26431);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-246.38931" y="73.773773" id="rect20517" style="opacity:0.1875;fill:url(#linearGradient26433);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-241.46507" y="107.92227" id="rect20519" style="opacity:0.1875;fill:url(#linearGradient26435);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-265.26581" y="83.184235" id="rect20521" style="opacity:0.46875;fill:url(#linearGradient26437);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-285.78122" y="104.65424" id="rect20523" style="opacity:0.46875;fill:url(#linearGradient26439);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.79443" y="58.689938" id="rect20525" style="opacity:0.46875;fill:url(#linearGradient26441);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-233.70056" y="60.803516" id="rect20527" style="opacity:0.1875;fill:url(#linearGradient26443);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-293.72324" y="57.410843" id="rect20529" style="opacity:0.1875;fill:url(#linearGradient26445);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.89771" y="72.826591" id="rect20531" style="opacity:0.1875;fill:url(#linearGradient26447);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-219.5639" y="70.463745" id="rect20533" style="opacity:0.46875;fill:url(#linearGradient26449);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.42273" y="58.774006" id="rect20535" style="opacity:0.46875;fill:url(#linearGradient26451);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.00671" y="72.494003" id="rect20537" style="opacity:0.46875;fill:url(#linearGradient26453);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-278.71185" y="109.54459" id="rect20539" style="opacity:0.1875;fill:url(#linearGradient26455);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-266.06219" y="55.475723" id="rect20541" style="opacity:0.1875;fill:url(#linearGradient26457);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-236.19772" y="77.694275" id="rect20543" style="opacity:0.1875;fill:url(#linearGradient26459);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.89938" y="71.35717" id="rect20545" style="opacity:0.46875;fill:url(#linearGradient26461);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-273.54712" y="84.367325" id="rect20547" style="opacity:0.46875;fill:url(#linearGradient26463);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-289.45844" y="81.262711" id="rect20549" style="opacity:0.46875;fill:url(#linearGradient26465);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-303.61487" y="104.93104" id="rect20551" style="opacity:0.1875;fill:url(#linearGradient26467);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.25128" y="71.748528" id="rect20553" style="opacity:0.1875;fill:url(#linearGradient26469);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-227.85863" y="59.726963" id="rect20555" style="opacity:0.1875;fill:url(#linearGradient26471);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-269.71912" y="79.780472" id="rect20557" style="opacity:0.46875;fill:url(#linearGradient26473);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-289.34674" y="64.180695" id="rect20559" style="opacity:0.46875;fill:url(#linearGradient26475);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-237.67152" y="56.720722" id="rect20561" style="opacity:0.46875;fill:url(#linearGradient26477);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-261.4035" y="61.502678" id="rect20563" style="opacity:0.1875;fill:url(#linearGradient26479);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-230.67986" y="97.29557" id="rect20565" style="opacity:0.1875;fill:url(#linearGradient26481);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-297.44293" y="85.375412" id="rect20567" style="opacity:0.1875;fill:url(#linearGradient26483);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-290.59766" y="96.2453" id="rect20569" style="opacity:0.46875;fill:url(#linearGradient26485);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-249.9745" y="104.10505" id="rect20571" style="opacity:0.46875;fill:url(#linearGradient26487);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-264.91541" y="63.215496" id="rect20573" style="opacity:0.46875;fill:url(#linearGradient26489);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-255.64404" y="65.274605" id="rect20575" style="opacity:0.1875;fill:url(#linearGradient26491);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-256.5867" y="64.151192" id="rect20577" style="opacity:0.1875;fill:url(#linearGradient26493);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.08963" y="73.799103" id="rect20579" style="opacity:0.1875;fill:url(#linearGradient26495);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.13312" y="76.512222" id="rect20581" style="opacity:0.46875;fill:url(#linearGradient26497);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-235.81549" y="67.021263" id="rect20583" style="opacity:0.46875;fill:url(#linearGradient26499);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-287.50644" y="95.929291" id="rect20585" style="opacity:0.46875;fill:url(#linearGradient26501);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-286.86389" y="64.541458" id="rect20587" style="opacity:0.1875;fill:url(#linearGradient26503);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.83641" y="102.7418" id="rect20589" style="opacity:0.1875;fill:url(#linearGradient26505);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.98199" y="108.77027" id="rect20591" style="opacity:0.1875;fill:url(#linearGradient26507);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.55357" y="70.026482" id="rect20593" style="opacity:0.46875;fill:url(#linearGradient26509);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-235.90517" y="73.117393" id="rect20595" style="opacity:0.46875;fill:url(#linearGradient26511);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-307.35992" y="81.319099" id="rect20597" style="opacity:0.46875;fill:url(#linearGradient26513);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-300.24792" y="60.969742" id="rect20599" style="opacity:0.1875;fill:url(#linearGradient26515);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-282.96555" y="82.846146" id="rect20601" style="opacity:0.1875;fill:url(#linearGradient26517);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.6167" y="105.03866" id="rect20603" style="opacity:0.1875;fill:url(#linearGradient26519);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-232.6017" y="85.002228" id="rect20605" style="opacity:0.46875;fill:url(#linearGradient26521);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-227.29018" y="87.934219" id="rect20607" style="opacity:0.46875;fill:url(#linearGradient26523);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-295.26987" y="97.667152" id="rect20609" style="opacity:0.46875;fill:url(#linearGradient26525);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-232.37012" y="94.034401" id="rect20611" style="opacity:0.1875;fill:url(#linearGradient26527);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.27859" y="64.077866" id="rect20613" style="opacity:0.1875;fill:url(#linearGradient26529);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-255.16219" y="75.800377" id="rect20615" style="opacity:0.1875;fill:url(#linearGradient26531);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-270.15637" y="69.005692" id="rect20617" style="opacity:0.46875;fill:url(#linearGradient26533);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-291.32767" y="106.1306" id="rect20619" style="opacity:0.46875;fill:url(#linearGradient26535);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-294.69739" y="106.73238" id="rect20621" style="opacity:0.46875;fill:url(#linearGradient26537);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.82419" y="60.101208" id="rect20623" style="opacity:0.1875;fill:url(#linearGradient26539);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-225.54817" y="70.407402" id="rect20625" style="opacity:0.1875;fill:url(#linearGradient26541);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.70004" y="61.894451" id="rect20627" style="opacity:0.1875;fill:url(#linearGradient26543);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-231.56357" y="73.227684" id="rect20629" style="opacity:0.46875;fill:url(#linearGradient26545);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-248.77377" y="86.167908" id="rect20631" style="opacity:0.46875;fill:url(#linearGradient26547);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.4563" y="80.202568" id="rect20633" style="opacity:0.46875;fill:url(#linearGradient26549);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.79651" y="77.157135" id="rect20635" style="opacity:0.1875;fill:url(#linearGradient26551);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.74509" y="97.382492" id="rect20637" style="opacity:0.1875;fill:url(#linearGradient26553);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-280.50726" y="61.974281" id="rect20639" style="opacity:0.1875;fill:url(#linearGradient26555);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-272.52014" y="104.55537" id="rect20641" style="opacity:0.46875;fill:url(#linearGradient26557);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-295.15088" y="102.41749" id="rect20643" style="opacity:0.46875;fill:url(#linearGradient26559);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-303.94156" y="66.058792" id="rect20645" style="opacity:0.46875;fill:url(#linearGradient26561);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.36902" y="79.583107" id="rect20647" style="opacity:0.1875;fill:url(#linearGradient26563);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.76428" y="89.643036" id="rect20649" style="opacity:0.1875;fill:url(#linearGradient26565);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.89841" y="106.57912" id="rect20651" style="opacity:0.1875;fill:url(#linearGradient26567);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.56018" y="105.04887" id="rect20653" style="opacity:0.46875;fill:url(#linearGradient26569);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-273.64111" y="61.205338" id="rect20655" style="opacity:0.46875;fill:url(#linearGradient26571);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.98749" y="68.127831" id="rect20657" style="opacity:0.46875;fill:url(#linearGradient26573);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-286.47653" y="88.594643" id="rect20659" style="opacity:0.1875;fill:url(#linearGradient26575);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.98727" y="105.70779" id="rect20661" style="opacity:0.1875;fill:url(#linearGradient26577);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-226.75633" y="59.944138" id="rect20663" style="opacity:0.1875;fill:url(#linearGradient26579);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.99521" y="98.409698" id="rect20665" style="opacity:0.46875;fill:url(#linearGradient26581);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-261.45309" y="83.215034" id="rect20667" style="opacity:0.46875;fill:url(#linearGradient26583);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-259.63129" y="84.058441" id="rect20669" style="opacity:0.46875;fill:url(#linearGradient26585);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-250.14677" y="62.076561" id="rect20671" style="opacity:0.1875;fill:url(#linearGradient26587);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.11346" y="79.031021" id="rect20673" style="opacity:0.1875;fill:url(#linearGradient26589);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-304.29114" y="72.775261" id="rect20675" style="opacity:0.1875;fill:url(#linearGradient26591);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-300.68109" y="77.156677" id="rect20677" style="opacity:0.46875;fill:url(#linearGradient26593);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.78348" y="98.731834" id="rect20679" style="opacity:0.46875;fill:url(#linearGradient26595);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-225.43291" y="78.722549" id="rect20681" style="opacity:0.46875;fill:url(#linearGradient26597);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-277.78207" y="65.402222" id="rect20683" style="opacity:0.1875;fill:url(#linearGradient26599);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-260.7579" y="96.139221" id="rect20685" style="opacity:0.1875;fill:url(#linearGradient26601);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.65329" y="96.36525" id="rect20687" style="opacity:0.1875;fill:url(#linearGradient26603);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-231.38538" y="84.262276" id="rect20689" style="opacity:0.46875;fill:url(#linearGradient26605);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-232.24651" y="76.61116" id="rect20691" style="opacity:0.46875;fill:url(#linearGradient26607);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-298.17392" y="94.361511" id="rect20693" style="opacity:0.46875;fill:url(#linearGradient26609);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-254.1611" y="80.839401" id="rect20695" style="opacity:0.1875;fill:url(#linearGradient26611);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-301.12796" y="79.646004" id="rect20697" style="opacity:0.1875;fill:url(#linearGradient26613);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.54639" y="104.00186" id="rect20699" style="opacity:0.1875;fill:url(#linearGradient26615);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-303.37537" y="71.01062" id="rect20701" style="opacity:0.46875;fill:url(#linearGradient26617);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.93375" y="102.269" id="rect20703" style="opacity:0.46875;fill:url(#linearGradient26619);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.88052" y="98.329185" id="rect20705" style="opacity:0.46875;fill:url(#linearGradient26621);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-223.75504" y="99.959984" id="rect20707" style="opacity:0.1875;fill:url(#linearGradient26623);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-283.50363" y="107.33015" id="rect20709" style="opacity:0.1875;fill:url(#linearGradient26625);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-303.61804" y="108.15018" id="rect20711" style="opacity:0.1875;fill:url(#linearGradient26627);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-300.03036" y="106.36648" id="rect20713" style="opacity:0.46875;fill:url(#linearGradient26629);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-303.59375" y="71.416595" id="rect20715" style="opacity:0.46875;fill:url(#linearGradient26631);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.73062" y="58.53096" id="rect20717" style="opacity:0.46875;fill:url(#linearGradient26633);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.80426" y="60.331181" id="rect20719" style="opacity:0.1875;fill:url(#linearGradient26635);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.48868" y="83.144234" id="rect20721" style="opacity:0.1875;fill:url(#linearGradient26637);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-307.44165" y="61.080101" id="rect20723" style="opacity:0.1875;fill:url(#linearGradient26639);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-249.13631" y="81.72905" id="rect20725" style="opacity:0.46875;fill:url(#linearGradient26641);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-243.89638" y="106.73634" id="rect20727" style="opacity:0.46875;fill:url(#linearGradient26643);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-304.9827" y="108.69421" id="rect20729" style="opacity:0.46875;fill:url(#linearGradient26645);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.26816" y="76.166199" id="rect20731" style="opacity:0.1875;fill:url(#linearGradient26647);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-261.2561" y="67.529793" id="rect20733" style="opacity:0.1875;fill:url(#linearGradient26649);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-306.53851" y="92.740334" id="rect20735" style="opacity:0.1875;fill:url(#linearGradient26651);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-237.18407" y="60.572968" id="rect20737" style="opacity:0.46875;fill:url(#linearGradient26653);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.11626" y="59.471355" id="rect20739" style="opacity:0.46875;fill:url(#linearGradient26655);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-238.31374" y="70.263519" id="rect20741" style="opacity:0.46875;fill:url(#linearGradient26657);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-295.89474" y="102.27914" id="rect20743" style="opacity:0.1875;fill:url(#linearGradient26659);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-251.24013" y="74.366951" id="rect20745" style="opacity:0.1875;fill:url(#linearGradient26661);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-303.00098" y="58.264374" id="rect20747" style="opacity:0.1875;fill:url(#linearGradient26663);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.54126" y="86.428101" id="rect20749" style="opacity:0.46875;fill:url(#linearGradient26665);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-304.38449" y="90.213768" id="rect20751" style="opacity:0.46875;fill:url(#linearGradient26667);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-283.8826" y="93.236168" id="rect20753" style="opacity:0.46875;fill:url(#linearGradient26669);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.99405" y="56.928612" id="rect20755" style="opacity:0.1875;fill:url(#linearGradient26671);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-283.38376" y="70.148064" id="rect20757" style="opacity:0.1875;fill:url(#linearGradient26673);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.78781" y="62.705917" id="rect20759" style="opacity:0.1875;fill:url(#linearGradient26675);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-300.72897" y="78.997246" id="rect20761" style="opacity:0.46875;fill:url(#linearGradient26677);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-253.59196" y="61.592701" id="rect20763" style="opacity:0.46875;fill:url(#linearGradient26679);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-257.47235" y="74.270607" id="rect20765" style="opacity:0.46875;fill:url(#linearGradient26681);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.67603" y="103.00905" id="rect20767" style="opacity:0.1875;fill:url(#linearGradient26683);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.1875" y="58.221188" id="rect20769" style="opacity:0.1875;fill:url(#linearGradient26685);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-293.44116" y="93.098091" id="rect20771" style="opacity:0.1875;fill:url(#linearGradient26687);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-274.90311" y="95.846085" id="rect20773" style="opacity:0.46875;fill:url(#linearGradient26689);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.50949" y="101.26105" id="rect20775" style="opacity:0.46875;fill:url(#linearGradient26691);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.00677" y="55.524345" id="rect20777" style="opacity:0.46875;fill:url(#linearGradient26693);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.34172" y="102.48254" id="rect20779" style="opacity:0.1875;fill:url(#linearGradient26695);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.48227" y="106.88896" id="rect20781" style="opacity:0.1875;fill:url(#linearGradient26697);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-277.00226" y="92.920219" id="rect20783" style="opacity:0.1875;fill:url(#linearGradient26699);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-231.33708" y="90.449989" id="rect20785" style="opacity:0.46875;fill:url(#linearGradient26701);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-227.81618" y="105.25217" id="rect20787" style="opacity:0.46875;fill:url(#linearGradient26703);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-281.00833" y="98.852737" id="rect20789" style="opacity:0.46875;fill:url(#linearGradient26705);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-220.06483" y="93.540413" id="rect20791" style="opacity:0.1875;fill:url(#linearGradient26707);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.59024" y="71.885101" id="rect20793" style="opacity:0.1875;fill:url(#linearGradient26709);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.60995" y="110.16111" id="rect20795" style="opacity:0.1875;fill:url(#linearGradient26711);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-299.35635" y="96.913025" id="rect20797" style="opacity:0.46875;fill:url(#linearGradient26713);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-231.3793" y="67.212074" id="rect20799" style="opacity:0.46875;fill:url(#linearGradient26715);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-305.76932" y="105.27201" id="rect20801" style="opacity:0.46875;fill:url(#linearGradient26717);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.66428" y="96.795341" id="rect20803" style="opacity:0.1875;fill:url(#linearGradient26719);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-298.21658" y="82.294411" id="rect20805" style="opacity:0.1875;fill:url(#linearGradient26721);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.59726" y="87.788773" id="rect20807" style="opacity:0.1875;fill:url(#linearGradient26723);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-228.504" y="69.20105" id="rect20809" style="opacity:0.46875;fill:url(#linearGradient26725);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.41647" y="102.48328" id="rect20811" style="opacity:0.46875;fill:url(#linearGradient26727);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-237.83372" y="108.8929" id="rect20813" style="opacity:0.46875;fill:url(#linearGradient26729);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-240.95575" y="68.082726" id="rect20815" style="opacity:0.1875;fill:url(#linearGradient26731);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-289.51202" y="86.063263" id="rect20817" style="opacity:0.1875;fill:url(#linearGradient26733);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-277.23071" y="85.233902" id="rect20819" style="opacity:0.1875;fill:url(#linearGradient26735);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-221.3028" y="95.189102" id="rect20821" style="opacity:0.46875;fill:url(#linearGradient26737);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.50308" y="75.583626" id="rect20823" style="opacity:0.46875;fill:url(#linearGradient26739);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-296.41016" y="90.319199" id="rect20825" style="opacity:0.46875;fill:url(#linearGradient26741);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-287.21121" y="87.030853" id="rect20827" style="opacity:0.1875;fill:url(#linearGradient26743);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.5347" y="82.118057" id="rect20829" style="opacity:0.1875;fill:url(#linearGradient26745);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-305.19586" y="90.467171" id="rect20831" style="opacity:0.1875;fill:url(#linearGradient26747);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-219.30733" y="105.46643" id="rect20833" style="opacity:0.46875;fill:url(#linearGradient26749);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-293.22729" y="92.518166" id="rect20835" style="opacity:0.46875;fill:url(#linearGradient26751);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-286.12463" y="72.211571" id="rect20837" style="opacity:0.46875;fill:url(#linearGradient26753);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-221.77547" y="70.537048" id="rect20839" style="opacity:0.1875;fill:url(#linearGradient26755);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-307.22208" y="105.5964" id="rect20841" style="opacity:0.1875;fill:url(#linearGradient26757);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-236.0667" y="65.166298" id="rect20843" style="opacity:0.1875;fill:url(#linearGradient26759);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.77191" y="64.786659" id="rect20845" style="opacity:0.46875;fill:url(#linearGradient26761);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.46454" y="74.910774" id="rect20847" style="opacity:0.46875;fill:url(#linearGradient26763);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-237.85799" y="55.804825" id="rect20849" style="opacity:0.46875;fill:url(#linearGradient26765);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.27036" y="67.163628" id="rect20851" style="opacity:0.1875;fill:url(#linearGradient26767);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-253.91354" y="107.84132" id="rect20853" style="opacity:0.1875;fill:url(#linearGradient26769);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.21909" y="55.62373" id="rect20855" style="opacity:0.1875;fill:url(#linearGradient26771);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-241.54463" y="60.722244" id="rect20857" style="opacity:0.46875;fill:url(#linearGradient26773);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-286.40973" y="60.930378" id="rect20859" style="opacity:0.46875;fill:url(#linearGradient26775);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.5116" y="61.007633" id="rect20861" style="opacity:0.46875;fill:url(#linearGradient26777);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-256.71246" y="63.907291" id="rect20863" style="opacity:0.1875;fill:url(#linearGradient26779);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-267.91263" y="92.62661" id="rect20865" style="opacity:0.1875;fill:url(#linearGradient26781);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-264.60248" y="101.52387" id="rect20867" style="opacity:0.1875;fill:url(#linearGradient26783);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-275.04568" y="86.762276" id="rect20869" style="opacity:0.46875;fill:url(#linearGradient26785);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-285.13998" y="97.211113" id="rect20871" style="opacity:0.46875;fill:url(#linearGradient26787);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.45563" y="75.488144" id="rect20873" style="opacity:0.46875;fill:url(#linearGradient26789);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-237.2831" y="63.000179" id="rect20875" style="opacity:0.1875;fill:url(#linearGradient26791);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-257.81769" y="84.297562" id="rect20877" style="opacity:0.1875;fill:url(#linearGradient26793);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-299.20258" y="110.55594" id="rect20879" style="opacity:0.1875;fill:url(#linearGradient26795);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-255.10905" y="101.29549" id="rect20881" style="opacity:0.46875;fill:url(#linearGradient26797);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-282.63766" y="110.90127" id="rect20883" style="opacity:0.46875;fill:url(#linearGradient26799);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.0107" y="96.098122" id="rect20885" style="opacity:0.46875;fill:url(#linearGradient26801);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-224.40564" y="80.693207" id="rect20887" style="opacity:0.1875;fill:url(#linearGradient26803);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-230.71815" y="108.91924" id="rect20889" style="opacity:0.1875;fill:url(#linearGradient26805);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.46727" y="64.286911" id="rect20891" style="opacity:0.1875;fill:url(#linearGradient26807);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-301.94312" y="81.063759" id="rect20893" style="opacity:0.46875;fill:url(#linearGradient26809);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-262.71429" y="61.501709" id="rect20895" style="opacity:0.46875;fill:url(#linearGradient26811);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-244.6245" y="67.977432" id="rect20897" style="opacity:0.46875;fill:url(#linearGradient26813);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.12466" y="76.452377" id="rect20899" style="opacity:0.1875;fill:url(#linearGradient26815);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.96835" y="108.51657" id="rect20901" style="opacity:0.1875;fill:url(#linearGradient26817);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-259.4852" y="59.947071" id="rect20903" style="opacity:0.1875;fill:url(#linearGradient26819);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-217.3017" y="87.066414" id="rect20905" style="opacity:0.46875;fill:url(#linearGradient26821);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-303.32651" y="107.02791" id="rect20907" style="opacity:0.46875;fill:url(#linearGradient26823);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.71164" y="96.72039" id="rect20909" style="opacity:0.46875;fill:url(#linearGradient26825);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-239.15398" y="61.069256" id="rect20911" style="opacity:0.1875;fill:url(#linearGradient26827);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.36102" y="74.99781" id="rect20913" style="opacity:0.1875;fill:url(#linearGradient26829);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.75641" y="88.847244" id="rect20915" style="opacity:0.1875;fill:url(#linearGradient26831);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-218.14275" y="67.334724" id="rect20917" style="opacity:0.46875;fill:url(#linearGradient26833);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.18599" y="109.29144" id="rect20919" style="opacity:0.46875;fill:url(#linearGradient26835);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.15916" y="96.86953" id="rect20921" style="opacity:0.46875;fill:url(#linearGradient26837);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-295.06256" y="109.20979" id="rect20923" style="opacity:0.1875;fill:url(#linearGradient26839);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.84415" y="103.0084" id="rect20925" style="opacity:0.1875;fill:url(#linearGradient26841);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-252.68372" y="87.013405" id="rect20927" style="opacity:0.1875;fill:url(#linearGradient26843);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-250.10957" y="77.451866" id="rect20929" style="opacity:0.46875;fill:url(#linearGradient26845);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-262.20053" y="90.775269" id="rect20931" style="opacity:0.46875;fill:url(#linearGradient26847);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-303.03128" y="64.104378" id="rect20933" style="opacity:0.46875;fill:url(#linearGradient26849);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-269.23318" y="56.084965" id="rect20935" style="opacity:0.1875;fill:url(#linearGradient26851);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.92523" y="57.800106" id="rect20937" style="opacity:0.1875;fill:url(#linearGradient26853);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-243.84235" y="101.17597" id="rect20939" style="opacity:0.1875;fill:url(#linearGradient26855);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-287.93134" y="85.971329" id="rect20941" style="opacity:0.46875;fill:url(#linearGradient26857);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-288.52533" y="56.047573" id="rect20943" style="opacity:0.46875;fill:url(#linearGradient26859);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-241.68431" y="92.835999" id="rect20945" style="opacity:0.46875;fill:url(#linearGradient26861);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.14163" y="102.65902" id="rect20947" style="opacity:0.1875;fill:url(#linearGradient26863);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-242.81085" y="62.801945" id="rect20949" style="opacity:0.1875;fill:url(#linearGradient26865);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.79077" y="61.009129" id="rect20951" style="opacity:0.1875;fill:url(#linearGradient26867);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-296.69693" y="73.567009" id="rect20953" style="opacity:0.46875;fill:url(#linearGradient26869);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.56216" y="91.539566" id="rect20955" style="opacity:0.46875;fill:url(#linearGradient26871);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.46866" y="67.355965" id="rect20957" style="opacity:0.46875;fill:url(#linearGradient26873);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-243.63399" y="59.601711" id="rect20959" style="opacity:0.1875;fill:url(#linearGradient26875);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.94403" y="59.034389" id="rect20961" style="opacity:0.1875;fill:url(#linearGradient26877);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.75485" y="57.040806" id="rect20963" style="opacity:0.1875;fill:url(#linearGradient26879);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-246.73541" y="60.859955" id="rect20965" style="opacity:0.46875;fill:url(#linearGradient26881);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-287.32837" y="101.73196" id="rect20967" style="opacity:0.46875;fill:url(#linearGradient26883);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-288.10788" y="86.818977" id="rect20969" style="opacity:0.46875;fill:url(#linearGradient26885);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-239.92403" y="106.37849" id="rect20971" style="opacity:0.1875;fill:url(#linearGradient26887);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.3898" y="81.959496" id="rect20973" style="opacity:0.1875;fill:url(#linearGradient26889);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.32462" y="78.340958" id="rect20975" style="opacity:0.1875;fill:url(#linearGradient26891);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-296.25104" y="61.141666" id="rect20977" style="opacity:0.46875;fill:url(#linearGradient26893);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-306.68286" y="67.630676" id="rect20979" style="opacity:0.46875;fill:url(#linearGradient26895);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-238.85361" y="106.74319" id="rect20981" style="opacity:0.46875;fill:url(#linearGradient26897);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-275.17776" y="81.861305" id="rect20983" style="opacity:0.1875;fill:url(#linearGradient26899);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.77428" y="65.122116" id="rect20985" style="opacity:0.1875;fill:url(#linearGradient26901);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-227.12112" y="73.324898" id="rect20987" style="opacity:0.1875;fill:url(#linearGradient26903);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-226.10251" y="63.861496" id="rect20989" style="opacity:0.46875;fill:url(#linearGradient26905);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.49176" y="61.256626" id="rect20991" style="opacity:0.46875;fill:url(#linearGradient26907);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.67081" y="62.871773" id="rect20993" style="opacity:0.46875;fill:url(#linearGradient26909);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-264.56204" y="63.978767" id="rect20995" style="opacity:0.1875;fill:url(#linearGradient26911);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.94516" y="108.00268" id="rect20997" style="opacity:0.1875;fill:url(#linearGradient26913);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-225.51779" y="105.95143" id="rect20999" style="opacity:0.1875;fill:url(#linearGradient26915);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-220.02303" y="78.689621" id="rect21001" style="opacity:0.46875;fill:url(#linearGradient26917);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.29872" y="56.172379" id="rect21003" style="opacity:0.46875;fill:url(#linearGradient26919);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-251.64853" y="73.173126" id="rect21005" style="opacity:0.46875;fill:url(#linearGradient26921);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.56259" y="76.504417" id="rect21007" style="opacity:0.1875;fill:url(#linearGradient26923);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.48233" y="65.487144" id="rect21009" style="opacity:0.1875;fill:url(#linearGradient26925);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-306.20041" y="57.922138" id="rect21011" style="opacity:0.1875;fill:url(#linearGradient26927);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-282.10361" y="64.32032" id="rect21013" style="opacity:0.46875;fill:url(#linearGradient26929);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-301.30933" y="87.516853" id="rect21015" style="opacity:0.46875;fill:url(#linearGradient26931);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-284.75369" y="55.552612" id="rect21017" style="opacity:0.46875;fill:url(#linearGradient26933);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-223.38631" y="87.094467" id="rect21019" style="opacity:0.1875;fill:url(#linearGradient26935);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.48524" y="99.373978" id="rect21021" style="opacity:0.1875;fill:url(#linearGradient26937);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-307.3002" y="105.05029" id="rect21023" style="opacity:0.1875;fill:url(#linearGradient26939);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.85101" y="100.16848" id="rect21025" style="opacity:0.46875;fill:url(#linearGradient26941);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-289.41794" y="101.33263" id="rect21027" style="opacity:0.46875;fill:url(#linearGradient26943);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-236.23395" y="75.302628" id="rect21029" style="opacity:0.46875;fill:url(#linearGradient26945);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-256.17188" y="89.433014" id="rect21031" style="opacity:0.1875;fill:url(#linearGradient26947);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.1181" y="69.298286" id="rect21033" style="opacity:0.1875;fill:url(#linearGradient26949);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-236.73039" y="57.077488" id="rect21035" style="opacity:0.1875;fill:url(#linearGradient26951);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-288.0459" y="98.268242" id="rect21037" style="opacity:0.46875;fill:url(#linearGradient26953);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-280.43768" y="71.375671" id="rect21039" style="opacity:0.46875;fill:url(#linearGradient26955);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-259.02997" y="77.971458" id="rect21041" style="opacity:0.46875;fill:url(#linearGradient26957);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-258.72766" y="101.21225" id="rect21043" style="opacity:0.1875;fill:url(#linearGradient26959);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.49631" y="91.145035" id="rect21045" style="opacity:0.1875;fill:url(#linearGradient26961);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-307.40121" y="108.50367" id="rect21047" style="opacity:0.1875;fill:url(#linearGradient26963);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-268.62418" y="73.931641" id="rect21049" style="opacity:0.46875;fill:url(#linearGradient26965);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.92096" y="64.543587" id="rect21051" style="opacity:0.46875;fill:url(#linearGradient26967);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-244.87704" y="86.798286" id="rect21053" style="opacity:0.46875;fill:url(#linearGradient26969);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.21255" y="84.152184" id="rect21055" style="opacity:0.1875;fill:url(#linearGradient26971);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-301.7442" y="68.038704" id="rect21057" style="opacity:0.1875;fill:url(#linearGradient26973);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-283.7352" y="106.20054" id="rect21059" style="opacity:0.1875;fill:url(#linearGradient26975);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-248.01788" y="63.94009" id="rect21061" style="opacity:0.46875;fill:url(#linearGradient26977);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-267.39545" y="81.627846" id="rect21063" style="opacity:0.46875;fill:url(#linearGradient26979);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.15396" y="87.510963" id="rect21065" style="opacity:0.46875;fill:url(#linearGradient26981);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-301.94168" y="76.720764" id="rect21067" style="opacity:0.1875;fill:url(#linearGradient26983);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.2645" y="76.507072" id="rect21069" style="opacity:0.1875;fill:url(#linearGradient26985);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.54091" y="64.807266" id="rect21071" style="opacity:0.1875;fill:url(#linearGradient26987);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-244.0256" y="105.53462" id="rect21073" style="opacity:0.46875;fill:url(#linearGradient26989);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.12021" y="86.390068" id="rect21075" style="opacity:0.46875;fill:url(#linearGradient26991);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-257.93661" y="69.662346" id="rect21077" style="opacity:0.46875;fill:url(#linearGradient26993);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-237.68182" y="92.135094" id="rect21079" style="opacity:0.1875;fill:url(#linearGradient26995);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-288.80685" y="59.947994" id="rect21081" style="opacity:0.1875;fill:url(#linearGradient26997);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.94907" y="75.974976" id="rect21083" style="opacity:0.1875;fill:url(#linearGradient26999);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-224.59161" y="102.0582" id="rect21085" style="opacity:0.46875;fill:url(#linearGradient27001);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-226.84268" y="60.748241" id="rect21087" style="opacity:0.46875;fill:url(#linearGradient27003);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-247.03136" y="61.704609" id="rect21089" style="opacity:0.46875;fill:url(#linearGradient27005);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-271.67252" y="62.573116" id="rect21091" style="opacity:0.1875;fill:url(#linearGradient27007);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.56517" y="98.622765" id="rect21093" style="opacity:0.1875;fill:url(#linearGradient27009);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-272.1326" y="94.367805" id="rect21095" style="opacity:0.1875;fill:url(#linearGradient27011);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.82713" y="68.418785" id="rect21097" style="opacity:0.46875;fill:url(#linearGradient27013);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-257.95242" y="81.885948" id="rect21099" style="opacity:0.46875;fill:url(#linearGradient27015);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-266.41571" y="103.11871" id="rect21101" style="opacity:0.46875;fill:url(#linearGradient27017);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.21912" y="55.450714" id="rect21103" style="opacity:0.1875;fill:url(#linearGradient27019);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-293.15164" y="97.328751" id="rect21105" style="opacity:0.1875;fill:url(#linearGradient27021);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-287.23364" y="62.857697" id="rect21107" style="opacity:0.1875;fill:url(#linearGradient27023);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-262.56189" y="88.4048" id="rect21109" style="opacity:0.46875;fill:url(#linearGradient27025);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-261.62183" y="85.401474" id="rect21111" style="opacity:0.46875;fill:url(#linearGradient27027);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-235.16788" y="109.76205" id="rect21113" style="opacity:0.46875;fill:url(#linearGradient27029);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-217.02565" y="80.835899" id="rect21115" style="opacity:0.1875;fill:url(#linearGradient27031);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-231.5825" y="91.056412" id="rect21117" style="opacity:0.1875;fill:url(#linearGradient27033);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.58057" y="92.429237" id="rect21119" style="opacity:0.1875;fill:url(#linearGradient27035);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-255.8084" y="106.70076" id="rect21121" style="opacity:0.46875;fill:url(#linearGradient27037);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.72501" y="80.25724" id="rect21123" style="opacity:0.46875;fill:url(#linearGradient27039);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-251.79741" y="109.15076" id="rect21125" style="opacity:0.46875;fill:url(#linearGradient27041);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-262.84338" y="100.30168" id="rect21127" style="opacity:0.1875;fill:url(#linearGradient27043);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-263.46655" y="89.088768" id="rect21129" style="opacity:0.1875;fill:url(#linearGradient27045);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-279.07495" y="103.64899" id="rect21131" style="opacity:0.1875;fill:url(#linearGradient27047);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-246.85617" y="72.184769" id="rect21133" style="opacity:0.46875;fill:url(#linearGradient27049);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.11118" y="89.581963" id="rect21135" style="opacity:0.46875;fill:url(#linearGradient27051);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-271.29672" y="69.089821" id="rect21137" style="opacity:0.46875;fill:url(#linearGradient27053);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.05901" y="72.152023" id="rect21139" style="opacity:0.1875;fill:url(#linearGradient27055);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-286.00827" y="102.33545" id="rect21141" style="opacity:0.1875;fill:url(#linearGradient27057);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-307.26855" y="61.659031" id="rect21143" style="opacity:0.1875;fill:url(#linearGradient27059);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-295.82904" y="71.701729" id="rect21145" style="opacity:0.46875;fill:url(#linearGradient27061);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-238.60464" y="77.884239" id="rect21147" style="opacity:0.46875;fill:url(#linearGradient27063);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-251.12772" y="85.596474" id="rect21149" style="opacity:0.46875;fill:url(#linearGradient27065);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-227.31731" y="56.329018" id="rect21151" style="opacity:0.1875;fill:url(#linearGradient27067);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-303.57483" y="95.667526" id="rect21153" style="opacity:0.1875;fill:url(#linearGradient27069);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-265.48077" y="100.69909" id="rect21155" style="opacity:0.1875;fill:url(#linearGradient27071);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-228.17764" y="59.823067" id="rect21157" style="opacity:0.46875;fill:url(#linearGradient27073);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.42281" y="78.211479" id="rect21159" style="opacity:0.46875;fill:url(#linearGradient27075);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.68494" y="70.215508" id="rect21161" style="opacity:0.46875;fill:url(#linearGradient27077);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-288.6322" y="101.17437" id="rect21163" style="opacity:0.1875;fill:url(#linearGradient27079);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-285.22156" y="85.157867" id="rect21165" style="opacity:0.1875;fill:url(#linearGradient27081);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-301.52106" y="63.534519" id="rect21167" style="opacity:0.1875;fill:url(#linearGradient27083);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-216.44229" y="83.262306" id="rect21169" style="opacity:0.46875;fill:url(#linearGradient27085);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-287.93253" y="108.89066" id="rect21171" style="opacity:0.46875;fill:url(#linearGradient27087);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-293.96442" y="57.4179" id="rect21173" style="opacity:0.46875;fill:url(#linearGradient27089);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-292.90317" y="111.03307" id="rect21175" style="opacity:0.1875;fill:url(#linearGradient27091);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-256.35715" y="69.274529" id="rect21177" style="opacity:0.1875;fill:url(#linearGradient27093);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.00333" y="109.78416" id="rect21179" style="opacity:0.1875;fill:url(#linearGradient27095);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.11942" y="94.954216" id="rect21181" style="opacity:0.46875;fill:url(#linearGradient27097);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.60632" y="85.795189" id="rect21183" style="opacity:0.46875;fill:url(#linearGradient27099);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-256.70975" y="66.782021" id="rect21185" style="opacity:0.46875;fill:url(#linearGradient27101);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-299.90479" y="102.16841" id="rect21187" style="opacity:0.1875;fill:url(#linearGradient27103);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-228.94711" y="57.03421" id="rect21189" style="opacity:0.1875;fill:url(#linearGradient27105);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-264.45731" y="61.083805" id="rect21191" style="opacity:0.1875;fill:url(#linearGradient27107);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-239.54405" y="93.159767" id="rect21193" style="opacity:0.46875;fill:url(#linearGradient27109);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-260.33878" y="92.271156" id="rect21195" style="opacity:0.46875;fill:url(#linearGradient27111);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-280.116" y="84.80423" id="rect21197" style="opacity:0.46875;fill:url(#linearGradient27113);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-250.88902" y="58.80711" id="rect21199" style="opacity:0.1875;fill:url(#linearGradient27115);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-294.33392" y="76.536911" id="rect21201" style="opacity:0.1875;fill:url(#linearGradient27117);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-306.26511" y="80.201492" id="rect21203" style="opacity:0.1875;fill:url(#linearGradient27119);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-301.01447" y="100.298" id="rect21205" style="opacity:0.46875;fill:url(#linearGradient27121);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-253.10202" y="58.051792" id="rect21207" style="opacity:0.46875;fill:url(#linearGradient27123);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-252.26166" y="107.3416" id="rect21209" style="opacity:0.46875;fill:url(#linearGradient27125);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.62167" y="58.792862" id="rect21211" style="opacity:0.1875;fill:url(#linearGradient27127);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-261.48352" y="61.158932" id="rect21213" style="opacity:0.1875;fill:url(#linearGradient27129);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-283.12637" y="66.620155" id="rect21215" style="opacity:0.1875;fill:url(#linearGradient27131);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-288.6153" y="73.945251" id="rect21217" style="opacity:0.46875;fill:url(#linearGradient27133);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.59021" y="65.025085" id="rect21219" style="opacity:0.46875;fill:url(#linearGradient27135);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.93964" y="95.183495" id="rect21221" style="opacity:0.46875;fill:url(#linearGradient27137);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.58449" y="98.754738" id="rect21223" style="opacity:0.1875;fill:url(#linearGradient27139);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-275.2807" y="65.886925" id="rect21225" style="opacity:0.1875;fill:url(#linearGradient27141);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-280.5025" y="83.986488" id="rect21227" style="opacity:0.1875;fill:url(#linearGradient27143);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-269.90002" y="85.324791" id="rect21229" style="opacity:0.46875;fill:url(#linearGradient27145);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.44086" y="82.210342" id="rect21231" style="opacity:0.46875;fill:url(#linearGradient27147);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-256.56891" y="84.863411" id="rect21233" style="opacity:0.46875;fill:url(#linearGradient27149);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.25336" y="87.089043" id="rect21235" style="opacity:0.1875;fill:url(#linearGradient27151);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-273.89474" y="76.845276" id="rect21237" style="opacity:0.1875;fill:url(#linearGradient27153);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-266.92368" y="108.63635" id="rect21239" style="opacity:0.1875;fill:url(#linearGradient27155);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-234.47511" y="63.970722" id="rect21241" style="opacity:0.46875;fill:url(#linearGradient27157);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.57806" y="61.810444" id="rect21243" style="opacity:0.46875;fill:url(#linearGradient27159);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-237.78726" y="80.350128" id="rect21245" style="opacity:0.46875;fill:url(#linearGradient27161);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-246.69666" y="70.788307" id="rect21247" style="opacity:0.1875;fill:url(#linearGradient27163);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-232.49185" y="68.09623" id="rect21249" style="opacity:0.1875;fill:url(#linearGradient27165);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.31662" y="72.337776" id="rect21251" style="opacity:0.1875;fill:url(#linearGradient27167);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-294.89255" y="66.959465" id="rect21253" style="opacity:0.46875;fill:url(#linearGradient27169);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.88751" y="69.532631" id="rect21255" style="opacity:0.46875;fill:url(#linearGradient27171);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.67349" y="60.119705" id="rect21257" style="opacity:0.46875;fill:url(#linearGradient27173);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.59361" y="87.967026" id="rect21259" style="opacity:0.1875;fill:url(#linearGradient27175);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.74771" y="107.91908" id="rect21261" style="opacity:0.1875;fill:url(#linearGradient27177);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-231.36357" y="97.068886" id="rect21263" style="opacity:0.1875;fill:url(#linearGradient27179);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-238.16719" y="75.513985" id="rect21265" style="opacity:0.46875;fill:url(#linearGradient27181);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.69632" y="99.551247" id="rect21267" style="opacity:0.46875;fill:url(#linearGradient27183);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-251.33495" y="75.012238" id="rect21269" style="opacity:0.46875;fill:url(#linearGradient27185);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-256.54056" y="111.64594" id="rect21271" style="opacity:0.1875;fill:url(#linearGradient27187);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.6232" y="57.15493" id="rect21273" style="opacity:0.1875;fill:url(#linearGradient27189);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-228.94926" y="102.41476" id="rect21275" style="opacity:0.1875;fill:url(#linearGradient27191);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-271.89328" y="68.986198" id="rect21277" style="opacity:0.46875;fill:url(#linearGradient27193);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.78401" y="92.376289" id="rect21279" style="opacity:0.46875;fill:url(#linearGradient27195);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-248.17442" y="62.975868" id="rect21281" style="opacity:0.46875;fill:url(#linearGradient27197);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-234.98894" y="74.333855" id="rect21283" style="opacity:0.1875;fill:url(#linearGradient27199);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-306.34875" y="74.775146" id="rect21285" style="opacity:0.1875;fill:url(#linearGradient27201);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-258.19437" y="67.117424" id="rect21287" style="opacity:0.1875;fill:url(#linearGradient27203);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.04742" y="87.623558" id="rect21289" style="opacity:0.46875;fill:url(#linearGradient27205);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.68338" y="83.066238" id="rect21291" style="opacity:0.46875;fill:url(#linearGradient27207);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-256.97443" y="68.172554" id="rect21293" style="opacity:0.46875;fill:url(#linearGradient27209);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-259.65314" y="103.76814" id="rect21295" style="opacity:0.1875;fill:url(#linearGradient27211);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-284.52921" y="89.421211" id="rect21297" style="opacity:0.1875;fill:url(#linearGradient27213);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-255.46428" y="86.758759" id="rect21299" style="opacity:0.1875;fill:url(#linearGradient27215);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-307.32059" y="59.507183" id="rect21301" style="opacity:0.46875;fill:url(#linearGradient27217);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-268.4805" y="56.354454" id="rect21303" style="opacity:0.46875;fill:url(#linearGradient27219);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-253.79776" y="82.508331" id="rect21305" style="opacity:0.46875;fill:url(#linearGradient27221);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-250.34879" y="101.22415" id="rect21307" style="opacity:0.1875;fill:url(#linearGradient27223);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-286.26691" y="81.187157" id="rect21309" style="opacity:0.1875;fill:url(#linearGradient27225);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-245.5034" y="57.942776" id="rect21311" style="opacity:0.1875;fill:url(#linearGradient27227);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-279.29797" y="56.313656" id="rect21313" style="opacity:0.46875;fill:url(#linearGradient27229);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-239.09218" y="102.84291" id="rect21315" style="opacity:0.46875;fill:url(#linearGradient27231);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.79333" y="57.296597" id="rect21317" style="opacity:0.46875;fill:url(#linearGradient27233);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.46246" y="58.547722" id="rect21319" style="opacity:0.1875;fill:url(#linearGradient27235);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.19955" y="98.540131" id="rect21321" style="opacity:0.1875;fill:url(#linearGradient27237);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.17332" y="70.700653" id="rect21323" style="opacity:0.1875;fill:url(#linearGradient27239);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.90558" y="89.287468" id="rect21325" style="opacity:0.46875;fill:url(#linearGradient27241);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-267.75607" y="75.273468" id="rect21327" style="opacity:0.46875;fill:url(#linearGradient27243);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-285.25287" y="96.609406" id="rect21329" style="opacity:0.46875;fill:url(#linearGradient27245);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.75479" y="105.10313" id="rect21331" style="opacity:0.1875;fill:url(#linearGradient27247);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.81497" y="60.864231" id="rect21333" style="opacity:0.1875;fill:url(#linearGradient27249);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.41241" y="63.960575" id="rect21335" style="opacity:0.1875;fill:url(#linearGradient27251);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-250.99886" y="64.671219" id="rect21337" style="opacity:0.46875;fill:url(#linearGradient27253);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.80031" y="56.595322" id="rect21339" style="opacity:0.46875;fill:url(#linearGradient27255);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.96497" y="103.23323" id="rect21341" style="opacity:0.46875;fill:url(#linearGradient27257);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-260.19916" y="75.172691" id="rect21343" style="opacity:0.1875;fill:url(#linearGradient27259);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-293.57715" y="101.3636" id="rect21345" style="opacity:0.1875;fill:url(#linearGradient27261);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-235.93849" y="74.692139" id="rect21347" style="opacity:0.1875;fill:url(#linearGradient27263);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.13702" y="64.289536" id="rect21349" style="opacity:0.46875;fill:url(#linearGradient27265);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-231.13849" y="63.319588" id="rect21351" style="opacity:0.46875;fill:url(#linearGradient27267);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.52722" y="87.676361" id="rect21353" style="opacity:0.46875;fill:url(#linearGradient27269);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-249.15074" y="78.342529" id="rect21355" style="opacity:0.1875;fill:url(#linearGradient27271);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-304.875" y="106.99411" id="rect21357" style="opacity:0.1875;fill:url(#linearGradient27273);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-243.84726" y="69.912445" id="rect21359" style="opacity:0.1875;fill:url(#linearGradient27275);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.75728" y="84.166862" id="rect21361" style="opacity:0.46875;fill:url(#linearGradient27277);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.75204" y="88.894562" id="rect21363" style="opacity:0.46875;fill:url(#linearGradient27279);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-267.36176" y="58.718811" id="rect21365" style="opacity:0.46875;fill:url(#linearGradient27281);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-223.17926" y="100.05959" id="rect21367" style="opacity:0.1875;fill:url(#linearGradient27283);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-291.39511" y="91.973068" id="rect21369" style="opacity:0.1875;fill:url(#linearGradient27285);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-234.90848" y="65.40184" id="rect21371" style="opacity:0.1875;fill:url(#linearGradient27287);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.50565" y="82.440086" id="rect21373" style="opacity:0.46875;fill:url(#linearGradient27289);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-282.06406" y="62.919212" id="rect21375" style="opacity:0.46875;fill:url(#linearGradient27291);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-294.80597" y="79.708824" id="rect21377" style="opacity:0.46875;fill:url(#linearGradient27293);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-219.50827" y="86.379814" id="rect21379" style="opacity:0.1875;fill:url(#linearGradient27295);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-306.90628" y="78.480072" id="rect21381" style="opacity:0.1875;fill:url(#linearGradient27297);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-239.25328" y="88.913887" id="rect21383" style="opacity:0.1875;fill:url(#linearGradient27299);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-283.05078" y="72.513489" id="rect21385" style="opacity:0.46875;fill:url(#linearGradient27301);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-243.75754" y="59.668365" id="rect21387" style="opacity:0.46875;fill:url(#linearGradient27303);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-251.42499" y="84.254898" id="rect21389" style="opacity:0.46875;fill:url(#linearGradient27305);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.21336" y="92.538765" id="rect21391" style="opacity:0.1875;fill:url(#linearGradient27307);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-274.96292" y="67.801994" id="rect21393" style="opacity:0.1875;fill:url(#linearGradient27309);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-259.03345" y="79.786247" id="rect21395" style="opacity:0.1875;fill:url(#linearGradient27311);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.33481" y="73.434113" id="rect21397" style="opacity:0.46875;fill:url(#linearGradient27313);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.33148" y="104.76869" id="rect21399" style="opacity:0.46875;fill:url(#linearGradient27315);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.44894" y="99.540825" id="rect21401" style="opacity:0.46875;fill:url(#linearGradient27317);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-256.04898" y="81.255905" id="rect21403" style="opacity:0.1875;fill:url(#linearGradient27319);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-298.30069" y="63.783806" id="rect21405" style="opacity:0.1875;fill:url(#linearGradient27321);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-266.29605" y="68.727859" id="rect21407" style="opacity:0.1875;fill:url(#linearGradient27323);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.89272" y="66.714928" id="rect21409" style="opacity:0.46875;fill:url(#linearGradient27325);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.11136" y="102.37201" id="rect21411" style="opacity:0.46875;fill:url(#linearGradient27327);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-255.21965" y="90.515549" id="rect21413" style="opacity:0.46875;fill:url(#linearGradient27329);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-217.83557" y="104.97116" id="rect21415" style="opacity:0.1875;fill:url(#linearGradient27331);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.50201" y="107.85217" id="rect21417" style="opacity:0.1875;fill:url(#linearGradient27333);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-256.51273" y="109.82304" id="rect21419" style="opacity:0.1875;fill:url(#linearGradient27335);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-296.68771" y="83.052849" id="rect21421" style="opacity:0.46875;fill:url(#linearGradient27337);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.08441" y="55.352558" id="rect21423" style="opacity:0.46875;fill:url(#linearGradient27339);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-307.1561" y="69.60759" id="rect21425" style="opacity:0.46875;fill:url(#linearGradient27341);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-248.7278" y="98.796432" id="rect21427" style="opacity:0.1875;fill:url(#linearGradient27343);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-305.89224" y="93.656448" id="rect21429" style="opacity:0.1875;fill:url(#linearGradient27345);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.91916" y="79.919479" id="rect21431" style="opacity:0.1875;fill:url(#linearGradient27347);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-275.83963" y="82.481972" id="rect21433" style="opacity:0.46875;fill:url(#linearGradient27349);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-294.69556" y="84.644272" id="rect21435" style="opacity:0.46875;fill:url(#linearGradient27351);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-296.13559" y="75.38723" id="rect21437" style="opacity:0.46875;fill:url(#linearGradient27353);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.20813" y="69.854103" id="rect21439" style="opacity:0.1875;fill:url(#linearGradient27355);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-280.60059" y="68.559395" id="rect21441" style="opacity:0.1875;fill:url(#linearGradient27357);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-283.63321" y="81.568436" id="rect21443" style="opacity:0.1875;fill:url(#linearGradient27359);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-257.16757" y="81.135536" id="rect21445" style="opacity:0.46875;fill:url(#linearGradient27361);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.10229" y="85.68129" id="rect21447" style="opacity:0.46875;fill:url(#linearGradient27363);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.03432" y="107.33843" id="rect21449" style="opacity:0.46875;fill:url(#linearGradient27365);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-234.79033" y="95.026062" id="rect21451" style="opacity:0.1875;fill:url(#linearGradient27367);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-247.72145" y="98.058182" id="rect21453" style="opacity:0.1875;fill:url(#linearGradient27369);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-233.6649" y="63.695808" id="rect21455" style="opacity:0.1875;fill:url(#linearGradient27371);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-220.88246" y="75.468437" id="rect21457" style="opacity:0.46875;fill:url(#linearGradient27373);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-275.45953" y="111.10085" id="rect21459" style="opacity:0.46875;fill:url(#linearGradient27375);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.74779" y="85.411835" id="rect21461" style="opacity:0.46875;fill:url(#linearGradient27377);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-225.76868" y="65.039749" id="rect21463" style="opacity:0.1875;fill:url(#linearGradient27379);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-273.39914" y="109.71464" id="rect21465" style="opacity:0.1875;fill:url(#linearGradient27381);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-287.76727" y="87.23999" id="rect21467" style="opacity:0.1875;fill:url(#linearGradient27383);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-235.03047" y="70.933456" id="rect21469" style="opacity:0.46875;fill:url(#linearGradient27385);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-261.24399" y="91.743217" id="rect21471" style="opacity:0.46875;fill:url(#linearGradient27387);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-268.04282" y="96.093422" id="rect21473" style="opacity:0.46875;fill:url(#linearGradient27389);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-303.54053" y="80.427925" id="rect21475" style="opacity:0.1875;fill:url(#linearGradient27391);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-294.41525" y="87.967781" id="rect21477" style="opacity:0.1875;fill:url(#linearGradient27393);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-287.14575" y="92.518379" id="rect21479" style="opacity:0.1875;fill:url(#linearGradient27395);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-267.88187" y="104.75542" id="rect21481" style="opacity:0.46875;fill:url(#linearGradient27397);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-225.48245" y="56.437023" id="rect21483" style="opacity:0.46875;fill:url(#linearGradient27399);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-291.78445" y="71.8396" id="rect21485" style="opacity:0.46875;fill:url(#linearGradient27401);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-271.13855" y="110.62964" id="rect21487" style="opacity:0.1875;fill:url(#linearGradient27403);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.79547" y="95.475662" id="rect21489" style="opacity:0.1875;fill:url(#linearGradient27405);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.55093" y="83.479332" id="rect21491" style="opacity:0.1875;fill:url(#linearGradient27407);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-264.83661" y="105.59111" id="rect21493" style="opacity:0.46875;fill:url(#linearGradient27409);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-283.90616" y="105.14223" id="rect21495" style="opacity:0.46875;fill:url(#linearGradient27411);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-247.52286" y="110.83428" id="rect21497" style="opacity:0.46875;fill:url(#linearGradient27413);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-233.30792" y="108.30075" id="rect21499" style="opacity:0.1875;fill:url(#linearGradient27415);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-238.4128" y="66.733093" id="rect21501" style="opacity:0.1875;fill:url(#linearGradient27417);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-236.95995" y="100.79337" id="rect21503" style="opacity:0.1875;fill:url(#linearGradient27419);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-248.94753" y="109.69339" id="rect21505" style="opacity:0.46875;fill:url(#linearGradient27421);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-285.84122" y="61.881496" id="rect21507" style="opacity:0.46875;fill:url(#linearGradient27423);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-263.46597" y="90.312744" id="rect21509" style="opacity:0.46875;fill:url(#linearGradient27425);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.28766" y="105.66008" id="rect21511" style="opacity:0.1875;fill:url(#linearGradient27427);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-306.57361" y="110.81626" id="rect21513" style="opacity:0.1875;fill:url(#linearGradient27429);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.30582" y="78.19458" id="rect21515" style="opacity:0.1875;fill:url(#linearGradient27431);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.36133" y="65.584717" id="rect21517" style="opacity:0.46875;fill:url(#linearGradient27433);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-247.48462" y="90.008995" id="rect21519" style="opacity:0.46875;fill:url(#linearGradient27435);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-293.29022" y="77.312546" id="rect21521" style="opacity:0.46875;fill:url(#linearGradient27437);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-290.92154" y="108.85014" id="rect21523" style="opacity:0.1875;fill:url(#linearGradient27439);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-235.70132" y="86.926987" id="rect21525" style="opacity:0.1875;fill:url(#linearGradient27441);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-299.51126" y="81.268387" id="rect21527" style="opacity:0.1875;fill:url(#linearGradient27443);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-242.69012" y="107.18739" id="rect21529" style="opacity:0.46875;fill:url(#linearGradient27445);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.16809" y="91.953133" id="rect21531" style="opacity:0.46875;fill:url(#linearGradient27447);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-303.52182" y="91.424484" id="rect21533" style="opacity:0.46875;fill:url(#linearGradient27449);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-265.15775" y="104.16637" id="rect21535" style="opacity:0.1875;fill:url(#linearGradient27451);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-302.05234" y="58.979252" id="rect21537" style="opacity:0.1875;fill:url(#linearGradient27453);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.64029" y="55.466087" id="rect21539" style="opacity:0.1875;fill:url(#linearGradient27455);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-259.65317" y="72.480949" id="rect21541" style="opacity:0.46875;fill:url(#linearGradient27457);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.7802" y="75.611626" id="rect21543" style="opacity:0.46875;fill:url(#linearGradient27459);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-305.25217" y="107.40909" id="rect21545" style="opacity:0.46875;fill:url(#linearGradient27461);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-236.92938" y="100.32093" id="rect21547" style="opacity:0.1875;fill:url(#linearGradient27463);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.53226" y="61.29652" id="rect21549" style="opacity:0.1875;fill:url(#linearGradient27465);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.69031" y="77.940781" id="rect21551" style="opacity:0.1875;fill:url(#linearGradient27467);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.86548" y="85.345512" id="rect21553" style="opacity:0.46875;fill:url(#linearGradient27469);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.49466" y="73.688721" id="rect21555" style="opacity:0.46875;fill:url(#linearGradient27471);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.92558" y="101.36566" id="rect21557" style="opacity:0.46875;fill:url(#linearGradient27473);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-263.073" y="107.99613" id="rect21559" style="opacity:0.1875;fill:url(#linearGradient27475);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-293.97604" y="90.513596" id="rect21561" style="opacity:0.1875;fill:url(#linearGradient27477);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-238.73608" y="97.185303" id="rect21563" style="opacity:0.1875;fill:url(#linearGradient27479);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.27396" y="105.07907" id="rect21565" style="opacity:0.46875;fill:url(#linearGradient27481);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-229.82477" y="56.584343" id="rect21567" style="opacity:0.46875;fill:url(#linearGradient27483);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-286.95914" y="98.348389" id="rect21569" style="opacity:0.46875;fill:url(#linearGradient27485);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.59947" y="63.419086" id="rect21571" style="opacity:0.1875;fill:url(#linearGradient27487);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.72168" y="82.934814" id="rect21573" style="opacity:0.1875;fill:url(#linearGradient27489);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-279.19464" y="66.085556" id="rect21575" style="opacity:0.1875;fill:url(#linearGradient27491);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-284.0527" y="58.101696" id="rect21577" style="opacity:0.46875;fill:url(#linearGradient27493);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-280.06149" y="103.94582" id="rect21579" style="opacity:0.46875;fill:url(#linearGradient27495);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-235.56268" y="72.870979" id="rect21581" style="opacity:0.46875;fill:url(#linearGradient27497);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-252.6017" y="74.478989" id="rect21583" style="opacity:0.1875;fill:url(#linearGradient27499);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.55887" y="99.894096" id="rect21585" style="opacity:0.1875;fill:url(#linearGradient27501);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-248.11136" y="92.003113" id="rect21587" style="opacity:0.1875;fill:url(#linearGradient27503);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-258.96588" y="91.77327" id="rect21589" style="opacity:0.46875;fill:url(#linearGradient27505);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-227.51933" y="105.80508" id="rect21591" style="opacity:0.46875;fill:url(#linearGradient27507);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.48543" y="103.79506" id="rect21593" style="opacity:0.46875;fill:url(#linearGradient27509);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.12206" y="108.9409" id="rect21595" style="opacity:0.1875;fill:url(#linearGradient27511);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-293.02167" y="58.260303" id="rect21597" style="opacity:0.1875;fill:url(#linearGradient27513);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-272.77448" y="65.542923" id="rect21599" style="opacity:0.1875;fill:url(#linearGradient27515);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.63763" y="68.649734" id="rect21601" style="opacity:0.46875;fill:url(#linearGradient27517);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.66443" y="55.40823" id="rect21603" style="opacity:0.46875;fill:url(#linearGradient27519);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-281.11868" y="70.003098" id="rect21605" style="opacity:0.46875;fill:url(#linearGradient27521);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.80618" y="83.68644" id="rect21607" style="opacity:0.1875;fill:url(#linearGradient27523);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.61108" y="72.337257" id="rect21609" style="opacity:0.1875;fill:url(#linearGradient27525);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-281.52625" y="91.485954" id="rect21611" style="opacity:0.1875;fill:url(#linearGradient27527);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-302.82098" y="73.17878" id="rect21613" style="opacity:0.46875;fill:url(#linearGradient27529);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.31381" y="62.302635" id="rect21615" style="opacity:0.46875;fill:url(#linearGradient27531);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.39542" y="100.40778" id="rect21617" style="opacity:0.46875;fill:url(#linearGradient27533);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.2916" y="56.54998" id="rect21619" style="opacity:0.1875;fill:url(#linearGradient27535);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-226.85687" y="88.680138" id="rect21621" style="opacity:0.1875;fill:url(#linearGradient27537);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.02325" y="57.190468" id="rect21623" style="opacity:0.1875;fill:url(#linearGradient27539);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-218.22159" y="107.58854" id="rect21625" style="opacity:0.46875;fill:url(#linearGradient27541);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.79041" y="67.897629" id="rect21627" style="opacity:0.46875;fill:url(#linearGradient27543);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-286.17734" y="93.437904" id="rect21629" style="opacity:0.46875;fill:url(#linearGradient27545);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-221.62856" y="69.776123" id="rect21631" style="opacity:0.1875;fill:url(#linearGradient27547);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-292.85226" y="72.556374" id="rect21633" style="opacity:0.1875;fill:url(#linearGradient27549);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-236.26521" y="65.97863" id="rect21829" style="opacity:0.46875;fill:url(#linearGradient27745);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-234.92079" y="66.180679" id="rect21635" style="opacity:0.1875;fill:url(#linearGradient27551);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-273.52203" y="88.789848" id="rect21637" style="opacity:0.46875;fill:url(#linearGradient27553);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-239.35887" y="106.48306" id="rect21639" style="opacity:0.46875;fill:url(#linearGradient27555);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-257.09924" y="61.134922" id="rect21641" style="opacity:0.46875;fill:url(#linearGradient27557);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.71439" y="71.699997" id="rect21643" style="opacity:0.1875;fill:url(#linearGradient27559);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.7209" y="60.317715" id="rect21645" style="opacity:0.1875;fill:url(#linearGradient27561);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-232.00232" y="56.347214" id="rect21647" style="opacity:0.1875;fill:url(#linearGradient27563);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.17883" y="94.825455" id="rect21649" style="opacity:0.46875;fill:url(#linearGradient27565);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.89526" y="87.537811" id="rect21651" style="opacity:0.46875;fill:url(#linearGradient27567);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-261.26334" y="84.091301" id="rect21653" style="opacity:0.46875;fill:url(#linearGradient27569);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-300.27002" y="70.411156" id="rect21655" style="opacity:0.1875;fill:url(#linearGradient27571);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-259.69394" y="78.538818" id="rect21657" style="opacity:0.1875;fill:url(#linearGradient27573);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-273.68408" y="60.320854" id="rect21659" style="opacity:0.1875;fill:url(#linearGradient27575);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.35306" y="103.11416" id="rect21661" style="opacity:0.46875;fill:url(#linearGradient27577);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-244.28685" y="96.777092" id="rect21663" style="opacity:0.46875;fill:url(#linearGradient27579);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-238.80014" y="106.55783" id="rect21665" style="opacity:0.46875;fill:url(#linearGradient27581);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-222.17648" y="66.65284" id="rect21667" style="opacity:0.1875;fill:url(#linearGradient27583);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-306.69562" y="59.358051" id="rect21669" style="opacity:0.1875;fill:url(#linearGradient27585);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-267.25375" y="75.676254" id="rect21671" style="opacity:0.1875;fill:url(#linearGradient27587);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-263.92645" y="65.860481" id="rect21673" style="opacity:0.46875;fill:url(#linearGradient27589);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-269.39749" y="102.62814" id="rect21675" style="opacity:0.46875;fill:url(#linearGradient27591);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.31821" y="77.852493" id="rect21677" style="opacity:0.46875;fill:url(#linearGradient27593);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-243.6496" y="101.4992" id="rect21679" style="opacity:0.1875;fill:url(#linearGradient27595);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-243.46136" y="73.306519" id="rect21681" style="opacity:0.1875;fill:url(#linearGradient27597);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-305.29956" y="102.79834" id="rect21683" style="opacity:0.1875;fill:url(#linearGradient27599);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-245.90312" y="85.702217" id="rect21685" style="opacity:0.46875;fill:url(#linearGradient27601);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-303.05383" y="111.4539" id="rect21687" style="opacity:0.46875;fill:url(#linearGradient27603);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-268.43542" y="81.403618" id="rect21689" style="opacity:0.46875;fill:url(#linearGradient27605);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-267.30719" y="92.514725" id="rect21691" style="opacity:0.1875;fill:url(#linearGradient27607);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-300.24991" y="74.283562" id="rect21693" style="opacity:0.1875;fill:url(#linearGradient27609);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-282.06049" y="60.561077" id="rect21695" style="opacity:0.1875;fill:url(#linearGradient27611);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-239.73814" y="105.74458" id="rect21697" style="opacity:0.46875;fill:url(#linearGradient27613);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.22021" y="96.253685" id="rect21699" style="opacity:0.46875;fill:url(#linearGradient27615);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-288.03934" y="110.5692" id="rect21701" style="opacity:0.46875;fill:url(#linearGradient27617);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-257.17294" y="111.13409" id="rect21703" style="opacity:0.1875;fill:url(#linearGradient27619);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-234.59334" y="101.43046" id="rect21705" style="opacity:0.1875;fill:url(#linearGradient27621);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.58798" y="60.705799" id="rect21707" style="opacity:0.1875;fill:url(#linearGradient27623);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-272.61441" y="73.019402" id="rect21709" style="opacity:0.46875;fill:url(#linearGradient27625);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-267.7652" y="98.472694" id="rect21711" style="opacity:0.46875;fill:url(#linearGradient27627);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-276.8707" y="107.17078" id="rect21713" style="opacity:0.46875;fill:url(#linearGradient27629);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-238.23187" y="86.312042" id="rect21715" style="opacity:0.1875;fill:url(#linearGradient27631);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-232.60698" y="95.533546" id="rect21717" style="opacity:0.1875;fill:url(#linearGradient27633);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-306.71002" y="101.39093" id="rect21719" style="opacity:0.1875;fill:url(#linearGradient27635);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-272.34747" y="86.315704" id="rect21721" style="opacity:0.46875;fill:url(#linearGradient27637);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-291.95612" y="55.324371" id="rect21723" style="opacity:0.46875;fill:url(#linearGradient27639);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-304.55295" y="102.14988" id="rect21725" style="opacity:0.46875;fill:url(#linearGradient27641);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-267.01569" y="61.645065" id="rect21727" style="opacity:0.1875;fill:url(#linearGradient27643);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-256.86374" y="110.06892" id="rect21729" style="opacity:0.1875;fill:url(#linearGradient27645);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-297.23123" y="92.380867" id="rect21731" style="opacity:0.1875;fill:url(#linearGradient27647);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-276.22873" y="59.463947" id="rect21733" style="opacity:0.46875;fill:url(#linearGradient27649);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-291.77228" y="92.189217" id="rect21735" style="opacity:0.46875;fill:url(#linearGradient27651);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-285.35599" y="108.36303" id="rect21737" style="opacity:0.46875;fill:url(#linearGradient27653);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-278.51425" y="55.131035" id="rect21739" style="opacity:0.1875;fill:url(#linearGradient27655);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-254.97046" y="78.479927" id="rect21741" style="opacity:0.1875;fill:url(#linearGradient27657);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.53455" y="70.767914" id="rect21743" style="opacity:0.1875;fill:url(#linearGradient27659);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-248.0918" y="83.996956" id="rect21745" style="opacity:0.46875;fill:url(#linearGradient27661);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-280.30066" y="100.72653" id="rect21747" style="opacity:0.46875;fill:url(#linearGradient27663);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-279.70331" y="67.053055" id="rect21749" style="opacity:0.46875;fill:url(#linearGradient27665);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-299.98083" y="73.581207" id="rect21751" style="opacity:0.1875;fill:url(#linearGradient27667);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.08847" y="94.374672" id="rect21753" style="opacity:0.1875;fill:url(#linearGradient27669);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-254.45741" y="100.69733" id="rect21755" style="opacity:0.1875;fill:url(#linearGradient27671);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-231.60889" y="85.703201" id="rect21757" style="opacity:0.46875;fill:url(#linearGradient27673);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-274.84732" y="103.87772" id="rect21759" style="opacity:0.46875;fill:url(#linearGradient27675);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-289.03357" y="90.877365" id="rect21761" style="opacity:0.46875;fill:url(#linearGradient27677);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-275.6626" y="70.500305" id="rect21763" style="opacity:0.1875;fill:url(#linearGradient27679);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-225.17976" y="57.346786" id="rect21765" style="opacity:0.1875;fill:url(#linearGradient27681);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-275.80215" y="76.338768" id="rect21767" style="opacity:0.1875;fill:url(#linearGradient27683);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-230.84044" y="62.407707" id="rect21769" style="opacity:0.46875;fill:url(#linearGradient27685);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-305.61429" y="109.48866" id="rect21771" style="opacity:0.46875;fill:url(#linearGradient27687);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.95377" y="99.259407" id="rect21773" style="opacity:0.46875;fill:url(#linearGradient27689);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-302.67654" y="80.126701" id="rect21775" style="opacity:0.1875;fill:url(#linearGradient27691);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-232.54361" y="80.017448" id="rect21777" style="opacity:0.1875;fill:url(#linearGradient27693);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-270.85376" y="96.710403" id="rect21779" style="opacity:0.1875;fill:url(#linearGradient27695);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-236.68607" y="104.046" id="rect21781" style="opacity:0.46875;fill:url(#linearGradient27697);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-271.02905" y="68.652893" id="rect21783" style="opacity:0.46875;fill:url(#linearGradient27699);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-294.33957" y="59.477379" id="rect21785" style="opacity:0.46875;fill:url(#linearGradient27701);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-233.72734" y="62.554237" id="rect21787" style="opacity:0.1875;fill:url(#linearGradient27703);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-251.08012" y="84.629906" id="rect21789" style="opacity:0.1875;fill:url(#linearGradient27705);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-246.50664" y="61.226196" id="rect21791" style="opacity:0.1875;fill:url(#linearGradient27707);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-288.17026" y="109.02679" id="rect21793" style="opacity:0.46875;fill:url(#linearGradient27709);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-276.62747" y="110.70783" id="rect21795" style="opacity:0.46875;fill:url(#linearGradient27711);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-252.71053" y="105.81419" id="rect21797" style="opacity:0.46875;fill:url(#linearGradient27713);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-223.33205" y="56.806377" id="rect21799" style="opacity:0.1875;fill:url(#linearGradient27715);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.8923" y="72.453812" id="rect21801" style="opacity:0.1875;fill:url(#linearGradient27717);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-287.84396" y="81.6036" id="rect21803" style="opacity:0.1875;fill:url(#linearGradient27719);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-259.28372" y="80.256149" id="rect21805" style="opacity:0.46875;fill:url(#linearGradient27721);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-299.51932" y="63.046921" id="rect21807" style="opacity:0.46875;fill:url(#linearGradient27723);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.11929" y="86.822929" id="rect21809" style="opacity:0.46875;fill:url(#linearGradient27725);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-273.89749" y="60.208015" id="rect21811" style="opacity:0.1875;fill:url(#linearGradient27727);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-257.36871" y="61.199322" id="rect21813" style="opacity:0.1875;fill:url(#linearGradient27729);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-297.65778" y="99.558662" id="rect21815" style="opacity:0.1875;fill:url(#linearGradient27731);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-294.99631" y="83.771034" id="rect21817" style="opacity:0.46875;fill:url(#linearGradient27733);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-296.79523" y="55.187725" id="rect21819" style="opacity:0.46875;fill:url(#linearGradient27735);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-274.21899" y="67.234024" id="rect21821" style="opacity:0.46875;fill:url(#linearGradient27737);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-279.93652" y="58.027828" id="rect21823" style="opacity:0.1875;fill:url(#linearGradient27739);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-265.09564" y="57.621449" id="rect21825" style="opacity:0.1875;fill:url(#linearGradient27741);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-230.92448" y="62.891903" id="rect21827" style="opacity:0.1875;fill:url(#linearGradient27743);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-245.2112" y="73.311836" id="rect21831" style="opacity:0.46875;fill:url(#linearGradient27747);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.29486" y="72.867485" id="rect21833" style="opacity:0.46875;fill:url(#linearGradient27749);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-293.24588" y="71.625595" id="rect21835" style="opacity:0.1875;fill:url(#linearGradient27751);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-259.41812" y="65.277237" id="rect21837" style="opacity:0.1875;fill:url(#linearGradient27753);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-278.57266" y="64.746178" id="rect21839" style="opacity:0.1875;fill:url(#linearGradient27755);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-281.70593" y="95.995338" id="rect21841" style="opacity:0.46875;fill:url(#linearGradient27757);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-260.45135" y="59.459827" id="rect21843" style="opacity:0.46875;fill:url(#linearGradient27759);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-296.65451" y="64.189789" id="rect21845" style="opacity:0.46875;fill:url(#linearGradient27761);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.06418" y="95.602432" id="rect21847" style="opacity:0.1875;fill:url(#linearGradient27763);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-297.3447" y="63.354229" id="rect21849" style="opacity:0.1875;fill:url(#linearGradient27765);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-288.95663" y="101.5279" id="rect21851" style="opacity:0.1875;fill:url(#linearGradient27767);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-298.72165" y="86.172012" id="rect21853" style="opacity:0.46875;fill:url(#linearGradient27769);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-278.71814" y="78.380249" id="rect21855" style="opacity:0.46875;fill:url(#linearGradient27771);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-229.52434" y="93.67672" id="rect21857" style="opacity:0.46875;fill:url(#linearGradient27773);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-290.90338" y="85.702248" id="rect21859" style="opacity:0.1875;fill:url(#linearGradient27775);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.38721" y="77.190605" id="rect21861" style="opacity:0.1875;fill:url(#linearGradient27777);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-247.67737" y="56.181717" id="rect21863" style="opacity:0.1875;fill:url(#linearGradient27779);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-282.15222" y="107.90704" id="rect21865" style="opacity:0.46875;fill:url(#linearGradient27781);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-303.92514" y="69.235466" id="rect21867" style="opacity:0.46875;fill:url(#linearGradient27783);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-282.22012" y="109.27183" id="rect21869" style="opacity:0.46875;fill:url(#linearGradient27785);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-282.93329" y="104.98781" id="rect21871" style="opacity:0.1875;fill:url(#linearGradient27787);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-290.55911" y="75.871635" id="rect21873" style="opacity:0.1875;fill:url(#linearGradient27789);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-290.32047" y="99.745865" id="rect21875" style="opacity:0.1875;fill:url(#linearGradient27791);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-258.80777" y="80.191414" id="rect21877" style="opacity:0.46875;fill:url(#linearGradient27793);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-243.10162" y="73.924088" id="rect21879" style="opacity:0.46875;fill:url(#linearGradient27795);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-234.60951" y="101.18223" id="rect21881" style="opacity:0.46875;fill:url(#linearGradient27797);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-247.05617" y="78.823349" id="rect21883" style="opacity:0.1875;fill:url(#linearGradient27799);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-300.5704" y="108.95625" id="rect21885" style="opacity:0.1875;fill:url(#linearGradient27801);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-280.31177" y="56.026588" id="rect21887" style="opacity:0.1875;fill:url(#linearGradient27803);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-223.99092" y="78.282021" id="rect21889" style="opacity:0.46875;fill:url(#linearGradient27805);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.61678" y="59.413132" id="rect21891" style="opacity:0.46875;fill:url(#linearGradient27807);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-282.67126" y="61.633476" id="rect21893" style="opacity:0.46875;fill:url(#linearGradient27809);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-306.9444" y="111.4621" id="rect21895" style="opacity:0.1875;fill:url(#linearGradient27811);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-240.84995" y="83.256912" id="rect21897" style="opacity:0.1875;fill:url(#linearGradient27813);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-262.802" y="57.619476" id="rect21899" style="opacity:0.1875;fill:url(#linearGradient27815);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-232.81755" y="77.153168" id="rect21901" style="opacity:0.46875;fill:url(#linearGradient27817);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-247.31902" y="68.481903" id="rect21903" style="opacity:0.46875;fill:url(#linearGradient27819);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-238.41722" y="61.906265" id="rect21905" style="opacity:0.46875;fill:url(#linearGradient27821);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-232.65349" y="86.281181" id="rect21907" style="opacity:0.1875;fill:url(#linearGradient27823);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.61473" y="89.972336" id="rect21909" style="opacity:0.1875;fill:url(#linearGradient27825);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-241.95982" y="103.9351" id="rect21911" style="opacity:0.1875;fill:url(#linearGradient27827);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-275.90552" y="105.45963" id="rect21913" style="opacity:0.46875;fill:url(#linearGradient27829);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-236.45705" y="73.526924" id="rect21915" style="opacity:0.46875;fill:url(#linearGradient27831);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-291.1709" y="64.812592" id="rect21917" style="opacity:0.46875;fill:url(#linearGradient27833);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-273.98798" y="64.855049" id="rect21919" style="opacity:0.1875;fill:url(#linearGradient27835);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.42635" y="73.936829" id="rect21921" style="opacity:0.1875;fill:url(#linearGradient27837);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-268.98654" y="73.139526" id="rect21923" style="opacity:0.1875;fill:url(#linearGradient27839);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-219.25526" y="80.140846" id="rect21925" style="opacity:0.46875;fill:url(#linearGradient27841);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-277.05325" y="94.54393" id="rect21927" style="opacity:0.46875;fill:url(#linearGradient27843);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-300.58752" y="94.470482" id="rect21929" style="opacity:0.46875;fill:url(#linearGradient27845);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-265.10745" y="68.010391" id="rect21931" style="opacity:0.1875;fill:url(#linearGradient27847);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-262.12384" y="57.154907" id="rect21933" style="opacity:0.1875;fill:url(#linearGradient27849);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-292.16574" y="94.142303" id="rect21935" style="opacity:0.1875;fill:url(#linearGradient27851);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-266.22025" y="110.43915" id="rect21937" style="opacity:0.46875;fill:url(#linearGradient27853);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-250.00839" y="80.812195" id="rect21939" style="opacity:0.46875;fill:url(#linearGradient27855);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-267.59402" y="76.412384" id="rect21941" style="opacity:0.46875;fill:url(#linearGradient27857);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-305.91107" y="58.024467" id="rect21943" style="opacity:0.1875;fill:url(#linearGradient27859);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-249.53322" y="97.532372" id="rect21945" style="opacity:0.1875;fill:url(#linearGradient27861);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-297.9502" y="79.375854" id="rect21947" style="opacity:0.1875;fill:url(#linearGradient27863);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-297.24863" y="83.744377" id="rect21949" style="opacity:0.46875;fill:url(#linearGradient27865);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-258.81308" y="87.086861" id="rect21951" style="opacity:0.46875;fill:url(#linearGradient27867);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-260.07507" y="87.316689" id="rect21953" style="opacity:0.46875;fill:url(#linearGradient27869);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-289.18948" y="111.07953" id="rect21955" style="opacity:0.1875;fill:url(#linearGradient27871);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-259.52704" y="94.9814" id="rect21957" style="opacity:0.1875;fill:url(#linearGradient27873);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-259.55115" y="79.851738" id="rect21959" style="opacity:0.1875;fill:url(#linearGradient27875);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-286.60129" y="67.812614" id="rect21961" style="opacity:0.46875;fill:url(#linearGradient27877);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-260.33926" y="104.16561" id="rect21963" style="opacity:0.46875;fill:url(#linearGradient27879);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-283.54825" y="93.081116" id="rect21965" style="opacity:0.46875;fill:url(#linearGradient27881);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-217.43896" y="58.822296" id="rect21967" style="opacity:0.1875;fill:url(#linearGradient27883);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-237.89325" y="100.85945" id="rect21969" style="opacity:0.1875;fill:url(#linearGradient27885);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-242.74698" y="63.367489" id="rect21971" style="opacity:0.1875;fill:url(#linearGradient27887);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-226.92989" y="76.764717" id="rect21973" style="opacity:0.46875;fill:url(#linearGradient27889);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-233.42609" y="98.909195" id="rect21975" style="opacity:0.46875;fill:url(#linearGradient27891);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-299.9494" y="67.81192" id="rect21977" style="opacity:0.46875;fill:url(#linearGradient27893);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-265.12759" y="80.207634" id="rect21979" style="opacity:0.1875;fill:url(#linearGradient27895);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-260.70068" y="107.55251" id="rect21981" style="opacity:0.1875;fill:url(#linearGradient27897);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-236.33008" y="88.17466" id="rect21983" style="opacity:0.1875;fill:url(#linearGradient27899);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="10.629006" height="0.28105551" rx="0" ry="0" x="-251.88853" y="84.047386" id="rect21985" style="opacity:0.46875;fill:url(#linearGradient27901);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.28105551" rx="0" ry="0" x="-255.8196" y="80.099098" id="rect21987" style="opacity:0.46875;fill:url(#linearGradient27903);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+    <rect width="19.367277" height="0.33215648" rx="0" ry="0" x="-276.29352" y="88.051704" id="rect21989" style="opacity:0.46875;fill:url(#linearGradient27905);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  </g>
+  <path d="M 34.6875,80.38144 C 33.51024,80.38144 32.5625,81.339002 32.5625,82.528441 L 32.5625,82.717882 C 32.5625,81.528444 33.51024,80.570884 34.6875,80.57088 L 85.84375,80.57088 C 86.87384,80.57088 87.74,81.327313 87.9375,82.307427 C 87.82856,81.22269 86.94705,80.38144 85.84375,80.38144 L 34.6875,80.38144 z M 39.96875,111.10251 L 39.96875,111.29197 C 39.96875,111.81689 40.38669,112.23916 40.90625,112.23916 L 55.03125,112.23916 C 55.5508,112.23916 55.96874,111.81689 55.96875,111.29197 L 55.96875,111.10251 C 55.96874,111.62744 55.5508,112.04971 55.03125,112.04971 L 40.90625,112.04971 C 40.38669,112.04971 39.96875,111.62744 39.96875,111.10251 z" id="path3292" style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <path d="M 34.6875,80.279513 C 33.51024,80.279513 32.5625,81.643 32.5625,82.832439 L 32.5625,83.021881 C 32.5625,81.832441 33.51024,81.474879 34.6875,81.474879 L 85.84375,81.474879 C 86.87384,81.474879 87.54,81.631311 87.7375,82.611424 C 87.62856,81.526688 86.94705,80.380993 85.84375,80.380993 L 34.6875,80.279513 z M 39.96875,111.40651 L 39.96875,111.59595 C 39.96875,112.12088 40.38669,112.54316 40.90625,112.54316 L 55.03125,112.54316 C 55.5508,112.54316 55.96874,112.12088 55.96875,111.59595 L 55.96875,111.40651 C 55.96874,111.93144 55.5508,112.35371 55.03125,112.35371 L 40.90625,112.35371 C 40.38669,112.35371 39.96875,111.93144 39.96875,111.40651 z" id="path3301" style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <rect width="0.25288588" height="38.263451" rx="0" ry="0" x="-87.866302" y="81.923531" transform="scale(-1,1)" id="rect27971" style="opacity:1;fill:url(#linearGradient27979);fill-opacity:1;stroke:none;stroke-width:0.1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <g transform="matrix(1.0884558,0,0,1.1036437,-2.1696646,-3.433884)" id="g28105" style="opacity:0.78515625">
+    <rect width="8" height="12" rx="1.079258" ry="1.079258" x="12" y="12" transform="matrix(0.6942102,0,0,0.6942102,4.8926363,5.5042159)" clip-path="url(#clipPath28045)" id="rect28009" style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter28031)"/>
+    <rect width="8" height="12" rx="1.079258" ry="1.079258" x="12" y="12" transform="matrix(0.6942102,0,0,0.6942102,4.8926363,5.5042159)" clip-path="url(#clipPath28041)" id="rect28039" style="opacity:1;fill:url(#radialGradient28110);fill-opacity:1;stroke:url(#linearGradient28112);stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter28031)"/>
+    <rect width="4.3502288" height="3.6759202" rx="0.45226815" ry="0.45226815" x="13.897468" y="18.030909" id="rect28057" style="opacity:1;fill:url(#radialGradient28114);fill-opacity:1;stroke:url(#linearGradient28116);stroke-width:0.33188635;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1;filter:url(#filter28101)"/>
+  </g>
+  <rect width="55.5" height="2.5258846" x="32.5" y="118.41405" id="rect28122" style="opacity:0.546875;fill:url(#linearGradient28138);fill-opacity:1;stroke:none;stroke-width:0.30000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.15;stroke-opacity:1"/>
+  <path d="M 11.375,8.000469 C 9.318588,8.107658 8,9.705749 8,12.312968 L 8,12.906718 C 8,9.927039 9.421552,8.594219 12.375,8.594219 C 48.895822,8.020377 88.665734,8.321938 116.625,8.594219 C 118.52101,8.594219 120,9.722534 120,11.906718 L 120,11.312968 C 120,9.769599 118.4515,8.000469 116.625,8.000469 L 12.375,8.000469 C 12.005819,8.000469 11.668773,7.9851585 11.375,8.000469 z" id="path3391" style="opacity:1;fill:#343434;fill-opacity:0.82840235;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"/>
+  <path d="M 118.02054,8.3884687 L 118.13103,9.4933229 L 119.58944,9.493323 C 119.49063,9.021128 119.39101,8.3122317 118.02054,8.3884687 z" transform="matrix(-1.3891392,0,0,1.3891392,175.666,-2.239338)" id="path3081" style="fill:url(#radialGradient3084);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3077)"/>
+  <path d="M 117.12054,8.6884687 L 117.23103,9.793323 L 118.68944,9.793323 C 118.59063,9.321128 118.49101,8.6122317 117.12054,8.6884687 z" transform="matrix(1.2828374,0,0,1.2828374,-33.432312,-2.365499)" id="path3031" style="opacity:0.86141304;fill:url(#radialGradient3039);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3077)"/>
+</svg>
\ No newline at end of file
diff --git a/CrowIDE/src/CrowIDE.cs b/CrowIDE/src/CrowIDE.cs
new file mode 100644 (file)
index 0000000..d0b640f
--- /dev/null
@@ -0,0 +1,304 @@
+//
+//  HelloCube.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2016 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+using System;
+using Crow;
+using System.Reflection;
+using System.Collections.Generic;
+using System.Collections;
+using System.Xml.Serialization;
+using System.IO;
+using Crow.IML;
+using System.Xml;
+using System.Linq;
+using Crow.Coding;
+using System.Threading;
+
+namespace Crow.Coding
+{
+       class CrowIDE : Interface
+       {
+               public Command CMDNew, CMDOpen, CMDSave, CMDSaveAs, cmdCloseSolution, CMDQuit,
+               CMDUndo, CMDRedo, CMDCut, CMDCopy, CMDPaste, CMDHelp,
+               CMDAbout, CMDOptions,
+               CMDViewGTExp, CMDViewProps, CMDViewProj, CMDViewProjProps, CMDViewErrors, CMDViewSolution, CMDViewEditor, CMDViewProperties,
+               CMDViewToolbox, CMDViewSchema, CMDViewStyling,CMDViewDesign,
+               CMDCompile;
+
+               void initCommands () {
+                       CMDNew = new Command(new Action(() => newFile())) { Caption = "New", Icon = new SvgPicture("#CrowIDE.icons.blank-file.svg"), CanExecute = true};
+                       CMDOpen = new Command(new Action(() => openFileDialog())) { Caption = "Open...", Icon = new SvgPicture("#CrowIDE.icons.open.svg") };
+                       CMDSave = new Command(new Action(() => saveFileDialog())) { Caption = "Save", Icon = new SvgPicture("#CrowIDE.icons.save.svg"), CanExecute = false};
+                       CMDSaveAs = new Command(new Action(() => saveFileDialog())) { Caption = "Save As...", Icon = new SvgPicture("#CrowIDE.icons.save.svg"), CanExecute = false};
+                       CMDQuit = new Command(new Action(() => app.running = false)) { Caption = "Quit", Icon = new SvgPicture("#CrowIDE.icons.sign-out.svg") };
+                       CMDUndo = new Command(new Action(() => undo())) { Caption = "Undo", Icon = new SvgPicture("#CrowIDE.icons.undo.svg"), CanExecute = false};
+                       CMDRedo = new Command(new Action(() => redo())) { Caption = "Redo", Icon = new SvgPicture("#CrowIDE.icons.redo.svg"), CanExecute = false};
+            //CMDCut = new Command(new Action(() => Quit (null, null))) { Caption = "Cut", Icon = new SvgPicture("#CrowIDE.icons.scissors.svg"), CanExecute = false};
+            //CMDCopy = new Command(new Action(() => Quit (null, null))) { Caption = "Copy", Icon = new SvgPicture("#CrowIDE.icons.copy-file.svg"), CanExecute = false};
+            //CMDPaste = new Command(new Action(() => Quit (null, null))) { Caption = "Paste", Icon = new SvgPicture("#CrowIDE.icons.paste-on-document.svg"), CanExecute = false};
+            CMDHelp = new Command(new Action(() => System.Diagnostics.Debug.WriteLine("help"))) { Caption = "Help", Icon = new SvgPicture("#CrowIDE.icons.question.svg") };
+                       CMDOptions = new Command(new Action(() => loadWindow("#CrowIDE.ui.Options.crow"))) { Caption = "Editor Options", Icon = new SvgPicture("#CrowIDE.icons.tools.svg") };
+
+                       cmdCloseSolution = new Command(new Action(() => closeSolution()))
+                       { Caption = "Close Solution", Icon = new SvgPicture("#CrowIDE.icons.paste-on-document.svg"), CanExecute = false};
+
+                       CMDViewErrors = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winErrors.crow",this)))
+                       { Caption = "Errors pane"};
+                       CMDViewSolution = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winSolution.crow",this)))
+                       { Caption = "Solution Tree", CanExecute = false};
+                       CMDViewEditor = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winEditor.crow",this)))
+                       { Caption = "Editor Pane"};
+                       CMDViewProperties = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winProperties.crow",this)))
+                       { Caption = "Properties"};
+                       CMDViewDesign = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winDesign.crow",this)))
+                       { Caption = "Quick Design", CanExecute = true};
+                       CMDViewToolbox = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winToolbox.crow",this)))
+                       { Caption = "Toolbox", CanExecute = false};
+                       CMDViewSchema = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winSchema.crow",this)))
+                       { Caption = "IML Shematic View", CanExecute = true};
+                       CMDViewStyling = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winStyleView.crow",this)))
+                       { Caption = "Styling Explorer", CanExecute = true};
+                               
+                       CMDViewGTExp = new Command(new Action(() => loadWindow ("#CrowIDE.ui.DockWindows.winGTExplorer.crow",this)))
+                       { Caption = "Graphic Tree Explorer", CanExecute = true};
+                       CMDCompile = new Command(new Action(() => compileSolution()))
+                       { Caption = "Compile", CanExecute = false};
+                       CMDViewProjProps = new Command(new Action(loadProjProps))
+                       { Caption = "Project Properties", CanExecute = false};
+               }
+
+               void openFileDialog () {                        
+                       AddWidget (instFileDlg.CreateInstance()).DataSource = this;
+               }
+               void openOptionsDialog(){}
+               void newFile() {                        
+                       currentSolution.OpenedItems.AddElement(new ProjectFile());
+               }
+               void saveFileDialog() {}
+               void undo() {}
+               void redo() {}
+               void closeSolution (){
+                       if (currentSolution != null)
+                               currentSolution.CloseSolution ();
+                       CurrentSolution = null;
+               }
+
+               public void saveWinConfigs() {
+                       Configuration.Global.Set ("WinConfigs", mainDock.ExportConfig ());
+                       Configuration.Global.Save ();
+               }
+               public void reloadWinConfigs() {
+                       string conf = Configuration.Global.Get<string>("WinConfigs");
+                       if (string.IsNullOrEmpty (conf))
+                               return;
+                       mainDock.ImportConfig (conf, this);
+               }
+
+               static CrowIDE app;
+               [STAThread]
+               static void Main ()
+               {
+                       using (app = new CrowIDE ()) {
+                               MainIFace = app;
+
+                               //app.Keyboard.KeyDown += App_KeyboardKeyDown;
+                               app.initIde ();
+
+                               app.reloadWinConfigs ();
+
+                               app.Run ();
+
+                               app.saveWinConfigs ();
+                       }
+               }
+
+               static void App_KeyboardKeyDown (object sender, KeyEventArgs e)
+               {
+                       Console.WriteLine((byte)e.Key);
+                       //#if DEBUG_LOG
+                       /*switch (e.Key) {
+                       case Key.F2:                            
+                               DebugLog.save (app);
+                               break;
+                       }*/
+                       //#endif
+               }
+
+               public CrowIDE ()
+                       : base(1024, 800)
+               {                       
+               }
+
+               Instantiator instFileDlg;
+               Solution currentSolution;
+               Project currentProject;
+               DockStack mainDock;
+
+               public static Interface MainIFace;
+               public static CrowIDE MainWin;
+
+               void initIde() {
+
+                       initCommands ();
+
+                       Widget go = Load (@"#CrowIDE.ui.CrowIDE.crow");
+                       go.DataSource = this;
+
+                       mainDock = go.FindByName ("mainDock") as DockStack;
+
+                       if (ReopenLastSolution && !string.IsNullOrEmpty (LastOpenSolution)) {
+                               CurrentSolution = Solution.LoadSolution (LastOpenSolution);
+                               //lock(MainIFace.UpdateMutex)
+                               CurrentSolution.ReopenItemsSavedInUserConfig ();
+                       }
+
+                       instFileDlg = Instantiator.CreateFromImlFragment
+                               (MainIFace, "<FileDialog Caption='Open File' CurrentDirectory='{²CurrentDirectory}' SearchPattern='*.sln' OkClicked='onFileOpen'/>");
+
+                       /*DockWindow dw = loadWindow ("#CrowIDE.ui.DockWindows.winEditor.crow", this) as DockWindow;
+                       dw.DockingPosition = Alignment.Center;
+                       dw.Dock (mainDock);
+                       dw = loadWindow ("#CrowIDE.ui.DockWindows.winSolution.crow", this) as DockWindow;
+                       dw.DockingPosition = Alignment.Right;
+                       dw.Dock (mainDock);
+                       dw = loadWindow ("#CrowIDE.ui.DockWindows.winToolbox.crow", this) as DockWindow;
+                       dw.DockingPosition = Alignment.Left;
+                       dw.Dock (mainDock);*/
+
+                       //Console.WriteLine ();
+               }
+
+               void loadProjProps () {
+                       loadWindow ("#CrowIDE.ui.ProjectProperties.crow");
+               }
+               void compileSolution () {
+                       //ProjectItem pi = CurrentSolution.SelectedItem;
+                       Project p = CurrentSolution?.Projects[1];
+                       if (p == null)
+                               return;
+                       p.Compile ();
+               }
+
+               public string CurrentDirectory {
+                       get { return Crow.Configuration.Global.Get<string>("CurrentDirectory");}
+                       set {
+                               Crow.Configuration.Global.Set ("CurrentDirectory", value);
+                       }
+               }
+               public Solution CurrentSolution {
+                       get { return currentSolution; }
+                       set {
+                               if (currentSolution == value)
+                                       return;
+                               
+                               currentSolution = value;
+
+                               CMDCompile.CanExecute = (currentSolution != null);
+                               cmdCloseSolution.CanExecute = (currentSolution != null);
+                               CMDViewSolution.CanExecute = (currentSolution != null);
+                               
+                               lock (MainIFace) {
+                                       NotifyValueChanged ("CurrentSolution", currentSolution);
+                               }
+                       }
+               }
+               public Project CurrentProject {
+                       get { return currentProject; }
+                       set {
+                               if (currentProject == value)
+                                       return;
+                               currentProject = value;
+
+                               CMDViewProjProps.CanExecute = (currentProject != null);
+                               
+                               lock (MainIFace) {
+                                       NotifyValueChanged ("CurrentProject", currentProject);
+                               }
+                       }
+               }
+
+               public string LastOpenSolution {
+                       get { return Crow.Configuration.Global.Get<string>("LastOpenSolution");}
+                       set {
+                               if (LastOpenSolution == value)
+                                       return;
+                               Crow.Configuration.Global.Set ("LastOpenSolution", value);
+                               NotifyValueChanged ("LastOpenSolution", value);
+                       }
+               }
+               public bool ReopenLastSolution {
+                       get { return Crow.Configuration.Global.Get<bool>("ReopenLastSolution");}
+                       set {
+                               if (ReopenLastSolution == value)
+                                       return;
+                               Crow.Configuration.Global.Set ("ReopenLastSolution", value);
+                               NotifyValueChanged ("ReopenLastSolution", value);
+                       }
+               }
+
+               public void onFileOpen (object sender, EventArgs e)
+               {
+                       FileDialog fd = sender as FileDialog;
+
+                       string filePath = fd.SelectedFileFullPath;
+
+                       try {
+                               string ext = Path.GetExtension (filePath);
+                               if (string.Equals (ext, ".sln", StringComparison.InvariantCultureIgnoreCase)) {                                 
+                                       CurrentSolution = Solution.LoadSolution (filePath);
+                                       LastOpenSolution = filePath;
+//                             }else if (string.Equals (ext, ".csproj", StringComparison.InvariantCultureIgnoreCase)) {
+//                                     currentProject = new Project (filePath);
+                               }
+                       } catch (Exception ex) {
+                               LoadIMLFragment ("<MessageBox Message='"+ ex.Message + "\n" + "' MsgType='Error'/>");   
+                       }                               
+               }
+
+               Window loadWindow(string path, object dataSource = null){
+                       try {
+                               Widget g = MainIFace.FindByName (path);
+                               if (g != null)
+                                       return g as Window;
+                               g = MainIFace.Load (path);
+                               g.Name = path;
+                               g.DataSource = dataSource;
+                               return g as Window;
+                       } catch (Exception ex) {
+                               Console.WriteLine (ex.ToString ());
+                       }
+                       return null;
+               }
+               void closeWindow (string path){
+                       Widget g = MainIFace.FindByName (path);
+                       if (g != null)
+                               MainIFace.DeleteWidget (g);
+               }
+
+               protected void onCommandSave(object sender, MouseButtonEventArgs e){
+                       System.Diagnostics.Debug.WriteLine("save");
+               }
+
+               void actionOpenFile(){
+                       System.Diagnostics.Debug.WriteLine ("OpenFile action");
+               }
+       }
+}
\ No newline at end of file
diff --git a/CrowIDE/src/DesignInterface.cs b/CrowIDE/src/DesignInterface.cs
new file mode 100644 (file)
index 0000000..6d2f8b5
--- /dev/null
@@ -0,0 +1,212 @@
+//
+// DesignInterface.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+using System.Globalization;
+using System.Threading;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using Crow.Cairo;
+
+namespace Crow.Coding
+{
+       public class DesignInterface : Interface, IValueChange
+       {
+               #region IValueChange implementation
+               /// <summary>
+               /// Raise to notify that the value of a property has changed, the binding system
+               /// rely mainly on this event. the member name may not be present in the class, this is 
+               /// used in **propertyless** bindings, this allow to raise custom named events without needing
+               /// to create an new one in the class or a new property.
+               /// </summary>
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               /// <summary>
+               /// Helper function to raise the value changed event
+               /// </summary>
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       //Debug.WriteLine ("Value changed: {0}->{1} = {2}", this, MemberName, _value);
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               public DesignInterface () : base()
+               {
+               }
+
+               public ProjectFile ProjFile;
+
+
+
+               public override Widget CreateInstance (string path)
+               {
+                       ProjectFile pi;
+
+                       if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi))
+                               return CreateITorFromIMLFragment (pi.Source).CreateInstance();                                  
+               
+                       return null;
+               }
+               public override Stream GetStreamFromPath (string path)
+               {
+                       ProjectFile pi;
+                       if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi)) {
+                               return new FileStream (pi.AbsolutePath, FileMode.Open); 
+                       }
+                       throw new Exception ($"In Design File not found: {path}");
+               }
+
+               protected override void InitBackend ()
+               {
+                       surf = new ImageSurface (Format.Argb32, 100, 100);
+               }
+               public override void ProcessResize (Rectangle bounds)
+               {
+                       if (bounds == clientRectangle)
+                               return;
+                       lock (UpdateMutex) {
+                               clientRectangle = bounds;
+                               surf.Dispose ();
+                               surf = new ImageSurface (Format.Argb32, clientRectangle.Width, clientRectangle.Height);
+
+                               foreach (Widget g in GraphicTree)
+                                       g.RegisterForLayouting (LayoutingType.All);
+
+                               RegisterClip (clientRectangle);
+                       }
+
+               }
+               public override bool ProcessMouseMove (int x, int y)
+               {
+                       int deltaX = x - Mouse.X;
+                       int deltaY = y - Mouse.Y;
+                       Mouse.X = x;
+                       Mouse.Y = y;
+                       MouseMoveEventArgs e = new MouseMoveEventArgs (x, y, deltaX, deltaY);
+                       e.Mouse = Mouse;
+
+                       if (ActiveWidget != null) {
+                               //TODO, ensure object is still in the graphic tree
+                               //send move evt even if mouse move outside bounds
+                               ActiveWidget.onMouseMove (this, e);
+                               if (!ActiveWidget.IsDragged)//if active is dragged, process mouse move as it was not visible.
+                                       return true;
+                       }
+
+                       if (HoverWidget != null) {
+                               
+                               //check topmost graphicobject first
+                               Widget tmp = HoverWidget;
+                               Widget topc = null;
+                               while (tmp is Widget) {
+                                       topc = tmp;
+                                       tmp = tmp.LogicalParent as Widget;
+                               }
+                               int idxhw = GraphicTree.IndexOf (topc);
+                               if (idxhw != 0) {
+                                       int i = 0;
+                                       while (i < idxhw) {
+                                               if (GraphicTree [i].localLogicalParentIsNull) {
+                                                       if (GraphicTree [i].MouseIsIn (e.Position)) {
+                                                               while (HoverWidget != null) {
+                                                                       HoverWidget.onMouseLeave (HoverWidget, e);
+                                                                       HoverWidget = HoverWidget.LogicalParent as Widget;
+                                                               }
+
+                                                               GraphicTree [i].checkHoverWidget (e);
+                                                               return true;
+                                                       }
+                                               }
+                                               i++;
+                                       }
+                               }
+
+                               if (HoverWidget.MouseIsIn (e.Position)) {
+                                       if (!(HoverWidget is TemplatedControl))
+                                               HoverWidget.checkHoverWidget (e);
+                                       return true;
+                               } else {
+                                       HoverWidget.onMouseLeave (HoverWidget, e);
+                                       //seek upward from last focused graph obj's
+                                       while (HoverWidget.LogicalParent as Widget != null) {
+                                               HoverWidget = HoverWidget.LogicalParent as Widget;
+                                               if (HoverWidget.MouseIsIn (e.Position)) {
+                                                       HoverWidget.checkHoverWidget (e);
+                                                       return true;
+                                               } else
+                                                       HoverWidget.onMouseLeave (HoverWidget, e);
+                                       }
+                               }
+                       }
+
+                       //top level graphic obj's parsing
+                       lock (GraphicTree) {
+                               for (int i = 0; i < GraphicTree.Count; i++) {
+                                       Widget g = GraphicTree [i];
+                                       if (g.MouseIsIn (e.Position)) {
+                                               if (!(HoverWidget is TemplatedControl))
+                                                       g.checkHoverWidget (e);
+                                               if (g is Window)
+                                                       PutOnTop (g);
+                                               return true;
+                                       }
+                               }
+                       }
+                       HoverWidget = null;
+                       return false;           
+               }
+       
+               protected override void processLayouting ()
+               {
+                       #if MEASURE_TIME
+                       layoutingMeasure.StartCycle();
+                       #endif
+
+                       if (Monitor.TryEnter (LayoutMutex)) {
+                               DiscardQueue = new Queue<LayoutingQueueItem> ();
+                               LayoutingQueueItem lqi;
+                               while (LayoutingQueue.Count > 0) {
+                                       lqi = LayoutingQueue.Dequeue ();
+                                       //Console.WriteLine (lqi.ToString ());
+                                       #if DEBUG_LAYOUTING
+                                       currentLQI = lqi;
+                                       curLQIsTries.Add(currentLQI);
+                                       #endif
+                                       lqi.ProcessLayouting ();
+                               }
+                               LayoutingQueue = DiscardQueue;
+                               Monitor.Exit (LayoutMutex);
+                               DiscardQueue = null;
+                       }
+
+                       #if MEASURE_TIME
+                       layoutingMeasure.StopCycle();
+                       #endif
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs b/CrowIDE/src/Editors/CodeBuffer/CodeBuffer.cs
new file mode 100644 (file)
index 0000000..7d5efec
--- /dev/null
@@ -0,0 +1,530 @@
+//
+//  CodeTextBuffer.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2017 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Diagnostics;
+using System.Threading;
+
+namespace Crow.Coding
+{
+       /// <summary>
+       /// Code buffer, lines are arranged in a List<string>, new line chars are removed during string.split on '\n...',
+       /// </summary>
+       public class CodeBuffer
+       {
+               public ReaderWriterLockSlim editMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+
+               //those events are handled in SourceEditor to help keeping sync between textbuffer,parser and editor.
+               //modified lines are marked for reparse
+               #region Events
+               public event EventHandler<CodeBufferEventArgs> LineUpadateEvent;
+               public event EventHandler<CodeBufferEventArgs> LineRemoveEvent;
+               public event EventHandler<CodeBufferEventArgs> LineAdditionEvent;
+               public event EventHandler<CodeBufferEventArgs> FoldingEvent;
+               public event EventHandler BufferCleared;
+               public event EventHandler SelectionChanged;
+               public event EventHandler PositionChanged;
+               #endregion
+
+               string lineBreak = Interface.LineBreak;
+               List<CodeLine> lines = new List<CodeLine>();
+               public int longestLineIdx = 0;
+               public int longestLineCharCount = 0;
+               /// <summary>
+               /// real position in char arrays, tab = 1 char
+               /// </summary>
+               int _currentLine = 0;
+               int _currentCol = 0;
+
+               public int LineCount { get { return lines.Count;}}
+               public int IndexOf (CodeLine cl) {
+                       return lines.IndexOf (cl);
+               }
+
+               public CodeLine this[int i]
+               {
+                       get { return i < LineCount ? lines[i] : null; }
+                       set {
+                               if (lines [i] == value)
+                                       return;
+                               editMutex.EnterWriteLock ();
+                               lines [i] = value;
+                               editMutex.ExitWriteLock ();
+                               LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
+                       }
+               }
+
+               public void RemoveAt(int i){
+                       editMutex.EnterWriteLock ();
+                       lines.RemoveAt (i);
+                       editMutex.ExitWriteLock ();
+                       LineRemoveEvent.Raise (this, new CodeBufferEventArgs (i));
+               }
+               public void Insert(int i, string item){
+                       editMutex.EnterWriteLock ();
+                       lines.Insert (i, item);
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, new CodeBufferEventArgs (i));
+               }
+               public void Add(CodeLine item){
+                       editMutex.EnterWriteLock ();
+                       lines.Add (item);
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, new CodeBufferEventArgs (lines.Count - 1));
+               }
+               public void AddRange (string[] items){
+                       int start = lines.Count;
+                       editMutex.EnterWriteLock ();
+                       for (int i = 0; i < items.Length; i++)
+                               lines.Add (items [i]);
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, new CodeBufferEventArgs (start, items.Length));
+               }
+               public void AddRange (CodeLine[] items){
+                       int start = lines.Count;
+                       editMutex.EnterWriteLock ();
+                       lines.AddRange (items);
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, new CodeBufferEventArgs (start, items.Length));
+               }
+               public void Clear () {
+                       editMutex.EnterWriteLock ();
+                       longestLineCharCount = 0;
+                       lines.Clear ();
+                       editMutex.ExitWriteLock ();
+                       BufferCleared.Raise (this, null);
+               }
+               public void UpdateLine(int i, string newContent){
+                       editMutex.EnterWriteLock ();
+                       this [i].Content = newContent;
+                       editMutex.ExitWriteLock ();
+                       LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
+               }
+               public void AppenedLine(int i, string newContent){
+                       editMutex.EnterWriteLock ();
+                       this [i].Content += newContent;
+                       editMutex.ExitWriteLock ();
+                       LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
+               }
+               public void RemoveLeadingTab (int l) {
+                       if (this [l] [0] == '\t') {
+                               UpdateLine (l, this [l].Content.Substring (1));
+                               return;
+                       }
+                       int i = 0;
+                       while (i < Interface.TabSize) {
+                               if (this [l] [i] != ' ')
+                                       break;
+                               i++;
+                       }
+                       if (i > 0)
+                               UpdateLine (l, this [l].Content.Substring (i));
+               }
+               public void ToogleFolding (int line) {
+                       if (!this [line].IsFoldable)
+                               return;
+                       editMutex.EnterWriteLock ();
+                       this [line].IsFolded = !this [line].IsFolded;
+                       editMutex.ExitWriteLock ();
+                       FoldingEvent.Raise (this, new CodeBufferEventArgs (line));
+               }
+               public void Load(string rawSource, string lineBrkRegex = @"\r\n|\r|\n|\\\n") {
+                       this.Clear();
+
+                       if (string.IsNullOrEmpty (rawSource))
+                               return;
+
+                       AddRange (Regex.Split (rawSource, lineBrkRegex));
+
+                       lineBreak = detectLineBreakKind (rawSource);
+               }
+
+               /// <summary>
+               /// Finds the longest visual line as printed on screen with tabulation replaced with n spaces
+               /// </summary>
+               public void FindLongestVisualLine(){
+                       longestLineCharCount = 0;
+                       editMutex.EnterReadLock ();
+                       for (int i = 0; i < this.LineCount; i++) {
+                               if (lines[i].PrintableLength > longestLineCharCount) {
+                                       longestLineCharCount = lines[i].PrintableLength;
+                                       longestLineIdx = i;
+                               }
+                       }
+                       editMutex.ExitReadLock ();
+                       //Debug.WriteLine ("Longest line: {0}->{1}", longestLineIdx, longestLineCharCount);
+               }
+               /// <summary> line break could be '\r' or '\n' or '\r\n' </summary>
+               static string detectLineBreakKind(string buffer){
+                       string strLB = "";
+
+                       if (string.IsNullOrEmpty(buffer))
+                               return Interface.LineBreak;
+                       int i = 0;
+                       while ( i < buffer.Length) {
+                               if (buffer [i] == '\r') {
+                                       strLB += '\r';
+                                       i++;
+                               }
+                               if (i < buffer.Length) {
+                                       if (buffer [i] == '\r')
+                                               return "\r";
+                                       if (buffer[i] == '\n')
+                                               strLB += '\n';
+                               }
+                               if (!string.IsNullOrEmpty (strLB))
+                                       return strLB;
+                               i++;
+                       }
+                       return Interface.LineBreak;
+               }
+               /// <summary>
+               /// return all lines with linebreaks
+               /// </summary>
+               public string FullText{
+                       get {
+                               if (lines.Count == 0)
+                                       return "";
+                               string tmp = "";
+                               editMutex.EnterReadLock ();
+                               for (int i = 0; i < lines.Count -1; i++)
+                                       tmp += lines [i].Content + this.lineBreak;
+                               tmp += lines [lines.Count - 1].Content;
+                               editMutex.ExitReadLock ();
+                               return tmp;
+                       }
+               }
+
+               /// <summary>
+               /// unfolded and not in folds line count
+               /// </summary>
+               public int UnfoldedLines {
+                       get {
+                               int i = 0, vl = 0;
+                               editMutex.EnterReadLock ();
+                               while (i < LineCount) {
+                                       if (this [i].IsFolded) {
+                                               i = GetEndNodeIndex (i);
+                                               if (i < 0) {
+                                                       Console.WriteLine ("error folding");
+                                                       break;
+                                               }
+                                       }
+                                       i++;
+                                       vl++;
+                               }
+                               editMutex.ExitReadLock ();
+                               //Debug.WriteLine ("unfolded lines: " + vl);
+                               return vl;
+                       }
+               }
+
+               /// <summary>
+               /// convert visual position to buffer position
+               /// </summary>
+               Point getBuffPos (Point visualPos) {
+                       int i = 0;
+                       int buffCol = 0;
+                       while (i < visualPos.X) {
+                               if (this [visualPos.Y] [buffCol] == '\t')
+                                       i += Interface.TabSize;
+                               else
+                                       i++;
+                               buffCol++;
+                       }
+                       return new Point (buffCol, visualPos.Y);
+               }
+
+               public int GetEndNodeIndex (int line) {
+                       return IndexOf (this [line].SyntacticNode.EndLine);
+               }
+
+               int ConverteTabulatedPosOfCurLine (int column) {
+                       int tmp = 0;
+                       int i = 0;
+                       while (i < lines [_currentLine].Content.Length){
+                               if (lines [_currentLine].Content [i] == '\t')
+                                       tmp += 4;
+                               else
+                                       tmp++;
+                               if (tmp > column)
+                                       break;
+                               i++;
+                       }
+                       return i;
+               }
+
+               public int CurrentTabulatedColumn {
+                       get {
+                               return lines [_currentLine].Content.Substring (0, _currentCol).
+                                       Replace ("\t", new String (' ', Interface.TabSize)).Length;
+                       }
+               }
+               /// <summary>
+               /// Gets visual position computed from actual buffer position
+               /// </summary>
+//             public Point TabulatedPosition {
+//                     get { return new Point (TabulatedColumn, _currentLine); }
+//             }
+               /// <summary>
+               /// set buffer current position from visual position
+               /// </summary>
+//             public void SetBufferPos(Point tabulatedPosition) {
+//                     CurrentPosition = getBuffPos(tabulatedPosition);
+//             }
+
+               #region Editing and moving cursor
+               Point selStartPos = -1; //selection start (row,column)
+               Point selEndPos = -1;   //selection end (row,column)
+
+               public bool SelectionInProgress { get { return selStartPos >= 0; }}
+               public void SetSelStartPos () {
+                       selStartPos = selEndPos = CurrentPosition;
+                       SelectionChanged.Raise (this, null);
+               }
+               public void SetSelEndPos () {
+                       selEndPos = CurrentPosition;
+                       SelectionChanged.Raise (this, null);
+               }
+               public void SetSelectionOnFullLines () {
+                       if (!SelectionInProgress)
+                               return;
+                       Point s = new Point (0, SelectionStart.Y);
+                       Point e = new Point (this [SelectionEnd.Y].Length, SelectionEnd.Y);
+                       selStartPos = s;
+                       selEndPos = e;
+                       SelectionChanged.Raise (this, null);
+               }
+               /// <summary>
+               /// Set selection in buffer to -1, empty selection
+               /// </summary>
+               public void ResetSelection () {
+                       selStartPos = selEndPos = -1;
+                       SelectionChanged.Raise (this, null);
+               }
+
+               public string SelectedText {
+                       get {
+                               if (SelectionIsEmpty)
+                                       return "";
+                               Point selStart = SelectionStart;
+                               Point selEnd = SelectionEnd;
+                               if (selStart.Y == selEnd.Y)
+                                       return this [selStart.Y].Content.Substring (selStart.X, selEnd.X - selStart.X);
+                               string tmp = "";
+                               tmp = this [selStart.Y].Content.Substring (selStart.X);
+                               for (int l = selStart.Y + 1; l < selEnd.Y; l++) {
+                                       tmp += Interface.LineBreak + this [l].Content;
+                               }
+                               tmp += Interface.LineBreak + this [selEnd.Y].Content.Substring (0, selEnd.X);
+                               return tmp;
+                       }
+               }
+               /// <summary>
+               /// ordered selection start and end positions in char units
+               /// </summary>
+               public Point SelectionStart     {
+                       get { return selEndPos < 0 || selStartPos.Y < selEndPos.Y ? selStartPos :
+                                       selStartPos.Y > selEndPos.Y ? selEndPos :
+                                       selStartPos.X < selEndPos.X ? selStartPos : selEndPos; }
+               }
+               public Point SelectionEnd {
+                       get { return selEndPos < 0 || selStartPos.Y > selEndPos.Y ? selStartPos :
+                                       selStartPos.Y < selEndPos.Y ? selEndPos :
+                                       selStartPos.X > selEndPos.X ? selStartPos : selEndPos; }
+               }
+               public bool SelectionIsEmpty
+               { get { return selEndPos == selStartPos; } }
+               int requestedColumn = -1;
+               /// <summary>
+               /// Current column in buffer coordinate, tabulation = 1 char
+               /// </summary>
+               public int CurrentColumn{
+                       get { return _currentCol; }
+                       set {
+                               if (value == _currentCol)
+                                       return;
+
+                               editMutex.EnterReadLock ();
+
+                               if (value < 0)
+                                       _currentCol = 0;
+                               else if (value > lines [_currentLine].Length)
+                                       _currentCol = lines [_currentLine].Length;
+                               else
+                                       _currentCol = value;
+
+                               requestedColumn = CurrentTabulatedColumn;
+
+                               editMutex.ExitReadLock ();
+
+                               PositionChanged.Raise (this, null);
+                       }
+               }
+               /// <summary>
+               /// Current row in buffer coordinate, tabulation = 1 char
+               /// </summary>
+               public int CurrentLine{
+                       get { return _currentLine; }
+                       set {
+                               if (value == _currentLine)
+                                       return;
+
+                               editMutex.EnterReadLock ();
+
+                               if (LineCount == 0)
+                                       _currentLine = 0;
+                               else if (value >= lines.Count)
+                                       _currentLine = lines.Count-1;
+                               else if (value < 0)
+                                       _currentLine = 0;
+                               else
+                                       _currentLine = value;
+//                             if (_currentCol < 0)
+//                                     requestedColumn = tabu _currentCol;
+                               int tabulatedRequestedCol = ConverteTabulatedPosOfCurLine(requestedColumn);
+                               if (requestedColumn > lines [_currentLine].PrintableLength)
+                                       _currentCol = lines [_currentLine].Length;
+                               else
+                                       //_currentCol = requestedColumn;
+                                       _currentCol = tabulatedRequestedCol;
+                               //Debug.WriteLine ("buff cur line: " + _currentLine);
+
+                               editMutex.ExitReadLock();
+
+                               PositionChanged.Raise (this, null);
+                       }
+               }
+               public CodeLine CurrentCodeLine {
+                       get { return this [_currentLine]; }
+               }
+               /// <summary>
+               /// Current position in buffer coordinate, tabulation = 1 char
+               /// </summary>
+               public Point CurrentPosition {
+                       get { return new Point(CurrentColumn, CurrentLine); }
+//                     set {
+//                             _currentCol = value.X;
+//                             _currentLine = value.Y;
+//                     }
+               }
+               /// <summary>
+               /// get char at current position in buffer
+               /// </summary>
+               protected Char CurrentChar { get { return lines [CurrentLine] [CurrentColumn]; } }
+
+               public void GotoWordStart(){
+                       if (this[CurrentLine].Length == 0)
+                               return;
+                       CurrentColumn--;
+                       //skip white spaces
+                       while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn > 0)
+                               CurrentColumn--;
+                       while (char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn > 0)
+                               CurrentColumn--;
+                       if (!char.IsLetterOrDigit (this.CurrentChar))
+                               CurrentColumn++;
+               }
+               public void GotoWordEnd(){
+                       //skip white spaces
+                       if (CurrentColumn >= this [CurrentLine].Length - 1)
+                               return;
+                       while (!char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < this [CurrentLine].Length-1)
+                               CurrentColumn++;
+                       while (char.IsLetterOrDigit (this.CurrentChar) && CurrentColumn < this [CurrentLine].Length-1)
+                               CurrentColumn++;
+                       if (char.IsLetterOrDigit (this.CurrentChar))
+                               CurrentColumn++;
+               }
+               public void DeleteChar()
+               {
+                       editMutex.EnterWriteLock ();
+                       if (SelectionIsEmpty) {
+                               if (CurrentColumn == 0) {
+                                       if (CurrentLine == 0) {
+                                               editMutex.ExitWriteLock ();
+                                               return;
+                                       }
+                                       CurrentLine--;
+                                       CurrentColumn = this [CurrentLine].Length;
+                                       AppenedLine (CurrentLine, this [CurrentLine + 1].Content);
+                                       RemoveAt (CurrentLine + 1);
+                                       editMutex.ExitWriteLock ();
+                                       return;
+                               }
+                               CurrentColumn--;
+                               UpdateLine (CurrentLine, this [CurrentLine].Content.Remove (CurrentColumn, 1));
+                       } else {
+                               int linesToRemove = SelectionEnd.Y - SelectionStart.Y + 1;
+                               int l = SelectionStart.Y;
+
+                               if (linesToRemove > 0) {
+                                       UpdateLine (l, this [l].Content.Remove (SelectionStart.X, this [l].Length - SelectionStart.X) +
+                                       this [SelectionEnd.Y].Content.Substring (SelectionEnd.X, this [SelectionEnd.Y].Length - SelectionEnd.X));
+                                       l++;
+                                       for (int c = 0; c < linesToRemove - 1; c++)
+                                               RemoveAt (l);
+                                       CurrentLine = SelectionStart.Y;
+                                       CurrentColumn = SelectionStart.X;
+                               } else
+                                       UpdateLine (l, this [l].Content.Remove (SelectionStart.X, SelectionEnd.X - SelectionStart.X));
+                               CurrentColumn = SelectionStart.X;
+                               ResetSelection ();
+                       }
+                       editMutex.ExitWriteLock ();
+               }
+               /// <summary>
+               /// Insert new string at caret position, should be sure no line break is inside.
+               /// </summary>
+               /// <param name="str">String.</param>
+               public void Insert(string str)
+               {
+                       if (!SelectionIsEmpty)
+                               this.DeleteChar ();
+                       string[] strLines = Regex.Split (str, "\r\n|\r|\n|" + @"\\n").ToArray();
+                       UpdateLine (CurrentLine, this [CurrentLine].Content.Insert (CurrentColumn, strLines[0]));
+                       CurrentColumn += strLines[0].Length;
+                       for (int i = 1; i < strLines.Length; i++) {
+                               InsertLineBreak ();
+                               UpdateLine (CurrentLine, this [CurrentLine].Content.Insert (CurrentColumn, strLines[i]));
+                               CurrentColumn += strLines[i].Length;
+                       }
+               }
+               /// <summary>
+               /// Insert a line break.
+               /// </summary>
+               public void InsertLineBreak()
+               {
+                       if (CurrentColumn > 0) {
+                               Insert (CurrentLine + 1, this [CurrentLine].Content.Substring (CurrentColumn));
+                               UpdateLine (CurrentLine, this [CurrentLine].Content.Substring (0, CurrentColumn));
+                       } else
+                               Insert(CurrentLine, "");
+
+                       CurrentColumn = 0;
+                       CurrentLine++;
+               }
+               #endregion
+       }
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs b/CrowIDE/src/Editors/CodeBuffer/CodeBufferEventArgs.cs
new file mode 100644 (file)
index 0000000..07dd25b
--- /dev/null
@@ -0,0 +1,20 @@
+using System;
+
+namespace Crow.Coding
+{
+       public class CodeBufferEventArgs : EventArgs {
+               public int LineStart;
+               public int LineCount;
+
+               public CodeBufferEventArgs(int lineNumber) {
+                       LineStart = lineNumber;
+                       LineCount = 1;
+               }
+               public CodeBufferEventArgs(int lineStart, int lineCount) {
+                       LineStart = lineStart;
+                       LineCount = lineCount;
+               }
+       }
+
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs b/CrowIDE/src/Editors/CodeBuffer/CodeLine.cs
new file mode 100644 (file)
index 0000000..23f43fb
--- /dev/null
@@ -0,0 +1,82 @@
+using System;
+using System.Text;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Crow.Coding
+{
+       public class CodeLine
+       {
+               public string Content;
+               public List<Token> Tokens;
+               public int EndingState = 0;
+               public Node SyntacticNode;
+               public ParserException exception;
+
+               public CodeLine (string _content){
+                       Content = _content;
+                       Tokens = null;
+                       exception = null;
+               }
+
+               public char this[int i]
+               {
+                       get { return Content[i]; }
+                       set {
+                               if (Content [i] == value)
+                                       return;
+                               StringBuilder sb = new StringBuilder(Content);
+                               sb[i] = value;
+                               Content = sb.ToString();
+                               Tokens = null;
+                               //LineUpadateEvent.Raise (this, new CodeBufferEventArgs (i));
+                       }
+               }
+               public bool IsFoldable { get { return SyntacticNode == null ? false :
+                               SyntacticNode.EndLine != SyntacticNode.StartLine && SyntacticNode.EndLine != null; } }
+               public int FoldingLevel { get { return IsFoldable ? SyntacticNode.Level : 0; } }
+               public bool IsFolded = false;
+               public bool IsParsed {
+                       get { return Tokens != null; }
+               }
+               public string PrintableContent {
+                       get {
+                               return string.IsNullOrEmpty (Content) ? "" : Content.Replace ("\t", new String (' ', Interface.TabSize));
+                       }
+               }
+               public int PrintableLength {
+                       get {
+                               return PrintableContent.Length;
+                       }
+               }
+               public int Length {
+                       get {
+                               return string.IsNullOrEmpty (Content) ? 0 : Content.Length;
+                       }
+               }
+               public int FirstNonBlankTokIndex {
+                       get { return Tokens == null ? -1 : Tokens.FindIndex (tk=>tk.Type != BufferParser.TokenType.WhiteSpace); }
+               }
+
+               public void SetLineInError (ParserException ex) {
+                       Tokens = null;
+                       exception = ex;
+               }
+
+//             public static implicit operator string(CodeLine sl) {
+//                     return sl == null ? "" : sl.Content;
+//             }
+               public static implicit operator CodeLine(string s) {
+                       return new CodeLine(s);
+               }
+               public static bool operator ==(string s1, CodeLine s2)
+               {
+                       return string.Equals (s1, s2.Content);
+               }
+               public static bool operator !=(string s1, CodeLine s2)
+               {
+                       return !string.Equals (s1, s2.Content);
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/Node.cs b/CrowIDE/src/Editors/CodeBuffer/Node.cs
new file mode 100644 (file)
index 0000000..9db5542
--- /dev/null
@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+
+namespace Crow.Coding
+{
+       public class Node
+       {
+               public Node Parent;
+               public string Name;
+               public string Type;
+               public CodeLine StartLine;
+               public CodeLine EndLine;
+               public Dictionary<string,string> Attributes = new Dictionary<string, string> ();
+
+               public List<Node> Children = new List<Node>();
+
+               public Node ()
+               {
+               }
+
+               public void AddChild (Node child) {
+                       child.Parent = this;
+                       Children.Add (child);
+               }
+
+               public int Level {
+                       get { return Parent == null ? 1 : Parent.Level + 1; } 
+               }
+
+               public override string ToString ()
+               {
+                       return string.Format ("Name:{0}, Type:{1}\n\tparent:{2}", Name, Type, Parent);
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs b/CrowIDE/src/Editors/CodeBuffer/TextBuffer.cs
new file mode 100644 (file)
index 0000000..e8c8718
--- /dev/null
@@ -0,0 +1,527 @@
+//
+//  CodeTextBuffer.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2017 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+using System.Diagnostics;
+using System.Threading;
+using System.Text;
+
+namespace Crow.Text
+{
+       /// <summary>
+       /// Code buffer, lines are arranged in a List<string>, new line chars are removed during string.split on '\n...',
+       /// </summary>
+       public class TextBuffer
+       {
+               public ReaderWriterLockSlim editMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+               static Regex slb = new Regex ("\\n");//single char line break used internaly
+               Regex reghexLineBrk = new Regex(@"\r\n|\r|\n|\\\n");//original text line break regex
+
+               #region Events
+               public event EventHandler<TextBufferEventArgs> LineUpadateEvent;
+               public event EventHandler<TextBufferEventArgs> LineRemoveEvent;
+               public event EventHandler<TextBufferEventArgs> LineAdditionEvent;
+               public event EventHandler BufferCleared;
+               public event EventHandler SelectionChanged;
+               public event EventHandler PositionChanged;
+               #endregion
+
+               StringBuilder buffer = new StringBuilder();
+               string lineBreak = Interface.LineBreak;//detected linebreak kind in original source
+               List<int> lineLength = new List<int>();//line length table
+               /// <summary>
+               /// real position in char arrays, tab = 1 char
+               /// </summary>
+               int _currentLine = 0;
+               int _currentCol = 0;
+
+               /// <summary>
+               /// Gets the total line count.
+               /// </summary>
+               public int LineCount { get { return lineLength.Count;}}
+
+               /// <summary>
+               /// get a substring in the buffer
+               /// </summary>
+               /// <returns>a new string</returns>
+               /// <param name="idx">absolute index in the buffer</param>
+               /// <param name="length">length of the substring</param>
+               public string GetSubString (int idx, int length){
+                       return buffer.ToString (idx, length);
+               }
+               /// <summary>
+               /// Gets length of a line.
+               /// </summary>
+               /// <returns>length of line</returns>
+               /// <param name="lineIdx">line nuber</param>
+               public int GetLineLength (int lineIdx) {
+                       return lineLength [lineIdx];
+               }
+               /// <summary>
+               /// get a single charactere in the buffer
+               /// </summary>
+               /// <returns>a single char</returns>
+               /// <param name="idx">absolute index in the buffer</param>
+               public char GetCharAt (int idx){
+                       return buffer [idx];
+               }
+               /// <summary>
+               /// return full text with original line breaks
+               /// </summary>
+               /// <value>a string containing the full text</value>
+               public string FullText {
+                       get { return buffer.Replace("\n", lineBreak).ToString (); }
+                       set {
+                               Load (value);
+                       }
+               }
+               /// <summary>
+               /// Gets the buffer pointer of a line
+               /// </summary>
+               /// <returns>absolute index of the line in the buffer</returns>
+               /// <param name="i">line number</param>
+               public int GetBufferIndexOfLine (int i) {
+                       int ptr = 0;
+                       editMutex.EnterReadLock ();
+                       for (int j = 0; j < i; j++) {
+                               ptr += lineLength [j];
+                       }
+                       editMutex.ExitReadLock ();
+                       return ptr;
+               }
+               /// <summary>
+               /// Gets the buffer pointer for the current position 
+               /// </summary>
+               /// <value>absolute index in the buffer of current position</value>
+               public int BufferIndexOfCurrentPosition {
+                       get {return GetBufferIndexOfLine (_currentLine) + _currentCol;}
+               }
+               public int this[int i]
+               {
+                       get {                           
+                               int ptr = 0;
+                               editMutex.EnterReadLock ();
+                               for (int j = 0; j < i; j++) {
+                                       ptr += lineLength [j];
+                               }
+                               editMutex.ExitReadLock ();
+                               return ptr; 
+                       }
+               }
+               /// <summary>
+               /// remove line number i
+               /// </summary>
+               /// <param name="i">index of the line</param>
+               public void RemoveLine(int i){
+                       editMutex.EnterWriteLock ();
+                       buffer.Remove (GetBufferIndexOfLine (i), lineLength [i]);
+                       lineLength.RemoveAt (i);
+                       editMutex.ExitWriteLock ();
+                       LineRemoveEvent.Raise (this, new TextBufferEventArgs (i));
+               }
+               /// <summary>
+               /// insert string without linebreaks at position i in buff
+               /// </summary>
+               /// <param name="i">absolute index in the buffer</param>
+               /// <param name="str">linebreak free string</param>
+               public void InsertAt(int i, string str){
+                       editMutex.EnterWriteLock ();
+                       buffer.Insert (this [i], str);
+                       lineLength.Insert (i, str.Length);
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, new TextBufferEventArgs (i));
+               }
+               public void AddLine(string str){
+                       editMutex.EnterWriteLock ();
+                       if (lineLength.LastOrDefault() == 0) {
+                               buffer.Append (str);
+                               lineLength [lineLength.Count - 1] = str.Length;
+                               lineLength.Add (0);
+                       }
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, new TextBufferEventArgs (lineLength.Count - 1));
+               }
+               public void AddRange (string[] items){
+                       int start = lineLength.Count;
+                       editMutex.EnterWriteLock ();
+                       for (int i = 0; i < items.Length; i++)
+                               AddLine (items [i]);
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, new TextBufferEventArgs (start, items.Length));
+               }
+               public void Clear () {
+                       editMutex.EnterWriteLock ();
+                       lineLength.Clear ();
+                       buffer.Clear ();
+                       editMutex.ExitWriteLock ();
+                       BufferCleared.Raise (this, null);
+               }
+               public void UpdateLine(int i, string newContent){
+                       editMutex.EnterWriteLock ();
+                       int ptrL = this [i];
+                       buffer.Remove (ptrL, lineLength [i]);
+                       buffer.Insert (ptrL, newContent);
+                       lineLength [i] = newContent.Length;
+                       editMutex.ExitWriteLock ();
+                       LineUpadateEvent.Raise (this, new TextBufferEventArgs (i));
+               }
+               public void AppenedLine(int i, string newContent){
+                       editMutex.EnterWriteLock ();
+                       int ptr = this [i] + lineLength [i];
+                       if (i < LineCount - 1)
+                               ptr--;
+                       buffer.Insert(ptr, newContent);
+                       lineLength [i] += newContent.Length;
+                       editMutex.ExitWriteLock ();
+                       LineUpadateEvent.Raise (this, new TextBufferEventArgs (i));
+               }
+               /// <summary>
+               /// Insert new string at caret position, should be sure no line break is inside.
+               /// </summary>
+               /// <param name="str">String.</param>
+               public void InsertAt(string str)
+               {
+                       if (!SelectionIsEmpty)
+                               this.Delete ();
+
+                       editMutex.EnterWriteLock ();
+
+                       string tmp = reghexLineBrk.Replace (str, "\n");//use single char line break in buffer
+                       int buffPtr = this [CurrentLine] + CurrentColumn;
+                       buffer.Insert (buffPtr, tmp);
+
+                       int lPtr = CurrentLine, strPtr = 0;
+                       int remainingLength = lineLength [lPtr] - CurrentColumn;
+                       lineLength [lPtr] = CurrentColumn;
+                       foreach (Match match in slb.Matches(tmp))
+                       {
+                               lineLength [lPtr] += match.Index + 1 - strPtr;
+                               lPtr++;
+                               lineLength.Insert (lPtr, 0);
+                               strPtr = match.Index + 1;
+                               //CurrentLine++;
+                       }
+                       remainingLength += tmp.Length - strPtr; 
+                       lineLength [lPtr] += remainingLength;
+
+                       CurrentLine = lPtr;
+                       if (strPtr == 0)
+                               CurrentColumn += tmp.Length;
+                       else
+                               CurrentColumn = tmp.Length - strPtr;
+
+                       editMutex.ExitWriteLock ();
+                       if (strPtr>0)
+                               LineAdditionEvent.Raise (this, null);
+                       else
+                               LineUpadateEvent.Raise (this, null);
+               }
+               /// <summary>
+               /// Insert a line break.
+               /// </summary>
+               public void InsertLineBreak()
+               {
+                       editMutex.EnterWriteLock ();
+                       buffer.Insert (this [CurrentLine] + CurrentColumn, '\n');
+                       int lgdiff = lineLength [CurrentLine] - CurrentColumn;
+                       lineLength.Insert (CurrentLine + 1, lineLength [CurrentLine] - CurrentColumn);
+                       lineLength [CurrentLine] = CurrentColumn + 1;
+                       editMutex.ExitWriteLock ();
+                       LineAdditionEvent.Raise (this, null);
+                       CurrentColumn = 0;
+                       CurrentLine++;
+               }
+               public void Delete()
+               {
+                       editMutex.EnterWriteLock ();
+                       if (SelectionIsEmpty) {
+                               if (CurrentColumn == 0) {
+                                       if (CurrentLine == 0) {
+                                               editMutex.ExitWriteLock ();
+                                               return;
+                                       }
+
+                                       buffer.Remove (this [CurrentLine] - 1, 1);
+
+                                       int col = lineLength [CurrentLine - 1] - 1;
+                                       lineLength [CurrentLine - 1] += lineLength [CurrentLine] - 1;
+                                       lineLength.RemoveAt (CurrentLine);
+
+                                       CurrentLine--;
+                                       CurrentColumn = col;
+
+                                       editMutex.ExitWriteLock ();
+                                       LineRemoveEvent.Raise (this, null);
+                                       return;
+                               }
+                               CurrentColumn--;
+                               buffer.Remove (this [CurrentLine] + CurrentColumn, 1);
+                               lineLength [CurrentLine]--;
+                       } else {
+                               int linesToRemove = SelectionEnd.Y - SelectionStart.Y;
+                               int ptr = this [SelectionStart.Y] + SelectionStart.X;
+                               int length = lineLength [SelectionStart.Y] - SelectionStart.X;
+                               int l = 1;
+                               while (l <= linesToRemove ) {
+                                       length += lineLength [SelectionStart.Y + l];
+                                       l++;
+                               }
+                               length -= lineLength [SelectionEnd.Y] - SelectionEnd.X;
+                               buffer.Remove (ptr, length);
+                               lineLength [SelectionStart.Y] = SelectionStart.X + lineLength [SelectionEnd.Y] - SelectionEnd.X;
+                               lineLength.RemoveRange (SelectionStart.Y + 1, linesToRemove);
+
+                               CurrentLine = SelectionStart.Y;
+                               CurrentColumn = SelectionStart.X;
+                               ResetSelection ();
+
+                               if (linesToRemove > 0)
+                                       LineRemoveEvent.Raise (this, null);
+                               else
+                                       LineUpadateEvent.Raise (this, null);
+                       }
+                       editMutex.ExitWriteLock ();
+               }
+               public void Load(string rawSource) {
+                       this.Clear();
+
+                       if (string.IsNullOrEmpty (rawSource))
+                               return;
+
+                       lineBreak = reghexLineBrk.Match (rawSource).Value;//store original line break
+                       string tmp = reghexLineBrk.Replace (rawSource, "\n");//use single char line break in buffer
+                       int ptr = 0;
+                       foreach (Match match in slb.Matches(tmp))
+                       {
+                               int l = match.Index + 1;
+                               int lg = l - ptr;
+                               lineLength.Add (lg);
+                               ptr = l;
+                       }
+                       lineLength.Add (0);
+
+                       buffer = new StringBuilder (tmp);
+               }
+
+//             public int CurrentTabulatedColumn {
+//                     get {
+////                           return lines [_currentLine].Content.Substring (0, _currentCol).
+////                                   Replace ("\t", new String (' ', Interface.TabSize)).Length;
+//                     }
+//             }
+
+               #region moving cursor an selection
+               Point selStartPos = -1; //selection start (row,column)
+               Point selEndPos = -1;   //selection end (row,column)
+
+               public bool SelectionInProgress { get { return selStartPos >= 0; }}
+               public void SetSelStartPos () {
+                       selStartPos = selEndPos = CurrentPosition;
+                       SelectionChanged.Raise (this, null);
+               }
+               public void SetSelEndPos () {
+                       selEndPos = CurrentPosition;
+                       SelectionChanged.Raise (this, null);
+               }
+               /// <summary>
+               /// Set selection in buffer to -1, empty selection
+               /// </summary>
+               public void ResetSelection () {
+                       selStartPos = selEndPos = -1;
+                       SelectionChanged.Raise (this, null);
+               }
+               /// <summary>
+               /// ordered selection start and end positions in char units
+               /// </summary>
+               public Point SelectionStart     {
+                       get { return selEndPos < 0 || selStartPos.Y < selEndPos.Y ? selStartPos :
+                                       selStartPos.Y > selEndPos.Y ? selEndPos :
+                                       selStartPos.X < selEndPos.X ? selStartPos : selEndPos; }
+               }
+               public Point SelectionEnd {
+                       get { return selEndPos < 0 || selStartPos.Y > selEndPos.Y ? selStartPos :
+                                       selStartPos.Y < selEndPos.Y ? selEndPos :
+                                       selStartPos.X > selEndPos.X ? selStartPos : selEndPos; }
+               }
+               public bool SelectionIsEmpty
+               { get { return selEndPos == selStartPos; } }
+               /// <summary>
+               /// Current column in buffer coordinate, tabulation = 1 char
+               /// </summary>
+               public int CurrentColumn{
+                       get { return _currentCol; }
+                       set {
+                               if (value == _currentCol)
+                                       return;
+
+                               editMutex.EnterWriteLock ();
+
+                               if (value < 0)
+                                       _currentCol = 0;
+                               else if (value >= lineLength [_currentLine]) {
+                                       if (_currentLine < LineCount -1 && value > lineLength [_currentLine] - 1)
+                                               _currentCol = lineLength [_currentLine] - 1;
+                                       else
+                                               _currentCol = lineLength [_currentLine];
+                               }else
+                                       _currentCol = value;
+
+                               editMutex.ExitWriteLock ();
+
+                               PositionChanged.Raise (this, null);
+                       }
+               }
+               /// <summary>
+               /// Current row in buffer coordinate, tabulation = 1 char
+               /// </summary>
+               public int CurrentLine{
+                       get { return _currentLine; }
+                       set {
+                               if (value == _currentLine)
+                                       return;
+
+                               editMutex.EnterWriteLock ();
+
+                               if (value >= lineLength.Count)
+                                       _currentLine = lineLength.Count-1;
+                               else if (value < 0)
+                                       _currentLine = 0;
+                               else
+                                       _currentLine = value;
+
+                               int c = _currentCol;
+                               _currentCol = 0;
+                               CurrentColumn = c;
+
+                               editMutex.ExitWriteLock();
+
+                               PositionChanged.Raise (this, null);
+                       }
+               }
+               /// <summary>
+               /// Current position in buffer coordinate, tabulation = 1 char
+               /// </summary>
+               public Point CurrentPosition {
+                       get { return new Point(CurrentColumn, CurrentLine); }
+               }
+               /// <summary>
+               /// get char at current position in buffer
+               /// </summary>
+               protected Char CurrentChar { get { return buffer[this [CurrentLine]]; } }
+               public string SelectedText {
+                       get {
+                               if (SelectionIsEmpty)
+                                       return "";
+                               Point selStart = SelectionStart;
+                               Point selEnd = SelectionEnd;
+
+                               int ptr = this [selStart.Y] + selStart.X;
+                               int length = lineLength[selStart.Y] - selStart.X;
+                               for (int i = selStart.Y+1; i <= selEnd.Y; i++) 
+                                       length += lineLength [i];
+                               length -= lineLength[selEnd.Y] - selEnd.X;
+
+                               return buffer.ToString (ptr, length);
+                       }
+               }
+
+               public void GotoWordStart(){
+                       if (_currentCol == 0)
+                               MoveLeft ();
+                       if (_currentCol == 0)
+                               return;
+                       int ptrStart = BufferIndexOfCurrentPosition;
+                       int ptr = ptrStart;
+                       char c;
+                       //skip white spaces
+                       do {
+                               ptr--;
+                               c = this.GetCharAt (ptr);
+                       } while (!char.IsLetterOrDigit (c) && c != '\n' && ptr > 1);
+                               
+                       do {
+                               ptr--;
+                               c = this.GetCharAt (ptr);
+                       } while (char.IsLetterOrDigit (c) && c != '\n' && ptr > 1);
+
+                       if (ptr == 0)
+                               CurrentColumn = 0;
+                       else
+                               CurrentColumn -= ptrStart - ptr - 1;            
+               }
+               public void GotoWordEnd(){
+                       int limx = GetLineLength (_currentLine);
+                       if (_currentLine < lineLength.Count - 1)
+                               limx--;
+                       
+                       if (_currentCol == limx) {
+                               MoveRight ();
+                               limx = GetLineLength (_currentLine);
+                               if (_currentLine < lineLength.Count - 1)
+                                       limx--;                         
+                       }
+
+                       int ptrLine = GetBufferIndexOfLine(_currentLine);
+                       int ptrCol = _currentCol;
+
+                       char c;
+                       //skip white spaces
+                       do {                            
+                               c = GetCharAt (ptrLine+ptrCol);
+                               ptrCol++;
+                       } while (!char.IsLetterOrDigit (c) && ptrCol < limx);
+
+                       do {
+                               c = GetCharAt (ptrLine + ptrCol);
+                               ptrCol++;
+                       } while (char.IsLetterOrDigit (c) && ptrCol < limx);
+                       CurrentColumn = ptrCol - 1;
+               }
+               /// <summary>
+               /// Moves cursor one char to the left, move up if cursor reaches start of line
+               /// </summary>
+               public void MoveLeft(){
+                       if (CurrentColumn == 0) {
+                               CurrentLine--;
+                               CurrentColumn = int.MaxValue;
+                       } else
+                               CurrentColumn--;                        
+               }
+               /// <summary>
+               /// Moves cursor one char to the right, move down if cursor reaches end of line
+               /// </summary>
+               public void MoveRight(){
+                       if (_currentLine < LineCount -1){
+                               if (CurrentColumn >= lineLength [CurrentLine] - 1) {
+                                       CurrentColumn = 0;
+                                       CurrentLine++;
+                                       return;
+                               }
+                       }
+                       CurrentColumn++;
+               }
+
+               #endregion
+       }
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs b/CrowIDE/src/Editors/CodeBuffer/TextBufferEventArgs.cs
new file mode 100644 (file)
index 0000000..3b67bb1
--- /dev/null
@@ -0,0 +1,20 @@
+using System;
+
+namespace Crow.Text
+{
+       public class TextBufferEventArgs : EventArgs {
+               public int LineStart;
+               public int LineCount;
+
+               public TextBufferEventArgs(int lineNumber) {
+                       LineStart = lineNumber;
+                       LineCount = 1;
+               }
+               public TextBufferEventArgs(int lineStart, int lineCount) {
+                       LineStart = lineStart;
+                       LineCount = lineCount;
+               }
+       }
+
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs b/CrowIDE/src/Editors/CodeBuffer/TextEditor.cs
new file mode 100644 (file)
index 0000000..7761263
--- /dev/null
@@ -0,0 +1,710 @@
+//
+// ScrollingTextBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Collections;
+using Crow.Cairo;
+using System.Text;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using System.Linq;
+using System.Diagnostics;
+using System.IO;
+using System.Threading;
+
+namespace Crow.Text
+{
+       /// <summary>
+       /// Scrolling text box optimized for monospace fonts, for coding
+       /// </summary>
+       public class TextEditor : Crow.Coding.Editor
+       {               
+               #region CTOR
+               public TextEditor (): base()
+               {                       
+                       buffer = new TextBuffer ();
+                       buffer.LineUpadateEvent += Buffer_LineUpadateEvent;
+                       buffer.LineAdditionEvent += Buffer_LineAdditionEvent;;
+                       buffer.LineRemoveEvent += Buffer_LineRemoveEvent;
+                       buffer.BufferCleared += Buffer_BufferCleared;
+                       buffer.SelectionChanged += Buffer_SelectionChanged;
+                       buffer.PositionChanged += Buffer_PositionChanged;
+                       //buffer.Add ("");
+               }
+               #endregion
+
+               string oldSource = "";
+               volatile bool isDirty = false;
+
+               #region private and protected fields
+               int visibleLines = 1;
+               int visibleColumns = 1;
+
+               TextBuffer buffer;
+
+               Color selBackground;
+               Color selForeground;
+               int selStartCol;
+               int selEndCol;
+
+               protected Rectangle rText;
+               protected FontExtents fe;
+               protected TextExtents te;
+
+               Point mouseLocalPos;
+               bool doubleClicked = false;
+               #endregion
+
+               /// <summary>
+               /// Updates visible line in widget, adapt max scroll y and updatePrintedLines
+               /// </summary>
+               void updateVisibleLines(){
+                       visibleLines = (int)Math.Floor ((double)ClientRectangle.Height / (fe.Ascent+fe.Descent));
+                       NotifyValueChanged ("VisibleLines", visibleLines);
+                       updateMaxScrollY ();
+                       RegisterForGraphicUpdate ();
+//                     System.Diagnostics.Debug.WriteLine ("update visible lines: " + visibleLines);
+//                     System.Diagnostics.Debug.WriteLine ("update MaxScrollY: " + MaxScrollY);
+               }
+               void updateVisibleColumns(){
+                       visibleColumns = (int)Math.Floor ((double)(ClientRectangle.Width)/ fe.MaxXAdvance);
+                       NotifyValueChanged ("VisibleColumns", visibleColumns);
+                       RegisterForGraphicUpdate ();
+//                     System.Diagnostics.Debug.WriteLine ("update visible columns: {0} leftMargin:{1}",visibleColumns, leftMargin);
+//                     System.Diagnostics.Debug.WriteLine ("update MaxScrollX: " + MaxScrollX);
+               }
+               void updateMaxScrollX (int longestTabulatedLineLength) {                        
+                       MaxScrollX = Math.Max (0, longestTabulatedLineLength - visibleColumns);
+                       if (longestTabulatedLineLength > 0)
+                               NotifyValueChanged ("ChildWidthRatio", Slot.Width * visibleColumns / longestTabulatedLineLength);
+               }
+               void updateMaxScrollY () {                      
+                       int lc = buffer.LineCount;
+                       MaxScrollY = Math.Max (0, lc - visibleLines);
+                       if (lc > 0)
+                               NotifyValueChanged ("ChildHeightRatio", Slot.Height * visibleLines / lc);
+                       
+               }                       
+
+
+
+               #region Editor overrides
+               protected override void updateEditorFromProjFile ()
+               {
+                       buffer.editMutex.EnterWriteLock ();
+                       loadSource ();
+                       buffer.editMutex.ExitWriteLock ();
+
+                       isDirty = false;
+                       oldSource = projFile.Source;
+                       projFile.RegisteredEditors [this] = true;
+               }
+               protected override void updateProjFileFromEditor ()
+               {
+                       buffer.editMutex.EnterWriteLock ();
+                       string newsrc = buffer.FullText;
+                       buffer.editMutex.ExitWriteLock ();
+                       projFile.UpdateSource (this, newsrc);
+               }
+               protected override bool EditorIsDirty {
+                       get { return isDirty; }
+                       set { isDirty = value; }
+               }
+               protected override bool IsReady {
+                       get { return projFile != null && buffer != null; }
+               }
+               #endregion
+
+               #region Buffer events handlers
+               void Buffer_BufferCleared (object sender, EventArgs e)
+               {
+                       editorMutex.EnterWriteLock ();
+
+                       MaxScrollX = MaxScrollY = 0;
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+                       isDirty = true;
+
+                       editorMutex.ExitWriteLock ();
+               }
+               void Buffer_LineAdditionEvent (object sender, TextBufferEventArgs e)
+               {
+                       updateMaxScrollY ();
+                       RegisterForGraphicUpdate ();
+                       isDirty = true;
+               }
+               void Buffer_LineRemoveEvent (object sender, TextBufferEventArgs e)
+               {
+                       updateMaxScrollY ();
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+                       isDirty = true;
+               }
+               void Buffer_LineUpadateEvent (object sender, TextBufferEventArgs e)
+               {
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+                       isDirty = true;
+               }
+               void Buffer_PositionChanged (object sender, EventArgs e)
+               {                       
+                       int cc = getTabulatedColumn (buffer.CurrentPosition);
+
+                       if (cc > visibleColumns + ScrollX) {
+                               ScrollX = cc - visibleColumns;
+                       } else if (cc < ScrollX)
+                               ScrollX = cc;
+
+                       if (buffer.CurrentLine >= visibleLines + ScrollY - 1)
+                               ScrollY = buffer.CurrentLine - visibleLines + 1;
+                       else if (buffer.CurrentLine < ScrollY)
+                               ScrollY = buffer.CurrentLine;
+                       
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+               }
+
+               void Buffer_SelectionChanged (object sender, EventArgs e)
+               {
+                       RegisterForGraphicUpdate ();
+               }
+               #endregion
+
+               void notifyPositionChanged (){
+                       try {                           
+                               NotifyValueChanged ("CurrentLine", buffer.CurrentLine+1);
+                               NotifyValueChanged ("CurrentColumn", buffer.CurrentColumn+1);
+                       } catch (Exception ex) {
+                               Console.WriteLine (ex.ToString ());
+                       }
+               }
+                       
+               #region Public Crow Properties
+               public int CurrentLine{
+                       get { return buffer == null ? 0 : buffer.CurrentLine+1; }
+                       set {
+                               try {
+                                       int l = value - 1;
+                                       if (l == buffer.CurrentLine)
+                                               return;
+                                       buffer.CurrentLine = l;                                                                 
+                               } catch (Exception ex) {                                        
+                                       Console.WriteLine ("Error cur column: " + ex.ToString ());
+                               }
+                       }
+               }
+               public int CurrentColumn{
+                       get { return buffer == null ? 0 : buffer.CurrentColumn+1; }
+                       set {
+                               try {                                   
+                                       if (value - 1 == buffer.CurrentColumn)
+                                               return;
+                                       buffer.CurrentColumn = value - 1;
+                               } catch (Exception ex) {                                        
+                                       Console.WriteLine ("Error cur column: " + ex.ToString ());
+                               }
+                       }
+               }
+               [DefaultValue("Blue")]
+               public virtual Color SelectionBackground {
+                       get { return selBackground; }
+                       set {
+                               if (value == selBackground)
+                                       return;
+                               selBackground = value;
+                               NotifyValueChanged ("SelectionBackground", selBackground);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue("White")]
+               public virtual Color SelectionForeground {
+                       get { return selForeground; }
+                       set {
+                               if (value == selForeground)
+                                       return;
+                               selForeground = value;
+                               NotifyValueChanged ("SelectionForeground", selForeground);
+                               RegisterForRedraw ();
+                       }
+               }
+               public override int ScrollY {
+                       get {
+                               return base.ScrollY;
+                       }
+                       set {
+                               if (value == base.ScrollY)
+                                       return;
+                               editorMutex.EnterWriteLock ();
+                               base.ScrollY = value;
+                               editorMutex.ExitWriteLock ();
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               #endregion
+
+
+               void loadSource () {
+                       buffer.Load (projFile.Source);
+                       projFile.RegisteredEditors [this] = true;
+                       updateMaxScrollY ();
+                       RegisterForGraphicUpdate ();
+               }
+
+               int getTabulatedColumn (int col, int line) {
+                       return buffer.GetSubString (buffer [line],
+                               buffer.GetLineLength (line)).Substring(0,col).Replace ("\t", new String (' ', Interface.TabSize)).Length;
+               }
+               int getTabulatedColumn (Point pos) {
+                       return getTabulatedColumn (pos.X,pos.Y);
+               }
+
+               #region Drawing
+               void drawLines(Context gr, Rectangle cb) {
+                       int longestTabulatedLine = 0;
+                       for (int i = 0; i < visibleLines; i++) {
+                               int lineIndex = i + ScrollY;
+                               if (lineIndex >= buffer.LineCount)//TODO:need optimize
+                                       break;                                                  
+
+                               double y = cb.Y + (fe.Ascent+fe.Descent) * i, x = cb.X;
+
+                               int lineLength = buffer.GetLineLength (lineIndex);
+                               if (lineIndex < buffer.LineCount - 1)//dont print line break
+                                       lineLength--;
+                               string lstr = buffer.GetSubString (buffer [lineIndex],
+                                       lineLength).Replace ("\t", new String (' ', Interface.TabSize));
+
+                               int lstrLength = lstr.Length;
+                               if (lstrLength > longestTabulatedLine)
+                                       longestTabulatedLine = lstrLength;
+                               
+                               if (ScrollX < lstrLength)
+                                       lstr = lstr.Substring (ScrollX);
+                               else
+                                       lstr = "";
+
+                               gr.MoveTo (x, y + fe.Ascent);
+                               gr.ShowText (lstr);
+                               gr.Fill ();
+
+                               if (!buffer.SelectionIsEmpty && lineIndex >= buffer.SelectionStart.Y && lineIndex <= buffer.SelectionEnd.Y) {
+                                       double rLineX = x,
+                                       rLineY = y,
+                                       rLineW = lstr.Length * fe.MaxXAdvance;
+
+                                       if (lineIndex == buffer.SelectionStart.Y) {
+                                               rLineX += (selStartCol - ScrollX) * fe.MaxXAdvance;
+                                               rLineW -= (selStartCol - ScrollX) * fe.MaxXAdvance;
+                                       }
+                                       if (lineIndex == buffer.SelectionEnd.Y)
+                                               rLineW -= (lstr.Length - selEndCol + ScrollX) * fe.MaxXAdvance;
+
+                                       gr.Save ();
+                                       gr.Operator = Operator.Source;
+                                       gr.Rectangle (rLineX, rLineY, rLineW, (fe.Ascent+fe.Descent));
+                                       gr.SetSourceColor (SelectionBackground);
+                                       gr.FillPreserve ();
+                                       gr.Clip ();
+                                       gr.Operator = Operator.Over;
+                                       gr.SetSourceColor (SelectionForeground);
+                                       gr.MoveTo (x, y + fe.Ascent);
+                                       gr.ShowText (lstr);
+                                       gr.Fill ();
+                                       gr.Restore ();
+                               }       
+                       
+                       
+                       }               
+               
+                       updateMaxScrollX(longestTabulatedLine);
+               }
+               #endregion
+
+               #region GraphicObject overrides
+               public override Font Font {
+                       get { return base.Font; }
+                       set {
+                               base.Font = value;
+
+                               using (ImageSurface img = new ImageSurface (Format.Argb32, 1, 1)) {
+                                       using (Context gr = new Context (img)) {
+                                               gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                                               gr.SetFontSize (Font.Size);
+
+                                               fe = gr.FontExtents;
+                                       }
+                               }
+                               MaxScrollY = 0;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               protected override int measureRawSize(LayoutingType lt)
+               {
+                       if (lt == LayoutingType.Height)
+                               return (int)Math.Ceiling((fe.Ascent+fe.Descent) * buffer.LineCount) + Margin * 2;
+
+                       return 0;// (int)(fe.MaxXAdvance * buffer.GetLineLength(buffer.longestLineIdx)) + Margin * 2;
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       if (layoutType == LayoutingType.Height)
+                               updateVisibleLines ();
+                       else if (layoutType == LayoutingType.Width)
+                               updateVisibleColumns ();
+               }
+
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                       gr.SetFontSize (Font.Size);
+                       gr.FontOptions = Interface.FontRenderingOptions;
+                       gr.Antialias = Interface.Antialias;
+
+                       Rectangle cb = ClientRectangle;
+
+                       Foreground.SetAsSource (gr);
+
+                       buffer.editMutex.EnterReadLock ();
+                       editorMutex.EnterReadLock ();
+
+                       #region draw text cursor
+                       if (buffer.SelectionInProgress){
+                               selStartCol = getTabulatedColumn (buffer.SelectionStart);
+                               selEndCol = getTabulatedColumn (buffer.SelectionEnd);
+                       }else if (HasFocus && CurrentLine >= 0){
+                               gr.LineWidth = 1.0;
+                               double cursorX = cb.X + (getTabulatedColumn(buffer.CurrentPosition) - ScrollX) * fe.MaxXAdvance ;
+                               double cursorY = cb.Y + (buffer.CurrentLine - ScrollY) * (fe.Ascent+fe.Descent);
+                               gr.MoveTo (0.5 + cursorX, cursorY);
+                               gr.LineTo (0.5 + cursorX, cursorY + fe.Ascent+fe.Descent);
+                               gr.Stroke();
+                       }
+                       #endregion
+
+                       drawLines (gr, cb);
+
+                       editorMutex.ExitReadLock ();
+
+                       buffer.editMutex.ExitReadLock ();
+
+               }
+               #endregion
+
+               int getBufferColFromVisualCol (int line, int column) {
+                       int i = 0;
+                       int buffCol = 0;
+                       int buffPtr = buffer [line];
+                       while (i < column && buffCol < buffer.GetLineLength(line)) {
+                               if (buffer.GetCharAt(buffPtr + buffCol) == '\t')
+                                       i += Interface.TabSize;
+                               else
+                                       i++;
+                               buffCol++;
+                       }
+                       return buffCol;
+               }
+
+
+               #region Mouse handling
+
+               int hoverLine = -1;
+               public int HoverLine {
+                       get { return hoverLine; }
+                       set { 
+                               if (hoverLine == value)
+                                       return;
+                               hoverLine = value;
+                               NotifyValueChanged ("HoverLine", hoverLine);                            
+                       }
+               }
+               void updateHoverLine () {
+//                     int hvl = (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent)));
+//                     hvl = Math.Min (PrintedLines.Count, hvl);
+//                     HoverLine = buffer.IndexOf (PrintedLines[hvl]);
+               }
+               void updateCurrentPosFromMouseLocalPos(){                       
+                       
+                       buffer.CurrentLine = ScrollY + (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent)));
+                       int curVisualCol = ScrollX +  (int)Math.Round ((mouseLocalPos.X) / fe.MaxXAdvance);
+                       buffer.CurrentColumn = getBufferColFromVisualCol (buffer.CurrentLine, curVisualCol);
+               }
+
+               public override void onMouseEnter (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseEnter (sender, e);
+                       IFace.MouseCursor = MouseCursors.Text;
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (sender, e);
+                       IFace.MouseCursor = MouseCursors.Default;
+               }
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       mouseLocalPos = e.Position - ScreenCoordinates(Slot).TopLeft - ClientRectangle.TopLeft;
+
+                       updateHoverLine ();
+
+                       if (e.Mouse.LeftButton == ButtonState.Released || !buffer.SelectionInProgress)
+                               return;
+
+                       //mouse is down
+                       updateCurrentPosFromMouseLocalPos();
+                       buffer.SetSelEndPos ();
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       if (!Focusable)
+                               return;
+
+                       base.onMouseDown (sender, e);
+
+                       if (doubleClicked) {
+                               doubleClicked = false;
+                               return;
+                       }
+
+                       updateCurrentPosFromMouseLocalPos ();
+                       buffer.SetSelStartPos ();
+               }
+               public override void onMouseUp (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+
+                       if (buffer.SelectionIsEmpty)
+                               buffer.ResetSelection ();
+               }
+
+               public override void onMouseDoubleClick (object sender, MouseButtonEventArgs e)
+               {
+                       //doubleClicked = true;
+                       base.onMouseDoubleClick (sender, e);
+
+                       buffer.GotoWordStart ();
+                       buffer.SetSelStartPos ();
+                       buffer.GotoWordEnd ();
+                       buffer.SetSelEndPos ();
+               }
+
+               public override void onMouseWheel (object sender, MouseWheelEventArgs e)
+               {
+                       base.onMouseWheel (sender, e);
+               }
+               #endregion
+
+               #region Keyboard handling
+               public override void onKeyDown (object sender, KeyEventArgs e)
+               {
+                       //base.onKeyDown (sender, e);
+
+                       Key key = e.Key;
+
+                       if (IFace.Ctrl) {
+                               switch (key) {
+                               case Key.S:
+                                       projFile.Save ();
+                                       break;
+                               case Key.W:
+                                       editorMutex.EnterWriteLock ();
+                                       if (IFace.Shift)
+                                               projFile.Redo (null);
+                                       else
+                                               projFile.Undo (null);
+                                       editorMutex.ExitWriteLock ();
+                                       break;
+                               default:
+                                       Console.WriteLine ("");
+                                       break;
+                               }
+                       }
+
+                       switch (key)
+                       {
+                       case Key.BackSpace:
+                               buffer.Delete ();
+                               break;
+                       case Key.Clear:
+                               break;
+                       case Key.Delete:
+                               if (buffer.SelectionIsEmpty)
+                                       buffer.MoveRight ();
+//                             else if (e.Shift)
+//                                     IFace.Clipboard = buffer.SelectedText;
+                               buffer.Delete ();
+                               break;
+                       case Key.ISO_Enter:
+                       case Key.KP_Enter:
+                               if (!buffer.SelectionIsEmpty)
+                                       buffer.Delete ();
+                               buffer.InsertLineBreak ();
+                               break;
+                       case Key.Escape:
+                               buffer.ResetSelection ();
+                               break;
+                       case Key.Home:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.CurrentLine = 0;
+                                       buffer.CurrentColumn = 0;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.CurrentLine = 0;
+                               buffer.CurrentColumn = 0;
+                               break;
+                       case Key.End:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.CurrentLine = int.MaxValue;
+                                       buffer.CurrentColumn = int.MaxValue;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.CurrentLine = int.MaxValue;
+                               buffer.CurrentColumn = int.MaxValue;
+                               break;
+                       case Key.Insert:
+                               if (IFace.Shift)
+                                       buffer.InsertAt (IFace.Clipboard);
+                               else if (IFace.Ctrl && !buffer.SelectionIsEmpty)
+                                       IFace.Clipboard = buffer.SelectedText;
+                               break;
+                       case Key.Left:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.GotoWordStart ();
+                                       else
+                                               buffer.MoveLeft ();
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.GotoWordStart ();
+                               else
+                                       buffer.MoveLeft();
+                               break;
+                       case Key.Right:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.GotoWordEnd ();
+                                       else
+                                               buffer.MoveRight ();
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.GotoWordEnd ();
+                               else
+                                       buffer.MoveRight ();
+                               break;
+                       case Key.Up:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       CurrentLine--;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               CurrentLine--;
+                               break;
+                       case Key.Down:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       CurrentLine++;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               CurrentLine++;
+                               break;
+                       case Key.Menu:
+                               break;
+                       case Key.Num_Lock:
+                               break;
+                       case Key.Page_Down:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       CurrentLine += visibleLines;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               CurrentLine += visibleLines;
+                               break;
+                       case Key.Page_Up:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       CurrentLine -= visibleLines;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               CurrentLine -= visibleLines;
+                               break;
+                       case Key.Tab:
+                               buffer.InsertAt ("\t");
+                               break;
+                       default:
+                               break;
+                       }
+                       RegisterForGraphicUpdate();
+               }
+               public override void onKeyPress (object sender, KeyPressEventArgs e)
+               {
+                       base.onKeyPress (sender, e);
+
+                       buffer.InsertAt (e.KeyChar.ToString());
+                       buffer.ResetSelection ();
+               }
+               #endregion
+       }
+}
\ No newline at end of file
diff --git a/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs b/CrowIDE/src/Editors/CodeBuffer/TextFormatting.cs
new file mode 100644 (file)
index 0000000..f7b2e51
--- /dev/null
@@ -0,0 +1,19 @@
+using System;
+
+namespace Crow.Coding
+{
+       public struct TextFormatting {
+               public Color Foreground;
+               public Color Background;
+               public bool Bold;
+               public bool Italic;
+
+               public TextFormatting(Color fg, Color bg, bool bold = false, bool italic = false){
+                       Foreground = fg;
+                       Background = bg;
+                       Bold = bold;
+                       Italic = italic;
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/CodeBuffer/Token.cs b/CrowIDE/src/Editors/CodeBuffer/Token.cs
new file mode 100644 (file)
index 0000000..8b4df5e
--- /dev/null
@@ -0,0 +1,71 @@
+//
+//  Token.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2017 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+
+namespace Crow.Coding
+{
+       public struct Token
+       {
+               public BufferParser.TokenType Type;
+               public string Content;
+               public Point Start;
+               public Point End;
+
+               public string PrintableContent {
+                       get { return string.IsNullOrEmpty(Content) ? "" : Content.Replace("\t", new String(' ', Interface.TabSize)); }
+               }
+
+//             public Token (TokenType tokType, string content = ""){
+//                     Type = tokType;
+//                     Content = content;
+//             }
+
+               public bool IsNull { get { return IsEmpty && Type == BufferParser.TokenType.Unknown; }}
+               public bool IsEmpty { get { return string.IsNullOrEmpty(Content); }}
+
+               public static bool operator == (Token t, System.Enum tt){
+                       return Convert.ToInt32(t.Type) == Convert.ToInt32(tt);
+               }
+               public static bool operator != (Token t, System.Enum tt){
+                       return Convert.ToInt32(t.Type) != Convert.ToInt32(tt);
+               }
+               public static bool operator == (System.Enum tt, Token t){
+                       return Convert.ToInt32(t.Type) == Convert.ToInt32(tt);
+               }
+               public static bool operator != (System.Enum tt, Token t){
+                       return Convert.ToInt32(t.Type) != Convert.ToInt32(tt);
+               }
+
+               public static Token operator +(Token t, char c){
+                       t.Content += c;
+                       return t;
+               }
+               public static Token operator +(Token t, string s){
+                       t.Content += s;
+                       return t;
+               }
+               public override string ToString ()
+               {
+                       return string.Format ("[Tok{2}->{3}:{0}: {1}]", Type,Content,Start,End);
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/EditPane.cs b/CrowIDE/src/Editors/EditPane.cs
new file mode 100644 (file)
index 0000000..a75522f
--- /dev/null
@@ -0,0 +1,57 @@
+//
+// EditPane.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+using System.Linq;
+
+namespace Crow.Coding
+{
+       public class EditPane : TemplatedGroup
+       {
+               public EditPane () {}
+
+               object selectedItemElement = null;
+
+               public override int SelectedIndex {
+                       get {
+                               return base.SelectedIndex;
+                       }
+                       set {
+                               base.SelectedIndex = value;
+                       }
+               }
+               public object SelectedItemElement {
+                       get { return selectedItemElement; }
+                       set {
+                               if (selectedItemElement == value)
+                                       return;
+                               selectedItemElement = value;
+                               NotifyValueChanged ("SelectedItemElement", selectedItemElement);
+                       }
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/Editor.cs b/CrowIDE/src/Editors/Editor.cs
new file mode 100644 (file)
index 0000000..102debb
--- /dev/null
@@ -0,0 +1,105 @@
+//
+// Editor.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Threading;
+using System.Xml.Serialization;
+
+namespace Crow.Coding
+{
+       public abstract class Editor : ScrollingObject
+       {
+               #region CTOR
+               protected Editor ():base(){
+                       Thread t = new Thread (backgroundThreadFunc);
+                       t.IsBackground = true;
+                       t.Start ();
+               }
+               #endregion
+
+               protected ReaderWriterLockSlim editorMutex = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
+               protected ProjectFile projFile = null;
+               Exception error = null;
+
+               public virtual ProjectFile ProjectNode
+               {
+                       get { return projFile; }
+                       set
+                       {
+                               if (projFile == value)
+                                       return;
+
+                               if (projFile != null)
+                                       projFile.UnregisterEditor (this);
+
+                               projFile = value;
+
+                               if (projFile != null)                                   
+                                       projFile.RegisterEditor (this);
+
+                               NotifyValueChanged ("ProjectNode", projFile);
+                       }
+               }
+               [XmlIgnore]public Exception Error {
+                       get { return error; }
+                       set {
+                               if (error == value)
+                                       return;
+                               error = value;
+                               NotifyValueChanged ("Error", error);
+                               NotifyValueChanged ("HasError", HasError);
+                       }
+               }
+               [XmlIgnore]public bool HasError {
+                       get { return error != null; }
+               }
+
+               protected abstract void updateEditorFromProjFile ();
+               protected abstract void updateProjFileFromEditor ();
+               protected abstract bool EditorIsDirty { get; set; }
+               protected virtual bool IsReady { get { return true; }}
+               protected virtual void updateCheckPostProcess () {}
+
+               protected void backgroundThreadFunc () {
+                       while (true) {
+                               if (IsReady) {
+                                       if (Monitor.TryEnter (IFace.UpdateMutex)) {
+                                               if (!projFile.RegisteredEditors [this]) {
+                                                       projFile.RegisteredEditors [this] = true;
+                                                       updateEditorFromProjFile ();
+                                               } else if (EditorIsDirty) {
+                                                       EditorIsDirty = false;
+                                                       updateProjFileFromEditor ();
+                                               }
+                                               updateCheckPostProcess ();
+                                               Monitor.Exit (IFace.UpdateMutex);
+                                       }
+                               }
+                               Thread.Sleep (100);
+                       }       
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/ImlSchematicEditor.cs b/CrowIDE/src/Editors/ImlSchematicEditor.cs
new file mode 100644 (file)
index 0000000..64541c9
--- /dev/null
@@ -0,0 +1,132 @@
+//
+//  ImlVisualEditor.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2016 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+using Crow;
+using System.Threading;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.IO;
+using System.Collections.Generic;
+using Crow.IML;
+using System.Text;
+using System.Xml;
+
+namespace Crow.Coding
+{
+       public class ImlSchematicEditor : TemplatedGroup
+       {
+               #region CTOR
+               public ImlSchematicEditor ()
+               {                       
+               }
+               #endregion
+
+               ProjectFile projNode;
+               Widget selectedItem;
+               ImlProjectItem imlProjFile;
+               Exception imlError = null;
+
+               bool drawGrid, snapToGrid;
+               int gridSpacing;
+
+               [DefaultValue(true)]
+               public bool DrawGrid {
+                       get { return drawGrid; }
+                       set {
+                               if (drawGrid == value)
+                                       return;
+                               drawGrid = value;
+                               NotifyValueChanged ("DrawGrid", drawGrid);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(true)]
+               public bool SnapToGrid {
+                       get { return snapToGrid; }
+                       set {
+                               if (snapToGrid == value)
+                                       return;
+                               snapToGrid = value;
+                               NotifyValueChanged ("SnapToGrid", snapToGrid);
+                       }
+               }
+               [DefaultValue(10)]
+               public int GridSpacing {
+                       get { return gridSpacing; }
+                       set {
+                               if (gridSpacing == value)
+                                       return;
+                               gridSpacing = value;
+                               NotifyValueChanged ("GridSpacing", gridSpacing);
+                               RegisterForRedraw ();
+                       }
+               }
+               public Widget SelectedItem {
+                       get { return selectedItem; }
+                       set {
+                               if (selectedItem == value)
+                                       return;
+                               selectedItem = value;
+                               NotifyValueChanged ("SelectedItem", selectedItem);
+                               RegisterForRedraw ();
+                       }
+               }
+//             public override ProjectFile ProjectNode {
+//                     get {
+//                             return projNode;
+//                     }
+//                     set {
+//                             if (projNode == value)
+//                                     return;                         
+//                             projNode = value;
+//                             NotifyValueChanged ("ProjectNode", projNode);
+//
+//                             if (projNode is ImlProjectItem)
+//                                     imlProjFile = projNode as ImlProjectItem;
+//                             else
+//                                     imlProjFile = null;
+//                     }
+//             }
+
+
+//             protected override bool EditorIsDirty {
+//                     get {
+//                             throw new NotImplementedException ();
+//                     }
+//                     set {
+//                             throw new NotImplementedException ();
+//                     }
+//             }
+//             protected override void updateProjFileFromEditor ()
+//             {
+//
+//             }
+//             protected override void updateEditorFromProjFile () {
+//                     
+//             }                       
+//             protected override void updateCheckPostProcess ()
+//             {
+//
+//             }
+
+
+       }
+}
diff --git a/CrowIDE/src/Editors/ImlVisualEditor.cs b/CrowIDE/src/Editors/ImlVisualEditor.cs
new file mode 100644 (file)
index 0000000..ccfb211
--- /dev/null
@@ -0,0 +1,905 @@
+//
+//  ImlVisualEditor.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2016 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+using Crow;
+using System.Threading;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.IO;
+using System.Collections.Generic;
+using Crow.IML;
+using System.Text;
+using System.Xml;
+using System.Diagnostics;
+using Crow.Cairo;
+
+namespace Crow.Coding
+{
+       public class ImlVisualEditor : Editor
+       {
+               #region CTOR
+               public ImlVisualEditor () : base()
+               {
+                       imlVE = new DesignInterface ();
+                       initCommands ();
+               }
+               #endregion
+
+               protected override void onInitialized (object sender, EventArgs e)
+               {
+                       initIcons ();
+                       base.onInitialized (sender, e);
+               }
+               DesignInterface imlVE;
+               Widget selectedItem;
+               ImlProjectItem imlProjFile;
+
+               bool editorIsDirty = false;//needed when tree is empty
+               bool drawGrid, snapToGrid;
+               int gridSpacing, zoom = 100;
+               Measure designWidth, designHeight;
+               bool updateEnabled;
+
+               Picture icoMove, icoStyle;
+               Rectangle rIcons = default(Rectangle);
+               Size iconSize = new Size(11,11);
+
+               public List<Crow.Command> Commands;
+               Crow.Command cmdDelete;
+
+               void initCommands () {
+                       cmdDelete = new Crow.Command (new Action (() => deleteObject (SelectedItem)))
+                               { Caption = "Delete", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = true };
+                       Commands = new List<Crow.Command> (new Crow.Command[] { cmdDelete });
+               }
+
+               void initIcons () {
+                       icoMove = new SvgPicture ("#CrowIDE.icons.move-arrows.svg");
+
+            //                 icoStyle = new SvgPicture ();
+            //                 icoStyle.Load (IFace, "#CrowIDE.icons.palette.svg");
+        }
+
+        [DefaultValue(true)]
+               public bool DrawGrid {
+                       get { return drawGrid; }
+                       set {
+                               if (drawGrid == value)
+                                       return;
+                               drawGrid = value;
+                               NotifyValueChanged ("DrawGrid", drawGrid);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(true)]
+               public bool SnapToGrid {
+                       get { return snapToGrid; }
+                       set {
+                               if (snapToGrid == value)
+                                       return;
+                               snapToGrid = value;
+                               NotifyValueChanged ("SnapToGrid", snapToGrid);
+                       }
+               }
+               [DefaultValue(10)]
+               public int GridSpacing {
+                       get { return gridSpacing; }
+                       set {
+                               if (gridSpacing == value)
+                                       return;
+                               gridSpacing = value;
+                               NotifyValueChanged ("GridSpacing", gridSpacing);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue(100)]
+               public int Zoom {
+                       get { return zoom; }
+                       set {
+                               if (zoom == value)
+                                       return;
+                               
+                               zoom = value;
+                               NotifyValueChanged ("Zoom", zoom);
+                               Width = (int)(designWidth * zoom / 100.0);
+                               Height = (int)(designHeight * zoom / 100.0);
+                       }
+               }
+               [DefaultValue("512")]
+               public Measure DesignWidth {
+                       get { return designWidth; }
+                       set { 
+                               if (designWidth == value)
+                                       return;
+                               designWidth = value;
+                               NotifyValueChanged ("DesignWidth", designWidth);
+                               Width = (int)(designWidth * zoom / 100.0);
+                       }
+               }
+               [DefaultValue("400")]
+               public Measure DesignHeight {
+                       get { return designHeight; }
+                       set {
+                               if (designHeight == value)
+                                       return;
+                               designHeight = value;
+                               NotifyValueChanged ("DesignHeight", designHeight);
+                               Height = (int)(designHeight * zoom / 100.0);
+                       }
+               }
+
+               public Widget SelectedItem {
+                       get { return selectedItem; }
+                       set {
+                               if (selectedItem == value)
+                                       return;
+                               selectedItem = value;
+
+                               if (selectedItem == null)
+                                       cmdDelete.CanExecute = false;
+                               else
+                                       cmdDelete.CanExecute = true;
+                               
+                               NotifyValueChanged ("SelectedItem", selectedItem);
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               /// <summary>PoinprojFilever the widget</summary>
+               public virtual Widget HoverWidget
+               {
+                       get { return imlVE.HoverWidget; }
+                       set {
+                               if (HoverWidget == value)
+                                       return;
+
+                               imlVE.HoverWidget = value;
+
+                               NotifyValueChanged ("HoverWidget", HoverWidget);
+                       }
+               }
+               /// <summary>
+               /// use to disable update if tab is not the visible one
+               /// </summary>
+               public bool UpdateEnabled {
+                       get { return updateEnabled; }
+                       set { 
+                               if (value == updateEnabled)
+                                       return;
+                               updateEnabled = value;
+                               NotifyValueChanged ("UpdateEnabled", updateEnabled);
+                       }
+               }
+
+               public List<Widget> GraphicTree {
+                       get { return imlVE.GraphicTree; }
+               }
+
+               [XmlIgnore]public List<LQIList> LQIs {
+                       get { return imlVE.LQIs; }
+               }
+
+               #region editor overrides
+               public override ProjectFile ProjectNode {
+                       get {
+                               return base.ProjectNode;
+                       }
+                       set {
+                               base.ProjectNode = value;
+                               imlProjFile = projFile as ImlProjectItem;
+                               imlVE.ProjFile = imlProjFile;
+                       }
+               }
+
+               protected override bool EditorIsDirty {
+                       get { return imlProjFile == null ? false :
+                               imlProjFile.Instance == null ? editorIsDirty :
+                               imlProjFile.Instance.design_HasChanged | editorIsDirty; }
+                       set {
+                               editorIsDirty = value;
+                               if (GraphicTree.Count == 0)
+                                       return;
+                               if (GraphicTree [0] != null)
+                                       GraphicTree [0].design_HasChanged = value;                      
+                       }
+               }
+               protected override bool IsReady {
+                       get { return updateEnabled && imlVE != null && imlProjFile != null; }
+               }
+
+               protected override void updateProjFileFromEditor ()
+               {
+                       Debug.WriteLine("\t\tImlEditor updateProjFileFromEditor");
+                       try {
+                               if (imlProjFile.Instance == null)
+                                       projFile.UpdateSource(this, @"<?xml version=""1.0""?>");
+                               else
+                                       projFile.UpdateSource(this, imlProjFile.Instance.GetIML());
+                       } catch (Exception ex) {
+                               Error = ex.InnerException;
+                               if (Monitor.IsEntered(imlVE.UpdateMutex))
+                                       Monitor.Exit (imlVE.UpdateMutex);
+                       }
+               }
+               protected override void updateEditorFromProjFile () {
+                       Debug.WriteLine("\t\tImlEditor updateEditorFromProjFile");
+                       try {
+                               string selItemDesignID = null;
+                               if (SelectedItem!=null)
+                                       selItemDesignID = SelectedItem.design_id;
+                               imlVE.ClearInterface();
+                               Instantiator.NextInstantiatorID = 0;
+                               imlVE.Styling = projFile.Project.solution.Styling;
+                               imlVE.DefaultValuesLoader.Clear();
+                               //imlVE.DefaultTemplates = projFile.Project.solution.DefaultTemplates;
+                               imlVE.Instantiators = new Dictionary<string, Instantiator>();
+
+                               //prevent error on empty file
+                               bool emptyFile = true;
+                               string src = projFile.Source;
+                               using (Stream s = new MemoryStream (Encoding.UTF8.GetBytes (src))) {
+                                       using (XmlReader itr = XmlReader.Create (s)) {
+                                               while(itr.Read()){
+                                                       if (itr.NodeType == XmlNodeType.Element){
+                                                               emptyFile = false;
+                                                               break;
+                                                       }
+                                               }
+                                       }
+                               }
+                               Widget go = null;
+                               Error = null;
+
+                               if (emptyFile){
+                                       imlProjFile.Instance = null;
+                               }else{
+                                       imlVE.LoadIMLFragment(src);
+                                       imlProjFile.Instance = imlVE.GraphicTree[0];
+                                       if (selItemDesignID!=null)
+                                               imlProjFile.Instance.FindByDesignID(selItemDesignID,out go);                                            
+
+                               }
+                               SelectedItem = go;
+                       } catch (Exception ex) {
+                               Error = ex;
+                       }
+               }
+               protected override void updateCheckPostProcess ()
+               {
+                       if (Error != null) {
+                               RegisterForRedraw ();
+                               return;
+                       }
+                       imlVE.Update ();
+                       bool isDirty = false;
+
+                       lock (imlVE.RenderMutex)
+                               isDirty = imlVE.IsDirty;
+
+                       if (isDirty) {                          
+                               lock (IFace.UpdateMutex)
+                                       RegisterForRedraw ();                           
+                       }
+               }
+               #endregion
+
+               #region GraphicObject overrides
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+                       switch (layoutType) {
+                       case LayoutingType.Width:
+                               DesignWidth = Slot.Width * 100 / zoom;
+                               imlVE.ProcessResize (new Size(designWidth,designHeight));
+                               break;
+                       case LayoutingType.Height:
+                               DesignHeight = Slot.Height * 100 / zoom;
+                               imlVE.ProcessResize (new Size(designWidth,designHeight));
+                               break;
+                       }
+               }
+
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       Widget oldHW = HoverWidget;
+                       Rectangle scr = this.ScreenCoordinates (this.getSlot ());
+                       ProcessMouseMove (e.X - scr.X, e.Y - scr.Y);
+
+                       Widget newHW = HoverWidget;
+                       if (newHW == null)
+                               return;
+
+                       if (draggedObj != null) {
+                               if (draggedObj.Parent == null) {
+                                       if (tryAddObjectTo (newHW, draggedObj)) {
+                                               RegisterForRedraw ();
+                                               return;
+                                       }
+                               } else if (newHW != draggedObj) {
+                                       //lock (imlVE.UpdateMutex) {
+                                       ILayoutable possibleParent = getPossibleParent (newHW, draggedObj);
+                                       if (possibleParent == null) {
+                                               Group g = newHW.Parent as Group;
+                                               if (g != null && g != draggedObj) {
+                                                       removeObject (draggedObj);
+                                                       g.InsertChild (g.Children.IndexOf (newHW), draggedObj);
+                                                       RegisterForRedraw ();
+                                                       return;
+                                               }
+                                       } else if (possibleParent != draggedObj.Parent) {
+                                               removeObject (draggedObj);
+                                               if (tryAddObjectTo (possibleParent, draggedObj)) {
+                                                       RegisterForRedraw ();
+                                                       return;
+                                               }
+                                       }
+                                       //}
+                               }
+                       }                       
+
+                       if (oldHW == newHW)
+                               return;
+                       //RegisterForRedraw ();
+
+               }
+               public override void onMouseEnter (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseEnter (sender, e);
+                       if (IFace.DragAndDropOperation != null && draggedObj == null)
+                               return;
+                       IFace.FocusedWidget = this;
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (sender, e);
+//                     IFace.FocusedWidget = null;
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       if (e.Mouse.RightButton == ButtonState.Pressed) {
+                               base.onMouseDown (sender, e);
+                               return;
+                       }
+                       SelectedItem = HoverWidget;
+
+//                     if (SelectedItem != null && projFile != null) {
+//                             projFile.CurrentLine = SelectedItem.design_line;
+//                             projFile.CurrentColumn = SelectedItem.design_column;
+//                     }
+
+               }
+
+               protected override void onDraw (Crow.Cairo.Context gr)
+               {
+                       base.onDraw (gr);
+
+                       Rectangle cb = new Rectangle (0, 0, designWidth, designHeight);
+
+                       gr.Save ();
+
+                       double z = zoom / 100.0;
+
+                       gr.Scale (z, z);
+
+                       if (drawGrid) {
+                               double gridLineWidth = 0.2 / z;
+                               double glhw = gridLineWidth / 2.0;
+                               int nbLines = cb.Width / gridSpacing;
+                               double d = cb.Left + gridSpacing;
+                               for (int i = 0; i < nbLines; i++) {
+                                       gr.MoveTo (d - glhw, cb.Y);
+                                       gr.LineTo (d - glhw, cb.Bottom);
+                                       d += gridSpacing;
+                               }
+                               nbLines = cb.Height / gridSpacing;
+                               d = cb.Top + gridSpacing;
+                               for (int i = 0; i < nbLines; i++) {
+                                       gr.MoveTo (cb.X, d - glhw);
+                                       gr.LineTo (cb.Right, d - glhw);
+                                       d += gridSpacing;
+                               }
+                               gr.LineWidth = gridLineWidth;
+                               Foreground.SetAsSource (gr, cb);
+                               gr.Stroke ();
+                       }
+
+                       lock (imlVE.RenderMutex) {
+                               gr.SetSourceSurface (imlVE.surf, cb.Left, cb.Top);
+                               gr.Paint ();
+                               imlVE.IsDirty = false;
+                       }
+                       /*if (Error == null) {
+                               gr.SetSourceColor (Color.Black);
+                               gr.Rectangle (cb, 1.0 / z);
+                       } else {
+                               gr.SetSourceColor (Color.LavenderBlush);
+                               gr.Rectangle (cb, 2.0 / z);
+                               string[] lerrs = Error.ToString ().Split ('\n');
+                               Point p = cb.Center;
+                               p.Y -= lerrs.Length * 20;
+                               foreach (string le in lerrs) {
+                                       drawCenteredTextLine(gr, p, le);
+                                       p.Y += 20;
+
+                               }
+                       }
+                       gr.Stroke ();*/
+
+                       Rectangle hr;
+
+                       if (SelectedItem?.Parent != null) {
+
+                               gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                               gr.SetFontSize (Font.Size);
+                               gr.FontOptions = Interface.FontRenderingOptions;
+                               gr.Antialias = Interface.Antialias;
+
+                               Widget g = SelectedItem;
+                               hr = g.ScreenCoordinates (g.getSlot ());
+
+//                             Rectangle rIcons = new Rectangle (iconSize);
+//                             rIcons.Width *= 4; 
+//                             rIcons.Top = hr.Bottom;
+//                             rIcons.Left = hr.Right - rIcons.Width + iconSize.Width;
+                               Rectangle rIcoMove = new Rectangle (hr.BottomRight, iconSize);
+//                             Rectangle rIcoStyle = rIcoMove;
+//                             rIcoStyle.Left += iconSize.Width + 4;
+
+                               using (Surface mask = new ImageSurface (Format.Argb32, cb.Width, cb.Height)) {
+                                       using (Context ctx = new Context (mask)) {
+                                               ctx.Save();
+                                               ctx.SetSourceRGBA(1.0,1.0,1.0,0.4);
+                                               ctx.Paint ();
+                                               ctx.Rectangle (hr);
+                                               ctx.Operator = Operator.Clear;
+                                               ctx.Fill ();
+                                       }
+
+                                       gr.SetSourceSurface (mask, 0, 0);
+                                       gr.Paint ();
+
+                                       using (Surface ol = new ImageSurface (Format.Argb32, cb.Width, cb.Height)) {
+                                               using (Context ctx = new Context (ol)) {
+                                                       ctx.SetSourceColor (Color.Black);
+                                                       drawDesignOverlay (ctx, g, cb, hr, 0.4 / z, 6.5);
+                                               }
+                                                       
+                                               gr.SetSourceSurface (ol, 0, 0);
+                                               gr.Paint ();
+                                       }
+
+                                       drawIcon (gr, icoMove, rIcoMove);
+                                       //drawIcon (gr, icoStyle, rIcoStyle);
+
+                               }                                               
+                       }
+                       if (HoverWidget != null) {
+                               hr = HoverWidget.ScreenCoordinates (HoverWidget.getSlot ());
+                               gr.SetSourceColor (Color.SkyBlue);
+                               //gr.SetDash (new double[]{ 5.0, 3.0 }, 0.0);
+                               gr.Rectangle (hr, 0.4 / z);
+                       }
+                       gr.Restore ();
+               }
+
+               void drawIcon (Context gr, Picture pic, Rectangle r) {
+//                     gr.SetSourceColor (Color.Black);
+//                     CairoHelpers.CairoRectangle (gr, r.Inflated (1), 2, 1.0);
+                       gr.SetSourceColor (Color.White);
+                       CairoHelpers.CairoRectangle (gr, r.Inflated (1), 2);
+                       gr.Fill ();
+                       gr.Operator = Operator.Clear;
+                       pic.Paint (gr, r);
+                       gr.Operator = Operator.Over;
+               }
+               void drawDesignOverlay (Context gr, Widget g, Rectangle cb, Rectangle hr, double coteStroke, double space = 6.5){
+                       double z = zoom / 100.0;
+                       double coteW = 3, coteL = 5;
+                       bool fill = true;
+                       Crow.Cairo.PointD p1 = new Crow.Cairo.PointD (hr.X + 0.5, hr.Y - space);
+                       Crow.Cairo.PointD p2 = new Crow.Cairo.PointD (hr.Right - 0.5, hr.Y - space);
+
+                       if (p1.Y < cb.Top) {
+                               if (hr.Bottom > cb.Bottom - space)
+                                       p1.Y = p2.Y = hr.Bottom - space;
+                               else
+                                       p1.Y = p2.Y = hr.Bottom + space;
+                       }
+
+                       if (g.Width.IsFit)
+                               gr.DrawCoteInverse (p1, p2, coteStroke, fill, coteW, coteL);
+                       else if (g.Width.IsRelativeToParent) {
+                               gr.DrawCote (p1, p2, coteStroke, fill, coteW, coteL);
+                               if (g.Width.Value < 100)
+                                       drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Width.ToString());
+                       }else if (g.Width.IsFixed) {
+                               gr.DrawCoteFixed (p1, p2, coteStroke * 2.0, coteW);
+                               drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Width.Value.ToString());
+                       }
+
+                       p1 = new Crow.Cairo.PointD (hr.X - space, hr.Top + 0.5);
+                       p2 = new Crow.Cairo.PointD (hr.X - space, hr.Bottom - 0.5);
+
+                       if (p1.X < cb.Left) {
+                               if (hr.Right > cb.Right - space)
+                                       p1.X = p2.X = hr.Right - space;
+                               else
+                                       p1.X = p2.X = hr.Right + space;
+                       } 
+                       if (g.Height.IsFit)
+                               gr.DrawCoteInverse (p1, p2, coteStroke, fill, coteW, coteL);
+                       else if (g.Height.IsRelativeToParent){
+                               gr.DrawCote (p1, p2, coteStroke, fill, coteW, coteL);
+                               if (g.Height.Value < 100)
+                                       drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Height.ToString());
+                       }else if (g.Width.IsFixed) {
+                               gr.DrawCoteFixed (p1, p2, coteStroke * 2.0, coteW);
+                               drawCenteredTextLine (gr, p1.Add(p2.Substract(p1).Divide (2)), g.Height.Value.ToString());
+                       }
+
+                       //                              hr.Inflate (2);
+                       //gr.SetDash (new double[]{ 1.0, 4.0 }, 0.0);
+                       //gr.SetSourceColor (Color.Grey);
+//                     gr.Rectangle (hr,coteStroke);
+//                     gr.Stroke ();
+                       gr.Operator = Operator.Over;                    
+               }
+
+               void drawCenteredTextLine (Context gr, Point center, string txt){
+                       drawCenteredTextLine (gr, new PointD(center.X,center.Y), txt);
+               }
+               void drawCenteredTextLine (Context gr, PointD center, string txt){
+                       if (string.IsNullOrEmpty(txt))
+                               return;
+                       FontExtents fe = gr.FontExtents;
+                       TextExtents te = gr.TextExtents (txt);
+
+                       Rectangle rText = new Rectangle(
+                               (int)(center.X - te.Width / 2), (int)(center.Y - (fe.Ascent + fe.Descent) / 2),
+                               (int)te.Width, (int)(fe.Ascent + fe.Descent));
+
+                       gr.Operator = Operator.Clear;
+                       Rectangle r = rText;
+                       r.Inflate (2);
+                       gr.Rectangle (r);
+                       gr.Fill ();
+                       gr.Operator = Operator.Over;
+
+                       gr.MoveTo (rText.X, rText.Y + fe.Ascent);
+                       gr.ShowText (txt);
+                       gr.Fill ();
+
+               }
+               protected override void onDragEnter (object sender, DragDropEventArgs e)
+               {
+                       base.onDragEnter (sender, e);
+                       GraphicObjectDesignContainer godc = e.DragSource.DataSource as GraphicObjectDesignContainer;
+                       if (godc == null)
+                               return;
+                       createDraggedObj (godc.CrowType);
+               }
+               protected override void onDragLeave (object sender, DragDropEventArgs e)
+               {
+                       base.onDragLeave (sender, e);
+                       GraphicObjectDesignContainer godc = e.DragSource.DataSource as GraphicObjectDesignContainer;
+                       if (godc == null)
+                               return;
+                       ClearDraggedObj ();
+               }
+
+               protected override void onStartDrag (object sender, DragDropEventArgs e)
+               {
+                       base.onStartDrag (sender, e);
+                       if (SelectedItem == null)
+                               return;
+                       
+                       Widget dumy = new Widget (IFace);
+                       dumy.EndDrag += dumyOnEndDrag;
+                       dumy.Drop += dumyOnDrop;
+                       dumy.IsDragged = true;
+                       IFace.ActiveWidget = dumy;
+                       e.DragSource.IsDragged = false;
+                       IFace.DragAndDropOperation.DragSource = dumy;
+                       draggedObj = SelectedItem;
+                       int dragIconSize = 48;
+                       lock (IFace.UpdateMutex) {
+                               IFace.DragImageHeight = dragIconSize;
+                               IFace.DragImageWidth = dragIconSize;
+                               IFace.DragImage = draggedObj.CreateIcon(dragIconSize);
+                       }                                       
+                       removeObject (draggedObj);
+                       SelectedItem = null;
+                       HoverWidget = null;
+               }
+               void dumyOnEndDrag (object sender, DragDropEventArgs e)
+               {                       
+                       IFace.ClearDragImage ();
+               }
+               void dumyOnDrop (object sender, DragDropEventArgs e)
+               {
+                       ClearDraggedObj (false);
+                       IFace.ClearDragImage ();
+               }
+               #endregion
+
+
+               #region draggedObj handling
+
+               public Widget draggedObj = null;
+
+               void createDraggedObj (Type crowType) {
+                       lock (imlVE.UpdateMutex) {
+                               draggedObj = imlVE.CreateITorFromIMLFragment ("<" + crowType.Name + "/>").CreateInstance ();
+                       }
+               }
+
+               public void ClearDraggedObj (bool removeFromTree = true) {
+                       if (removeFromTree)
+                               deleteObject (draggedObj);                      
+                       draggedObj = null;
+               }
+               #endregion
+
+               void removeObject (Widget go) {
+                       if (go == null)
+                               return;
+                       if (go.Parent == null)
+                               return;         
+//                     lock (imlVE.UpdateMutex) {
+                               Interface i = go.Parent as Interface;
+                               if (i != null) {
+                                       i.RemoveWidget (go);
+                                       imlProjFile.Instance = null;
+                               } else {
+                                       Container c = go.Parent as Container;
+                                       if (c != null) 
+                                               c.SetChild (null);
+                                       else {
+                                               TemplatedContainer tc = go.Parent as TemplatedContainer;
+                                               if (tc != null)
+                                                       tc.Content = null;
+                                               else {
+                                                       Group g = go.Parent as Group;
+                                                       if (g != null)
+                                                               g.RemoveChild (go);
+                                               }
+                                       }
+                               }                                       
+                               EditorIsDirty = true;
+                       //}
+               }
+               void deleteObject (Widget go) {
+                       if (go == null)
+                               return;
+                       //lock (imlVE.UpdateMutex) {
+                               removeObject (go);
+                               go.Dispose ();
+                       //}
+               }
+
+               ILayoutable getPossibleParent (ILayoutable parent, Widget go) {
+                       if (go == null)
+                               return null;
+//                     lock (imlVE.UpdateMutex) {
+                               
+                               Interface i = null;
+                               if (parent == null)
+                                       i = imlVE;
+                               else
+                                       i = parent as Interface;
+                               if (i != null)
+                                       return i.GraphicTree.Count > 0 ? null : i;
+                               
+                               Container c = parent as Container;
+                               if (c != null)
+                                       return c.Child == null || c.Child == go ? c : null;                                             
+                               
+                               TemplatedContainer tc = parent as TemplatedContainer;
+                               if (tc != null)
+                                       return tc.Content == null || tc.Content == go? tc : null;
+                               
+                               return parent as Group;
+//                     }
+               }
+               bool tryAddObjectTo (ILayoutable parent, Widget go) {
+                       if (go == null)
+                               return false;
+//                     lock (imlVE.UpdateMutex) {
+                       Interface i = null;
+                       if (parent == null)
+                               i = imlVE;
+                       else
+                               i = parent as Interface;
+                       if (i != null) {
+                               if (i.GraphicTree.Count > 0)
+                                       return false;
+                               i.AddWidget (go);
+                               imlProjFile.Instance = go;
+                               EditorIsDirty = true;
+                               return true;
+                       }
+                       Container c = parent as Container;
+                       if (c != null) {
+                               if (c.Child != null)
+                                       return false;
+                                       //return tryAddObjectTo (c.Parent, go);
+                               c.SetChild (go);
+                               EditorIsDirty = true;
+                               return true;
+                       }
+                       TemplatedContainer tc = parent as TemplatedContainer;
+                       if (tc != null) {
+                               if (tc.Content != null)
+                                       return false;
+                               //return tryAddObjectTo (c.Parent, go);
+                               tc.Content = (go);
+                               EditorIsDirty = true;
+                               return true;
+                       }
+                       Group g = parent as Group;
+                       if (g != null) {
+                               g.AddChild (go);
+                               EditorIsDirty = true;
+                               return true;
+                       }
+                       return false;//tryAddObjectTo (parent.Parent, go);
+//                     }
+               }
+
+
+
+               void WidgetCheckOver (Widget go, MouseMoveEventArgs e){
+                       Type tGo = go.GetType();
+                       if (typeof(TemplatedGroup).IsAssignableFrom (tGo)) {
+                               
+                       } else if (typeof(TemplatedContainer).IsAssignableFrom (tGo)) {
+                               TemplatedContainer c = go as TemplatedContainer;
+                               if (c.Content?.MouseIsIn (e.Position) == true) {                                        
+                                       WidgetCheckOver (c.Content, e);
+                                       return;
+                               }
+                       } else if (typeof(TemplatedControl).IsAssignableFrom (tGo)) {
+                       } else if (typeof(Group).IsAssignableFrom (tGo)) {
+                               Group c = go as Group;
+                               for (int i = c.Children.Count -1; i >= 0; i--) {
+                                       if (c.Children[i].MouseIsIn (e.Position)) {                                     
+                                               WidgetCheckOver (c.Children[i], e);
+                                               return;
+                                       }
+                               }
+                       } else if (typeof(Crow.Container).IsAssignableFrom (tGo)) {
+                               Crow.Container c = go as Crow.Container;
+                               if (c.Child?.MouseIsIn (e.Position)==true) {                                    
+                                       WidgetCheckOver (c.Child, e);
+                                       return;
+                               }
+                       }
+                       HoverWidget = go;
+                       WidgetMouseEnter (go, e);
+               }
+               void WidgetMouseLeave (Widget go, MouseMoveEventArgs e){
+
+               }
+               void WidgetMouseEnter (Widget go, MouseMoveEventArgs e){
+
+               }
+               void WidgetMouseMove (Widget go, MouseMoveEventArgs e){}
+
+               public bool ProcessMouseMove(int x, int y)
+               {
+                       int deltaX = x - imlVE.Mouse.X;
+                       int deltaY = y - imlVE.Mouse.Y;
+                       imlVE.Mouse.X = x;
+                       imlVE.Mouse.Y = y;
+                       MouseMoveEventArgs e = new MouseMoveEventArgs (x, y, deltaX, deltaY);
+                       e.Mouse = imlVE.Mouse;
+
+                       if (imlVE.ActiveWidget != null) {
+                               //TODO, ensure object is still in the graphic tree
+                               //send move evt even if mouse move outside bounds
+                               WidgetMouseMove (imlVE.ActiveWidget, e);
+                               return true;
+                       }
+
+                       if (HoverWidget != null) {
+                               //TODO, ensure object is still in the graphic tree
+                               //check topmost graphicobject first
+                               Widget tmp = HoverWidget;
+                               Widget topc = null;
+                               while (tmp is Widget) {
+                                       topc = tmp;
+                                       tmp = tmp.LogicalParent as Widget;
+                               }
+                               int idxhw = imlVE.GraphicTree.IndexOf (topc);
+                               if (idxhw != 0) {
+                                       int i = 0;
+                                       while (i < idxhw) {
+                                               if (imlVE.GraphicTree [i].LogicalParent == imlVE.GraphicTree [i].Parent) {
+                                                       if (imlVE.GraphicTree [i].MouseIsIn (e.Position)) {
+                                                               while (imlVE.HoverWidget != null) {
+                                                                       WidgetMouseLeave (imlVE.HoverWidget, e);
+                                                                       imlVE.HoverWidget = imlVE.HoverWidget.LogicalParent as Widget;
+                                                               }
+
+                                                               WidgetCheckOver (GraphicTree [i], e);
+                                                               return true;
+                                                       }
+                                               }
+                                               i++;
+                                       }
+                               }
+
+
+                               if (imlVE.HoverWidget.MouseIsIn (e.Position)) {
+                                       WidgetCheckOver (imlVE.HoverWidget, (e));
+                                       return true;
+                               } else {
+                                       WidgetMouseLeave (imlVE.HoverWidget, e);
+                                       //seek upward from last focused graph obj's
+                                       while (imlVE.HoverWidget.LogicalParent as Widget != null) {
+                                               imlVE.HoverWidget = imlVE.HoverWidget.LogicalParent as Widget;
+                                               if (imlVE.HoverWidget.MouseIsIn (e.Position)) {
+                                                       WidgetCheckOver (imlVE.HoverWidget, e);
+                                                       return true;
+                                               } else
+                                                       WidgetMouseLeave (imlVE.HoverWidget, e);
+                                       }
+                               }
+                       }
+
+                       //top level graphic obj's parsing
+                       lock (imlVE.GraphicTree) {
+                               for (int i = 0; i < imlVE.GraphicTree.Count; i++) {
+                                       Widget g = imlVE.GraphicTree [i];
+                                       if (g.MouseIsIn (e.Position)) {
+                                               WidgetCheckOver (g, e);
+                                               return true;
+                                       }
+                               }
+                       }
+                       imlVE.HoverWidget = null;
+                       return false;
+
+               }
+
+               void GTView_SelectedItemChanged (object sender, SelectionChangeEventArgs e)
+               {
+                       SelectedItem = e.NewValue as Widget;
+               }
+
+
+               public override void onKeyDown (object sender, KeyEventArgs e)
+               {
+               
+                       switch (e.Key) {
+                       case Key.Delete:
+                               if (selectedItem == null)
+                                       return;
+                               deleteObject (selectedItem);
+                               break;
+                       case Key.Escape:
+                               SelectedItem = null;
+                               break;
+                       }
+               }
+       }
+}
diff --git a/CrowIDE/src/Editors/Parsers/BufferParser.cs b/CrowIDE/src/Editors/Parsers/BufferParser.cs
new file mode 100644 (file)
index 0000000..c193c7d
--- /dev/null
@@ -0,0 +1,380 @@
+using System;
+using System.IO;
+using Crow;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text;
+
+namespace Crow.Coding
+{
+       /// <summary>
+       /// base class for tokenizing sources
+       /// </summary>
+       public abstract class BufferParser
+       {
+               /// <summary>
+               /// Default tokens, this enum may be overriden in derived parser with the new keyword,
+               /// see XMLParser for example.
+               /// </summary>
+               public enum TokenType {
+                       Unknown = 0,
+                       WhiteSpace = 1,
+                       NewLine = 2,
+                       LineComment = 3,
+                       BlockCommentStart = 4,
+                       BlockComment = 5,
+                       BlockCommentEnd = 6,
+                       Preprocessor = 7,
+                       Identifier = 8,
+                       Keyword = 9,
+                       OpenBlock = 10,
+                       CloseBlock = 11,
+                       StatementEnding = 12,
+                       OperatorOrPunctuation = 13,
+                       IntegerLitteral = 14,
+                       RealLitteral = 15,
+                       StringLitteralOpening = 16,
+                       StringLitteralClosing = 17,
+                       StringLitteral = 18,
+                       CharLitteralOpening = 19,
+                       CharLitteralClosing = 20,
+                       CharLitteral = 21,
+                       BoolLitteral = 22,
+                       NullLitteral = 23,                       
+                       Type = 24,
+               }
+
+               #region CTOR
+               public BufferParser (CodeBuffer _buffer)
+               {
+                       buffer = _buffer;
+
+                       buffer.LineUpadateEvent += Buffer_LineUpadateEvent;
+                       //buffer.LineAdditionEvent += Buffer_LineAdditionEvent;;
+                       buffer.LineRemoveEvent += Buffer_LineRemoveEvent;
+                       buffer.BufferCleared += Buffer_BufferCleared;
+               }
+
+               #endregion
+
+               #region Buffer events handlers
+               void Buffer_BufferCleared (object sender, EventArgs e)
+               {
+
+               }
+               void Buffer_LineAdditionEvent (object sender, CodeBufferEventArgs e)
+               {
+
+               }
+               void Buffer_LineRemoveEvent (object sender, CodeBufferEventArgs e)
+               {
+                       reparseSource ();
+               }
+               void Buffer_LineUpadateEvent (object sender, CodeBufferEventArgs e)
+               {
+                       for (int i = 0; i < e.LineCount; i++)
+                               TryParseBufferLine (e.LineStart + i);
+                       reparseSource ();
+               }
+               #endregion
+
+               internal int currentLine = 0;
+               internal int currentColumn = 0;
+
+               int syntTreeDepth = 0;
+               public int SyntacticTreeDepth {
+                       get { return syntTreeDepth;}
+                       set {
+                               syntTreeDepth = value;
+                               if (syntTreeDepth > SyntacticTreeMaxDepth)
+                                       SyntacticTreeMaxDepth = syntTreeDepth;
+                       }
+               }
+               public int SyntacticTreeMaxDepth = 0;
+
+               protected CodeBuffer buffer;
+               protected Token currentTok;
+               protected bool eol = true;
+               protected Point CurrentPosition {
+                       get { return new Point (currentLine, currentColumn); }
+                       set {
+                               currentLine = value.Y;
+                               currentColumn = value.X;
+                       }
+               }
+
+               public Node RootNode;
+
+               public abstract void ParseCurrentLine();
+               public abstract void SyntaxAnalysis ();
+               public void reparseSource () {
+                       for (int i = 0; i < buffer.LineCount; i++) {
+                               if (!buffer[i].IsParsed)
+                                       TryParseBufferLine (i);
+                       }
+                       try {
+                               SyntaxAnalysis ();
+                       } catch (Exception ex) {
+                               Debug.WriteLine ("Syntax Error: " + ex.ToString ());
+                               if (ex is ParserException)
+                                       SetLineInError (ex as ParserException);
+                       }
+               }
+               public void TryParseBufferLine(int lPtr) {
+                       buffer [lPtr].exception = null;
+                       currentLine = lPtr;
+                       currentColumn = 0;
+                       eol = false;
+
+                       try {
+                               ParseCurrentLine ();
+                       } catch (Exception ex) {
+                               Debug.WriteLine (ex.ToString ());
+                               if (ex is ParserException)
+                                       SetLineInError (ex as ParserException);
+                       }
+
+               }
+
+               public virtual void SetLineInError(ParserException ex) {
+                       currentTok = default(Token);
+                       if (ex.Line >= buffer.LineCount)
+                               ex.Line = buffer.LineCount - 1;
+                       if (buffer [ex.Line].IsFolded)
+                               buffer.ToogleFolding (ex.Line);
+                       buffer [ex.Line].SetLineInError (ex);
+               }
+               public virtual string LineBrkRegex {
+                       get { return @"\r\n|\r|\n|\\\\n"; }
+               }
+               void updateFolding () {
+                       //                      Stack<TokenList> foldings = new Stack<TokenList>();
+                       //                      bool inStartTag = false;
+                       //
+                       //                      for (int i = 0; i < parser.Tokens.Count; i++) {
+                       //                              TokenList tl = parser.Tokens [i];
+                       //                              tl.foldingTo = null;
+                       //                              int fstTK = tl.FirstNonBlankTokenIndex;
+                       //                              if (fstTK > 0 && fstTK < tl.Count - 1) {
+                       //                                      if (tl [fstTK + 1] != XMLParser.TokenType.ElementName)
+                       //                                              continue;
+                       //                                      if (tl [fstTK] == XMLParser.TokenType.ElementStart) {
+                       //                                              //search closing tag
+                       //                                              int tkPtr = fstTK+2;
+                       //                                              while (tkPtr < tl.Count) {
+                       //                                                      if (tl [tkPtr] == XMLParser.TokenType.ElementClosing)
+                       //
+                       //                                                      tkPtr++;
+                       //                                              }
+                       //                                              if (tl.EndingState == (int)XMLParser.States.Content)
+                       //                                                      foldings.Push (tl);
+                       //                                              else if (tl.EndingState == (int)XMLParser.States.StartTag)
+                       //                                                      inStartTag = true;
+                       //                                              continue;
+                       //                                      }
+                       //                                      if (tl [fstTK] == XMLParser.TokenType.ElementEnd) {
+                       //                                              TokenList tls = foldings.Pop ();
+                       //                                              int fstTKs = tls.FirstNonBlankTokenIndex;
+                       //                                              if (tls [fstTK + 1].Content == tl [fstTK + 1].Content) {
+                       //                                                      tl.foldingTo = tls;
+                       //                                                      continue;
+                       //                                              }
+                       //                                              parser.CurrentPosition = tls [fstTK + 1].Start;
+                       //                                              parser.SetLineInError(new ParserException(parser, "closing tag not corresponding"));
+                       //                                      }
+                       //
+                       //                              }
+                       //                      }
+               }
+
+               #region low level parsing
+               protected void addCharToCurTok(char c, Point position){
+                       currentTok.Start = position;
+                       currentTok += c;
+               }
+               /// <summary>
+               /// Read one char from current position in buffer and store it into the current token
+               /// </summary>
+               /// <param name="startOfTok">if true, set the Start position of the current token to the current position</param>
+               protected void readToCurrTok(bool startOfTok = false){
+                       if (startOfTok)
+                               currentTok.Start = CurrentPosition;
+                       currentTok += Read();
+               }
+               /// <summary>
+               /// read n char from the buffer and store it into the current token
+               /// </summary>
+               protected void readToCurrTok(int length) {
+                       for (int i = 0; i < length; i++)
+                               currentTok += Read ();
+               }
+               /// <summary>
+               /// Save current token into current TokensLine and raz current token
+               /// </summary>
+               protected void saveAndResetCurrentTok() {
+                       currentTok.End = CurrentPosition;
+                       buffer[currentLine].Tokens.Add (currentTok);
+                       currentTok = default(Token);
+               }
+               /// <summary>
+               /// read one char and add current token to current TokensLine, current token is reset
+               /// </summary>
+               /// <param name="type">Type of the token</param>
+               /// <param name="startToc">set start of token to current position</param>
+               protected void readAndResetCurrentTok(System.Enum type, bool startToc = false) {
+                       readToCurrTok ();
+                       saveAndResetCurrentTok (type);
+               }
+               /// <summary>
+               /// Save current tok
+               /// </summary>
+               /// <param name="type">set the type of the tok</param>
+               protected void saveAndResetCurrentTok(System.Enum type) {
+                       currentTok.Type = (TokenType)type;
+                       saveAndResetCurrentTok ();
+               }
+               protected void setPreviousTokOfTypeTo (TokenType inType, TokenType newType) {
+                       for (int i = currentLine; i >= 0; i--) {
+                               int j = buffer [i].Tokens.Count - 1;
+                               while (j >= 0) {
+                                       if (buffer [i].Tokens [j].Type == inType) {
+                                               Token t = buffer [i].Tokens [j];
+                                               t.Type = newType;
+                                               buffer [i].Tokens [j] = t;
+                                               return;
+                                       }
+                                       j--;
+                               }                               
+                       }
+               }
+               /// <summary>
+               /// Peek next char, emit '\n' if current column > buffer's line length
+               /// Throw error if eof is true
+               /// </summary>
+               protected virtual char Peek() {
+                       if (eol)
+                               throw new ParserException (currentLine, currentColumn, "Unexpected End of line");
+                       return currentColumn < buffer [currentLine].Length ?
+                               buffer [currentLine] [currentColumn] : '\n';
+               }
+               /// <summary>
+               /// Peek n char from buffer or less if remaining char in buffer's line is less than requested
+               /// if end of line is reached, no '\n' will be emitted, instead, empty string is returned. '\n' should be checked only
+               /// with single char Peek().
+               /// Throw error is eof is true
+               /// </summary>
+               /// <param name="length">Length.</param>
+               protected virtual string Peek(int length) {
+                       if (eol)
+                               return "";//throw new ParserException (currentLine, currentColumn, "Unexpected End of Line");
+                       int lg = Math.Min(length, Math.Max (buffer [currentLine].Length - currentColumn, buffer [currentLine].Length - currentColumn - length));
+                       if (lg == 0)
+                               return "";
+                       return buffer [currentLine].Content.Substring (currentColumn, lg);
+               }
+               /// <summary>
+               /// read one char from buffer at current position, if '\n' is read, current line is incremented
+               /// and column is reset to 0
+               /// </summary>
+               protected virtual char Read() {
+                       char c = Peek ();
+                       if (c == '\n')
+                               eol = true;
+                       currentColumn++;
+                       return c;
+               }
+               protected virtual string Read(int charCount){
+                       string tmp = "";
+                       for (int i = 0; i < charCount; i++) {
+                               if (eol)
+                                       break;
+                               tmp += Read ();
+                       }
+                       return tmp;
+               }
+               /// <summary>
+               /// read until end of line is reached
+               /// </summary>
+               /// <returns>string read</returns>
+               protected virtual string ReadLine () {
+                       StringBuilder tmp = new StringBuilder();
+                       char c = Read ();
+                       while (!eol) {
+                               tmp.Append (c);
+                               c = Read ();
+                       }
+                       return tmp.ToString();
+               }
+               /// <summary>
+               /// read until end expression is reached or end of line.
+               /// </summary>
+               /// <returns>string read minus the ending expression that has to be read after</returns>
+               /// <param name="endExp">Expression to search for</param>
+               protected virtual string ReadLineUntil (string endExp){
+                       string tmp = "";
+
+                       while (!eol) {
+                               if (buffer [currentLine].Length - currentColumn - endExp.Length < 0) {
+                                       tmp += ReadLine();
+                                       break;
+                               }
+                               if (string.Equals (Peek (endExp.Length), endExp))
+                                       return tmp;
+                               tmp += Read();
+                       }
+                       return tmp;
+               }
+               /// <summary>
+               /// skip white spaces, but not line break. Save spaces in a WhiteSpace token.
+               /// </summary>
+               protected void SkipWhiteSpaces () {
+                       if (currentTok.Type != TokenType.Unknown)
+                               throw new ParserException (currentLine, currentColumn, "current token should be reset to unknown (0) before skiping white spaces");
+                       while (!eol) {
+                               if (!char.IsWhiteSpace (Peek ())||Peek()=='\n')
+                                       break;
+                               readToCurrTok (currentTok.Type == TokenType.Unknown);
+                               currentTok.Type = TokenType.WhiteSpace;
+                       }
+                       if (currentTok.Type != TokenType.Unknown)
+                               saveAndResetCurrentTok ();
+               }
+               #endregion
+
+               protected Node addChildNode (Node curNode, CodeLine cl, int tokPtr, string type = "") {
+                       Node n = new Node () { Name = cl.Tokens [tokPtr].Content, StartLine = cl, Type = type };
+                       curNode.AddChild (n);
+                       if (cl.SyntacticNode == null)
+                               cl.SyntacticNode = n;
+                       SyntacticTreeDepth++;
+                       return n;
+               }
+               protected void closeNodeAndGoUp (ref Node n, CodeLine cl, string type = ""){
+                       while (n != null) {
+                               if (n.Type == type) {
+                                       n.EndLine = cl;
+                                       n = n.Parent;
+                                       SyntacticTreeDepth--;
+                                       break;
+                               }
+                               n = n.Parent;
+                               SyntacticTreeDepth--;
+                       }
+               }
+               protected void closeNodeAndGoUp (ref Node n, CodeLine cl){
+                       SyntacticTreeDepth--;
+                       n.EndLine = cl;
+                       n = n.Parent;
+               }
+
+               protected void initSyntaxAnalysis () {
+                       RootNode = new Node () { Name = "RootNode", Type="Root" };
+                       SyntacticTreeDepth = SyntacticTreeMaxDepth = 0;
+               }
+
+
+               protected void throwParserException(string msg){
+                       throw new ParserException (currentLine, currentColumn, msg);
+               }
+       }
+}
\ No newline at end of file
diff --git a/CrowIDE/src/Editors/Parsers/CSharpParser.cs b/CrowIDE/src/Editors/Parsers/CSharpParser.cs
new file mode 100644 (file)
index 0000000..23655aa
--- /dev/null
@@ -0,0 +1,386 @@
+using System;
+using Crow;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text.RegularExpressions;
+using System.Linq;
+
+namespace Crow.Coding
+{
+       public class CSharpParser : BufferParser
+       {
+               #region keywords
+               string[] keywords = new string[] {
+                       "abstract",
+                       "as",
+                       "ascending",
+                       "async",
+                       "await",
+                       "base",
+                       "bool",
+                       "break",
+                       "byte",
+                       "case",
+                       "catch",
+                       "char",
+                       "checked",
+                       "class",
+                       "const",
+                       "continue",
+                       "decimal",
+                       "default",
+                       "delegate",
+                       "descending",
+                       "do",
+                       "double",
+                       "dynamic",
+                       "else",
+                       "enum",
+                       "equals",
+                       "event",
+                       "explicit",
+                       "extern",
+                       "false",
+                       "finally",
+                       "fixed",
+                       "float",
+                       "for",
+                       "foreach",
+                       "from",
+                       "get",
+                       "goto",
+                       "group",
+                       "if",
+                       "implicit",
+                       "in",
+                       "int",
+                       "interface",
+                       "internal",
+                       "is",
+                       "join",
+                       "let",
+                       "lock",
+                       "long",
+                       "nameof",
+                       "namespace",
+                       "new",
+                       "null",
+                       "object",
+                       "operator",
+                       "orderby",
+                       "out",
+                       "override",
+                       "params",
+                       "partial",
+                       "private",
+                       "protected",
+                       "public",
+                       "readonly",
+                       "ref",
+                       "return",
+                       "sbyte",
+                       "sealed",
+                       "select",
+                       "set",
+                       "short",
+                       "sizeof",
+                       "stackalloc",
+                       "static",
+                       "string",
+                       "struct",
+                       "switch",
+                       "this",
+                       "throw",
+                       "true",
+                       "try",
+                       "typeof",
+                       "uint",
+                       "ulong",
+                       "unchecked",
+                       "unsafe",
+                       "ushort",
+                       "using",
+                       "value",
+                       "var",
+                       "virtual",
+                       "void",
+                       "volatile",
+                       "when",
+                       "where",
+                       "while",
+                       "yield "                        
+               };
+               #endregion
+
+               public enum States
+               {
+                       init,       
+                       BlockComment,
+                       InNameSpace,
+                       InClass,
+                       InMember,
+                       Unknown,
+               }
+
+               public CSharpParser (CodeBuffer _buffer) : base(_buffer)
+               {
+               }
+
+               #region Regular Expression for validity checks
+               static Regex rxValidChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               static Regex rxNameStartChar = new Regex(@"_|\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}");
+               static Regex rxNameChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               static Regex rxNewLineChar = new Regex(@"\u000D|\u000A|\u0085|\u2028|\u2029");
+               static Regex rxWhiteSpaceChar = new Regex(@"\p{Zs}|\u0009|\u000B|\u000C");
+               static Regex rxDecimal = new Regex(@"[0-9]+");
+               static Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+");
+
+               public static bool CharIsValidCharStartName (char c) {
+                       return rxNameStartChar.IsMatch(new string(new char[]{c}));
+               }
+               public static bool CharIsValidCharName (char c) {
+                       return rxNameChar.IsMatch(new string(new char[]{c}));
+               }
+
+               public bool nextCharIsValidCharStartName
+               {
+                       get { return CharIsValidCharStartName(Peek()); }
+               }
+               public bool nextCharIsValidCharName
+               {
+                       get { return CharIsValidCharName(Peek()); }
+               }
+               #endregion
+
+               States curState = States.init;
+               States savedState = States.init;
+
+               public override void ParseCurrentLine ()
+               {
+                       //Debug.WriteLine (string.Format("parsing line:{0}", currentLine));
+                       CodeLine cl = buffer [currentLine];
+                       cl.Tokens = new List<Token> ();
+
+
+                       //retrieve current parser state from previous line
+                       if (currentLine > 0)
+                               curState = (States)buffer[currentLine - 1].EndingState;
+                       else
+                               curState = States.init;
+
+                       States previousEndingState = (States)cl.EndingState;
+
+                       while (! eol) {
+                               if (currentTok.IsNull)
+                                       SkipWhiteSpaces ();
+
+                               if (curState == States.BlockComment) {
+                                       currentTok.Start = CurrentPosition;
+                                       currentTok.Type = (BufferParser.TokenType)TokenType.BlockComment;
+                                       currentTok += ReadLineUntil ("*/");
+                                       if (Peek (2) == "*/") {
+                                               readToCurrTok (2);
+                                               curState = savedState;
+                                       }
+                                       saveAndResetCurrentTok ();
+                                       continue;
+                               }
+
+                               switch (Peek()) {
+                               case '\n':
+                                       eol = true;
+                                       if (!currentTok.IsNull)
+                                               saveAndResetCurrentTok ();
+                                       break;
+                               case '#':
+                                       readToCurrTok (true);
+                                       currentTok += ReadLine ();
+                                       saveAndResetCurrentTok (TokenType.Preprocessor);
+                                       break;
+                               case '/':
+                                       readToCurrTok (true);
+                                       switch (Peek ()) {
+                                       case '*':
+                                               readToCurrTok ();
+                                               currentTok += ReadLine ();
+                                               //currentTok.Type = (Parser.TokenType)TokenType.BlockComment;
+                                               savedState = curState;
+                                               curState = States.BlockComment;
+                                               saveAndResetCurrentTok (TokenType.BlockComment);
+                                               break;
+                                       case '/':
+                                               //readToCurrTok ();
+                                               currentTok += ReadLine ();
+                                               saveAndResetCurrentTok (TokenType.LineComment);
+                                               //currentTok.Type = (Parser.TokenType)TokenType.LineComment;
+                                               break;
+                                       default:
+                                               currentTok += ReadLine ();
+                                               saveAndResetCurrentTok (TokenType.Unknown);
+                                               break;
+                                       }
+                                       break;
+                               case '{':
+                                       if (currentTok.IsNull)
+                                               readAndResetCurrentTok (TokenType.OpenBlock, true);
+                                       else
+                                               readToCurrTok ();
+                                       break;
+                               case '}':
+                                       if (currentTok.IsNull)
+                                               readAndResetCurrentTok (TokenType.CloseBlock, true);
+                                       else
+                                               readToCurrTok ();                                       
+                                       break;
+                               case '\\'://unicode escape sequence
+                                       if (!(currentTok.Type == TokenType.Identifier ||
+                                           currentTok.IsEmpty || currentTok.Type == TokenType.StringLitteral || currentTok.Type == TokenType.CharLitteral)) {
+                                               saveAndResetCurrentTok ();
+                                       }
+                                       Point pos = CurrentPosition;
+                                       Read ();
+                                       char escChar = Read ();
+
+                                       if (escChar == 'u') {
+                                               char c = char.ConvertFromUtf32 (int.Parse (Read (4), System.Globalization.NumberStyles.HexNumber))[0];
+                                               if (currentTok.IsEmpty) {
+                                                       if (!CharIsValidCharStartName (c))
+                                                               throwParserException ("expecting identifier start");                                                    
+                                                       currentTok.Start = pos;
+                                                       currentTok.Type = TokenType.Identifier;
+                                               } else if (currentTok.Type == TokenType.Identifier) {
+                                                       if (!CharIsValidCharName (c))
+                                                               throwParserException ("expecting identifier valid char");                                               
+                                               }
+                                               currentTok += c;
+                                               break;
+                                       }
+                                       currentTok += new String (new char[] { '\\', escChar });
+                                       break;
+                               case '\'':
+                                       if (currentTok.IsNull) {
+                                               readAndResetCurrentTok (TokenType.CharLitteralOpening, true);
+                                               currentTok.Type = TokenType.CharLitteral;
+                                       } else if (currentTok.Type == TokenType.CharLitteral) {
+                                               saveAndResetCurrentTok ();
+                                               readAndResetCurrentTok (TokenType.CharLitteralClosing, true);
+                                       } else if (currentTok.Type == TokenType.StringLitteral){
+                                               readToCurrTok ();
+                                       } else
+                                               throwParserException ("unexpected character: (\')");                                            
+                                       break;
+                               case '"':
+                                       if (currentTok.IsNull) {
+                                               readAndResetCurrentTok (TokenType.StringLitteralOpening, true);
+                                               currentTok.Type = TokenType.StringLitteral;
+                                       } else if (currentTok.Type == TokenType.StringLitteral) {
+                                               saveAndResetCurrentTok ();
+                                               readAndResetCurrentTok (TokenType.StringLitteralClosing, true);
+                                       } else
+                                               throwParserException ("unexpected character: (\")");
+                                       break;
+                               default:
+                                       if (currentTok.Type == TokenType.StringLitteral || currentTok.Type == TokenType.CharLitteral) {
+                                               readToCurrTok (currentTok.IsEmpty);
+                                       } else if (currentTok.IsNull) {
+                                               if (nextCharIsValidCharStartName) {                                             
+                                                       readToCurrTok (true);
+                                                       while (nextCharIsValidCharName)
+                                                               readToCurrTok ();
+
+                                                       if (keywords.Contains (currentTok.Content))
+                                                               saveAndResetCurrentTok (TokenType.Keyword);
+                                                       else
+                                                               saveAndResetCurrentTok (TokenType.Identifier);
+                                                       continue;
+                                               } else
+                                                       readAndResetCurrentTok(TokenType.Unknown, true);
+                                       } else
+                                               readAndResetCurrentTok(TokenType.Unknown, true);                                        
+                                       break;
+                               }
+                       }
+
+                       if (cl.EndingState != (int)curState && currentLine < buffer.LineCount - 1)
+                               buffer [currentLine + 1].Tokens = null;
+
+                       cl.EndingState = (int)curState;
+               }
+               
+               public override void SyntaxAnalysis ()
+               {
+                       initSyntaxAnalysis ();
+                       Node currentNode = RootNode;
+
+                       int ptrLine = 0;
+                       while (ptrLine < buffer.LineCount) {
+                               CodeLine cl = buffer [ptrLine];
+                               if (cl.Tokens == null){
+                                       ptrLine++;
+                                       continue;
+                               }
+                               cl.SyntacticNode = null;
+
+                               int tokPtr = 0;
+                               bool onlyWhiteSpace = true;
+                               while (tokPtr < cl.Tokens.Count) {
+                                       if (cl.Tokens [tokPtr].Type == TokenType.WhiteSpace) {
+                                               tokPtr++;
+                                               continue;
+                                       }
+
+                                       if (cl.Tokens [tokPtr].Type == TokenType.LineComment && onlyWhiteSpace) {
+                                               int startLine = ptrLine;
+                                               ptrLine++;
+                                               while (ptrLine < buffer.LineCount) {
+                                                       int idx = buffer [ptrLine].FirstNonBlankTokIndex;
+                                                       if (idx < 0) 
+                                                               break;
+                                                       if (buffer [ptrLine].Tokens [idx].Type != TokenType.LineComment)
+                                                               break;
+                                                       ptrLine++;
+                                               }
+                                               ptrLine--;
+                                               if (ptrLine - startLine > 0) {
+                                                       currentNode = addChildNode (currentNode, cl, tokPtr, "comment");
+                                                       closeNodeAndGoUp (ref currentNode, buffer [ptrLine], "comment");
+                                               }
+                                               break;
+                                       }
+
+                                       switch (cl.Tokens [tokPtr].Type) {
+                                       case TokenType.BlockCommentStart:
+                                       case TokenType.OpenBlock:
+                                               currentNode = addChildNode (currentNode, cl, tokPtr);
+                                               break;
+                                       case TokenType.CloseBlock:
+                                       case TokenType.BlockCommentEnd:
+                                               closeNodeAndGoUp (ref currentNode, cl);
+                                               break;
+                                       case TokenType.Preprocessor:
+                                               if (cl.Tokens [tokPtr].Content.StartsWith ("#region", StringComparison.Ordinal)) {
+                                                       currentNode = addChildNode (currentNode, cl, tokPtr, "region");
+                                               } else if (cl.Tokens [tokPtr].Content.StartsWith ("#endregion", StringComparison.Ordinal)) {
+                                                       
+                                                       closeNodeAndGoUp (ref currentNode, cl,"region");
+                                               }
+                                               break;
+                                       }
+                                       onlyWhiteSpace = false;
+                                       tokPtr++;
+                               }
+                               ptrLine++;
+                       }
+                       /*ptrLine = 0;
+                       while (ptrLine < buffer.LineCount) {
+                               CodeLine cl = buffer [ptrLine];
+                               if (cl.IsFoldable) {
+                                       if (cl.SyntacticNode.Type == "comment" || cl.SyntacticNode.Type == "region")
+                                               cl.IsFolded = true;
+                               }
+                               ptrLine++;
+                       }*/
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/Parsers/StyleParser.cs b/CrowIDE/src/Editors/Parsers/StyleParser.cs
new file mode 100644 (file)
index 0000000..9a1e74c
--- /dev/null
@@ -0,0 +1,179 @@
+using System;
+using Crow;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Text.RegularExpressions;
+using System.Linq;
+
+namespace Crow.Coding
+{
+       public class StyleParser : BufferParser
+       {
+               enum States { init, classNames, members, value, endOfStatement }
+
+               public StyleParser (CodeBuffer _buffer) : base(_buffer)
+               {
+               }
+
+               #region Character ValidityCheck
+               static Regex rxValidChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               static Regex rxNameStartChar = new Regex(@"_|\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}");                                                                                                                      
+               static Regex rxNameChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               static Regex rxDecimal = new Regex(@"[0-9]+");
+               static Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+");
+
+               public bool nextCharIsValidCharStartName
+               {
+                       get { return rxNameStartChar.IsMatch(new string(new char[]{Peek()})); }
+               }
+               public bool nextCharIsValidCharName
+               {
+                       get { return rxNameChar.IsMatch(new string(new char[]{Peek()})); }
+               }
+               #endregion
+
+               States curState = States.classNames;
+
+               public override void ParseCurrentLine ()
+               {
+                       //Debug.WriteLine (string.Format("parsing line:{0}", currentLine));
+                       CodeLine cl = buffer [currentLine];
+                       cl.Tokens = new List<Token> ();
+
+                       //retrieve current parser state from previous line
+                       if (currentLine > 0)
+                               curState = (States)buffer[currentLine - 1].EndingState;
+                       else
+                               curState = States.init;
+
+                       States previousEndingState = (States)cl.EndingState;
+
+                       while (! eol) {
+                               SkipWhiteSpaces ();
+
+                               if (eol)
+                                       break;
+
+                               if (Peek () == '\n') {
+                                       if (currentTok != TokenType.Unknown)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected end of line");
+                                       Read ();
+                                       eol = true;
+                                       continue;
+                               }
+
+                               switch (Peek()) {
+                               case '/':
+                                       readToCurrTok (true);
+                                       switch (Peek ()) {
+                                       case '/':
+                                               currentTok += ReadLine ();
+                                               saveAndResetCurrentTok (TokenType.LineComment);
+                                               break;
+                                       default:
+                                               currentTok += ReadLine ();
+                                               saveAndResetCurrentTok (TokenType.Unknown);
+                                               break;
+                                       }
+                                       break;
+                               case ',':
+                                       if (curState != States.init && curState != States.classNames )
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected char ','");
+                                       readAndResetCurrentTok (TokenType.OperatorOrPunctuation, true);
+                                       curState = States.classNames;
+                                       break;
+                               case '{':
+                                       if (!(curState == States.init || curState == States.classNames))
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected char '{'");
+                                       readAndResetCurrentTok (TokenType.OpenBlock, true);
+                                       curState = States.members;
+                                       break;
+                               case '}':
+                                       if (curState != States.members)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected char '}'");
+                                       readAndResetCurrentTok (TokenType.CloseBlock, true);
+                                       curState = States.classNames;
+                                       break;
+                               case '=':
+                                       if (curState == States.classNames)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected char '='");
+                                       setPreviousTokOfTypeTo (TokenType.Type, TokenType.Identifier);
+                                       readAndResetCurrentTok (TokenType.OperatorOrPunctuation, true);
+                                       curState = States.value;
+                                       break;
+                               case '"':
+                                       if (curState != States.value)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected char '\"'");                                 
+                                       readAndResetCurrentTok (TokenType.StringLitteralOpening, true);
+
+                                       while (!eol) {
+                                               currentTok += ReadLineUntil ("\"");
+                                               if (currentTok.Content [currentTok.Content.Length - 1] == '\\')
+                                                       readToCurrTok ();
+                                               else
+                                                       break;
+                                       }
+                                       if (eol)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected end of line");
+                                       saveAndResetCurrentTok (TokenType.StringLitteral);
+
+                                       readAndResetCurrentTok (TokenType.StringLitteralClosing, true);
+                                       curState = States.endOfStatement;
+                                       break;
+                               case ';':
+                                       if (curState != States.endOfStatement)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected end of statement");                                  
+                                       readAndResetCurrentTok (TokenType.StatementEnding, true);
+                                       curState = States.members;
+                                       break;
+                               default:
+                                       if (currentTok.Type != TokenType.Unknown)
+                                               throw new ParserException (currentLine, currentColumn, "error curtok not null");
+                                       if (curState == States.value)
+                                               throw new ParserException (currentLine, currentColumn, "expecting value enclosed in '\"'");
+                                       if (curState == States.endOfStatement)
+                                               throw new ParserException (currentLine, currentColumn, "expecting end of statement");                                   
+                                       
+                                       if (nextCharIsValidCharStartName) {                                             
+                                               readToCurrTok (true);
+                                               while (nextCharIsValidCharName)
+                                                       readToCurrTok ();
+                                       }
+                                       saveAndResetCurrentTok (TokenType.Type);
+                                       break;
+                               }
+                       }
+
+                       if (cl.EndingState != (int)curState && currentLine < buffer.LineCount - 1)
+                               buffer [currentLine + 1].Tokens = null;
+
+                       cl.EndingState = (int)curState;
+               }
+               public override void SyntaxAnalysis ()
+               {
+                       initSyntaxAnalysis ();
+                       Node currentNode = RootNode;
+
+                       for (int i = 0; i < buffer.LineCount; i++) {
+                               CodeLine cl = buffer[i];
+                               if (cl.Tokens == null)
+                                       continue;
+                               cl.SyntacticNode = null;
+
+                               int tokPtr = 0;
+                               while (tokPtr < cl.Tokens.Count) {
+                                       switch (cl.Tokens [tokPtr].Type) {
+                                       case TokenType.OpenBlock:                                               
+                                               currentNode = addChildNode (currentNode, cl, tokPtr, "style");
+                                               break;
+                                       case TokenType.CloseBlock:                                              
+                                               closeNodeAndGoUp (ref currentNode, cl, "style");
+                                               break;
+                                       }
+                                       tokPtr++;
+                               }
+                       }
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/Parsers/XMLParser.cs b/CrowIDE/src/Editors/Parsers/XMLParser.cs
new file mode 100644 (file)
index 0000000..8e95408
--- /dev/null
@@ -0,0 +1,307 @@
+using System;
+using Crow;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using System.Diagnostics;
+using System.Linq;
+
+namespace Crow.Coding
+{
+       public class XMLParser : BufferParser
+       {
+               public new enum TokenType {
+                       Unknown = BufferParser.TokenType.Unknown,
+                       WhiteSpace = BufferParser.TokenType.WhiteSpace,
+                       NewLine = BufferParser.TokenType.NewLine,
+                       LineComment = BufferParser.TokenType.LineComment,
+                       BlockCommentStart = BufferParser.TokenType.BlockCommentStart,
+                       BlockComment = BufferParser.TokenType.BlockComment,
+                       BlockCommentEnd = BufferParser.TokenType.BlockCommentEnd,
+                       ElementName = BufferParser.TokenType.Type,
+                       AttributeName = BufferParser.TokenType.Identifier,
+                       ElementClosing = BufferParser.TokenType.StatementEnding,
+                       Affectation = BufferParser.TokenType.OperatorOrPunctuation,
+                       AttributeValueOpening = BufferParser.TokenType.StringLitteralOpening,
+                       AttributeValueClosing = BufferParser.TokenType.StringLitteralClosing,
+                       AttributeValue = BufferParser.TokenType.StringLitteral,
+                       XMLDecl = BufferParser.TokenType.Preprocessor,
+                       Doctype = BufferParser.TokenType.Keyword,
+                       ElementStart = 50,
+                       ElementEnd = 51,
+               }
+
+               public enum States
+               {
+                       init,       //first statement of prolog, xmldecl should only apear in this state
+                       prolog,     //misc before doctypedecl
+                       InternalSubset,    //doctype declaration subset
+                       ExternalSubsetInit,
+                       ExternalSubset,
+                       BlockComment,
+                       DTDEnd,//doctype finished
+                       XML,//normal xml
+                       StartTag,//inside start tag
+                       Content,//after start tag with no closing slash
+                       EndTag
+               }
+
+               #region CTOR
+               public XMLParser (CodeBuffer _buffer) : base(_buffer) {}
+               #endregion
+
+               enum Keywords
+               {
+                       DOCTYPE,
+                       ELEMENT,
+                       ATTLIST,
+                       ENTITY,
+                       NOTATION
+               }
+
+               States curState = States.init;
+
+               #region Regular Expression for validity checks
+               //private static Regex rxValidChar = new Regex("[\u0020-\uD7FF]");
+               private static Regex rxValidChar = new Regex(@"\u0009|\u000A|\u000D|[\u0020-\uD7FF]|[\uE000-\uFFFD]");   //| [\u10000-\u10FFFF] unable to set those plans
+               private static Regex rxNameStartChar = new Regex(@":|[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]"); // | [\u10000-\uEFFFF]
+               private static Regex rxNameChar = new Regex(@":|[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|[\u203F-\u2040]");//[\u10000-\uEFFFF]|
+               private static Regex rxDecimal = new Regex(@"[0-9]+");
+               private static Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+");
+               private static Regex rxAttributeValue = new Regex(@"[^<]");
+               private static Regex rxEntityValue = new Regex(@"[^<]");
+               private static Regex rxPubidChar = new Regex(@"\u0020|\u000D|\u000A|[a-zA-Z0-9]|[-\(\)\+\,\./:=\?;!\*#@\$_%]");
+               #endregion
+
+               #region Character ValidityCheck
+               public bool nextCharIsValidCharStartName
+               {
+                       get { return rxNameStartChar.IsMatch(new string(new char[]{Peek()})); }
+               }
+               public bool nextCharIsValidCharName
+               {
+                       get { return rxNameChar.IsMatch(new string(new char[]{Peek()})); }
+               }
+               #endregion
+
+               public override void SetLineInError (ParserException ex)
+               {
+                       base.SetLineInError (ex);
+                       //buffer[ex.Line].Tokens.EndingState = (int)States.init;
+               }
+
+               public override void ParseCurrentLine ()
+               {
+                       //Debug.WriteLine (string.Format("parsing line:{0}", currentLine));
+                       CodeLine cl = buffer [currentLine];
+                       cl.Tokens = new List<Token> ();
+
+                       //retrieve current parser state from previous line
+                       if (currentLine > 0)
+                               curState = (States)buffer[currentLine - 1].EndingState;
+                       else
+                               curState = States.init;
+
+                       States previousEndingState = (States)cl.EndingState;
+
+
+                       while (! eol) {
+                               SkipWhiteSpaces ();
+
+                               if (eol)
+                                       break;
+
+                               if (Peek () == '\n') {
+                                       if (currentTok != TokenType.Unknown)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected end of line");
+                                       Read ();
+                                       eol = true;
+                                       continue;
+                               }
+
+                               if (curState == States.BlockComment) {
+                                       if (currentTok != TokenType.Unknown)
+                                               Debugger.Break ();
+
+                                       currentTok.Start = CurrentPosition;
+                                       currentTok.Type = (BufferParser.TokenType)TokenType.BlockComment;
+                                       currentTok += ReadLineUntil ("-->");
+                                       if (Peek (3) == "-->") {
+                                               readToCurrTok (3);
+                                               curState = States.XML;
+                                       }
+                                       saveAndResetCurrentTok ();
+                                       continue;
+                               }
+
+                               switch (Peek()) {
+                               case '<':
+                                       readToCurrTok (true);
+                                       switch (Peek()) {
+                                       case '?':
+                                               if (curState != States.init)
+                                                       throw new ParserException (currentLine, currentColumn, "xml decl may appear only on first line");
+                                               readToCurrTok ();
+                                               currentTok += ReadLineUntil ("?>");
+                                               if (Peek (2) != "?>")
+                                                       throw new ParserException (currentLine, currentColumn, "expecting '?>'");
+                                               readToCurrTok (2);
+                                               saveAndResetCurrentTok (TokenType.XMLDecl);
+                                               curState = States.prolog;
+                                               break;
+                                       case '!':
+                                               readToCurrTok ();
+                                               switch (Peek()) {
+                                               case '-':
+                                                       readToCurrTok ();
+                                                       if (Peek () != '-')
+                                                               throw new ParserException (currentLine, currentColumn, "Expecting comment start tag");
+                                                       readToCurrTok ();
+                                                       currentTok += ReadLineUntil ("--");
+                                                       if (Peek (3) == "-->") {
+                                                               readToCurrTok (3);
+                                                       }else
+                                                               curState = States.BlockComment;
+                                                       saveAndResetCurrentTok (TokenType.BlockComment);
+                                                       break;
+                                               case 'D':
+                                               case 'd':
+                                                       string tmp = Read (7);
+                                                       currentTok += tmp;
+                                                       if (!string.Equals (tmp, "DOCTYPE", StringComparison.OrdinalIgnoreCase))
+                                                               throw new ParserException (currentLine, currentColumn, "Expecting 'doctype'");
+                                                       saveAndResetCurrentTok (TokenType.Doctype);
+                                                       break;
+                                               default:                                                        
+                                                       throw new ParserException (currentLine, currentColumn, "error");
+                                               }
+                                               break;
+                                       default:
+                                               if (!(curState == States.Content || curState == States.XML || curState == States.init || curState == States.prolog))
+                                                       throw new ParserException (currentLine, currentColumn, "Unexpected char: '<'");
+                                               if (Peek () == '/') {
+                                                       curState = States.EndTag;
+                                                       readToCurrTok ();
+                                                       saveAndResetCurrentTok (TokenType.ElementEnd);
+                                               } else {
+                                                       curState = States.StartTag;
+                                                       saveAndResetCurrentTok (TokenType.ElementStart);
+                                               }
+
+                                               if (!nextCharIsValidCharStartName)
+                                                       throw new ParserException (currentLine, currentColumn, "Expected element name");
+
+                                               readToCurrTok (true);
+                                               while (nextCharIsValidCharName)
+                                                       readToCurrTok ();
+
+                                               saveAndResetCurrentTok (TokenType.ElementName);
+                                               break;
+                                       }
+                                       break;
+                               case '/':
+                                       if (curState != States.StartTag)
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected char: '/'");
+                                       readToCurrTok (true);
+                                       if (Peek () != '>')
+                                               throw new ParserException (currentLine, currentColumn, "Expecting '>'");
+                                       readAndResetCurrentTok (TokenType.ElementEnd);
+
+                                       curState = States.XML;
+                                       break;
+                               case '>':
+                                       readAndResetCurrentTok (TokenType.ElementClosing, true);
+                                       switch (curState) {
+                                       case States.EndTag:
+                                               curState = States.XML;
+                                               break;
+                                       case States.StartTag:
+                                               curState = States.Content;
+                                               break;
+                                       default:
+                                               throw new ParserException (currentLine, currentColumn, "Unexpected char: '>'");
+                                       }
+                                       break;
+                               default:
+                                       switch (curState) {
+                                       case States.StartTag:
+                                               if (!nextCharIsValidCharStartName)
+                                                       throw new ParserException (currentLine, currentColumn, "Expected attribute name");
+                                               readToCurrTok (true);
+                                               while (nextCharIsValidCharName)
+                                                       readToCurrTok ();
+                                               saveAndResetCurrentTok (TokenType.AttributeName);
+
+                                               SkipWhiteSpaces ();
+
+                                               if (Peek () != '=')
+                                                       throw new ParserException (currentLine, currentColumn, "Expecting: '='");
+                                               readAndResetCurrentTok (TokenType.Affectation, true);
+
+                                               SkipWhiteSpaces ();
+
+                                               char openAttVal = Peek ();
+                                               if (openAttVal != '"' && openAttVal != '\'')
+                                                       throw new ParserException (currentLine, currentColumn, "Expecting attribute value enclosed either in '\"' or in \"'\"");
+                                               readAndResetCurrentTok (TokenType.AttributeValueOpening, true);
+
+                                               currentTok.Start = CurrentPosition;
+                                               currentTok.Content = ReadLineUntil (new string (new char[]{ openAttVal }));
+                                               saveAndResetCurrentTok (TokenType.AttributeValue);
+
+                                               if (Peek () != openAttVal)
+                                                       throw new ParserException (currentLine, currentColumn, string.Format ("Expecting {0}", openAttVal));
+                                               readAndResetCurrentTok (TokenType.AttributeValueClosing, true);
+                                               break;
+                                       default:
+                                               throw new ParserException (currentLine, currentColumn, "unexpected char: " + Peek ());
+                                       }
+                                       break;
+                               }
+                       }
+
+                       if (cl.EndingState != (int)curState && currentLine < buffer.LineCount - 1)
+                               buffer [currentLine + 1].Tokens = null;
+
+                       cl.EndingState = (int)curState;
+               }
+
+               public override void SyntaxAnalysis ()
+               {
+                       initSyntaxAnalysis ();
+                       Node currentNode = RootNode;
+
+                       for (int i = 0; i < buffer.LineCount; i++) {
+                               CodeLine cl = buffer[i];
+                               if (cl.Tokens == null)
+                                       continue;
+                               cl.SyntacticNode = null;
+
+                               int tokPtr = 0;
+                               while (tokPtr < cl.Tokens.Count) {
+                                       switch ((XMLParser.TokenType)cl.Tokens [tokPtr].Type) {
+                                       case TokenType.ElementStart:
+                                               tokPtr++;
+                                               currentNode = addChildNode (currentNode, cl, tokPtr, "Element");
+                                               break;
+                                       case TokenType.ElementEnd:
+                                               tokPtr++;
+                                               if (tokPtr < cl.Tokens.Count) {
+                                                       if ((XMLParser.TokenType)cl.Tokens [tokPtr].Type == TokenType.ElementName &&
+                                                           cl.Tokens [tokPtr].Content != currentNode.Name)
+                                                               throw new ParserException (currentLine, currentColumn, "Closing tag mismatch");
+                                               }
+                                               closeNodeAndGoUp (ref currentNode, cl, "Element");
+                                               break;
+                                       case TokenType.ElementClosing:
+                                               //currentNode = currentNode.Parent;
+                                               break;
+                                       default:
+                                               break;
+                                       }
+                                       tokPtr++;
+                               }
+                       }
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Editors/Parsers2/Tokenizer.cs b/CrowIDE/src/Editors/Parsers2/Tokenizer.cs
new file mode 100644 (file)
index 0000000..bcda1ec
--- /dev/null
@@ -0,0 +1,67 @@
+//
+// Tokenizer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow.Text;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+
+namespace Crow.Coding2
+{
+       public static class TokenType {
+               public const int Undefine = 0;
+               public const int WhiteSpace = 0;
+       }
+       public class Token {
+               public int ptr;
+               public int length;
+       }
+
+       public class Tokenizer
+       {
+               #region Regular Expression for validity checks
+               public Regex rxValidChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               public Regex rxNameStartChar = new Regex(@"_|\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}");
+               public Regex rxNameChar = new Regex(@"\p{Lu}|\p{Ll}|\p{Lt}|\p{Lm}|\p{Lo}|\p{Nl}|\p{Mn}|\p{Mc}|\p{Nd}|\p{Pc}|\p{Cf}");
+               public Regex rxNewLineChar = new Regex(@"\u000D|\u000A|\u0085|\u2028|\u2029");
+               public Regex rxWhiteSpaceChar = new Regex(@"\p{Zs}|\u0009|\u000B|\u000C");
+               public Regex rxDecimal = new Regex(@"[0-9]+");
+               public Regex rxHexadecimal = new Regex(@"[0-9a-fA-F]+");
+               #endregion
+
+               public List<Token> Tokens;
+
+               public Tokenizer (TextBuffer buffer)
+               {
+               }
+
+
+               public void Tokenize () {
+                       
+               }
+
+       }
+}
+
diff --git a/CrowIDE/src/Editors/SourceEditor.cs b/CrowIDE/src/Editors/SourceEditor.cs
new file mode 100644 (file)
index 0000000..a85e240
--- /dev/null
@@ -0,0 +1,1220 @@
+//
+// ScrollingTextBox.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Collections;
+using Crow.Cairo;
+using System.Text;
+using System.Collections.Generic;
+using System.Text.RegularExpressions;
+using System.Linq;
+using System.Diagnostics;
+using System.IO;
+using System.Threading;
+
+namespace Crow.Coding
+{
+       /// <summary>
+       /// Scrolling text box optimized for monospace fonts, for coding
+       /// </summary>
+       public class SourceEditor : Editor
+       {               
+               #region CTOR
+               public SourceEditor (): base()
+               {
+                       formatting.Add ((int)XMLParser.TokenType.AttributeName, new TextFormatting (Color.DarkSlateGrey, Color.Transparent));
+                       formatting.Add ((int)XMLParser.TokenType.ElementName, new TextFormatting (Color.DarkBlue, Color.Transparent));
+                       formatting.Add ((int)XMLParser.TokenType.ElementStart, new TextFormatting (Color.Black, Color.Transparent));
+                       formatting.Add ((int)XMLParser.TokenType.ElementEnd, new TextFormatting (Color.Black, Color.Transparent));
+                       formatting.Add ((int)XMLParser.TokenType.ElementClosing, new TextFormatting (Color.Black, Color.Transparent));
+
+                       formatting.Add ((int)XMLParser.TokenType.AttributeValueOpening, new TextFormatting (Color.Crimson, Color.Transparent));
+                       formatting.Add ((int)XMLParser.TokenType.AttributeValueClosing, new TextFormatting (Color.Crimson, Color.Transparent));
+                       formatting.Add ((int)XMLParser.TokenType.AttributeValue, new TextFormatting (Color.FireBrick, Color.Transparent, false, true));
+                       formatting.Add ((int)XMLParser.TokenType.XMLDecl, new TextFormatting (Color.ForestGreen, Color.Transparent));
+
+                       formatting.Add ((int)BufferParser.TokenType.BlockComment, new TextFormatting (Color.Grey, Color.Transparent, false, true));
+                       formatting.Add ((int)BufferParser.TokenType.LineComment, new TextFormatting (Color.Grey, Color.Transparent, false, true));
+                       formatting.Add ((int)BufferParser.TokenType.OperatorOrPunctuation, new TextFormatting (Color.Black, Color.Transparent));
+                       formatting.Add ((int)BufferParser.TokenType.Keyword, new TextFormatting (Color.Teal, Color.Transparent));
+                       //formatting.Add ((int)BufferParser.TokenType.Keyword, new TextFormatting (Color.DarkCyan, Color.Transparent));
+
+                       parsing.Add (".crow", "Crow.Coding.XMLParser");
+                       parsing.Add (".svg", "Crow.Coding.XMLParser");
+                       parsing.Add (".template", "Crow.Coding.XMLParser");
+                       parsing.Add (".cs", "Crow.Coding.CSharpParser");
+                       parsing.Add (".style", "Crow.Coding.StyleParser");
+
+                       buffer = new CodeBuffer ();
+                       buffer.LineUpadateEvent += Buffer_LineUpadateEvent;
+                       buffer.LineAdditionEvent += Buffer_LineAdditionEvent;;
+                       buffer.LineRemoveEvent += Buffer_LineRemoveEvent;
+                       buffer.BufferCleared += Buffer_BufferCleared;
+                       buffer.SelectionChanged += Buffer_SelectionChanged;
+                       buffer.PositionChanged += Buffer_PositionChanged;
+                       buffer.FoldingEvent += Buffer_FoldingEvent;
+                       buffer.Add (new CodeLine(""));
+               }
+               #endregion
+
+               string oldSource = "";
+               //save requested position on error, and try it on next move
+               int requestedLine = 0, requestedCol = 0;
+               volatile bool isDirty = false;
+
+               const int leftMarginGap = 10;//gap between items in margin and text
+               const int foldSize = 9;//folding rectangles size
+               const int foldHSpace = 4;//folding level tabulation x
+               int foldMargin { get { return parser == null ? 0 : parser.SyntacticTreeMaxDepth * foldHSpace; }}//folding margin size
+
+               #region private and protected fields
+               bool foldingEnabled = true;
+               int leftMargin = 0;     //margin used to display line numbers, folding errors,etc...
+               int visibleLines = 1;
+               int visibleColumns = 1;
+               int firstPrintedLine = -1;
+               int printedCurrentLine = 0;//Index of the currentline in the PrintedLines array
+
+               CodeBuffer buffer;
+               BufferParser parser;
+               List<CodeLine> PrintedLines;//list of lines visible in the Editor depending on scrolling and folding
+
+               Dictionary<int, TextFormatting> formatting = new Dictionary<int, TextFormatting>();
+               Dictionary<string, string> parsing = new Dictionary<string, string>();
+
+               Color selBackground;
+               Color selForeground;
+               int selStartCol;
+               int selEndCol;
+
+               protected Rectangle rText;
+               protected FontExtents fe;
+               protected TextExtents te;
+
+               Point mouseLocalPos;
+               bool doubleClicked = false;
+               #endregion
+
+               void measureLeftMargin () {
+                       leftMargin = 0;
+                       if (PrintLineNumbers)
+                               leftMargin += (int)Math.Ceiling((double)buffer.LineCount.ToString().Length * fe.MaxXAdvance) +6;
+                       if (foldingEnabled)
+                               leftMargin += foldMargin;
+                       if (leftMargin > 0)
+                               leftMargin += leftMarginGap;                    
+                       updateVisibleColumns ();
+               }
+               void findLongestLineAndUpdateMaxScrollX() {
+                       buffer.FindLongestVisualLine ();
+                       updateMaxScrollX ();
+//                     Debug.WriteLine ("SourceEditor: Find Longest line and update maxscrollx: {0} visible cols:{1}", MaxScrollX, visibleColumns);
+               }
+               /// <summary>
+               /// Updates visible line in widget, adapt max scroll y and updatePrintedLines
+               /// </summary>
+               void updateVisibleLines(){
+                       visibleLines = (int)Math.Floor ((double)ClientRectangle.Height / (fe.Ascent+fe.Descent));
+                       NotifyValueChanged ("VisibleLines", visibleLines);
+                       updateMaxScrollY ();
+                       updatePrintedLines ();
+                       RegisterForGraphicUpdate ();
+//                     System.Diagnostics.Debug.WriteLine ("update visible lines: " + visibleLines);
+//                     System.Diagnostics.Debug.WriteLine ("update MaxScrollY: " + MaxScrollY);
+               }
+               void updateVisibleColumns(){
+                       visibleColumns = (int)Math.Floor ((double)(ClientRectangle.Width - leftMargin)/ fe.MaxXAdvance);
+                       NotifyValueChanged ("VisibleColumns", visibleColumns);
+                       updateMaxScrollX ();
+//                     System.Diagnostics.Debug.WriteLine ("update visible columns: {0} leftMargin:{1}",visibleColumns, leftMargin);
+//                     System.Diagnostics.Debug.WriteLine ("update MaxScrollX: " + MaxScrollX);
+               }
+               void updateMaxScrollX () {
+                       MaxScrollX = Math.Max (0, buffer.longestLineCharCount - visibleColumns);
+                       if (buffer.longestLineCharCount > 0)
+                               NotifyValueChanged ("ChildWidthRatio", Slot.Width * visibleColumns / buffer.longestLineCharCount);                      
+               }
+               void updateMaxScrollY () {
+                       if (parser == null || !foldingEnabled) {
+                               MaxScrollY = Math.Max (0, buffer.LineCount - visibleLines);
+                               if (buffer.UnfoldedLines > 0)
+                                       NotifyValueChanged ("ChildHeightRatio", Slot.Height * visibleLines / buffer.UnfoldedLines);                                                     
+                       } else {
+                               MaxScrollY = Math.Max (0, buffer.UnfoldedLines - visibleLines);
+                               if (buffer.UnfoldedLines > 0)
+                                       NotifyValueChanged ("ChildHeightRatio", Slot.Height * visibleLines / buffer.UnfoldedLines);                                                     
+                       }
+               }                       
+               void updatePrintedLines () {
+                       buffer.editMutex.EnterReadLock ();
+                       editorMutex.EnterWriteLock ();
+
+                       PrintedLines = new List<CodeLine> ();
+                       int curL = 0;
+                       int i = 0;
+
+                       while (curL < buffer.LineCount && i < ScrollY) {
+                               if (buffer [curL].IsFolded)
+                                       curL = buffer.GetEndNodeIndex (curL);
+                               curL++;
+                               i++;
+                       }
+
+                       firstPrintedLine = curL;
+                       i = 0;
+                       while (i < visibleLines && curL < buffer.LineCount) {
+                               PrintedLines.Add (buffer [curL]);
+
+                               if (buffer [curL].IsFolded)
+                                       curL = buffer.GetEndNodeIndex (curL);
+
+                               curL++;
+                               i++;
+                       }
+
+                       buffer.editMutex.ExitReadLock ();
+                       editorMutex.ExitWriteLock ();
+               }
+               void updateOnScreenCurLineFromBuffCurLine(){
+                       printedCurrentLine = PrintedLines.IndexOf (buffer.CurrentCodeLine);
+               }
+               void toogleFolding (int line) {
+                       if (parser == null || !foldingEnabled)
+                               return;
+                       buffer.ToogleFolding (line);
+               }
+
+               #region Editor overrides
+               protected override void updateEditorFromProjFile ()
+               {
+                       Debug.WriteLine("\t\tSourceEditor updateEditorFromProjFile");
+
+                       //buffer.editMutex.EnterWriteLock ();
+                       loadSource ();
+                       //buffer.editMutex.ExitWriteLock ();
+
+                       isDirty = false;
+                       oldSource = projFile.Source;
+                       CurrentLine = requestedLine;
+                       CurrentColumn = requestedCol;
+                       projFile.RegisteredEditors [this] = true;
+               }
+               protected override void updateProjFileFromEditor ()
+               {
+                       Debug.WriteLine("\t\tSourceEditor updateProjFileFromEditor");
+
+                       buffer.editMutex.EnterWriteLock ();
+                       string newsrc = buffer.FullText;
+                       buffer.editMutex.ExitWriteLock ();
+                       projFile.UpdateSource (this, newsrc);
+               }
+               protected override bool EditorIsDirty {
+                       get { return isDirty; }
+                       set { isDirty = value; }
+               }
+               protected override bool IsReady {
+                       get { return projFile != null && buffer != null; }
+               }
+               #endregion
+
+               #region Buffer events handlers
+               void Buffer_BufferCleared (object sender, EventArgs e)
+               {
+                       editorMutex.EnterWriteLock ();
+
+                       buffer.longestLineCharCount = 0;
+                       buffer.longestLineIdx = 0;
+                       measureLeftMargin ();
+                       MaxScrollX = MaxScrollY = 0;
+                       PrintedLines = null;
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+                       isDirty = true;
+
+                       editorMutex.ExitWriteLock ();
+               }
+               void Buffer_LineAdditionEvent (object sender, CodeBufferEventArgs e)
+               {
+                       for (int i = 0; i < e.LineCount; i++) {
+                               int lptr = e.LineStart + i;
+                               int charCount = buffer[lptr].PrintableLength;
+                               if (charCount > buffer.longestLineCharCount) {
+                                       buffer.longestLineIdx = lptr;
+                                       buffer.longestLineCharCount = charCount;
+                               }else if (lptr <= buffer.longestLineIdx)
+                                       buffer.longestLineIdx++;
+                               if (parser == null)
+                                       continue;
+                               parser.TryParseBufferLine (e.LineStart + i);
+                       }
+
+                       if (parser != null)
+                               parser.reparseSource ();
+
+                       measureLeftMargin ();
+
+                       updatePrintedLines ();
+                       updateMaxScrollY ();
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+                       isDirty = true;
+               }
+               void Buffer_LineRemoveEvent (object sender, CodeBufferEventArgs e)
+               {
+                       bool trigFindLongestLine = false;
+                       for (int i = 0; i < e.LineCount; i++) {
+                               int lptr = e.LineStart + i;
+                               if (lptr <= buffer.longestLineIdx)
+                                       trigFindLongestLine = true;
+                       }
+                       if (trigFindLongestLine)
+                               findLongestLineAndUpdateMaxScrollX ();
+
+                       measureLeftMargin ();
+                       updatePrintedLines ();
+                       updateMaxScrollY ();
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+                       isDirty = true;
+               }
+               void Buffer_LineUpadateEvent (object sender, CodeBufferEventArgs e)
+               {
+                       bool trigFindLongestLine = false;
+                       for (int i = 0; i < e.LineCount; i++) {
+
+                               int lptr = e.LineStart + i;
+                               if (lptr == buffer.longestLineIdx)
+                                       trigFindLongestLine = true;
+                               else if (buffer[lptr].PrintableLength > buffer.longestLineCharCount) {
+                                       buffer.longestLineCharCount = buffer[lptr].PrintableLength;
+                                       buffer.longestLineIdx = lptr;
+                               }
+                       }
+                       if (trigFindLongestLine)
+                               findLongestLineAndUpdateMaxScrollX ();
+                       
+                       RegisterForGraphicUpdate ();
+                       notifyPositionChanged ();
+                       isDirty = true;
+               }
+               void Buffer_PositionChanged (object sender, EventArgs e)
+               {
+                       //Console.WriteLine ("Position changes: ({0},{1})", buffer.CurrentLine, buffer.CurrentColumn);
+                       int cc = buffer.CurrentTabulatedColumn;
+
+                       if (cc > visibleColumns + ScrollX) {
+                               ScrollX = cc - visibleColumns;
+                       } else if (cc < ScrollX)
+                               ScrollX = cc;
+                       
+                       RegisterForGraphicUpdate ();
+                       updateOnScreenCurLineFromBuffCurLine ();
+                       notifyPositionChanged ();
+               }
+
+               void Buffer_SelectionChanged (object sender, EventArgs e)
+               {
+                       RegisterForGraphicUpdate ();
+               }
+               void Buffer_FoldingEvent (object sender, CodeBufferEventArgs e)
+               {
+                       updatePrintedLines ();
+                       updateOnScreenCurLineFromBuffCurLine ();
+                       updateMaxScrollY ();
+                       RegisterForGraphicUpdate ();
+               }
+               #endregion
+
+               void notifyPositionChanged (){
+                       try {                           
+                               NotifyValueChanged ("CurrentLine", buffer.CurrentLine+1);
+                               NotifyValueChanged ("CurrentColumn", buffer.CurrentColumn+1);
+                               NotifyValueChanged ("CurrentLineHasError", CurrentLineHasError);
+                               NotifyValueChanged ("CurrentLineError", CurrentLineError);
+                       } catch (Exception ex) {
+                               Console.WriteLine (ex.ToString ());
+                       }
+               }
+                       
+               #region Public Crow Properties
+               public int CurrentLine{
+                       get { return buffer == null ? 0 : buffer.CurrentLine+1; }
+                       set {
+                               try {
+                                       int l = value - 1;
+                                       if (l == buffer.CurrentLine)
+                                               return;
+                                       buffer.CurrentLine = l;
+                                       l = buffer.CurrentLine; //reaffect from buffer where bound check is made
+                                       if ((bool)buffer [l]?.IsFolded)
+                                               buffer.ToogleFolding (l);                                       
+                               } catch (Exception ex) {
+                                       requestedLine = value - 1;
+                                       Console.WriteLine ("Error cur column: " + ex);
+                               }
+                       }
+               }
+               public int CurrentColumn{
+                       get { return buffer == null ? 0 : buffer.CurrentColumn+1; }
+                       set {
+                               try {                                   
+                                       if (value - 1 == buffer.CurrentColumn)
+                                               return;
+                                       buffer.CurrentColumn = value - 1;
+                               } catch (Exception ex) {
+                                       requestedCol = value - 1;
+                                       Console.WriteLine ("Error cur column: " + ex.ToString ());
+                               }
+                       }
+               }
+               public bool PrintLineNumbers
+               {
+                       get { return Configuration.Global.Get<bool> ("PrintLineNumbers"); }
+                       set     {
+                               if (PrintLineNumbers == value)
+                                       return;
+                               Configuration.Global.Set ("PrintLineNumbers", value);
+                               NotifyValueChanged ("PrintLineNumbers", PrintLineNumbers);
+                               measureLeftMargin ();
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               [DefaultValue("SteelBlue")]
+               public virtual Color SelectionBackground {
+                       get { return selBackground; }
+                       set {
+                               if (value == selBackground)
+                                       return;
+                               selBackground = value;
+                               NotifyValueChanged ("SelectionBackground", selBackground);
+                               RegisterForRedraw ();
+                       }
+               }
+               [DefaultValue("White")]
+               public virtual Color SelectionForeground {
+                       get { return selForeground; }
+                       set {
+                               if (value == selForeground)
+                                       return;
+                               selForeground = value;
+                               NotifyValueChanged ("SelectionForeground", selForeground);
+                               RegisterForRedraw ();
+                       }
+               }
+               public override int ScrollY {
+                       get {
+                               return base.ScrollY;
+                       }
+                       set {
+                               if (value == base.ScrollY)
+                                       return;
+                               base.ScrollY = value;
+                               updatePrintedLines ();
+                               updateOnScreenCurLineFromBuffCurLine ();
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               public ParserException CurrentLineError {
+                       get { return buffer?.CurrentCodeLine?.exception; }
+               }
+               public bool CurrentLineHasError {
+                       get { return buffer == null ? false : buffer.CurrentCodeLine == null ? false :
+                               buffer.CurrentCodeLine.exception != null; }
+               }
+               public override ProjectFile ProjectNode {
+                       get {
+                               return base.ProjectNode;
+                       }
+                       set {
+                               base.ProjectNode = value;
+                               if (projFile != null)
+                                       parser = getParserFromExt (System.IO.Path.GetExtension (projFile.Extension));
+                       }
+               }
+               #endregion
+
+               BufferParser getParserFromExt (string extension) {
+                       if (string.IsNullOrEmpty(extension))
+                               return null;
+                       if (!parsing.ContainsKey(extension))
+                               return null;
+                       Type parserType = Type.GetType (parsing [extension]);
+                       if (parserType == null)
+                               return null;
+                       return (BufferParser)Activator.CreateInstance (parserType, buffer );
+               }
+               void loadSource () {
+
+                       try {
+
+                               if (parser == null)
+                                       buffer.Load (projFile.Source);
+                               else//parser may have special linebrk rules
+                                       buffer.Load (projFile.Source, parser.LineBrkRegex);
+
+                       } catch (Exception ex) {
+                               Debug.WriteLine (ex.ToString ());
+                       }
+
+                       projFile.RegisteredEditors [this] = true;
+
+                       updateMaxScrollY ();
+                       MaxScrollX = Math.Max (0, buffer.longestLineCharCount - visibleColumns);
+                       updatePrintedLines ();
+
+                       RegisterForGraphicUpdate ();
+               }
+
+               /// <summary>
+               /// Current editor line, when set, update buffer.CurrentLine
+               /// </summary>
+               int PrintedCurrentLine {
+                       get { return printedCurrentLine;}
+                       set {
+                               if (value < 0) {
+                                       ScrollY += value;
+                                       printedCurrentLine = 0;
+                               } else if (PrintedLines.Count < visibleLines && value >= PrintedLines.Count) {
+                                       printedCurrentLine = PrintedLines.Count - 1;
+                               }else if (value >= visibleLines) {
+                                       ScrollY += value - visibleLines + 1;
+                                       printedCurrentLine = visibleLines - 1;
+                               }else
+                                       printedCurrentLine = value;
+                               //Debug.WriteLine ("printed current line:" + printedCurrentLine.ToString ());
+                               //update position in buffer
+                               buffer.CurrentLine = buffer.IndexOf (PrintedLines[printedCurrentLine]);
+                       }
+               }
+               int getTabulatedColumn (int col, int line) {
+                       return buffer [line].Content.Substring (0, col).Replace ("\t", new String (' ', Interface.TabSize)).Length;
+               }
+               int getTabulatedColumn (Point pos) {
+                       return getTabulatedColumn (pos.X,pos.Y);
+               }
+               /// <summary>
+               /// Moves cursor one char to the left, move up if cursor reaches start of line
+               /// </summary>
+               /// <returns><c>true</c> if move succeed</returns>
+               public bool MoveLeft(){
+                       if (buffer.CurrentColumn == 0) {
+                               if (printedCurrentLine == 0)
+                                       return false;
+                               PrintedCurrentLine--;
+                               buffer.CurrentColumn = int.MaxValue;
+                       } else
+                               buffer.CurrentColumn--;
+                       return true;
+               }
+               /// <summary>
+               /// Moves cursor one char to the right, move down if cursor reaches end of line
+               /// </summary>
+               /// <returns><c>true</c> if move succeed</returns>
+               public bool MoveRight(){
+                       if (buffer.CurrentColumn >= buffer.CurrentCodeLine.Length) {
+                               if (PrintedCurrentLine == buffer.UnfoldedLines - 1)
+                                       return false;
+                               buffer.CurrentColumn = 0;
+                               PrintedCurrentLine++;
+                       } else
+                               buffer.CurrentColumn++;
+                       return true;
+               }
+
+               #region Drawing
+               void drawLine(Context gr, Rectangle cb, int i) {
+                       CodeLine cl = PrintedLines[i];
+                       int lineIndex = buffer.IndexOf(cl);
+
+                       double y = cb.Y + (fe.Ascent+fe.Descent) * i, x = cb.X;
+
+                       //Draw line numbering
+                       Color mgFg = Color.Grey;
+                       Color mgBg = Color.White;
+                       if (PrintLineNumbers){
+                               Rectangle mgR = new Rectangle ((int)x, (int)y, leftMargin - leftMarginGap, (int)Math.Ceiling((fe.Ascent+fe.Descent)));
+                               if (cl.exception != null) {
+                                       mgBg = Color.Red;
+                                       if (buffer.CurrentLine == lineIndex)
+                                               mgFg = Color.White;
+                                       else
+                                               mgFg = Color.LightGrey;
+                               }else if (buffer.CurrentLine == lineIndex && HasFocus) {
+                                       mgFg = Color.Black;
+                                       mgBg = Color.DarkGrey;
+                               }
+                               string strLN = (lineIndex+1).ToString ();
+                               gr.SetSourceColor (mgBg);
+                               gr.Rectangle (mgR);
+                               gr.Fill();
+                               gr.SetSourceColor (mgFg);
+
+                               gr.MoveTo (cb.X + (int)(gr.TextExtents (buffer.LineCount.ToString()).Width - gr.TextExtents (strLN).Width), y + fe.Ascent);
+                               gr.ShowText (strLN);
+                               gr.Fill ();
+                       }
+
+
+
+                       //draw folding
+                       if (foldingEnabled){
+
+                               Rectangle rFld = new Rectangle (cb.X + leftMargin - leftMarginGap - foldMargin,
+                                       (int)(y + (fe.Ascent + fe.Descent) / 2.0 - foldSize / 2.0), foldSize, foldSize);
+
+                               gr.SetSourceColor (Color.Black);
+                               gr.LineWidth = 1.0;
+
+                               int level = 0;
+                               bool closingNode = false;
+
+                               if (currentNode != null) {
+                                       if (cl == currentNode.EndLine) {
+                                               currentNode = currentNode.Parent;
+                                               closingNode = true;
+                                       }
+                                       if (currentNode != null)
+                                               level = currentNode.Level - 1;
+                               }
+
+                               for (int l = 0; l < level; l++) {                                       
+                                       gr.MoveTo (rFld.Center.X + 0.5, y);
+                                       gr.LineTo (rFld.Center.X + 0.5, y + fe.Ascent + fe.Descent);
+                                       rFld.Left += foldHSpace;
+                               }
+                               if (closingNode) {
+                                       gr.MoveTo (rFld.Center.X + 0.5, y);
+                                       gr.LineTo (rFld.Center.X + 0.5, y + fe.Ascent / 2 + 0.5);
+                                       gr.LineTo (rFld.Center.X + 0.5 + foldSize / 2, y + fe.Ascent / 2 + 0.5);
+                                       closingNode = false;
+                               }
+                               gr.SetDash (new double[]{ 1.5 },0.0);
+                               gr.SetSourceColor (Color.Grey);
+                               gr.Stroke ();
+                               gr.SetDash (new double[]{}, 0.0);
+
+                               if (cl.IsFoldable) {
+                                       gr.Rectangle (rFld);
+                                       gr.SetSourceColor (Color.White);
+                                       gr.Fill();
+                                       gr.SetSourceColor (Color.Black);
+                                       gr.Rectangle (rFld, 1.0);
+                                       if (cl.IsFolded) {
+                                               gr.MoveTo (rFld.Center.X + 0.5, rFld.Y + 2);
+                                               gr.LineTo (rFld.Center.X + 0.5, rFld.Bottom - 2);
+                                       }else
+                                               currentNode = cl.SyntacticNode;
+                                       
+                                       gr.MoveTo (rFld.Left + 2, rFld.Center.Y + 0.5);
+                                       gr.LineTo (rFld.Right - 2, rFld.Center.Y + 0.5);
+                                       gr.Stroke ();
+                               } 
+                       }
+
+                       gr.SetSourceColor (Foreground);
+                       x += leftMargin;
+
+                       if (cl.Tokens == null)
+                               drawRawCodeLine (gr, x, y, i, lineIndex);
+                       else
+                               drawParsedCodeLine (gr, x, y, i, lineIndex);
+               }
+               Node currentNode = null;
+//             void drawParsed(Context gr){
+//                     if (PrintedLines == null)
+//                             return;
+//
+//                     gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+//                     gr.SetFontSize (Font.Size);
+//                     gr.FontOptions = Interface.FontRenderingOptions;
+//                     gr.Antialias = Interface.Antialias;
+//
+//                     Rectangle cb = ClientRectangle;
+//                     gr.Save ();
+//                     CairoHelpers.CairoRectangle (gr, cb, CornerRadius);
+//                     gr.Clip ();
+//
+//                     bool selectionInProgress = false;
+//
+//                     Foreground.SetAsSource (gr);
+//
+//                     #region draw text cursor
+//                     if (SelBegin != SelRelease)
+//                             selectionInProgress = true;
+//                     else if (HasFocus){
+//                             gr.LineWidth = 1.0;
+//                             double cursorX = + leftMargin + cb.X + (CurrentColumn - ScrollX) * fe.MaxXAdvance;
+//                             gr.MoveTo (0.5 + cursorX, cb.Y + printedCurrentLine * (fe.Ascent+fe.Descent));
+//                             gr.LineTo (0.5 + cursorX, cb.Y + (printedCurrentLine + 1) * (fe.Ascent+fe.Descent));
+//                             gr.Stroke();
+//                     }
+//                     #endregion
+//
+//                     for (int i = 0; i < PrintedLines.Count; i++)
+//                             drawTokenLine (gr, i, selectionInProgress, cb);
+//
+//                     gr.Restore ();
+//             }
+               void drawRawCodeLine(Context gr, double x, double y, int i, int lineIndex) {
+                       string lstr = buffer[lineIndex].PrintableContent;
+                       if (ScrollX < lstr.Length)
+                               lstr = lstr.Substring (ScrollX);
+                       else
+                               lstr = "";
+
+                       gr.MoveTo (x, y + fe.Ascent);
+                       gr.ShowText (lstr);
+                       gr.Fill ();
+
+                       if (!buffer.SelectionIsEmpty && lineIndex >= buffer.SelectionStart.Y && lineIndex <= buffer.SelectionEnd.Y) {
+                               double rLineX = x,
+                               rLineY = y,
+                               rLineW = lstr.Length * fe.MaxXAdvance;
+
+                               //System.Diagnostics.Debug.WriteLine ("sel start: " + buffer.SelectionStart + " sel end: " + buffer.SelectionEnd);
+                               if (lineIndex == buffer.SelectionStart.Y) {
+                                       rLineX += (selStartCol - ScrollX) * fe.MaxXAdvance;
+                                       rLineW -= selStartCol * fe.MaxXAdvance;
+                               }
+                               if (lineIndex == buffer.SelectionEnd.Y)
+                                       rLineW -= (lstr.Length - selEndCol) * fe.MaxXAdvance;
+
+                               gr.Save ();
+                               gr.Operator = Operator.Source;
+                               gr.Rectangle (rLineX, rLineY, rLineW, (fe.Ascent+fe.Descent));
+                               gr.SetSourceColor (SelectionBackground);
+                               gr.FillPreserve ();
+                               gr.Clip ();
+                               gr.Operator = Operator.Over;
+                               gr.SetSourceColor (SelectionForeground);
+                               gr.MoveTo (x, y + fe.Ascent);
+                               gr.ShowText (lstr);
+                               gr.Fill ();
+                               gr.Restore ();
+                       }
+               }
+               void drawParsedCodeLine (Context gr, double x, double y, int i, int lineIndex) {
+                       int lPtr = 0;
+                       CodeLine cl = PrintedLines[i];
+
+                       for (int t = 0; t < cl.Tokens.Count; t++) {
+                               string lstr = cl.Tokens [t].PrintableContent;
+                               if (lPtr < ScrollX) {
+                                       if (lPtr - ScrollX + lstr.Length <= 0) {
+                                               lPtr += lstr.Length;
+                                               continue;
+                                       }
+                                       lstr = lstr.Substring (ScrollX - lPtr);
+                                       lPtr += ScrollX - lPtr;
+                               }
+                               Color bg = this.Background;
+                               Color fg = this.Foreground;
+                               Color selbg = this.SelectionBackground;
+                               Color selfg = this.SelectionForeground;
+                               FontSlant fts = FontSlant.Normal;
+                               FontWeight ftw = FontWeight.Normal;
+
+                               if (formatting.ContainsKey ((int)cl.Tokens [t].Type)) {
+                                       TextFormatting tf = formatting [(int)cl.Tokens [t].Type];
+                                       bg = tf.Background;
+                                       fg = tf.Foreground;
+                                       if (tf.Bold)
+                                               ftw = FontWeight.Bold;
+                                       if (tf.Italic)
+                                               fts = FontSlant.Italic;
+                               }
+
+                               gr.SelectFontFace (Font.Name, fts, ftw);
+                               gr.SetSourceColor (fg);
+
+                               gr.MoveTo (x, y + fe.Ascent);
+                               gr.ShowText (lstr);
+                               gr.Fill ();
+
+                               if (buffer.SelectionInProgress && lineIndex >= buffer.SelectionStart.Y && lineIndex <= buffer.SelectionEnd.Y &&
+                                       !(lineIndex == buffer.SelectionStart.Y && lPtr + lstr.Length <= selStartCol) &&
+                                       !(lineIndex == buffer.SelectionEnd.Y && selEndCol <= lPtr)) {
+
+                                       double rLineX = x,
+                                       rLineY = y,
+                                       rLineW = lstr.Length * fe.MaxXAdvance;
+                                       double startAdjust = 0.0;
+
+                                       if ((lineIndex == buffer.SelectionStart.Y) && (selStartCol < lPtr + lstr.Length) && (selStartCol > lPtr))
+                                               startAdjust = (selStartCol - lPtr) * fe.MaxXAdvance;
+                                       rLineX += startAdjust;
+                                       if ((lineIndex == buffer.SelectionEnd.Y) && (selEndCol < lPtr + lstr.Length))
+                                               rLineW = (selEndCol - lPtr) * fe.MaxXAdvance;
+                                       rLineW -= startAdjust;
+
+                                       gr.Save ();
+                                       gr.Operator = Operator.Source;
+                                       gr.Rectangle (rLineX, rLineY, rLineW, (fe.Ascent+fe.Descent));
+                                       gr.SetSourceColor (selbg);
+                                       gr.FillPreserve ();
+                                       gr.Clip ();
+                                       gr.Operator = Operator.Over;
+                                       gr.SetSourceColor (selfg);
+                                       gr.MoveTo (x, y + fe.Ascent);
+                                       gr.ShowText (lstr);
+                                       gr.Fill ();
+                                       gr.Restore ();
+                               }
+                               x += (int)lstr.Length * fe.MaxXAdvance;
+                               lPtr += lstr.Length;
+                       }
+               }
+
+               #endregion
+
+               #region GraphicObject overrides
+               public override Font Font {
+                       get { return base.Font; }
+                       set {
+                               base.Font = value;
+
+                               using (ImageSurface img = new ImageSurface (Format.Argb32, 1, 1)) {
+                                       using (Context gr = new Context (img)) {
+                                               gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                                               gr.SetFontSize (Font.Size);
+
+                                               fe = gr.FontExtents;
+                                       }
+                               }
+                               MaxScrollY = 0;
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+               protected override int measureRawSize(LayoutingType lt)
+               {
+                       if (lt == LayoutingType.Height)
+                               return (int)Math.Ceiling((fe.Ascent+fe.Descent) * buffer.LineCount) + Margin * 2;
+
+                       return (int)(fe.MaxXAdvance * buffer.longestLineCharCount) + Margin * 2 + leftMargin;
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+
+                       if (layoutType == LayoutingType.Height)
+                               updateVisibleLines ();
+                       else if (layoutType == LayoutingType.Width)
+                               updateVisibleColumns ();
+               }
+
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       gr.SelectFontFace (Font.Name, Font.Slant, Font.Wheight);
+                       gr.SetFontSize (Font.Size);
+                       gr.FontOptions = Interface.FontRenderingOptions;
+                       gr.Antialias = Interface.Antialias;
+
+                       Rectangle cb = ClientRectangle;
+
+                       Foreground.SetAsSource (gr);
+
+                       buffer.editMutex.EnterReadLock ();
+                       editorMutex.EnterReadLock ();
+
+                       #region draw text cursor
+                       if (buffer.SelectionInProgress){
+                               selStartCol = getTabulatedColumn (buffer.SelectionStart);
+                               selEndCol = getTabulatedColumn (buffer.SelectionEnd);
+                       }else if (HasFocus && printedCurrentLine >= 0){
+                               gr.LineWidth = 1.0;
+                               double cursorX = cb.X + (getTabulatedColumn(buffer.CurrentPosition) - ScrollX) * fe.MaxXAdvance + leftMargin;
+                               gr.MoveTo (0.5 + cursorX, cb.Y + (printedCurrentLine) * (fe.Ascent+fe.Descent));
+                               gr.LineTo (0.5 + cursorX, cb.Y + (printedCurrentLine + 1) * (fe.Ascent+fe.Descent));
+                               gr.Stroke();
+                       }
+                       #endregion
+
+                       if (PrintedLines?.Count > 0) {                          
+                               int unfoldedLines = buffer.UnfoldedLines;
+                               currentNode = null;
+                               CodeLine cl = PrintedLines[0];
+                               int idx0 = buffer.IndexOf(cl);
+                               int li = idx0-1;
+                               while (li >= 0) {
+                                       if (buffer [li].IsFoldable && !buffer [li].IsFolded) {
+                                               if (buffer.IndexOf(buffer [li].SyntacticNode.EndLine) > idx0){
+                                                       currentNode = buffer [li].SyntacticNode;
+                                                       break;
+                                               }
+                                       }
+                                       li--;
+                               }
+
+                               for (int i = 0; i < visibleLines; i++) {
+                                       if (i + ScrollY >= unfoldedLines)//TODO:need optimize
+                                               break;
+                                       drawLine (gr, cb, i);
+                               }
+                       }
+
+                       editorMutex.ExitReadLock ();
+
+                       buffer.editMutex.ExitReadLock ();
+
+               }
+               #endregion
+
+               #region Mouse handling
+
+               int hoverLine = -1;
+               public int HoverLine {
+                       get { return hoverLine; }
+                       set { 
+                               if (hoverLine == value)
+                                       return;
+                               hoverLine = value;
+                               NotifyValueChanged ("HoverLine", hoverLine);
+                               NotifyValueChanged ("HoverError", buffer [hoverLine].exception);
+                       }
+               }
+               void updateHoverLine () {
+                       if (PrintedLines.Count > 0) {
+                               int hvl = (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent + fe.Descent)));
+                               hvl = Math.Min (PrintedLines.Count - 1, hvl);
+                               HoverLine = buffer.IndexOf (PrintedLines [hvl]);
+                       } else
+                               HoverLine = 0;
+               }
+               void updateCurrentPosFromMouseLocalPos(){                       
+                       PrintedCurrentLine = (int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent)));
+                       int curVisualCol = ScrollX +  (int)Math.Round ((mouseLocalPos.X - leftMargin) / fe.MaxXAdvance);
+
+                       int i = 0;
+                       int buffCol = 0;
+                       while (i < curVisualCol && buffCol < buffer.CurrentCodeLine.Length) {
+                               if (buffer.CurrentCodeLine[buffCol] == '\t')
+                                       i += Interface.TabSize;
+                               else
+                                       i++;
+                               buffCol++;
+                       }
+                       buffer.CurrentColumn = buffCol;
+               }
+               public override void onMouseEnter (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseEnter (sender, e);
+                       if (e.X - ScreenCoordinates(Slot).X < leftMargin + ClientRectangle.X)
+                               IFace.MouseCursor = MouseCursors.Default;
+                       else
+                               IFace.MouseCursor = MouseCursors.Text;
+               }
+               public override void onMouseLeave (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseLeave (sender, e);
+                       IFace.MouseCursor = MouseCursors.Default;
+               }
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+                       base.onMouseMove (sender, e);
+
+                       mouseLocalPos = e.Position - ScreenCoordinates(Slot).TopLeft - ClientRectangle.TopLeft;
+
+                       updateHoverLine ();
+
+                       if (!e.Mouse.IsButtonDown (MouseButton.Left)) {
+                               if (mouseLocalPos.X < leftMargin)
+                                       IFace.MouseCursor = MouseCursors.Default;
+                               else
+                                       IFace.MouseCursor = MouseCursors.Text;
+                               return;
+                       }
+
+                       if (!HasFocus || !buffer.SelectionInProgress)
+                               return;
+
+                       //mouse is down
+                       updateCurrentPosFromMouseLocalPos();
+                       buffer.SetSelEndPos ();
+               }
+               public override void onMouseDown (object sender, MouseButtonEventArgs e)
+               {
+                       if (!this.Focusable)
+                               return;
+
+                       if (mouseLocalPos.X >= leftMargin)
+                               base.onMouseDown (sender, e);
+
+                       if (doubleClicked) {
+                               doubleClicked = false;
+                               return;
+                       }
+
+                       if (mouseLocalPos.X < leftMargin) {
+                               toogleFolding (buffer.IndexOf (PrintedLines [(int)Math.Max (0, Math.Floor (mouseLocalPos.Y / (fe.Ascent+fe.Descent)))]));
+                               return;
+                       }
+
+                       updateCurrentPosFromMouseLocalPos ();
+                       buffer.SetSelStartPos ();
+               }
+               public override void onMouseUp (object sender, MouseButtonEventArgs e)
+               {
+                       base.onMouseUp (sender, e);
+
+                       if (buffer.SelectionIsEmpty)
+                               buffer.ResetSelection ();
+               }
+
+               public override void onMouseDoubleClick (object sender, MouseButtonEventArgs e)
+               {
+                       doubleClicked = true;
+                       base.onMouseDoubleClick (sender, e);
+
+                       buffer.GotoWordStart ();
+                       buffer.SetSelStartPos ();
+                       buffer.GotoWordEnd ();
+                       buffer.SetSelEndPos ();
+               }
+               public void MakeSelection (int lineStart, int colStart, int lineEnd, int colEnd) {
+                       buffer.CurrentLine = lineStart;
+                       buffer.CurrentColumn = colStart;
+                       buffer.SetSelStartPos ();
+                       buffer.CurrentLine = lineEnd;
+                       buffer.CurrentColumn = colEnd;
+                       buffer.SetSelEndPos ();
+               }
+               public override void onMouseWheel (object sender, MouseWheelEventArgs e)
+               {
+                       base.onMouseWheel (sender, e);
+               }
+               #endregion
+
+               #region Keyboard handling
+               public override void onKeyDown (object sender, KeyEventArgs e)
+               {
+                       //base.onKeyDown (sender, e);
+
+                       Key key = e.Key;
+
+                       if (IFace.Ctrl) {
+                               switch (key) {
+                               case Key.S:
+                                       projFile.Save ();
+                                       break;
+                               case Key.W:
+                                       editorMutex.EnterWriteLock ();
+                                       if (IFace.Shift)
+                                               projFile.Redo (null);
+                                       else
+                                               projFile.Undo (null);
+                                       editorMutex.ExitWriteLock ();
+                                       break;
+                               default:
+                                       Console.WriteLine ("");
+                                       break;
+                               }
+                       }
+
+                       switch (key)
+                       {
+                       case Key.BackSpace:
+                               buffer.DeleteChar ();
+                               break;
+                       case Key.Clear:
+                               break;
+                       case Key.Delete:
+                               if (buffer.SelectionIsEmpty)
+                                       MoveRight ();
+                               else if (IFace.Shift)
+                                       IFace.Clipboard = buffer.SelectedText;
+                               buffer.DeleteChar ();
+                               break;
+                       case Key.Return:
+                       case Key.KP_Enter:
+                               if (!buffer.SelectionIsEmpty)
+                                       buffer.DeleteChar ();
+                               buffer.InsertLineBreak ();
+                               break;
+                       case Key.Escape:
+                               buffer.ResetSelection ();
+                               break;
+                       case Key.Home:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.CurrentLine = 0;
+                                       buffer.CurrentColumn = 0;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.CurrentLine = 0;
+                               buffer.CurrentColumn = 0;
+                               break;
+                       case Key.End:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.CurrentLine = int.MaxValue;
+                                       buffer.CurrentColumn = int.MaxValue;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.CurrentLine = int.MaxValue;
+                               buffer.CurrentColumn = int.MaxValue;
+                               break;
+                       case Key.Insert:
+                               if (IFace.Shift)
+                                       buffer.Insert (IFace.Clipboard);
+                               else if (IFace.Ctrl && !buffer.SelectionIsEmpty)
+                                       IFace.Clipboard = buffer.SelectedText;
+                               break;
+                       case Key.Left:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.GotoWordStart ();
+                                       else
+                                               MoveLeft ();
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.GotoWordStart ();
+                               else
+                                       MoveLeft();
+                               break;
+                       case Key.Right:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       if (IFace.Ctrl)
+                                               buffer.GotoWordEnd ();
+                                       else
+                                               MoveRight ();
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               if (IFace.Ctrl)
+                                       buffer.GotoWordEnd ();
+                               else
+                                       MoveRight ();
+                               break;
+                       case Key.Up:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       PrintedCurrentLine--;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               PrintedCurrentLine--;
+                               break;
+                       case Key.Down:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       PrintedCurrentLine++;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               PrintedCurrentLine++;
+                               break;
+                       case Key.Menu:
+                               break;
+                       case Key.Num_Lock:
+                               break;
+                       case Key.Page_Down:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       PrintedCurrentLine += visibleLines;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               PrintedCurrentLine += visibleLines;
+                               break;
+                       case Key.Page_Up:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty)
+                                               buffer.SetSelStartPos ();
+                                       PrintedCurrentLine -= visibleLines;
+                                       buffer.SetSelEndPos ();
+                                       break;
+                               }
+                               buffer.ResetSelection ();
+                               PrintedCurrentLine -= visibleLines;
+                               break;
+                       case Key.Tab:
+                               if (IFace.Shift) {
+                                       if (buffer.SelectionIsEmpty ||
+                                               (buffer.SelectionStart.Y == buffer.SelectionEnd.Y)) {
+                                               //TODO
+                                               break;
+                                       }
+                                       for (int i = buffer.SelectionStart.Y; i <= buffer.SelectionEnd.Y; i++)
+                                               buffer.RemoveLeadingTab (i);
+                                       buffer.SetSelectionOnFullLines ();
+                               } else {
+                                       if (buffer.SelectionIsEmpty ||
+                                               (buffer.SelectionStart.Y == buffer.SelectionEnd.Y)) {
+                                               buffer.Insert ("\t");
+                                               break;
+                                       }
+                                       for (int i = buffer.SelectionStart.Y; i <= buffer.SelectionEnd.Y; i++) {
+                                               buffer.UpdateLine (i, "\t" + buffer [i].Content);
+                                       }
+                               }
+
+                               break;
+                       case Key.F8:
+                               toogleFolding (buffer.CurrentLine);
+                               break;
+                       default:
+                               break;
+                       }
+                       RegisterForGraphicUpdate();
+               }
+               public override void onKeyPress (object sender, KeyPressEventArgs e)
+               {
+                       base.onKeyPress (sender, e);
+
+                       buffer.Insert (e.KeyChar.ToString());
+                       buffer.ResetSelection ();
+               }
+               #endregion
+       }
+}
\ No newline at end of file
diff --git a/CrowIDE/src/Editors/SvgEditor.cs b/CrowIDE/src/Editors/SvgEditor.cs
new file mode 100644 (file)
index 0000000..cac0366
--- /dev/null
@@ -0,0 +1,140 @@
+//
+// SvgEditor.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.ComponentModel;
+using Crow.Cairo;
+
+namespace Crow.Coding
+{
+       public class SvgEditor : Editor
+       {
+               SvgPicture _pic = new SvgPicture();
+
+               int zoom;
+
+               [DefaultValue(100)]
+               public int Zoom {
+                       get { return zoom; }
+                       set {
+                               if (zoom == value)
+                                       return;
+                               zoom = value;
+                               NotifyValueChanged ("Zoom", zoom);
+                               updateMaxScrolls ();
+                               RegisterForGraphicUpdate ();
+                       }
+               }
+
+               void updateMaxScrolls() {                       
+                       MaxScrollX = Math.Max(0, _pic.Dimensions.Width * zoom / 100 - Slot.Width);
+                       MaxScrollY = Math.Max(0, _pic.Dimensions.Height * zoom / 100 - Slot.Height);
+
+                       if (Slot.Width + MaxScrollX > 0)
+                               NotifyValueChanged ("ChildWidthRatio", Slot.Width * Slot.Width / (Slot.Width + MaxScrollX));
+                       else
+                               NotifyValueChanged ("ChildWidthRatio", 0);
+                       
+                       if (Slot.Height + MaxScrollY > 0)
+                               NotifyValueChanged ("ChildHeightRatio", Slot.Height * Slot.Height / (Slot.Height + MaxScrollY));
+                       else
+                               NotifyValueChanged ("ChildHeightRatio", 0);
+               }
+               #region editor overrides
+               protected override void updateEditorFromProjFile ()
+               {
+                       Error = null;
+                       try {
+                               editorMutex.EnterWriteLock();
+                               _pic.LoadSvgFragment (projFile.Source);
+                               _pic.Scaled = true;
+                               _pic.KeepProportions = true;
+                       } catch (Exception ex) {
+                               Error = ex;
+                       }
+                       editorMutex.ExitWriteLock ();
+                       updateMaxScrolls ();
+                       RegisterForGraphicUpdate ();
+               }
+               protected override void updateProjFileFromEditor ()
+               {
+                       throw new NotImplementedException ();
+               }
+               protected override bool EditorIsDirty {
+                       get { return false;     }
+                       set {
+                               throw new NotImplementedException ();
+                       }
+               }
+               protected override bool IsReady {                       
+                       get { return projFile != null;  }
+               }
+               #endregion
+
+               #region GraphicObject overrides
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       if (_pic == null)
+                               return 2 * Margin;
+                       //_pic = "#Crow.Images.Icons.IconAlerte.svg";
+                       //TODO:take scalling in account
+                       if (lt == LayoutingType.Width)
+                               return _pic.Dimensions.Width + 2 * Margin;
+                       else
+                               return _pic.Dimensions.Height + 2 * Margin;
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       Rectangle r = ClientRectangle;
+                       Foreground.SetAsSource (gr, r);
+                       gr.Rectangle (r, 0.1);
+                       gr.Stroke ();
+
+                       r.Width = _pic.Dimensions.Width * zoom / 100;
+                       r.Height = _pic.Dimensions.Height * zoom / 100;
+
+                       gr.Save ();
+
+                       editorMutex.EnterReadLock ();
+
+                       gr.Translate (-ScrollX, -ScrollY);
+                       if (_pic != null)
+                               _pic.Paint (gr, r);
+                       editorMutex.ExitReadLock ();
+
+                       gr.Restore ();
+               }
+               public override void OnLayoutChanges (LayoutingType layoutType)
+               {
+                       base.OnLayoutChanges (layoutType);
+                       if ((layoutType | LayoutingType.Sizing) > 0)
+                               updateMaxScrolls ();
+               }
+               #endregion
+       }
+}
+
diff --git a/CrowIDE/src/Extensions.cs b/CrowIDE/src/Extensions.cs
new file mode 100644 (file)
index 0000000..86c5834
--- /dev/null
@@ -0,0 +1,45 @@
+//
+//  Extensions.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2016 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+using System.Collections.Generic;
+
+namespace Crow
+{
+       public static partial class Extensions
+       {
+               public static string GetIcon(this Widget go){
+                       return "#CrowIDE.icons.toolbox." + go.GetType().FullName + ".svg";
+               }
+               public static List<Widget> GetChildren(this Widget go){
+                       Type goType = go.GetType();
+                       if (typeof (Group).IsAssignableFrom (goType))
+                               return (go as Group).Children;
+                       if (typeof(Container).IsAssignableFrom (goType))
+                               return new List<Widget>( new Widget[] { (go as Container).Child });
+                       if (typeof(TemplatedContainer).IsAssignableFrom (goType))
+                               return new List<Widget>( new Widget[] { (go as TemplatedContainer).Content });
+                       if (typeof(TemplatedGroup).IsAssignableFrom (goType))
+                               return (go as TemplatedGroup).Items;
+
+                       return new List<Widget>();
+               }
+       }
+}
diff --git a/CrowIDE/src/GraphicObjectDesignContainer.cs b/CrowIDE/src/GraphicObjectDesignContainer.cs
new file mode 100644 (file)
index 0000000..e996ce3
--- /dev/null
@@ -0,0 +1,85 @@
+//
+// GraphicObjectDesignContainer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow.Cairo;
+
+namespace Crow.Coding
+{
+       public class GraphicObjectDesignContainer
+       {
+               #region CTOR
+               public GraphicObjectDesignContainer (Type crowType)
+               {
+                       CrowType = crowType;
+               }
+               #endregion
+
+               int dragIconSize = 32;
+               public Type CrowType;
+
+               public string IconPath {
+                       get { return "#CrowIDE.icons.toolbox." + CrowType.FullName + ".svg"; }
+               }
+               public string DisplayName {
+                       get { return CrowType.Name; }
+               }
+               void onStartDrag (object sender, EventArgs e)
+               {
+                       Widget go = sender as Widget;
+
+                       lock (go.IFace.UpdateMutex) {                           
+                               go.IFace.DragImageHeight = dragIconSize;
+                               go.IFace.DragImageWidth = dragIconSize;
+                               SvgPicture pic = new SvgPicture (IconPath);
+                               //pic.Load (go.IFace, IconPath);
+                               ImageSurface img = new ImageSurface (Format.Argb32, dragIconSize, dragIconSize);
+                               using (Context ctx = new Context (img)) {
+                                       Rectangle r = new Rectangle (0, 0, dragIconSize, dragIconSize);
+                                       pic.Paint (ctx, r);     
+                                       ctx.Operator = Operator.In;
+                                       ctx.SetSourceRGBA (1.0, 1.0, 1.0, 1.0);
+                                       ctx.Rectangle (r);
+                                       ctx.Fill ();
+
+                               }
+                               go.IFace.DragImage = img;
+                       }
+               }
+               void onEndDrag (object sender, DragDropEventArgs e)
+               {
+                       (sender as Widget).IFace.ClearDragImage ();
+
+               }
+               void onDrop (object sender, DragDropEventArgs e)
+               {
+                       ImlVisualEditor imlVE = e.DropTarget as ImlVisualEditor;
+                       if (imlVE != null)
+                               imlVE.ClearDraggedObj (false);
+                       (sender as Widget).IFace.ClearDragImage ();
+               }
+       }
+}
+
diff --git a/CrowIDE/src/INetProject.cs b/CrowIDE/src/INetProject.cs
new file mode 100644 (file)
index 0000000..53d81a1
--- /dev/null
@@ -0,0 +1,35 @@
+//
+// INetProject.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow.Coding
+{
+       public interface INetProject
+       {
+               
+       }
+}
+
diff --git a/CrowIDE/src/MemberView/CategoryContainer.cs b/CrowIDE/src/MemberView/CategoryContainer.cs
new file mode 100644 (file)
index 0000000..fbf3fe2
--- /dev/null
@@ -0,0 +1,65 @@
+//
+// CategoryContainer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow.Coding
+{
+       public class CategoryContainer : IValueChange
+       {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               bool _isExpanded = true;
+
+               public PropertyContainer[] Properties;
+               public string Name;
+
+               public bool IsExpanded
+               {
+                       get { return _isExpanded; }
+                       set
+                       {
+                               if (value == _isExpanded)
+                                       return;
+
+                               _isExpanded = value;
+
+                               NotifyValueChanged ("IsExpanded", _isExpanded);
+                       }
+               }
+
+               public CategoryContainer (string categoryName, PropertyContainer[] properties){
+                       Name = categoryName;
+                       Properties = properties;
+               }
+       }
+}
+
diff --git a/CrowIDE/src/MemberView/MembersView.cs b/CrowIDE/src/MemberView/MembersView.cs
new file mode 100644 (file)
index 0000000..27d1e02
--- /dev/null
@@ -0,0 +1,140 @@
+//
+//  MembersView.cs
+//
+//  Author:
+//       Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
+//
+//  Copyright (c) 2016 jp
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
+using Crow;
+using System.Xml.Serialization;
+using System.ComponentModel;
+using System.Reflection;
+using System.Collections.Generic;
+using System.Linq;
+using Crow.Cairo;
+
+namespace Crow.Coding
+{      
+       public class MembersView : ListBox
+       {               
+               object instance;
+               ImlProjectItem projFile;
+
+               public MembersView () : base() {}
+
+               //cache property containers per type
+               //Dictionary<string,PropertyContainer[]> propContainersCache = new Dictionary<string, PropertyContainer[]>();
+               Dictionary<string,List<CategoryContainer>> categoryContainersCache = new Dictionary<string,List<CategoryContainer>> ();
+
+               [DefaultValue(null)]
+               public virtual object Instance {
+                       get { return instance; }
+                       set {
+                               if (instance == value)
+                                       return;
+                               object lastInst = instance;
+
+                               instance = value;
+                               NotifyValueChanged ("Instance", instance);
+
+                               if (Instance is Widget) {
+                                       NotifyValueChanged ("SelectedItemName", Instance.GetType().Name + (Instance as Widget).design_id
+                                               + ":" + (Instance as Widget).design_imlPath );
+                               }else
+                                       NotifyValueChanged ("SelectedItemName", "");
+
+                               if (instance == null) { 
+                                       Data = null;
+                                       return;
+                               }       
+
+                               Type it = instance.GetType ();
+                               if (!categoryContainersCache.ContainsKey (it.FullName)) {
+                                       MemberInfo[] members = it.GetMembers (BindingFlags.Public | BindingFlags.Instance);
+                                       List<PropertyContainer> props = new List<PropertyContainer> ();
+                                       foreach (MemberInfo m in members) {
+                                               if (m.MemberType == MemberTypes.Property) {
+                                                       PropertyInfo pi = m as PropertyInfo;
+                                                       if (!pi.CanWrite)
+                                                               continue;
+                                                       if (pi.GetCustomAttribute (typeof(XmlIgnoreAttribute)) != null)
+                                                               continue;
+                                                       props.Add (new PropertyContainer (this, pi));
+                                               }
+                                       }
+                                       //propContainersCache.Add (it.FullName, props.OrderBy (p => p.Name).ToArray ());
+                                       List<CategoryContainer> categories = new List<CategoryContainer> ();
+
+                                       foreach (IGrouping<string,PropertyContainer> ig in props.OrderBy (p => p.Name).GroupBy(pc=>pc.DesignCategory)) {
+                                               categories.Add(new CategoryContainer(ig.Key, ig.ToArray()));
+                                       }
+                                       categoryContainersCache.Add (it.FullName, categories);
+                               }
+
+
+                               Data = categoryContainersCache[it.FullName];
+
+                               if (lastInst != instance) {
+                                       foreach (CategoryContainer cc in categoryContainersCache [it.FullName]) {
+                                               foreach (PropertyContainer pc in cc.Properties) {
+                                                       pc.NotifyValueChanged ("Value", pc.Value);
+                                                       pc.NotifyValueChanged ("LabForeground", pc.LabForeground);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               public ImlProjectItem ProjectNode {
+                       get { return projFile; }
+                       set {
+                               if (projFile == value)
+                                       return;
+                               
+//                             if (projFile != null)
+//                                     projFile.UnregisterEditor (this);
+                               
+                               projFile = value;
+
+//                             if (projFile != null)
+//                                     projFile.RegisterEditor (this);
+
+                               NotifyValueChanged ("ProjectNode", projFile);
+                       }
+               }
+
+//             public void updateSource () {
+//                     if (projFile == null)
+//                             return;
+//                     projFile.UpdateSource (this, (Instance as GraphicObject).GetIML ());
+//             }
+
+//             public override void Paint (ref Context ctx)
+//             {
+//                     base.Paint (ref ctx);
+//
+//                     if (SelectedIndex < 0)
+//                             return;
+//
+//                     Rectangle r =  Parent.ContextCoordinates(Items [SelectedIndex].Slot);
+//                     ctx.SetSourceRGB (0, 0, 1);
+//                     ctx.Rectangle (r);
+//                     ctx.LineWidth = 2;
+//                     ctx.Stroke ();
+//             }
+
+       }
+}
diff --git a/CrowIDE/src/MemberView/PropertyContainer.cs b/CrowIDE/src/MemberView/PropertyContainer.cs
new file mode 100644 (file)
index 0000000..4d043ab
--- /dev/null
@@ -0,0 +1,222 @@
+//
+// PropertyContainer.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Reflection;
+using System.Linq;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.ComponentModel;
+
+namespace Crow.Coding
+{      
+       public class PropertyContainer : IValueChange
+       {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               PropertyInfo pi;
+               MembersView mview;
+               Command cmdReset, cmdGoToStyle;
+
+               public List<Crow.Command> Commands;
+
+               #region CTOR
+               public PropertyContainer(MembersView mv, PropertyInfo prop){
+                       mview = mv;
+                       pi = prop;
+
+                       cmdReset = new Crow.Command (new Action (() => Reset ())) { Caption = "Reset to default" };
+                       cmdGoToStyle = new Crow.Command (new Action (() => GotoStyle ())) { Caption = "Goto style" };
+
+                       Commands = new List<Crow.Command> (new Crow.Command[] { cmdReset, cmdGoToStyle });
+               }
+               #endregion
+
+               public string DesignCategory {
+                       get {
+                               DesignCategory dca = (DesignCategory)pi.GetCustomAttribute (typeof(DesignCategory));
+                               return dca == null ? "Divers" : dca.Name;                                       
+                       }
+               }
+               public string Name { get { return pi.Name; }}
+               public object Value {
+                       get {
+                               return mview.ProjectNode?.SelectedItem == null ? null : pi.GetValue(mview.ProjectNode.SelectedItem);
+                       }
+                       set {
+                               try {
+                                       if (value == Value)
+                                               return;
+                                       Widget g = Instance;
+                                       string valstr = null, oldval = null;
+
+                                       if (value != null)
+                                               valstr = value.ToString();
+
+                                       if (HasStyling)
+                                               oldval = g.design_style_values[Name];
+                                       else if (HasDefaultValue)
+                                               oldval = DefaultValue?.ToString();
+                                       else if (IsSetByIML)
+                                               oldval = g.design_iml_values [Name];
+                                       
+                                       if (valstr == oldval){
+                                               if (IsSetByIML){
+                                                       g.design_iml_values.Remove(Name);
+                                                       Debug.WriteLine("iml attrib removed {0}.{1}", g.Name, Name);
+                                               }else
+                                                       return;
+                                       }else{
+                                               if (IsSetByIML){
+                                                       g.design_iml_values [Name] = valstr;
+                                                       Debug.WriteLine("iml update {0}.{1} = {2}", g.Name, Name, valstr);
+                                               }else{
+                                                       g.design_iml_values.Add(Name,valstr);
+                                                       Debug.WriteLine("iml add {0}.{1} = {2}", g.Name, Name, valstr);
+                                               }
+                                       }
+
+                                       if (!pi.PropertyType.IsAssignableFrom(value.GetType()) && pi.PropertyType != typeof(string)){
+                                               if (pi.PropertyType.IsEnum) {
+                                                       if (value is string) {
+                                                               pi.SetValue (g, Enum.Parse (pi.PropertyType, (string)value));
+                                                       }else
+                                                               pi.SetValue (g, value);
+                                               } else {
+                                                       MethodInfo me = pi.PropertyType.GetMethod
+                                                               ("Parse", BindingFlags.Static | BindingFlags.Public,
+                                                                       System.Type.DefaultBinder, new Type [] {typeof (string)},null);
+                                                       pi.SetValue (g, me.Invoke (null, new object[] { value }), null);
+                                               }
+                                       }else
+                                               pi.SetValue(g, value);
+
+                                       Debug.WriteLine("\t\tPropContainer set design_dirty to instance");
+
+                                       mview.ProjectNode.Instance.design_HasChanged = true;
+                                       NotifyValueChanged ("Value", value);
+                                       NotifyValueChanged ("LabForeground", LabForeground);
+                               } catch (Exception ex) {
+                                       Debug.WriteLine ("Error setting property:"+ ex.ToString());
+                               }
+                               //
+                       }
+               }
+               /// <summary>
+               /// for style attribute which is a string, return Style as type
+               /// </summary>
+               public string Type { get { return pi.PropertyType.IsEnum ?
+                               "System.Enum"
+                                       : pi.Name == "Style" ? "Style" : pi.PropertyType.FullName; }}
+               
+               public object[] Choices {
+                       get {
+                               return pi.PropertyType.IsEnum ?
+                                       Enum.GetValues (pi.PropertyType).Cast<object>().ToArray() :
+                                       mview.ProjectNode.Project.solution.AvailaibleStyles;
+                       }
+               }
+               /// <summary>
+               /// Current graphicobject instance
+               /// </summary>
+               public Widget Instance {
+                       get { return mview.ProjectNode.SelectedItem as Widget; }
+               }
+               public object DefaultValue {
+                       get { return ((DefaultValueAttribute)(pi.GetCustomAttribute (typeof (DefaultValueAttribute)))).Value; }
+               }
+               public bool HasDefaultValue {
+                       get { return pi.GetCustomAttribute (typeof(DefaultValueAttribute))!=null; }
+               }
+               /// <summary>
+               /// return true if current value comes from IML attributes
+               /// </summary>
+               public bool IsSetByIML {
+                       get { return Instance.design_iml_values.ContainsKey (Name); }
+               }
+               /// <summary>
+               /// return true if member default value comes from style
+               /// </summary>
+               public bool HasStyling {
+                       get { return Instance.design_style_locations.ContainsKey(Name); }
+               }
+               /// <summary>
+               /// Return true if current value comes from styling
+               /// </summary>
+               public bool IsSetByStyling {
+                       get { return IsSetByIML ? false : HasStyling; }
+               }
+
+
+               public Fill LabForeground {
+                       get { return IsSetByIML ? Color.DarkBlue : HasStyling ? Color.Black : Color.Grey;}
+               }
+
+               /// <summary>
+               /// reset to default value
+               /// </summary>
+               public void Reset () {
+                       Widget inst = mview.ProjectNode.SelectedItem as Widget;
+                       if (!inst.design_iml_values.ContainsKey (Name))
+                               return;
+                       inst.design_iml_values.Remove (Name);
+
+                       NotifyValueChanged ("LabForeground", LabForeground);
+                       mview.ProjectNode.UpdateSource(this, mview.ProjectNode.Instance.GetIML());
+                       //mview.ProjectNode.Instance.design_HasChanged = true;
+                       //should reinstantiate to get default
+               }
+               public void GotoStyle(){
+                       Widget g = Instance;
+                       if (!g.design_style_locations.ContainsKey (Name))
+                               return;
+                       FileLocation fl = g.design_style_locations [Name];
+                       ProjectFile pf;
+                       if (!mview.ProjectNode.Project.TryGetProjectFileFromPath ("#" + fl.FilePath, out pf))
+                               return;
+
+                       if (!pf.IsOpened)
+                               pf.Open ();
+
+                       pf.CurrentLine = fl.Line;
+                       pf.CurrentColumn = fl.Column;
+
+                       pf.IsSelected = true;
+
+               }
+
+               public override string ToString ()
+               {
+                       return string.Format ("{0} = {1}", Name, Value);
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Project.cs b/CrowIDE/src/Project.cs
new file mode 100644 (file)
index 0000000..a3ffa63
--- /dev/null
@@ -0,0 +1,519 @@
+//
+// Project.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Xml;
+using System.IO;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.CSharp;
+using System.CodeDom.Compiler;
+using Crow;
+using System.Text.RegularExpressions;
+
+namespace Crow.Coding {
+    public class Project : IValueChange {
+        #region IValueChange implementation
+        public event EventHandler<ValueChangeEventArgs> ValueChanged;
+        public virtual void NotifyValueChanged (string MemberName, object _value) {
+            ValueChanged.Raise (this, new ValueChangeEventArgs (MemberName, _value));
+        }
+        #endregion
+
+        bool isLoaded = false;
+        bool isExpanded;
+        XmlDocument xmlDoc;
+        XmlNode nodeProject;
+        XmlNode nodeProps;
+        XmlNodeList nodesItems;
+        SolutionProject solutionProject;
+        Crow.Command cmdSave, cmdOpen, cmdCompile, cmdSetAsStartProj, cmdNewFile;
+
+        #region CTOR
+        public Project (Solution sol, SolutionProject sp) {
+            solutionProject = sp;
+
+            solution = sol;
+
+            cmdSave = new Crow.Command (new Action (() => Save ())) { Caption = "Save", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = true };
+            cmdOpen = new Crow.Command (new Action (() => Load ())) { Caption = "Open", Icon = new SvgPicture ("#CrowIDE.icons.open.svg"), CanExecute = false };
+            cmdCompile = new Crow.Command (new Action (() => Compile ())) {
+                Caption = "Compile",
+                Icon = "#CrowIDE.icons.compile.svg"
+            };
+            cmdSetAsStartProj = new Crow.Command (new Action (() => setAsStartupProject ())) {
+                Caption = "Set as Startup Project"
+            };
+            cmdNewFile = new Crow.Command (new Action (() => AddNewFile ())) {
+                Caption = "Add New File",
+                Icon = new SvgPicture ("#CrowIDE.icons.blank-file.svg"),
+                CanExecute = true
+            };
+
+            Commands = new List<Crow.Command> (new Crow.Command[] { cmdOpen, cmdSave, cmdSetAsStartProj, cmdCompile, cmdNewFile });
+
+            Load ();
+        }
+        #endregion
+
+        public Solution solution;
+        public List<Crow.Command> Commands;
+        public CompilerResults CompilationResults;
+        public List<Project> dependantProjects = new List<Project> ();
+        public Project ParentProject = null;
+        List<ProjectNode> rootItems;
+        List<ProjectNode> flattenNodes;
+
+        public string Name {
+            get { return solutionProject.ProjectName; }
+        }
+        public bool IsLoaded {
+            get { return isLoaded; }
+            set {
+                if (isLoaded == value)
+                    return;
+                isLoaded = value;
+                NotifyValueChanged ("IsLoaded", isLoaded);
+            }
+        }
+        public bool IsExpanded {
+            get { return isExpanded; }
+            set {
+                if (value == isExpanded)
+                    return;
+                isExpanded = value;
+                NotifyValueChanged ("IsExpanded", isExpanded);
+            }
+        }
+        public bool IsStartupProject {
+            get { return solution.StartupProject == this; }
+        }
+        public string Path {
+            get { return System.IO.Path.Combine (solution.SolutionFolder, solutionProject.RelativePath.Replace ('\\', '/')); }
+        }
+        public string RootDir {
+            get { return System.IO.Path.GetDirectoryName (Path); }
+        }
+
+
+
+        public List<ProjectNode> RootItems {
+            get { return rootItems; }
+        }
+
+        void buildTreeNodes () {
+            ProjectNode root = new ProjectNode (this, ItemType.VirtualGroup, RootNamespace);
+            List<ProjectItem> items = new List<ProjectItem> ();
+            foreach (XmlNode i in nodesItems) {
+                foreach (XmlNode f in i.ChildNodes) {
+                    items.Add (new ProjectItem (this, f));
+                }
+            }
+
+            flattenNodes = new List<ProjectNode> ();
+
+            ProjectNode refs = new ProjectNode (this, ItemType.ReferenceGroup, "References");
+            root.AddChild (refs);
+
+            foreach (ProjectItem pn in items) {
+                switch (pn.Type) {
+                    case ItemType.Reference:
+                        refs.AddChild (pn);
+                        flattenNodes.Add (pn);
+                        break;
+                    case ItemType.ProjectReference:
+                        ProjectReference pr = new ProjectReference (pn);
+                        refs.AddChild (pr);
+                        flattenNodes.Add (pr);
+                        break;
+                    case ItemType.Compile:
+                    case ItemType.None:
+                    case ItemType.EmbeddedResource:
+                        ProjectNode curNode = root;
+                        string[] folds = pn.Path.Split ('/');
+                        for (int i = 0; i < folds.Length - 1; i++) {
+                            ProjectNode nextNode = curNode.ChildNodes.FirstOrDefault (n => n.DisplayName == folds[i] && n.Type == ItemType.VirtualGroup);
+                            if (nextNode == null) {
+                                nextNode = new ProjectNode (this, ItemType.VirtualGroup, folds[i]);
+                                curNode.AddChild (nextNode);
+                            }
+                            curNode = nextNode;
+                        }
+                        ProjectNode f = null;
+                        switch (pn.Extension) {
+                            /*case ".cs":
+                                f = new CSProjectFile (pn);
+                                break;*/
+                            case ".crow":
+                            case ".template":
+                            case ".goml":
+                            case ".itemp":
+                            case ".imtl":
+                                f = new ImlProjectItem (pn);
+                                break;
+                            case ".style":
+                                f = new StyleProjectItem (pn);
+                                break;
+                            default:
+                                f = new ProjectFile (pn);
+                                break;
+                        }
+                        curNode.AddChild (f);
+                        flattenNodes.Add (f);
+                        break;
+                }
+            }
+            root.SortChilds ();
+
+            rootItems = root.ChildNodes;
+        }
+
+        #region Project properties
+        public string ToolsVersion {
+            get { return nodeProject?.Attributes["ToolsVersion"]?.Value; }
+        }
+        public string DefaultTargets {
+            get { return nodeProject?.Attributes["DefaultTargets"]?.Value; }
+        }
+        public string ProjectGuid {
+            get { return solutionProject.ProjectGuid; }
+        }
+        public string AssemblyName {
+            get { return nodeProps["AssemblyName"]?.InnerText; }
+        }
+        public string OutputType {
+            get { return nodeProps["OutputType"]?.InnerText; }
+        }
+        public string RootNamespace {
+            get { return nodeProps["RootNamespace"]?.InnerText; }
+        }
+        public bool AllowUnsafeBlocks {
+            get {
+                return nodeProps["AllowUnsafeBlocks"] == null ? false :
+               bool.Parse (nodeProps["AllowUnsafeBlocks"]?.InnerText);
+            }
+        }
+        public bool NoStdLib {
+            get {
+                return nodeProps["NoStdLib"] == null ? false :
+              bool.Parse (nodeProps["NoStdLib"]?.InnerText);
+            }
+        }
+        public bool TreatWarningsAsErrors {
+            get {
+                return nodeProps["TreatWarningsAsErrors"] == null ? false :
+              bool.Parse (nodeProps["TreatWarningsAsErrors"]?.InnerText);
+            }
+        }
+        public bool SignAssembly {
+            get { return bool.Parse (nodeProps["SignAssembly"]?.InnerText); }
+        }
+        public string TargetFrameworkVersion {
+            get { return nodeProps["TargetFrameworkVersion"]?.InnerText; }
+        }
+        public string Description {
+            get { return nodeProps["Description"]?.InnerText; }
+        }
+        public string OutputPath {
+            get { return nodeProps["OutputPath"]?.InnerText; }
+        }
+        public string IntermediateOutputPath {
+            get { return nodeProps["IntermediateOutputPath"]?.InnerText; }
+        }
+        public string StartupObject {
+            get { return nodeProps["StartupObject"]?.InnerText; }
+        }
+        public bool DebugSymbols {
+            get { return nodeProps["DebugSymbols"] == null ? false : bool.Parse (nodeProps["DebugSymbols"]?.InnerText); }
+        }
+        public int WarningLevel {
+            get { return nodeProps["WarningLevel"] == null ? 0 : int.Parse (nodeProps["WarningLevel"]?.InnerText); }
+        }
+
+        #endregion
+
+
+        public void AddNewFile () {
+            Window.Show (CrowIDE.MainIFace, "#CrowIDE.ui.NewFile.crow", true).DataSource = this;
+        }
+
+        public void Load () {
+
+            xmlDoc = new XmlDocument ();
+            using (Stream ins = new FileStream (this.Path, FileMode.Open)) {
+                xmlDoc.Load (new XmlTextReader (ins) { Namespaces = false });
+            }
+
+            nodeProject = xmlDoc.SelectSingleNode ("Project");
+            XmlNodeList nodesProps = xmlDoc.SelectNodes ("/Project/PropertyGroup");
+
+            foreach (XmlNode n in nodesProps) {
+                if (n.Attributes["Condition"] == null)
+                    nodeProps = n;
+            }
+            nodesItems = xmlDoc.SelectNodes ("/Project/ItemGroup");
+
+            if (ProjectGuid != solutionProject.ProjectGuid)
+                throw new Exception ("Project GUID not matching with solution");
+
+            buildTreeNodes ();
+
+            IsLoaded = true;
+        }
+
+        public void Save () {
+
+        }
+
+        void setAsStartupProject () {
+            solution.StartupProject = this;
+        }
+        static Regex regexDirTokens = new Regex (@"\$\(([^\)]*)\)|([^\$]*)");
+
+        string getDirectoryWithTokens (string dir) {
+            Match m = regexDirTokens.Match (dir);
+            string tmp = "";
+            while (m.Success) {
+                if (m.Value == @"$(SolutionDir)")
+                    tmp = System.IO.Path.Combine (tmp, solution.SolutionFolder);
+                else if (m.Value == @"$(Configuration)")
+                    tmp = System.IO.Path.Combine (tmp, "Debug");
+                else
+                    tmp = System.IO.Path.Combine (tmp, m.Value);
+
+                if (tmp.EndsWith (@"\") || tmp.EndsWith (@"/"))
+                    tmp = tmp.Remove (tmp.Length - 1);
+
+                m = m.NextMatch ();
+            }
+            return tmp;
+        }
+        public string Compile () {
+            if (ParentProject != null)
+                ParentProject.Compile ();
+
+            CSharpCodeProvider cp = new CSharpCodeProvider ();
+            CompilerParameters parameters = new CompilerParameters ();
+
+            foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
+                Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
+                if (p == null)
+                    throw new Exception ("referenced project not found");
+                parameters.ReferencedAssemblies.Add (p.Compile ());
+            }
+
+            string outputDir = getDirectoryWithTokens (this.OutputPath);
+            string objDir = getDirectoryWithTokens (this.IntermediateOutputPath);
+
+            Directory.CreateDirectory (outputDir);
+            Directory.CreateDirectory (objDir);
+
+            parameters.OutputAssembly = System.IO.Path.Combine (outputDir, this.AssemblyName);
+
+            // True - exe file generation, false - dll file generation
+            if (this.OutputType == "Library") {
+                parameters.GenerateExecutable = false;
+                parameters.CompilerOptions += " /target:library";
+                parameters.OutputAssembly += ".dll";
+            } else {
+                parameters.GenerateExecutable = true;
+                parameters.CompilerOptions += " /target:exe";
+                parameters.OutputAssembly += ".exe";
+                parameters.MainClass = this.StartupObject;
+            }
+
+            parameters.GenerateInMemory = false;
+            parameters.IncludeDebugInformation = this.DebugSymbols;
+            parameters.TreatWarningsAsErrors = this.TreatWarningsAsErrors;
+            parameters.WarningLevel = this.WarningLevel;
+            parameters.CompilerOptions += " /noconfig";
+            if (this.AllowUnsafeBlocks)
+                parameters.CompilerOptions += " /unsafe";
+            parameters.CompilerOptions += " /delaysign+";
+            parameters.CompilerOptions += " /debug:full /debug+";
+            parameters.CompilerOptions += " /optimize-";
+            parameters.CompilerOptions += " /define:\"DEBUG;TRACE\"";
+            parameters.CompilerOptions += " /nostdlib";
+
+
+
+            foreach (ProjectItem pi in flattenNodes.Where (p => p.Type == ItemType.Reference)) {
+
+                if (string.IsNullOrEmpty (pi.HintPath)) {
+                    parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/" + pi.Path + ".dll";
+                    continue;
+                }
+                parameters.ReferencedAssemblies.Add (pi.Path);
+                string fullHintPath = System.IO.Path.GetFullPath (System.IO.Path.Combine (RootDir, pi.HintPath.Replace ('\\', '/')));
+                if (File.Exists (fullHintPath)) {
+                    string outPath = System.IO.Path.Combine (outputDir, System.IO.Path.GetFileName (fullHintPath));
+                    if (!File.Exists (outPath))
+                        File.Copy (fullHintPath, outPath);
+                }
+            }
+            parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/System.Core.dll";
+            parameters.CompilerOptions += " /reference:/usr/lib/mono/4.5/mscorlib.dll";
+            //parameters.ReferencedAssemblies.Add ("System.Core");
+            //parameters.ReferencedAssemblies.Add ("mscorlib.dll");
+
+
+            IEnumerable<ProjectFile> pfs = flattenNodes.OfType<ProjectFile> ();
+
+            foreach (ProjectFile pi in pfs.Where (p => p.Type == ItemType.EmbeddedResource)) {
+
+                string absPath = pi.AbsolutePath;
+                string logicName = pi.LogicalName;
+                if (string.IsNullOrEmpty (logicName))
+                    parameters.CompilerOptions += string.Format (" /resource:{0},{1}", absPath, this.Name + "." + pi.Path.Replace ('/', '.'));
+                else
+                    parameters.CompilerOptions += string.Format (" /resource:{0},{1}", absPath, logicName);
+            }
+            foreach (ProjectFile pi in pfs.Where (p => p.Type == ItemType.None)) {
+                if (pi.CopyToOutputDirectory == CopyToOutputState.Never)
+                    continue;
+                string source = pi.AbsolutePath;
+                string target = System.IO.Path.Combine (outputDir, pi.Path);
+                Directory.CreateDirectory (System.IO.Path.GetDirectoryName (target));
+
+                if (File.Exists (target)) {
+                    if (pi.CopyToOutputDirectory == CopyToOutputState.PreserveNewest) {
+                        if (DateTime.Compare (
+                                System.IO.File.GetLastWriteTime (source),
+                                System.IO.File.GetLastWriteTime (target)) < 0)
+                            continue;
+                    }
+                    File.Delete (target);
+                }
+                System.Diagnostics.Debug.WriteLine ("copy " + source + " to " + target);
+                File.Copy (source, target);
+            }
+            string[] files = pfs.Where (p => p.Type == ItemType.Compile).Select (p => p.AbsolutePath).ToArray ();
+
+            System.Diagnostics.Debug.WriteLine ("---- start compilation of :" + parameters.OutputAssembly);
+            System.Diagnostics.Debug.WriteLine (parameters.CompilerOptions);
+
+            CompilationResults = cp.CompileAssemblyFromFile (parameters, files);
+
+            solution.UpdateErrorList ();
+
+            return parameters.OutputAssembly;
+        }
+
+        public bool TryGetProjectFileFromAbsolutePath (string absolutePath, out ProjectFile pi) {
+            pi = flattenNodes.OfType<ProjectFile> ().FirstOrDefault
+                (pp => pp.AbsolutePath == absolutePath);
+            return pi != null;
+        }
+        public bool TryGetProjectFileFromPath (string path, out ProjectFile pi) {
+            if (path.StartsWith ("#", StringComparison.Ordinal))
+                pi = flattenNodes.OfType<ProjectFile> ().FirstOrDefault
+                    (pp => pp.Type == ItemType.EmbeddedResource && pp.ResourceID == path.Substring (1));
+            else
+                pi = flattenNodes.OfType<ProjectFile> ().FirstOrDefault (pp => pp.Path == path);
+
+            if (pi != null)
+                return true;
+
+            foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
+                Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
+                if (p == null)
+                    throw new Exception ("referenced project not found");
+                if (p.TryGetProjectFileFromPath (path, out pi))
+                    return true;
+            }
+            //TODO: search referenced assemblies
+            return false;
+        }
+
+        public void GetDefaultTemplates () {
+            IEnumerable<ProjectFile> tmpFiles =
+                flattenNodes.OfType<ProjectFile> ().Where (pp => pp.Extension == ".template");
+
+            foreach (ProjectFile pi in tmpFiles.Where (
+                pp => pp.Type == ItemType.None && pp.CopyToOutputDirectory != CopyToOutputState.Never)) {
+
+                string clsName = System.IO.Path.GetFileNameWithoutExtension (pi.Path);
+                if (solution.DefaultTemplates.ContainsKey (clsName))
+                    continue;
+                solution.DefaultTemplates[clsName] = pi.AbsolutePath;
+            }
+            foreach (ProjectFile pi in tmpFiles.Where (pp => pp.Type == ItemType.EmbeddedResource)) {
+                string resId = pi.ResourceID;
+                string clsName = resId.Substring (0, resId.Length - 9);
+                if (solution.DefaultTemplates.ContainsKey (clsName))
+                    continue;
+                solution.DefaultTemplates[clsName] = pi.Path;
+            }
+
+            foreach (Project p in ReferencedProjects)
+                p.GetDefaultTemplates ();
+        }
+        //             void searchTemplatesIn(Assembly assembly){
+        //                     if (assembly == null)
+        //                             return;
+        //                     foreach (string resId in assembly
+        //                             .GetManifestResourceNames ()
+        //                             .Where (r => r.EndsWith (".template", StringComparison.OrdinalIgnoreCase))) {
+        //                             string clsName = resId.Substring (0, resId.Length - 9);
+        //                             if (DefaultTemplates.ContainsKey (clsName))
+        //                                     continue;
+        //                             DefaultTemplates[clsName] = "#" + resId;
+        //                     }
+        //             }
+
+        public List<Project> ReferencedProjects {
+            get {
+                List<Project> tmp = new List<Project> ();
+                foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
+                    Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
+                    if (p != null)
+                        tmp.Add (p);
+                }
+                return tmp;
+            }
+        }
+
+        public void GetStyling () {
+            try {
+                foreach (ProjectFile pi in flattenNodes.OfType<ProjectFile> ().Where (pp => pp.Type == ItemType.EmbeddedResource && pp.Extension == ".style")) {
+                    using (Stream s = new MemoryStream (System.Text.Encoding.UTF8.GetBytes (pi.Source))) {
+                        new StyleReader (solution.Styling, s, pi.ResourceID);
+                    }
+                }
+            } catch (Exception ex) {
+                Console.WriteLine (ex.ToString ());
+            }
+            foreach (ProjectReference pr in flattenNodes.OfType<ProjectReference> ()) {
+                Project p = solution.Projects.FirstOrDefault (pp => pp.ProjectGuid == pr.ProjectGUID);
+                if (p == null)
+                    throw new Exception ("referenced project not found");
+                p.GetStyling ();
+            }
+
+            //TODO:get styling from referenced assemblies
+        }
+    }
+}
+
diff --git a/CrowIDE/src/ProjectTree/CSProjectFile.cs b/CrowIDE/src/ProjectTree/CSProjectFile.cs
new file mode 100644 (file)
index 0000000..586e226
--- /dev/null
@@ -0,0 +1,72 @@
+//
+// ProjectNodes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+
+namespace Crow.Coding
+{
+       public class CSProjectFile : ProjectFile
+       {
+        CSharpSyntaxTree tree;
+
+
+        #region CTOR
+        public CSProjectFile (ProjectItem pi) : base (pi){                     
+               }
+        #endregion
+
+        public override void UpdateSource(object sender, string newSrc)
+        {
+            base.UpdateSource(sender, newSrc);
+
+            tree = (CSharpSyntaxTree)CSharpSyntaxTree.ParseText (Source, CSharpParseOptions.Default);
+        }
+
+        public override void Open () {
+            base.Open ();
+
+            tree = (CSharpSyntaxTree)CSharpSyntaxTree.ParseText (Source, CSharpParseOptions.Default);
+
+                       CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot ();
+                       MemberDeclarationSyntax firstMember = root.Members [0];
+
+                       Console.WriteLine ( firstMember.GetType().FullName);
+
+                       SyntaxToken tok = root.GetFirstToken();
+                       
+                       while (tok.Value != null) {
+                               Console.Write (tok.Text);
+                               tok = tok.GetNextToken (true,true);
+                       }
+                       Console.Out.Flush ();
+        }
+
+
+    }
+}
+
diff --git a/CrowIDE/src/ProjectTree/ImlProjectItem.cs b/CrowIDE/src/ProjectTree/ImlProjectItem.cs
new file mode 100644 (file)
index 0000000..8487f83
--- /dev/null
@@ -0,0 +1,89 @@
+//
+// ProjectNodes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using System.IO;
+using Crow;
+using System.Threading;
+
+namespace Crow.Coding
+{
+       public class ImlProjectItem : ProjectFile
+       {
+               #region CTOR
+               public ImlProjectItem (ProjectItem pi) : base (pi){                     
+               }
+               #endregion
+
+               Widget instance;
+               Measure designWidth, designHeight;
+
+               /// <summary>
+               /// instance created with an instantiator from the source by a DesignInterface,
+               /// for now, the one in ImlVisualEditor
+               /// </summary>
+               public Widget Instance {
+                       get { return instance; }
+                       set {
+                               if (instance == value)
+                                       return;
+                               instance = value;
+                               NotifyValueChanged ("Instance", instance);
+                       }
+               }
+                       
+               public Measure DesignWidth {
+                       get { return designWidth; }
+                       set { 
+                               if (designWidth == value)
+                                       return;
+                               designWidth = value;
+                               NotifyValueChanged ("DesignWidth", designWidth);
+                       }
+               }
+               public Measure DesignHeight {
+                       get { return designHeight; }
+                       set {
+                               if (designHeight == value)
+                                       return;
+                               designHeight = value;
+                               NotifyValueChanged ("DesignHeight", designHeight);
+                       }
+               }
+
+
+               public List<Widget> GraphicTree { 
+                       get { return new List<Widget> (new Widget[] {instance}); }
+               }
+
+               void GTView_SelectedItemChanged (object sender, SelectionChangeEventArgs e){
+                       SelectedItem = e.NewValue;
+               }
+       }
+}
+
diff --git a/CrowIDE/src/ProjectTree/ProjectFile.cs b/CrowIDE/src/ProjectTree/ProjectFile.cs
new file mode 100644 (file)
index 0000000..294a28f
--- /dev/null
@@ -0,0 +1,323 @@
+//
+// ProjectNodes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading;
+using System.Xml;
+
+namespace Crow.Coding {
+    public class ProjectFile : ProjectItem {           
+               bool isOpened = false;
+               DateTime accessTime;
+               string source;
+               string origSource;
+               object selectedItem;
+               int curLine, curColumn;
+
+               internal ReaderWriterLockSlim srcEditMtx = new ReaderWriterLockSlim();
+
+               public Dictionary<object, bool> RegisteredEditors = new Dictionary<object, bool>();
+               List<String> undoStack = new List<string>();
+               List<String> redoStack = new List<string>();
+
+               public Crow.Command cmdSave, cmdSaveAs, cmdOpen, cmdClose, cmdUndo, cmdRedo;
+
+               void initCommands (){
+                       cmdSave = new Crow.Command (new Action (() => Save ()))
+                       { Caption = "Save", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = false };
+                       cmdSaveAs = new Crow.Command (new Action (() => SaveAs ()))
+                       { Caption = "Save As ..", Icon = new SvgPicture ("#CrowIDE.icons.save.svg"), CanExecute = false };
+                       cmdOpen = new Crow.Command (new Action (() => Open ())) 
+                       { Caption = "Open", Icon = new SvgPicture ("#CrowIDE.icons.open.svg"), CanExecute = true };
+                       cmdClose = new Crow.Command (new Action (() => OnQueryClose (this,null))) 
+                       { Caption = "Close", Icon = new SvgPicture ("#CrowIDE.icons.open.svg"), CanExecute = false };
+                       cmdUndo = new Crow.Command (new Action (() => Undo (null))) 
+                       { Caption = "Undo", Icon = new SvgPicture ("#CrowIDE.icons.undo.svg"), CanExecute = false };
+                       cmdRedo = new Crow.Command (new Action (() => Redo (null))) 
+                       { Caption = "Redo", Icon = new SvgPicture ("#CrowIDE.icons.redo.svg"), CanExecute = false };
+
+                       Commands.Insert (0, cmdOpen);
+                       Commands.Insert (1, cmdSave);
+                       Commands.Insert (2, cmdSaveAs);
+                       Commands.Insert (3, cmdUndo);
+                       Commands.Insert (4, cmdRedo);
+                       Commands.Add (cmdClose);
+               }
+               public ProjectFile () {
+                       initCommands();
+               }
+               public ProjectFile (ProjectItem pi)
+                       : base (pi.Project, pi.node) {
+                       initCommands ();
+               }
+
+               public string ResourceID {
+                       get {                           
+                               return Type != ItemType.EmbeddedResource ? null :
+                                       node.SelectSingleNode ("LogicalName") == null ?
+                                       Project.Name + "." + Path.Replace ('/', '.') :
+                                       LogicalName;
+                       }
+               }
+               public string LogicalName {
+                       get {
+                               return node.SelectSingleNode ("LogicalName")?.InnerText;
+                       }
+               }
+               public bool IsOpened {
+                       get { return isOpened; }
+                       set {
+                               if (isOpened == value)
+                                       return;
+                               isOpened = value;
+
+                               cmdOpen.CanExecute = !isOpened;
+                               cmdClose.CanExecute = isOpened;
+                               cmdSave.CanExecute = isOpened && IsDirty;
+
+                               if (isOpened) 
+                                       Project.solution.OpenItem (this);
+                               else
+                                       Project.solution.CloseItem (this);                              
+
+                               NotifyValueChanged ("IsOpened", isOpened);
+                       }
+               }
+
+               public void UnregisterEditor (object editor){
+                       lock(RegisteredEditors){
+                               RegisteredEditors.Remove (editor);
+                       }
+               }
+               public void RegisterEditor (object editor) {
+                       lock(RegisteredEditors){
+                               RegisteredEditors.Add (editor, false);
+                       }
+               }
+               public virtual void UpdateSource (object sender, string newSrc){
+                       System.Diagnostics.Debug.WriteLine ("update source by {0}", sender);
+                       Source = newSrc;
+                       signalOtherRegisteredEditors (sender);
+               }
+               public void SignalEditorOfType<T> (){
+                       lock (RegisteredEditors) {
+                               object[] keys = RegisteredEditors.Keys.ToArray ();
+                               foreach (object ed in keys) {
+                                       T editor = (T)ed;
+                                       if (editor == null)
+                                               continue;
+                                       RegisteredEditors [editor] = false;
+                                       break;
+                               }
+                       }
+               }
+               protected void signalOtherRegisteredEditors (object sender) {
+                       lock (RegisteredEditors) {
+                               object[] keys = RegisteredEditors.Keys.ToArray ();
+                               foreach (object editor in keys) {
+                                       if (editor != sender)
+                                               RegisteredEditors [editor] = false;
+                               }
+                       }
+               }
+               public string Source {
+                       get {
+                               if (!IsOpened) {
+                                       using (StreamReader sr = new StreamReader (AbsolutePath))
+                                               source = sr.ReadToEnd ();
+                                       
+                               } else {
+                                       if (DateTime.Compare (
+                                                   accessTime,
+                                                   System.IO.File.GetLastWriteTime (AbsolutePath)) < 0)
+                                               Console.WriteLine ("File has been modified outside CrowIDE");
+                               }
+                               return source;
+                       }
+                       set {
+                               if (source == value)
+                                       return;
+                               
+                               srcEditMtx.EnterWriteLock ();
+
+                               undoStack.Add (source);
+                               cmdUndo.CanExecute = true;
+                               redoStack.Clear ();
+                               cmdRedo.CanExecute = false;
+                               source = value;
+
+                               NotifyValueChanged ("Source", source);
+                               NotifyValueChanged ("IsDirty", IsDirty);
+
+                               cmdSave.CanExecute = cmdSaveAs.CanExecute = IsDirty;
+
+                               srcEditMtx.ExitWriteLock ();
+                       }
+               }
+               public bool IsDirty {
+                       get { return source != origSource; }
+               }
+               public int CurrentColumn{
+                       get { return curColumn; }
+                       set {
+                               if (curColumn == value)
+                                       return;
+                               curColumn = value;
+                               NotifyValueChanged ("CurrentColumn", curColumn);
+                       }
+               }
+               public int CurrentLine{
+                       get { return curLine; }
+                       set {
+                               if (curLine == value)
+                                       return;
+                               curLine = value;
+                               NotifyValueChanged ("CurrentLine", curLine);
+                       }
+               }
+
+               public object SelectedItem {
+                       get { return selectedItem; }
+                       set {
+                               if (selectedItem == value)
+                                       return;
+                               selectedItem= value;
+                               Project.solution.SelectedItemElement = value;
+                               NotifyValueChanged ("SelectedItem", selectedItem);
+                       }
+               }
+
+               public CopyToOutputState CopyToOutputDirectory {
+                       get {
+                               XmlNode xn = node.SelectSingleNode ("CopyToOutputDirectory");
+                               return xn == null ? CopyToOutputState.Never :
+                                       (CopyToOutputState)Enum.Parse (typeof(CopyToOutputState), xn.InnerText, true);
+                       }
+               }
+
+               public virtual void Open () {                   
+                       accessTime = System.IO.File.GetLastWriteTime (AbsolutePath);
+                       using (StreamReader sr = new StreamReader (AbsolutePath)) {
+                               source = sr.ReadToEnd ();
+                       }
+                       origSource = source;
+                       IsOpened = true;
+                       NotifyValueChanged ("IsDirty", false);
+               }
+               public virtual void Save () {
+                       if (!IsDirty)
+                               return;
+                       using (StreamWriter sw = new StreamWriter (AbsolutePath)) {
+                               sw.Write (source);
+                       }
+                       origSource = source;
+                       NotifyValueChanged ("IsDirty", false);
+               }
+               public virtual void SaveAs () {
+                       if (!IsDirty)
+                               return;
+                       using (StreamWriter sw = new StreamWriter (AbsolutePath)) {
+                               sw.Write (source);
+                       }
+                       origSource = source;
+                       NotifyValueChanged ("IsDirty", false);
+               }
+               public void Close () {
+                       origSource = source = null;
+                       IsOpened = false;
+               }
+               public void Undo(object sender){
+                       undo();
+                       signalOtherRegisteredEditors (sender);
+               }
+               public void Redo(object sender){
+                       redo();
+                       signalOtherRegisteredEditors (sender);
+               }
+
+               void undo () {                  
+                       if (undoStack.Count == 0)
+                               return;
+                       
+                       srcEditMtx.EnterWriteLock ();
+                       string step = undoStack [undoStack.Count -1];
+                       redoStack.Add (source);
+                       cmdRedo.CanExecute = true;
+                       undoStack.RemoveAt(undoStack.Count -1);
+
+                       source = step;
+
+                       NotifyValueChanged ("Source", source);
+                       NotifyValueChanged ("IsDirty", IsDirty);
+                       cmdSave.CanExecute = IsDirty;
+
+                       if (undoStack.Count == 0)
+                               cmdUndo.CanExecute = false;
+                       srcEditMtx.ExitWriteLock ();
+               }
+
+               void redo () {
+                       if (redoStack.Count == 0)
+                               return;
+                       srcEditMtx.EnterWriteLock ();
+                       string step = redoStack [redoStack.Count -1];
+                       undoStack.Add (source);
+                       cmdUndo.CanExecute = true;
+                       redoStack.RemoveAt(redoStack.Count -1);
+                       source = step;
+                       NotifyValueChanged ("Source", source);
+                       NotifyValueChanged ("IsDirty", IsDirty);
+                       cmdSave.CanExecute = IsDirty;
+
+                       if (redoStack.Count == 0)
+                               cmdRedo.CanExecute = false;
+                       srcEditMtx.ExitWriteLock ();
+
+               }
+
+               public void onDoubleClick (object sender, MouseButtonEventArgs e){
+                       if (IsOpened)
+                               return;
+                       Open ();
+               }
+
+               public void onClick (object sender, MouseButtonEventArgs e){
+                       IsSelected = true;
+               }
+               public void OnQueryClose (object sender, EventArgs e){
+                       if (IsDirty) {
+                               MessageBox mb = MessageBox.ShowModal (CrowIDE.MainIFace,
+                                                       MessageBox.Type.YesNoCancel, $"{DisplayName} has unsaved changes.\nSave it now?");
+                               mb.Yes += (object _sender, EventArgs _e) => { Save (); Close (); };
+                               mb.No += (object _sender, EventArgs _e) => Close();
+                       } else
+                               Close ();
+               }
+       }
+}
+
diff --git a/CrowIDE/src/ProjectTree/ProjectItem.cs b/CrowIDE/src/ProjectTree/ProjectItem.cs
new file mode 100644 (file)
index 0000000..afa3e3e
--- /dev/null
@@ -0,0 +1,116 @@
+//
+// ProjectNodes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using System.IO;
+using Crow;
+using System.Threading;
+
+namespace Crow.Coding
+{      
+       public class ProjectItem : ProjectNode {
+               #region CTOR
+               public ProjectItem() {}
+               public ProjectItem (Project project, XmlNode _node) : base (project){
+                       node = _node;
+               }
+               #endregion
+
+               public XmlNode node;
+
+        public override Picture Icon {
+            get {
+                switch (Extension)
+                {
+                    case ".cs":
+                        return new SvgPicture("#CrowIDE.icons.cs-file.svg");
+                    case ".crow":                        
+                        return new SvgPicture("#CrowIDE.icons.xml-file.svg");
+                    case ".xml":
+                        return new SvgPicture("#CrowIDE.icons.xml-file.svg");
+                    default:
+                        return base.Icon;
+                }
+            }
+        }
+
+        public string Extension {
+                       get { return System.IO.Path.GetExtension (Path); }
+               }
+               public string Path {
+                       get {
+                               return node.Attributes["Include"]?.Value.Replace('\\','/');
+                       }
+               }
+               public string AbsolutePath {
+                       get {
+                               return System.IO.Path.Combine (Project.RootDir, Path);
+                       }
+               }
+               public override ItemType Type {
+                       get { 
+                               return (ItemType)Enum.Parse (typeof(ItemType), node.Name, true);
+                       }
+               }
+               public override string DisplayName {
+                       get { 
+                               return Type == ItemType.Reference ?
+                                       Path :
+                                       Path.Split ('/').LastOrDefault();
+                       }
+               }
+               public string HintPath {
+                       get { return node.SelectSingleNode ("HintPath")?.InnerText; }
+               }
+
+               public override bool IsSelected {
+                       get {
+                               return isSelected;
+                       }
+                       set {
+                               if (value == isSelected)
+                                       return;
+
+                               isSelected = value;
+
+                               NotifyValueChanged ("IsSelected", isSelected);
+
+                               if (isSelected) {
+                                       Project.solution.SelectedItem = this;
+                                       Project.IsExpanded = true;
+                                       ProjectNode pn = Parent;
+                                       while (pn != null) {
+                                               pn.IsExpanded = true;
+                                               pn = pn.Parent;
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
diff --git a/CrowIDE/src/ProjectTree/ProjectNodes.cs b/CrowIDE/src/ProjectTree/ProjectNodes.cs
new file mode 100644 (file)
index 0000000..bafb9cb
--- /dev/null
@@ -0,0 +1,159 @@
+//
+// ProjectNodes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using System.IO;
+using Crow;
+using System.Threading;
+
+namespace Crow.Coding
+{
+       public enum ItemType {
+               ReferenceGroup,
+               Reference,
+               ProjectReference,
+               VirtualGroup,
+               Folder,
+               None,
+               Compile,
+               EmbeddedResource,
+       }
+       public enum CopyToOutputState {
+               Never,
+               Always,
+               PreserveNewest
+       }
+       public class ProjectNode  : IValueChange
+       {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               #region CTOR
+               public ProjectNode (Project project, ItemType _type, string _name) : this(project){                     
+                       type = _type;
+                       name = _name;
+                       initCommands ();
+               }
+               public ProjectNode (Project project){
+                       Project = project;
+                       initCommands ();
+               }
+               public ProjectNode (){
+                       initCommands ();
+               }
+               #endregion
+
+               void initCommands () {
+                       Commands = new List<Crow.Command> ();
+               }
+
+               ProjectNode parent;
+               bool isExpanded;
+               protected bool isSelected;
+               ItemType type;
+               string name;
+               List<ProjectNode> childNodes = new List<ProjectNode>();
+
+               public Project Project;
+               public List<Crow.Command> Commands;//list of command available for that node
+
+               public virtual Crow.Picture Icon {
+                       get {
+                               switch (Type) {
+                               case ItemType.Reference:
+                                       return new SvgPicture ("#Crow.Icons.assembly.svg");
+                               case ItemType.ProjectReference:
+                                       return new SvgPicture("#Crow.Icons.projectRef.svg"); 
+                               default:
+                                       return new SvgPicture("#CrowIDE.icons.blank-file.svg"); 
+                               }
+                       }
+               }
+               public ProjectNode Parent {
+                       get { return parent; }
+                       set { parent = value; }
+               }
+               public virtual ItemType Type {
+                       get { return type; }
+               }
+               public virtual string DisplayName {
+                       get { return name; }
+               }
+               public List<ProjectNode> ChildNodes {
+                       get { return childNodes;        }
+               }
+               public void AddChild (ProjectNode pn) {
+                       childNodes.Add(pn);
+                       pn.Parent = this;
+               }
+               public void RemoveChild (ProjectNode pn){
+                       pn.Parent = null;
+                       childNodes.Remove (pn);
+               }
+               public void SortChilds () {
+                       foreach (ProjectNode pn in childNodes)
+                               pn.SortChilds ();                       
+                       childNodes = childNodes.OrderBy(c=>c.Type).ThenBy(cn=>cn.DisplayName).ToList();
+               }
+
+               public bool IsExpanded
+               {
+                       get { return isExpanded; }
+                       set
+                       {
+                               if (value == isExpanded)
+                                       return;
+                               isExpanded = value;
+                               NotifyValueChanged ("IsExpanded", isExpanded);
+                       }
+               }
+               public virtual bool IsSelected
+               {
+                       get { return isSelected; }
+                       set
+                       {
+                               if (value == isSelected)
+                                       return;
+                               
+                               isSelected = value;
+
+                               NotifyValueChanged ("IsSelected", isSelected);
+                       }
+               }
+               public override string ToString ()
+               {
+                       return DisplayName;
+               }
+       }
+}
+
diff --git a/CrowIDE/src/ProjectTree/ProjectReference.cs b/CrowIDE/src/ProjectTree/ProjectReference.cs
new file mode 100644 (file)
index 0000000..8487074
--- /dev/null
@@ -0,0 +1,51 @@
+//
+// ProjectNodes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using System.IO;
+using Crow;
+using System.Threading;
+
+namespace Crow.Coding
+{      
+       public class ProjectReference : ProjectItem {
+               public ProjectReference (ProjectItem pi) : base (pi.Project, pi.node){
+               }
+               public string ProjectGUID {
+                       get {
+                               return node.SelectSingleNode ("Project")?.InnerText;
+                       }
+               }
+               public override string DisplayName {
+                       get {
+                               return node.SelectSingleNode ("Name").InnerText;
+                       }
+               }
+       }
+}
+
diff --git a/CrowIDE/src/ProjectTree/StyleProjectItem.cs b/CrowIDE/src/ProjectTree/StyleProjectItem.cs
new file mode 100644 (file)
index 0000000..1de77cd
--- /dev/null
@@ -0,0 +1,50 @@
+//
+// ProjectNodes.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Xml;
+using System.IO;
+using Crow;
+using System.Threading;
+
+namespace Crow.Coding
+{
+       public class StyleProjectItem : ProjectFile
+       {
+               #region CTOR
+               public StyleProjectItem (ProjectItem pi) : base (pi){                   
+               }
+               #endregion
+
+               public override void UpdateSource (object sender, string newSrc)
+               {
+                       base.UpdateSource (sender, newSrc);
+                       Project.solution.ReloadStyling ();
+               }
+       }
+}
+
diff --git a/CrowIDE/src/Solution.cs b/CrowIDE/src/Solution.cs
new file mode 100644 (file)
index 0000000..c6b1fbc
--- /dev/null
@@ -0,0 +1,541 @@
+//
+// Solution.cs
+//
+//code taken in project https://sourceforge.net/projects/syncproj/
+// no licence info was included, I took the liberty to modify it.
+// Author:
+//             tarmopikaro
+//      2018 Jean-Philippe Bruyère
+//MIT-licenced
+
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics.CodeAnalysis;
+using System.Globalization;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Xml.Serialization;
+using Crow;
+
+namespace Crow.Coding{ 
+       public class SolutionProject {
+               public string ProjectHostGuid;
+               public string ProjectName;
+               public string RelativePath;
+               public string ProjectGuid;
+       }
+       public class StyleItemContainer {
+               public object Value;
+               public string Name;
+               public StyleItemContainer(string name, object _value){
+                       Name = name;
+                       Value = _value;
+               }
+       }
+       public class StyleContainer : IValueChange {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               Style style;
+               bool isExpanded;
+
+               public string Name;
+               public List<StyleItemContainer> Items;
+               public bool IsExpanded
+               {
+                       get { return isExpanded; }
+                       set
+                       {
+                               if (value == isExpanded)
+                                       return;
+                               isExpanded = value;
+                               NotifyValueChanged ("IsExpanded", isExpanded);
+                       }
+               }
+               public StyleContainer(string name, Style _style){
+                       Name = name;
+                       style = _style;
+
+                       Items = new List<StyleItemContainer> ();
+                       foreach (string k in style.Keys) {
+                               Items.Add(new StyleItemContainer(k, style[k]));
+                       }
+               }
+       }
+
+
+       /// <summary>
+/// .sln loaded into class.
+/// </summary>
+       public class Solution: IValueChange
+       {
+               #region IValueChange implementation
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               ProjectItem selectedItem = null;
+               object selectedItemElement = null;
+               ObservableList<ProjectItem> openedItems = new ObservableList<ProjectItem>();
+               ObservableList<GraphicObjectDesignContainer> toolboxItems;
+
+               public Dictionary<string, Style> Styling;
+               public Dictionary<string, string> DefaultTemplates;
+
+               public List<Style> Styles { get { return Styling.Values.ToList(); }}
+               public List<StyleContainer> StylingContainers;
+               //TODO: check project dependencies if no startup proj
+
+               public void ReloadStyling () {
+                       Styling = new Dictionary<string, Style> ();
+                       if (StartupProject != null)
+                               StartupProject.GetStyling ();
+//                     StylingContainers = new List<StyleContainer> ();
+//                     foreach (string k in Styling.Keys) {
+//                             StylingContainers.Add (new StyleContainer (k, Styling [k]));
+//                     }
+                       foreach (ImlProjectItem pf in openedItems.OfType<ImlProjectItem>()) {
+                               pf.SignalEditorOfType<ImlVisualEditor> ();
+                       }
+               }
+               public string[] AvailaibleStyles {
+                       get { return Styling == null ? new string[] {} : Styling.Keys.ToArray();}
+               }
+               public void ReloadDefaultTemplates () {
+                       DefaultTemplates = new Dictionary<string, string>();
+                       if (StartupProject != null)
+                               StartupProject.GetDefaultTemplates ();
+               }
+               public void updateToolboxItems () {
+                       Type[] crowItems = AppDomain.CurrentDomain.GetAssemblies ()
+                               .SelectMany (t => t.GetTypes ())
+                               .Where (t => t.IsClass && !t.IsAbstract && t.IsPublic &&                                        
+                                       t.Namespace == "Crow" && t.IsSubclassOf(typeof(Widget)) &&
+                                       t.GetCustomAttribute<DesignIgnore>(false) == null).ToArray ();
+                       ToolboxItems = new ObservableList<GraphicObjectDesignContainer> ();
+                       foreach (Type ci in crowItems) {
+                               toolboxItems.AddElement(new GraphicObjectDesignContainer(ci));
+                       }
+               }
+               public bool GetProjectFileFromPath (string path, out ProjectFile pi){
+                       pi = null;
+                       return StartupProject == null ? false :
+                               StartupProject.TryGetProjectFileFromPath (path, out pi);
+               }
+
+               public ObservableList<ProjectItem> OpenedItems {
+                       get { return openedItems; }
+                       set {
+                               if (openedItems == value)
+                                       return;
+                               openedItems = value;
+                               NotifyValueChanged ("OpenedItems", openedItems);
+                       }
+               }
+
+               public ObservableList<GraphicObjectDesignContainer> ToolboxItems {
+                       get { return toolboxItems; }
+                       set {
+                               if (toolboxItems == value)
+                                       return;
+                               toolboxItems = value;
+                               NotifyValueChanged ("ToolboxItems", toolboxItems);
+                       }                       
+               }
+               public ProjectItem SelectedItem {
+                       get { return selectedItem; }
+                       set {
+                               if (selectedItem == value)
+                                       return;
+                               if (SelectedItem != null)
+                                       SelectedItem.IsSelected = false;
+                               selectedItem = value;
+                               if (SelectedItem != null) 
+                                       SelectedItem.IsSelected = true;
+
+                               UserConfig.Set ("SelectedProjItems", SelectedItem?.AbsolutePath);
+
+                               NotifyValueChanged ("SelectedItem", selectedItem);
+                       }
+               }
+               public object SelectedItemElement {
+                       get { return selectedItemElement; }
+                       set {
+                               if (selectedItemElement == value)
+                                       return;
+                               selectedItemElement = value;
+                               NotifyValueChanged ("SelectedItemElement", selectedItemElement);
+                       }
+               }
+               public string DisplayName {
+                       get { return name; }
+               }
+               /// <summary>
+               /// Gets solution path
+               /// </summary>
+               public String SolutionFolder
+               {
+                       get { return Path.GetDirectoryName (path); }
+               }
+
+//             public System.CodeDom.Compiler.CompilerErrorCollection CompilationErrors {
+//                     get {
+//                             System.CodeDom.Compiler.CompilerErrorCollection tmp = Projects.SelectMany<Project>
+//                                     (p => p.CompilationResults.Errors);
+//                             return tmp;
+//                     }
+//             }
+               public List<System.CodeDom.Compiler.CompilerError> CompilerErrors {
+                       get {
+                               int errCount = 0;
+                               for (int i = 0; i < Projects.Count; i++) {
+                                       if (Projects [i].CompilationResults != null)
+                                               errCount += Projects [i].CompilationResults.Errors.Count;
+                               }
+                               System.CodeDom.Compiler.CompilerError[] tmp = new System.CodeDom.Compiler.CompilerError[errCount];
+
+                               int ptr = 0;
+                               for (int i = 0; i < Projects.Count; i++) {
+                                       if (Projects [i].CompilationResults == null)
+                                               continue;
+                                       Projects [i].CompilationResults.Errors.CopyTo (tmp,ptr);
+                                       ptr += Projects [i].CompilationResults.Errors.Count;
+                               }
+                               return new List<System.CodeDom.Compiler.CompilerError>(tmp);
+                       }
+               }
+
+               public void UpdateErrorList () {
+                       NotifyValueChanged ("CompilerErrors", CompilerErrors);
+               }
+
+               void saveOpenedItemsInUserConfig (){
+                       if (openedItems.Count == 0)
+                               UserConfig.Set ("OpenedItems", "");
+                       else
+                               UserConfig.Set ("OpenedItems", openedItems.Select(o => o.AbsolutePath).Aggregate((a,b)=>a + ";" + b));
+               }
+               public void ReopenItemsSavedInUserConfig () {
+                       string tmp = UserConfig.Get<string> ("OpenedItems");
+                       string sel = UserConfig.Get<string> ("SelectedProjItems");
+                       ProjectFile selItem = null;
+                       if (string.IsNullOrEmpty (tmp))
+                               return;
+                       foreach (string f in tmp.Split(';')) {
+                               foreach (Project p in Projects) {
+                                       ProjectFile pi;
+                                       if (p.TryGetProjectFileFromAbsolutePath (f, out pi)) {
+                                               pi.Open ();
+                                               if (pi.AbsolutePath == sel)
+                                                       selItem = pi;
+                                               break;
+                                       }
+                               }
+                       }
+                       if (selItem == null)
+                               return;
+                       selItem.IsSelected = true;
+               }
+
+               /*void onSelectedItemChanged (object sender, SelectionChangeEventArgs e){                                                       
+                       SelectedItem = e.NewValue as ProjectItem;
+                       UserConfig.Set ("SelectedProjItems", SelectedItem?.AbsolutePath);
+               }*/
+
+               public void OpenItem (ProjectItem pi) {
+                       if (!openedItems.Contains (pi)) {
+                               openedItems.AddElement (pi);
+                               saveOpenedItemsInUserConfig ();
+                       }
+               }
+               public void CloseItem (ProjectItem pi) {                        
+                       openedItems.RemoveElement (pi);
+                       saveOpenedItemsInUserConfig ();
+               }
+
+               public void CloseSolution () {
+                       while (openedItems.Count > 0) {
+                               openedItems.RemoveElement (openedItems [0]);
+                       }
+                       while (toolboxItems.Count > 0) {
+                               toolboxItems.RemoveElement (toolboxItems [0]);
+                       }
+                       NotifyValueChanged ("Projects", null);
+               }
+           /// <summary>
+           /// Solution name
+           /// </summary>
+           String name;
+               /// <summary>
+               /// File path from where solution was loaded.
+               /// </summary>
+               [XmlIgnore]
+               String path;
+
+           /// <summary>
+           /// Solution name for debugger.
+           /// </summary>
+           [ExcludeFromCodeCoverage]
+           public override string ToString()
+           {
+               return "Solution: " + name;
+           }
+                       
+               #region Solution properties
+           double slnVer;                                      // 11.00 - vs2010, 12.00 - vs2015
+
+           /// <summary>
+           /// Visual studio version information used for generation, for example 2010, 2012, 2015 and so on...
+           /// </summary>
+           public int fileFormatVersion;
+
+           /// <summary>
+           /// null for old visual studio's
+           /// </summary>
+           public String VisualStudioVersion;
+           
+           /// <summary>
+           /// null for old visual studio's
+           /// </summary>
+           public String MinimumVisualStudioVersion;
+
+           /// <summary>
+           /// List of project included into solution.
+           /// </summary>
+           public List<Project> Projects = new List<Project>();
+
+           /// <summary>
+           /// List of configuration list, in form "{Configuration}|{Platform}", for example "Release|Win32".
+           /// To extract individual platforms / configuration list, use following functions.
+           /// </summary>
+           public List<String> configurations = new List<string>();
+
+           /// <summary>
+           /// Extracts platfroms supported by solution
+           /// </summary>
+           public IEnumerable<String> getPlatforms()
+           {
+               return configurations.Select(x => x.Split('|')[1]).Distinct();
+           }
+
+           /// <summary>
+           /// Extracts configuration names supported by solution
+           /// </summary>
+           public IEnumerable<String> getConfigurations()
+           {
+               return configurations.Select(x => x.Split('|')[0]).Distinct();
+           }
+               #endregion
+
+               public Configuration UserConfig;
+
+               public Project StartupProject {
+                       get { return Projects?.FirstOrDefault (p => p.ProjectGuid == UserConfig.Get<string> ("StartupProject")); }
+                       set {
+                               if (value == StartupProject)
+                                       return;
+                               if (value == null)
+                                       UserConfig.Set ("StartupProject", "");
+                               else {
+                                       UserConfig.Set ("StartupProject", value.ProjectGuid);
+                                       value.NotifyValueChanged("IsStartupProject", true);
+                               }
+                               NotifyValueChanged ("StartupProject", StartupProject);
+                               ReloadStyling ();
+                               ReloadDefaultTemplates ();
+                       }
+               }
+
+               #region CTOR
+           /// <summary>
+           /// Creates new solution.
+           /// </summary>
+           public Solution() { 
+               }
+
+               #endregion
+
+
+               #region Loading from SLN file   
+           /// <summary>
+           /// Loads visual studio .sln solution
+           /// </summary>
+           /// <exception cref="System.IO.FileNotFoundException">The file specified in path was not found.</exception>
+           static public Solution LoadSolution(string path)
+           {
+               Solution s = new Solution();
+               s.path = path;
+
+               String slnTxt = File.ReadAllText(path);
+               //
+               //  Extra line feed is used by Visual studio, cmake does not generate extra line feed.
+               //
+               s.slnVer = Double.Parse(Regex.Match(slnTxt, "[\r\n]?Microsoft Visual Studio Solution File, Format Version ([0-9.]+)", RegexOptions.Multiline).Groups[1].Value, CultureInfo.InvariantCulture);
+
+               int vsNumber = Int32.Parse(Regex.Match(slnTxt, "^\\# Visual Studio (Express )?([0-9]+)", RegexOptions.Multiline).Groups[2].Value);
+               if (vsNumber > 2000)
+                   s.fileFormatVersion = vsNumber;
+               else
+                   s.fileFormatVersion = vsNumber - 14 + 2015;     // Visual Studio 14 => vs2015, formula might not be applicable for future vs versions.
+
+               foreach (String line in new String[] { "VisualStudioVersion", "MinimumVisualStudioVersion" })
+               {
+                   var m = Regex.Match(slnTxt, "^" + line + " = ([0-9.]+)", RegexOptions.Multiline);
+                   String v = null;
+                   if (m.Success)
+                       v = m.Groups[1].Value;
+
+                   s.GetType().GetField(line).SetValue(s, v);
+               }
+
+               Regex reProjects = new Regex(
+                   "Project\\(\"(?<ProjectHostGuid>{[A-F0-9-]+})\"\\) = \"(?<ProjectName>.*?)\", \"(?<RelativePath>.*?)\", \"(?<ProjectGuid>{[A-F0-9-]+})\"[\r\n]*(?<dependencies>.*?)EndProject[\r\n]+",
+                   RegexOptions.Singleline);
+
+
+               reProjects.Replace(slnTxt, new MatchEvaluator(m =>
+               {
+                   SolutionProject p = new SolutionProject ();
+
+                   foreach (String g in reProjects.GetGroupNames())
+                   {
+                       if (g == "0")   //"0" - RegEx special kind of group
+                           continue;
+
+                       //
+                       // ProjectHostGuid, ProjectName, RelativePath, ProjectGuid fields/properties are set here.
+                       //
+                       String v = m.Groups[g].ToString();
+                       if (g != "dependencies")
+                       {
+                           FieldInfo fi = p.GetType().GetField(g);
+                           if (fi != null)
+                           {
+                               fi.SetValue(p, v);
+                           }
+                           else
+                           {
+                               p.GetType().GetProperty(g).SetValue(p, v);
+                           }
+                           continue;
+                       }
+
+                       if (v == "")    // No dependencies set
+                           continue;
+
+                       String depsv = new Regex("ProjectSection\\(ProjectDependencies\\)[^\r\n]*?[\r\n]+" + "(.*?)" + "EndProjectSection", RegexOptions.Singleline).Match(v).Groups[1].Value;
+
+                       //
+                       // key is always equal to it's value.
+                       // http://stackoverflow.com/questions/5629981/question-about-visual-studio-sln-file-format
+                       //
+                       var ProjectDependencies = new Regex("\\s*?({[A-F0-9-]+}) = ({[A-F0-9-]+})[\r\n]+", RegexOptions.Multiline).Matches(depsv).Cast<Match>().Select(x => x.Groups[1].Value).ToList();
+                   } //foreach
+                               s.Projects.Add(new Project (s, p));
+                   return "";
+               }
+               )
+               );
+
+               new Regex("GlobalSection\\(SolutionConfigurationPlatforms\\).*?[\r\n]+(.*?)EndGlobalSection[\r\n]+", RegexOptions.Singleline).Replace(slnTxt, new MatchEvaluator(m2 =>
+               {
+                   s.configurations = new Regex("\\s*(.*)\\s+=").Matches(m2.Groups[1].ToString()).Cast<Match>().Select(x => x.Groups[1].Value).ToList();
+                   return "";
+               }
+               ));
+
+                       Console.WriteLine ("******** CONFIG ***************");
+
+               new Regex("GlobalSection\\(ProjectConfigurationPlatforms\\).*?[\r\n]+(.*?)EndGlobalSection[\r\n]+", RegexOptions.Singleline).Replace(slnTxt, new MatchEvaluator(m2 =>
+               {
+                   foreach (Match m3 in new Regex("\\s*({[A-F0-9-]+})\\.(.*?)\\.(.*?)\\s+=\\s+(.*?)[\r\n]+").Matches(m2.Groups[1].ToString()))
+                   {
+                       String guid = m3.Groups[1].Value;
+                       String solutionConfig = m3.Groups[2].Value;
+                       String action = m3.Groups[3].Value;
+                       String projectConfig = m3.Groups[4].Value;
+
+                       Project p = s.Projects.Where(x => x.ProjectGuid == guid).FirstOrDefault();
+                       if (p == null)
+                           continue;
+
+                                               Console.WriteLine ("{0},{1},{2},{3}",guid,solutionConfig,action,projectConfig);
+
+                       int iConfigIndex = s.configurations.IndexOf(solutionConfig);
+                       if (iConfigIndex == -1)
+                           continue;
+
+//                     while (p.slnConfigurations.Count < s.configurations.Count)
+//                     {
+//                         p.slnConfigurations.Add(null);
+//                         p.slnBuildProject.Add(false);
+//                     }
+//
+//                     if (action == "ActiveCfg")
+//                     {
+//                         p.slnConfigurations[iConfigIndex] = projectConfig;
+//                     }
+//                     else
+//                     {
+//                         if (action.StartsWith("Build"))
+//                         {
+//                             p.slnBuildProject[iConfigIndex] = true;
+//                         }
+//                         else
+//                         {
+//                             if (action.StartsWith("Deploy"))
+//                             {
+//                                 if (p.slnDeployProject == null) p.slnDeployProject = new List<bool?>();
+//
+//                                 while (p.slnDeployProject.Count < s.configurations.Count)
+//                                     p.slnDeployProject.Add(null);
+//
+//                                 p.slnDeployProject[iConfigIndex] = true;
+//                             }
+//                         }
+//                     } //if-esle
+                   }
+                   return "";
+               }
+               ));
+
+               //
+               // Initializes parent-child relationship.
+               //
+               new Regex("GlobalSection\\(NestedProjects\\).*?[\r\n]+(.*?)EndGlobalSection[\r\n]+", RegexOptions.Singleline).Replace(slnTxt, new MatchEvaluator(m4 =>
+               {
+                   String v = m4.Groups[1].Value;
+                   new Regex("\\s*?({[A-F0-9-]+}) = ({[A-F0-9-]+})[\r\n]+", RegexOptions.Multiline).Replace(v, new MatchEvaluator(m5 =>
+                   {
+                       String[] args = m5.Groups.Cast<System.Text.RegularExpressions.Group>().Skip(1).Select(x => x.Value).ToArray();
+                       Project child = s.Projects.Where(x => args[0] == x.ProjectGuid).FirstOrDefault();
+                       Project parent = s.Projects.Where(x => args[1] == x.ProjectGuid).FirstOrDefault();
+                       parent.dependantProjects.Add(child);
+                       child.ParentProject = parent;
+                       return "";
+                   }));
+                   return "";
+               }
+               ));
+
+                       s.UserConfig = new Configuration (s.path + ".user");
+                       s.ReloadStyling ();
+                       s.ReloadDefaultTemplates ();
+                       s.updateToolboxItems ();
+               return s;
+           } //LoadSolution
+               #endregion
+       } 
+}
diff --git a/CrowIDE/src/SolutionControler.cs b/CrowIDE/src/SolutionControler.cs
new file mode 100644 (file)
index 0000000..edb6b0d
--- /dev/null
@@ -0,0 +1,37 @@
+//
+// SolutionControler.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+
+namespace Crow.Coding
+{
+       public class SolutionControler
+       {
+               public SolutionControler ()
+               {
+               }
+       }
+}
+
diff --git a/CrowIDE/src/VerticalLine.cs b/CrowIDE/src/VerticalLine.cs
new file mode 100644 (file)
index 0000000..d7bfe0c
--- /dev/null
@@ -0,0 +1,57 @@
+//
+// VerticalLine.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+
+namespace Crow.Coding
+{
+       public class VerticalLine : Widget
+       {
+               public VerticalLine () : base()
+               {
+               }
+
+               protected override void onDraw (Crow.Cairo.Context gr)
+               {
+                       base.onDraw (gr);
+                       Foreground.SetAsSource (gr);
+                       Rectangle r = ClientRectangle;
+                       double x = r.Center.X - 0.5;
+                       double y;
+                       gr.LineWidth = 1;
+                       gr.MoveTo (x, r.Y);
+                       gr.LineTo (x, r.Bottom-8);
+
+                       for (y = 8.5+r.Y; y < r.Bottom; y += 18) {
+                               gr.MoveTo (x, y);
+                               gr.LineTo (x * 2, y);
+                       }
+
+                       gr.Stroke ();
+               }
+       }
+}
+
diff --git a/CrowIDE/ui/CategoryExp.template b/CrowIDE/ui/CategoryExp.template
new file mode 100755 (executable)
index 0000000..d3732ae
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<Expandable Caption="{Name}" IsExpanded="{IsExpanded}" Background="Grey" Foreground="Black">
+       <Template>
+               <VerticalStack>
+                       <HorizontalStack Spacing="1" Height="Fit" MouseDoubleClick="./onClickForExpand" Background="Grey">
+                               <Container Margin="1" Width="9" Height="9" Focusable="true" MouseDown="./onClickForExpand"
+                                                                                                                       MouseEnter="{Background=LightGrey}"
+                                                                                                                       MouseLeave="{Background=Transparent}">
+                                       <Image
+                                               Path="#Crow.Icons.expandable.svg"
+                                               Visible="{./IsExpandable}"
+                                               SvgSub="{./IsExpanded}"/>
+                               </Container>
+                               <Label Foreground="White" Text="{./Caption}"/>
+                       </HorizontalStack>
+                       <Container Name="Content" Visible="false"/>
+               </VerticalStack>
+       </Template>
+       <VerticalStack Spacing="1" Height="Fit" Name="ItemsContainer"
+               Margin="0" VerticalAlignment="Top"/>
+</Expandable>  
\ No newline at end of file
diff --git a/CrowIDE/ui/CrowIDE.crow b/CrowIDE/ui/CrowIDE.crow
new file mode 100644 (file)
index 0000000..4295287
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!--<Window Height="Stretched" Width="Stretched" >-->
+       <VerticalStack DataSourceType="CrowIDE">
+               <Menu>
+                       <MenuItem Caption="File" Width="Fit" PopWidth="120" DataSource="{CurrentSolution}">
+                               <MenuItem Command="{CMDNew}" />
+                               <MenuItem Command="{CMDOpen}" />
+                               <MenuItem Command="{cmdCloseSolution}" />
+                               <MenuItem DataSource="{SelectedItem}" Command="{cmdSave}" />
+                               <MenuItem DataSource="{SelectedItem}" Command="{cmdSaveAs}" />
+                               <MenuItem Command="{CMDQuit}" />
+                       </MenuItem>
+                       <MenuItem Caption="Edit" Name="edit" Width="Fit" PopWidth="100" DataSource="{CurrentSolution}">
+                               <MenuItem DataSource="{SelectedItem}" Command="{cmdUndo}" />
+                               <MenuItem DataSource="{SelectedItem}" Command="{cmdRedo}" />
+                               <MenuItem Command="{CMDCut}" />
+                               <MenuItem Command="{CMDCopy}" />
+                               <MenuItem Command="{CMDPaste}" />
+                               <MenuItem Command="{CMDOptions}"/>
+                       </MenuItem>
+                       <MenuItem Caption="View" Fit="true" PopWidth="150">
+                               <MenuItem Command="{CMDViewSolution}"/>
+                               <MenuItem Command="{CMDViewEditor}"/>
+                               <MenuItem Command="{CMDViewProperties}"/>
+                               <MenuItem Command="{CMDViewDesign}"/>
+                               <MenuItem Command="{CMDViewStyling}"/>
+                               <MenuItem Command="{CMDViewToolbox}"/>
+                               <MenuItem Command="{CMDViewErrors}"/>
+                               <MenuItem Command="{CMDViewGTExp}"/>
+                               <MenuItem Command="{CMDViewSchema}"/>
+                       </MenuItem>
+                       <MenuItem Caption="Project" Fit="true" PopWidth="120">
+                               <MenuItem Command="{CMDCompile}"/>
+                               <MenuItem Command="{CMDViewProjProps}"/>
+                       </MenuItem>
+                       <MenuItem Caption="Help" Width="Fit" PopWidth="60">
+                               <MenuItem Caption="About"/>
+                               <MenuItem Command="{CMDHelp}"/>
+                       </MenuItem>
+               </Menu>
+<!--           <Label DataSource="{CurrentSolution}" Text="{SelectedItemElement}" Width="Stretched"/>-->
+<!--           <Docker >-->
+                       <DockStack Name="mainDock"/>
+<!--                   <DockWindow DataSource="{CurrentSolution}" Name="winEditor" Caption="Edit View" Width="70%" Height="80%">
+                               <Template>
+                                       <Border BorderWidth="1" Foreground="DimGrey" CornerRadius="{./CornerRadius}"
+                                                                       Background="{./Background}"
+                                                                       MouseEnter="./onBorderMouseEnter"
+                                                                       MouseLeave="./onBorderMouseLeave">
+                                               <Container Name="Content" MinimumSize="50,50"/>
+                                       </Border>
+                               </Template>
+                               <EditPane SelectedItem="{²SelectedItem}" SelectedItemElement="{²SelectedItemElement}" Data="{OpenedItems}" DataTest="Extension"
+                                       ItemTemplate="#Crow.Coding.ui.EditPaneItems.template"/>
+                       </DockWindow>-->
+<!--           </Docker>-->
+       </VerticalStack>
+<!--</Window>-->
diff --git a/CrowIDE/ui/DockWindows/GTreeExpITemp.crow b/CrowIDE/ui/DockWindows/GTreeExpITemp.crow
new file mode 100644 (file)
index 0000000..fb044b3
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<Expandable IsExpanded="{²IsExpanded}" MouseDoubleClick="/onClickForExpand">
+       <Template>
+               <VerticalStack>
+                       <Border CornerRadius="2" Margin="0" Height="Fit"                                                
+                                       Foreground="Transparent"
+                                       MouseEnter="{Foreground=DimGrey}"
+                                       MouseLeave="{Foreground=Transparent}">
+                               <HorizontalStack Spacing="1">
+                                       <Image Margin="1" Width="9" Height="9" Focusable="true" MouseDown="./onClickForExpand"
+                                               Path="{./Image}"
+                                               Visible="{./IsExpandable}"
+                                               SvgSub="{./IsExpanded}"
+                                               MouseEnter="{Background=LightGrey}"
+                                               MouseLeave="{Background=Transparent}"/>
+                                       <Border Width="16" Height="16" Foreground="Black" Background="DimGrey">
+                                               <Image Margin="2" Path="{GetIcon}" />
+                                       </Border>
+                                       <Label Text="{DesignName}"/>
+                               </HorizontalStack>
+                       </Border>
+                       <Container Name="Content" Visible="false"/>
+               </VerticalStack>
+       </Template>
+       <HorizontalStack Height="Fit">
+               <Widget Width="8" Height="10"/>
+               <VerticalStack Height="Fit" Name="ItemsContainer"/>
+       </HorizontalStack>
+</Expandable>
diff --git a/CrowIDE/ui/DockWindows/WinSchemaItem.template b/CrowIDE/ui/DockWindows/WinSchemaItem.template
new file mode 100755 (executable)
index 0000000..2832a32
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="Black" CornerRadius="10"
+                               Background="Grey"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+               <HorizontalStack Background="MediumSeaGreen" Margin="0" Spacing="0" Height="Fit" Width="Stretched">                             
+                       <Label Width="Stretched" Margin="0" TextAlignment="Center" Text="{./Caption}" />
+               </HorizontalStack>
+               <Widget Background="Black" Height="1"/>
+               <Container Margin="5" Name="Content" Width="Fit"/>
+       </VerticalStack>
+</Border>
diff --git a/CrowIDE/ui/DockWindows/toolboxBut.template b/CrowIDE/ui/DockWindows/toolboxBut.template
new file mode 100644 (file)
index 0000000..0729a38
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<Border Background="{./Background}" Name="Content"
+       Foreground="Transparent" CornerRadius="{./CornerRadius}" BorderWidth="1"
+       MouseDown="{Foreground=vgradient|0:Black|0.05:Grey|0.85:Grey|1:White}"
+       MouseUp="{Foreground=vgradient|0:White|0.2:Grey|0.9:Grey|1:Black}">
+       <Image Path="{./Caption}" Margin="2" Width="20" Height="20" />
+</Border>
diff --git a/CrowIDE/ui/DockWindows/winDesign.crow b/CrowIDE/ui/DockWindows/winDesign.crow
new file mode 100644 (file)
index 0000000..4b5125b
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<DockWindow DataSource="{CurrentSolution}" Name="winDesign" Caption="Design" Width="200" Height="50%">
+       <VerticalStack DataSource="{SelectedItemElement}">
+               <ColorPicker SelectedColor="{²Background}"/>
+               <Group Fit="true">
+                       <Border Foreground="Black" Left="25" Top="12" Width="34" Height="21" Background="{Background}"/>
+                       <Border Foreground="Black" Left="1" Top="1" Width="34" Height="21" Background="{Foreground}"/>
+               </Group>
+       </VerticalStack>
+</DockWindow>
diff --git a/CrowIDE/ui/DockWindows/winEditor.crow b/CrowIDE/ui/DockWindows/winEditor.crow
new file mode 100644 (file)
index 0000000..461a260
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<DockWindow Name="winEditor" Caption="Edit View">
+       <EditPane DataSource="{CurrentSolution}"
+               SelectedItemElement="{²SelectedItemElement}" Data="{OpenedItems}" DataTest="Extension"
+               ItemTemplate="#Crow.Coding.EditPaneItems.template"/>
+</DockWindow>
diff --git a/CrowIDE/ui/DockWindows/winErrors.crow b/CrowIDE/ui/DockWindows/winErrors.crow
new file mode 100644 (file)
index 0000000..82ecc17
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<DockWindow DataSource="{CurrentSolution}" Name="winErrors" Caption="Errors"  Width="20%">
+       <ListBox Width="Stretched" Data="{CompilerErrors}">
+               <ItemTemplate>
+                       <HorizontalStack Height="Fit" Margin="0" Focusable="true" Spacing="10"
+                                       MouseEnter="{Background=SteelBlue}"
+                                       MouseLeave="{Background=Transparent}">                                          
+                               <Image Width="10" Height="10" Path="#Crow.Icons.compiler_error.svg" SvgSub="{IsWarning}"/>
+                               <Label Text="{Line}" Width="25" TextAlignment="Right"/>
+                               <Label Text="{ErrorText}" Width="60%"/>
+                               <Label Text="{FileName}" Width="Fit"/>
+                       </HorizontalStack>
+               </ItemTemplate>
+       </ListBox>
+</DockWindow>
diff --git a/CrowIDE/ui/DockWindows/winGTExplorer.crow b/CrowIDE/ui/DockWindows/winGTExplorer.crow
new file mode 100644 (file)
index 0000000..62c7b9b
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<DockWindow Name="winGTExplorer" Caption="Edit View" Width="40%" Height="80%">
+       <VerticalStack Name="vstack" DataSource="{CurrentSolution}">
+               <Button Caption="Expand All" MouseClick="../treeView.onExpandAll_MouseClick"/>          
+               <TreeView DataSource="{SelectedItem}" IsRoot="true" Name="treeView" Data="{GraphicTree}"
+                       SelectedItemChanged="../../vstack.DataSource.GTView_SelectedItemChanged">
+                       <ItemTemplate>
+                               <Border Width="Stretched" Focusable="true" Foreground="Transparent">
+                                       <HorizontalStack Spacing="5">
+                                               <Widget Width="5" Height="5"/>
+                                               <Border Width="16" Height="16" Foreground="Black" Background="DimGrey">
+                                                       <Image Margin="2" Path="{GetIcon}" />
+                                               </Border>
+                                               <Label Text="{DesignName}" Width="Stretched"/>
+                                       </HorizontalStack>
+                               </Border>
+                       </ItemTemplate>
+                       <ItemTemplate DataType="Crow.Group" Data="GetChildren"
+                               Path="#Crow.Coding.ui.DockWindows.GTreeExpITemp.crow"/>
+                       <ItemTemplate DataType="Crow.Container" Data="GetChildren"
+                               Path="#Crow.Coding.ui.DockWindows.GTreeExpITemp.crow"/>
+                       <ItemTemplate DataType="Crow.TemplatedContainer" Data="GetChildren"
+                               Path="#Crow.Coding.ui.DockWindows.GTreeExpITemp.crow"/>
+                       <ItemTemplate DataType="Crow.TemplatedGroup" Data="GetChildren"
+                               Path="#Crow.Coding.ui.DockWindows.GTreeExpITemp.crow"/>
+               </TreeView>
+       </VerticalStack>
+</DockWindow>
diff --git a/CrowIDE/ui/DockWindows/winProperties.crow b/CrowIDE/ui/DockWindows/winProperties.crow
new file mode 100644 (file)
index 0000000..2ef5f6e
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<DockWindow Name="winProperties" Caption="Properties"  Width="20%">
+       <MembersView DataSource="{CurrentSolution}" ProjectNode="{SelectedItem}"
+               Instance="{SelectedItemElement}" DataTest="Type"
+               ItemTemplate="#Crow.Coding.MembersItem.template"/>
+</DockWindow>
+
diff --git a/CrowIDE/ui/DockWindows/winSchema.crow b/CrowIDE/ui/DockWindows/winSchema.crow
new file mode 100644 (file)
index 0000000..cd84249
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<DockWindow DataSource="{CurrentSolution}" Name="winSchema" Caption="IML Schematic View" Height="60%" Width="80%">
+       <ImlSchematicEditor DataSource="{SelectedItem}" Data="{GraphicTree}">
+               <Template>
+                       <Group Name="ItemsContainer"/>
+               </Template>
+               <ItemTemplate DataType="Crow.Widget">
+                       <Window Style="WinSchema" Caption="{Name}">
+                               <Label Text="test"/>
+                       </Window>
+               </ItemTemplate>
+               <ItemTemplate DataType="Crow.Container" >
+                       <Window Style="WinSchema" Caption="{Name}">
+                               <Label Text="test"/>
+                       </Window>
+               </ItemTemplate>
+       </ImlSchematicEditor>
+</DockWindow>
diff --git a/CrowIDE/ui/DockWindows/winSolution.crow b/CrowIDE/ui/DockWindows/winSolution.crow
new file mode 100644 (file)
index 0000000..e33a200
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<DockWindow Name="winSolution" Caption="Solution"  Width="20%">
+       <TreeView Name="treeview" IsRoot="true" DataSource="{CurrentSolution}"
+               Data="{Projects}" SelectedItemChanged="onSelectedItemChanged"
+               ItemTemplate="#Crow.Coding.ProjectTree.template"/>
+</DockWindow>
diff --git a/CrowIDE/ui/DockWindows/winStyleView.crow b/CrowIDE/ui/DockWindows/winStyleView.crow
new file mode 100644 (file)
index 0000000..a86343e
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<DockWindow DataSource="{CurrentSolution}" Name="winStyle" Caption="Styling"  Width="20%">
+       <TreeView Data="{StylingContainers}">
+               <Template>
+                       <VerticalStack Name="ItemsContainer" Spacing="1"/>
+               </Template>
+               <ItemTemplate DataType="Crow.Coding.StyleItemContainer">
+                       <HorizontalStack Height="Fit" Spacing="1">
+                               <Label Background="White" Foreground="Jet" Text="{Name}" Width="40%"/>
+                               <Label Background="White" Foreground="Jet" Text="{Value}" Width="Stretched"/>
+                       </HorizontalStack>
+               </ItemTemplate>
+               <ItemTemplate Path="#Crow.Coding.ui.CategoryExp.template" DataType="Crow.Coding.StyleContainer" Data="Items"/>
+       </TreeView>
+</DockWindow>
+
diff --git a/CrowIDE/ui/DockWindows/winToolbox.crow b/CrowIDE/ui/DockWindows/winToolbox.crow
new file mode 100644 (file)
index 0000000..615488e
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<DockWindow DataSource="{CurrentSolution}" Name="winToolbox" Caption="Toolbox" Width="60">
+       <ListBox Margin="3" Data="{ToolboxItems}" SelectionBackground="SkyBlue">
+               <Template>
+                       <Wrapper Name="ItemsContainer" Orientation="Vertical" Spacing="0"/>
+               </Template>
+               <ItemTemplate>
+                       <Container Fit="true" Focusable="true" Tooltip="{DisplayName}" Margin="2" AllowDrag="true"
+                               StartDrag="onStartDrag" EndDrag="onEndDrag" Drop="onDrop">
+                               <Border Foreground="Black" Background="DimGrey" Margin="0" BorderWidth="1"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=Black}">
+                                       <Image Path="{IconPath}" Margin="3"  Width="20" Height="20" />
+                               </Border>
+                       </Container>
+               </ItemTemplate>
+       </ListBox>
+</DockWindow>
diff --git a/CrowIDE/ui/IcoBut.template b/CrowIDE/ui/IcoBut.template
new file mode 100644 (file)
index 0000000..ef84670
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Border Background="{./Background}" Name="Content"
+       BorderWidth="1" BorderStyle="Normal"
+       MouseDown="{BorderStyle=Sunken}"
+       MouseUp="{BorderStyle=Normal}">
+       <Image Margin="1" Path="#icons.blank-file" />
+</Border>
diff --git a/CrowIDE/ui/ItemTemplates/Enum.template b/CrowIDE/ui/ItemTemplates/Enum.template
new file mode 100755 (executable)
index 0000000..9ee2b60
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<HorizontalStack Style="MemberViewHStack" ContextCommands="{Commands}" DataSourceType="PropertyContainer">
+       <Label Style="MemberViewLabel" Text="{Name}" Foreground = "{LabForeground}"/>
+       <ComboBox Margin="0"  Height="Stretched" Width="50%" Data="{Choices}"
+                       SelectedItem="{²Value}">
+               <Template>
+                       <Popper Name="popper" PopDirection="Bottom">
+                               <Template>
+                                       <CheckBox Caption="{./Caption}" IsChecked="{²./IsPopped}" Foreground="{./Foreground}" Background="{./Background}">
+                                               <Template>
+                                                       <Border CornerRadius="0" Foreground="LightGrey" Background="White">
+                                                               <HorizontalStack Margin="0" Spacing="1">
+                                                                       <Label Width="Stretched" MinimumSize="80,10" Margin="1" Foreground = "{LabForeground}" Background="White"
+                                                                               Text="{../../../../../SelectedItem}"/>
+                                                                       <Button Width="12" Height="12" Focusable="false"
+                                                                               Template="#Crow.ArrowBut.template">
+                                                                               <Image Margin="1" Path="#Crow.Icons.updown.svg" SvgSub="down"/>
+                                                                       </Button>
+                                                               </HorizontalStack>
+                                                       </Border>
+                                               </Template>
+                                       </CheckBox>
+                               </Template>
+                               <Border Background="White" BorderWidth="1" Margin="1" Foreground="Black"
+                                       MinimumSize="{../../MinimumPopupSize}" Fit="true">
+                                       <Scroller Name="scroller1" Margin="2" 
+                                               MaximumSize="0,200"
+                                               HorizontalAlignment="Left">
+                                               <VerticalStack LayoutChanged="../../../../_list_LayoutChanged"
+                                                       MouseClick="../../../onMouseClick" Focusable="True"
+                                                       Height="Fit" Name="ItemsContainer" Margin="0"
+                                                       HorizontalAlignment="Left"
+                                                       VerticalAlignment="Top"/>
+                                       </Scroller>
+                               </Border>
+                       </Popper>
+               </Template>
+               <ItemTemplate>
+                       <Container Fit="true" Margin="0" Focusable="true"
+                                       HorizontalAlignment="Left"
+                                       MouseEnter="{Background=SteelBlue}"
+                                       MouseLeave="{Background=Transparent}">
+                               <Label Text="{}" Foreground="Black"/>
+                       </Container>
+               </ItemTemplate>
+       </ComboBox>
+</HorizontalStack>
diff --git a/CrowIDE/ui/ItemTemplates/Fill.template b/CrowIDE/ui/ItemTemplates/Fill.template
new file mode 100755 (executable)
index 0000000..56d4a4d
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<HorizontalStack Style="MemberViewHStack" ContextCommands="{Commands}">
+       <Label Style="MemberViewLabel" Text="{Name}" Foreground = "{LabForeground}"/>
+       <Popper Height="Stretched" Caption="{Value}">
+               <Template>
+                       <CheckBox Caption="{./Caption}" IsChecked="{²./IsPopped}">
+                               <Template>
+                                       <HorizontalStack Margin="1" Height="Stretched" Spacing="3" Background="White">
+                                               <Border Foreground="{LabForeground}" Width="18" Height="12" CornerRadius="3"
+                                                       Background="{Value}">
+                                               </Border>
+                                               <Label Width="Stretched" Text="{./Caption}" Foreground="{LabForeground}"/>
+                                       </HorizontalStack>
+                               </Template>
+                       </CheckBox>
+               </Template>
+               <ColorPicker SelectedColor="{²Value}" Background="DimGrey" Margin="5" Fit="True" />
+       </Popper>
+</HorizontalStack>
\ No newline at end of file
diff --git a/CrowIDE/ui/LQIsExplorer.crow b/CrowIDE/ui/LQIsExplorer.crow
new file mode 100644 (file)
index 0000000..2994db6
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<Window Width="50%" Height="50%" Background="DimGrey">
+       <TreeView IsRoot="true" Name="treeView" Data="{LQIs}">
+               <ItemTemplate DataType="Crow.LayoutingQueueItem" Data="triggeredLQIs">
+                       <Expandable>
+                               <Template>
+                                       <VerticalStack Height="{./HeightPolicy}" Width="{./WidthPolicy}">
+                                               <VerticalStack Fit="true" Margin="3" Background="DimGrey"
+                                                               HorizontalAlignment="Left"
+                                                               MouseEnter="{Background=hgradient|0:RoyalBlue|1:Transparent}"
+                                                               MouseLeave="{Background=DimGrey}">
+                                                       <Label Text="{FullName}" Font="droid, 8" Background="LightGrey" Foreground="Black"/>
+                                                       <HorizontalStack Fit="true" Spacing="10">
+                                                               <Label Text="{LayoutingTries}" Foreground="SkyBlue"/>
+                                                               <Label Text="{DiscardCount}" Foreground="Red"/>
+                                                               <Label Text="{Name}" Font="droid bold"/>
+                                                               <Label Text="{LayoutType}" Foreground="Maize"/>
+                                                               <Label Text="{Width}"/>
+                                                               <Label Text="{Height}"/>
+                                                       </HorizontalStack>
+
+                                                       <HorizontalStack Fit="true">
+                                                               <Label Text="{Slot}"/>
+                                                               <Label Text=" => "/>
+                                                               <Label Text="{NewSlot}"/>
+                                                       </HorizontalStack>
+                                                       <Widget Background="SeaGreen" Height="3" Visible="{HasTriggeredLQIs}"/>
+                                               </VerticalStack>
+                                               <Container Name="Content" Visible="false" HorizontalAlignment="Left"
+                                                               Fit="true"/>
+                                       </VerticalStack>
+                               </Template>
+                               <HorizontalStack Height="Fit" Width="Fit">
+                                       <Widget Width="20" Height="10"/>
+                                       <TreeView Name="List" Height="Fit" Width="Fit"
+                                               Template="#Crow.Templates.treeList.crow" />
+                               </HorizontalStack>
+                       </Expandable>
+               </ItemTemplate>
+               <ItemTemplate DataType="Crow.LQIList" Data="GetRootLQIs">
+                       <Expandable Caption="{}" >
+                               <Template>
+                                       <VerticalStack Height="{./HeightPolicy}" Width="{./WidthPolicy}">
+                                               <HorizontalStack Spacing="1" Height="Fit" Width="{./WidthPolicy}"
+                                                               MouseEnter="{Background=hgradient|0:RoyalBlue|1:Transparent}"
+                                                               MouseLeave="{Background=Transparent}">
+                                                       <Image Margin="2" Width="12" Height="12"
+
+                                                               Path="{./Image}"
+                                                               SvgSub="{./IsExpanded}"/>
+                                                       <Label Text="{./Caption}" Width="{./WidthPolicy}"/>
+                                               </HorizontalStack>
+                                               <Container Name="Content" Visible="false"
+                                                               Height="{./HeightPolicy}" Width="{./WidthPolicy}"/>
+                                       </VerticalStack>
+                               </Template>
+                               <HorizontalStack Height="Fit" Width="{./WidthPolicy}">
+                                       <Widget Width="12" Height="10"/>
+                                       <TreeView Name="List" Height="Fit" Width="{./WidthPolicy}"
+                                               Template="#Crow.Templates.treeList.crow" />
+                               </HorizontalStack>
+                       </Expandable>
+               </ItemTemplate>
+       </TreeView>
+</Window>
diff --git a/CrowIDE/ui/MemberView.crow b/CrowIDE/ui/MemberView.crow
new file mode 100644 (file)
index 0000000..170a3fc
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Window Caption="Properties" Width="30%" Height="60%" AlwaysOnTop="true">
+       <MembersView Instance="{SelectedItem}" DataTest="Type"
+               ItemTemplate="#Crow.Coding.ui.MembersItem.template"/>
+</Window>
\ No newline at end of file
diff --git a/CrowIDE/ui/MembersItem.template b/CrowIDE/ui/MembersItem.template
new file mode 100755 (executable)
index 0000000..b552e92
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<ItemTemplate>
+       <HorizontalStack Style="MemberViewHStack" ContextCommands="{Commands}" DataSourceType="PropertyContainer">
+               <Label Style="MemberViewLabel" Text="{Name}" Foreground = "{LabForeground}"/>
+               <TextBox Margin="1" Text="{²Value}" Height="Fit" Foreground = "{LabForeground}"/>
+       </HorizontalStack>
+</ItemTemplate>
+<ItemTemplate Path="#Crow.Coding.CategoryExp.template" DataType="Crow.Coding.CategoryContainer"
+       Data="Properties" DataTest="Type"/>
+<ItemTemplate DataType="System.Boolean" >
+       <HorizontalStack Style="MemberViewHStack" ContextCommands="{Commands}">
+               <Label Style="MemberViewLabel" Text="{Name}" Foreground = "{LabForeground}" />
+               <CheckBox Background="White" Foreground = "{LabForeground}" Height="Stretched" Caption="" IsChecked="{²Value}"/>
+       </HorizontalStack>
+</ItemTemplate>
+<ItemTemplate Path="#Crow.Coding.Enum.template" DataType="System.Enum" />
+<ItemTemplate Path="#Crow.Coding.Enum.template" DataType="Style" />
+<!--<ItemTemplate Path="#Crow.Coding.ui.ItemTemplates.Fill.template" DataType="Crow.Fill"/>-->
+       
\ No newline at end of file
diff --git a/CrowIDE/ui/MembersView.template b/CrowIDE/ui/MembersView.template
new file mode 100755 (executable)
index 0000000..046049e
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <Border Height="Fit">
+               <Label TextAlignment="Left" Text="{./SelectedItemName}" Width="Stretched"/>
+       </Border>
+       <HorizontalStack>
+               <Scroller  Name="scroller1" Margin="1" 
+                       Background="{./Background}">
+                       <VerticalStack Spacing="1"
+                               Height="Fit" Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+               </Scroller>
+               <ScrollBar
+                       Name="scrollbar1" Orientation="Vertical"
+                       LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30"
+                       CursorSize="{../scroller1.ChildHeightRatio}"
+                       Value="{²../scroller1.ScrollY}"
+                       Maximum="{../scroller1.MaxScrollY}"/>
+       </HorizontalStack>
+</VerticalStack>
diff --git a/CrowIDE/ui/NewFile.crow b/CrowIDE/ui/NewFile.crow
new file mode 100644 (file)
index 0000000..ffee5fe
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Window Caption="Add New File..." Height="60%" Width="70%">
+       <Label/>
+</Window>
+
diff --git a/CrowIDE/ui/Options.crow b/CrowIDE/ui/Options.crow
new file mode 100644 (file)
index 0000000..7d401e0
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<Window Caption="Crow IDE Options" Width="80%" Height="70%" Background="DimGrey" Modal="true">
+       <TabView>
+               <TabItem Caption="IML Visual Editor">
+                       <VerticalStack Margin="10">
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                       </VerticalStack>
+               </TabItem>
+               <TabItem Caption="Text Editor">
+                       <VerticalStack Margin="10">
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                               <CheckBox Caption="Print Line Numbers" IsChecked="True"/>
+                       </VerticalStack>
+               </TabItem>
+
+       </TabView>
+</Window>
diff --git a/CrowIDE/ui/ProjectProperties.crow b/CrowIDE/ui/ProjectProperties.crow
new file mode 100644 (file)
index 0000000..9a6ba39
--- /dev/null
@@ -0,0 +1,66 @@
+<?xml version="1.0"?>
+<Window Caption="Project Properties" Width="60%" Height="70%" Modal="true">
+       <HorizontalStack>
+               <VerticalStack Height="Fit" Width="50%">
+                       <HorizontalStack>
+                               <Label Text="Tools Version" Width="30%"/>
+                               <Label Text="{ToolsVersion}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Default Targets" Width="30%"/>
+                               <Label Text="{DefaultTargets}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Project Guid" Width="30%"/>
+                               <Label Text="{ProjectGuid}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Output Type" Width="30%"/>
+                               <Label Text="{OutputType}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Root Namespace" Width="30%"/>
+                               <Label Text="{RootNamespace}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Assembly Name" Width="30%"/>
+                               <Label Text="{AssemblyName}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Allow Unsafe Blocks" Width="30%"/>
+                               <CheckBox IsChecked="{AllowUnsafeBlocks}" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="No Std Lib" Width="30%"/>
+                               <CheckBox IsChecked="{NoStdLib}" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Treat Warnings As Errors" Width="30%"/>
+                               <CheckBox IsChecked="{TreatWarningsAsErrors}" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Sign Assembly" Width="30%"/>
+                               <CheckBox IsChecked="{SignAssembly}" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Target Framework" Width="30%"/>
+                               <Label Text="{TargetFrameworkVersion}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Description" Width="30%"/>
+                               <Label Text="{Description}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Output Path" Width="30%"/>
+                               <Label Text="{OutputPath}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+                       <HorizontalStack>
+                               <Label Text="Intermediate Output Path" Width="30%"/>
+                               <Label Text="{IntermediateOutputPath}" IsEnabled="false" Width="70%"/>
+                       </HorizontalStack>
+               </VerticalStack>
+               <TreeView Width="50%" IsRoot="true" Name="treeView" Data="{RootItems}" DataTest="Type"
+                       ItemTemplate="#Crow.Coding.ui.ProjectTree.template">
+               </TreeView>
+       </HorizontalStack>
+</Window>
diff --git a/CrowIDE/ui/ProjectTree.template b/CrowIDE/ui/ProjectTree.template
new file mode 100644 (file)
index 0000000..8ffb17b
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+<ItemTemplate>
+       <Border DataSourceType="ProjectItem" Style="TreeItemBorder" ContextCommands="{Commands}" Focusable="true" MouseDown="onClick" MouseDoubleClick="onDoubleClick">
+               <Group>
+                       <Widget Height="Stretched" Background="RoyalBlue" Visible="{IsSelected}"/>
+                       <HorizontalStack>
+                               <Widget Width="5" Height="5"/>
+                               <Image Style="TreeIcon" Picture="{Icon}"/>
+                               <Label Text="{DisplayName}" Width="Stretched"/>
+                       </HorizontalStack>
+               </Group>
+       </Border>
+</ItemTemplate>
+<ItemTemplate DataType="Crow.Coding.Project" Data="RootItems" DataTest="Type">
+       <Expandable DataSourceType="Project" Caption="{Name}" ContextCommands="{Commands}" IsExpanded="{²IsExpanded}" MouseDoubleClick="/onClickForExpand">
+               <Template>
+                       <VerticalStack>
+                               <Border Style="TreeItemBorder" >
+                                       <HorizontalStack Spacing="1">
+                                               <Image Margin="1" Width="9" Height="9" Focusable="true" MouseDown="./onClickForExpand"
+                                                       Path="{./Image}"
+                                                       Visible="{./IsExpandable}"
+                                                       SvgSub="{./IsExpanded}"
+                                                       MouseEnter="{Background=LightGrey}"
+                                                       MouseLeave="{Background=Transparent}"/>
+                                               <Image Style="TreeIcon"
+                                                       Path="#Crow.Icons.crowproj.svg"/>
+                                               <Widget Width="4" Height="9" Background="Green" Visible="{IsStartupProject}"/>
+                                               <Label Text="{./Caption}"/>                                             
+                                       </HorizontalStack>
+                               </Border>
+                               <Container Name="Content" Visible="false"/>
+                       </VerticalStack>
+               </Template>
+               <HorizontalStack Height="Fit">
+                       <Widget Width="8" Height="10"/>
+                       <VerticalStack Height="Fit" Name="ItemsContainer"/>
+               </HorizontalStack>
+       </Expandable>
+</ItemTemplate>
+<ItemTemplate DataSourceType="ProjectNode" DataType="ReferenceGroup" Data="ChildNodes" DataTest="Type" >
+       <Expandable Caption="{DisplayName}" Template="#Crow.Coding.TreeExpandable.template" IsExpanded="{²IsExpanded}">
+               <HorizontalStack Height="Fit">
+                       <Widget Width="8" Height="10"/>
+                       <VerticalStack Height="Fit" Name="ItemsContainer"/>
+               </HorizontalStack>
+       </Expandable>
+</ItemTemplate>
+<ItemTemplate DataType="VirtualGroup" Data="ChildNodes" DataTest="Type">
+       <Expandable DataSourceType="ProjectNode" Caption="{DisplayName}" Template="#Crow.Coding.TreeExpandable.template" IsExpanded="{²IsExpanded}">
+               <HorizontalStack Height="Fit">
+                       <Widget Width="8" Height="10"/>
+                       <VerticalStack Height="Fit" Name="ItemsContainer"/>
+               </HorizontalStack>
+       </Expandable>
+</ItemTemplate>
+<ItemTemplate DataType="Folder" DataTest="Type">
+       <Border DataSourceType="ProjectNode" Style="TreeItemBorder" ContextCommands="{Commands}">
+               <HorizontalStack>
+                       <Image Style="ProjTreeIcon"
+                               Path="#Crow.Icons.folder.svg"/>
+                       <Label Text="{DisplayName}" Width="Stretched"/>
+               </HorizontalStack>
+       </Border>
+</ItemTemplate>
diff --git a/CrowIDE/ui/TreeExpandable.template b/CrowIDE/ui/TreeExpandable.template
new file mode 100644 (file)
index 0000000..f945f78
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <Border Style="TreeItemBorder" >                
+               <HorizontalStack Spacing="5" Focusable="true" MouseDoubleClick="./onClickForExpand">
+                       <Image Margin="1" Width="9" Height="9" Focusable="true" MouseDown="./onClickForExpand"
+                               Path="{./Image}"
+                               Visible="{./IsExpandable}"
+                               SvgSub="{./IsExpanded}"
+                               MouseEnter="{Background=LightGrey}"
+                               MouseLeave="{Background=Transparent}"/>
+                       <Image Style="TreeIcon"
+                               Path="#Crow.Icons.folder.svg" SvgSub="{./IsExpanded}"/>
+                       <Label Text="{./Caption}"/>
+               </HorizontalStack>
+       </Border>
+       <Container Name="Content" Visible="false"/>
+</VerticalStack>
diff --git a/CrowIDE/ui/editors/EditPane.template b/CrowIDE/ui/editors/EditPane.template
new file mode 100644 (file)
index 0000000..f6eb0f8
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<TabView SelectedTab="{²./SelectedIndex}" Name="ItemsContainer" Orientation="Horizontal"/>
diff --git a/CrowIDE/ui/editors/EditPaneItems.template b/CrowIDE/ui/editors/EditPaneItems.template
new file mode 100644 (file)
index 0000000..d9f253e
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<ItemTemplate> 
+       <TabItem Caption="{DisplayName}" QueryClose="OnQueryClose">
+               <Label Text="Error" Background="Red"/>
+       </TabItem>
+</ItemTemplate>
+<ItemTemplate Path="#CrowIDE.ui.editors.SvgEdit.itemp" DataType=".svg"/>
+<ItemTemplate Path="#CrowIDE.ui.editors.SrcEdit.itemp" DataType=".cs"/>
+<ItemTemplate Path="#CrowIDE.ui.editors.SrcEdit.itemp" DataType=".style"/>
+<ItemTemplate Path="#CrowIDE.ui.editors.IMLEdit.itemp" DataType=".crow"/>
+<ItemTemplate Path="#CrowIDE.ui.editors.IMLEdit.itemp" DataType=".itemp"/>
+<ItemTemplate Path="#CrowIDE.ui.editors.IMLEdit.itemp" DataType=".template"/>
+<ItemTemplate DataType=".goml">
+       <TabItem Caption="{DisplayName}" QueryClose="OnQueryClose">
+               <IMLContainer Path="#CrowIDE.ui.editors.TextEditor.crow"/>
+       </TabItem>
+</ItemTemplate>
+
diff --git a/CrowIDE/ui/editors/EditTabItem.template b/CrowIDE/ui/editors/EditTabItem.template
new file mode 100644 (file)
index 0000000..b082c06
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<GenericStack Orientation="Vertical" Spacing="0" DataSourceType="ProjectFile"          
+       MouseEnter="{caption.Font=hack bold, 10}"
+       MouseLeave="{caption.Font=hack, 10}">
+       <HorizontalStack Margin="2" Left="{./TabOffset}"
+               Name="TabTitle"
+               HorizontalAlignment="Left"
+               Height="{./TabHeight}"
+               Width="{./TabWidth}">
+               <Widget Width="5" Height="5" Background="Blue" Visible="{IsDirty}"/>
+               <Label Name="caption" Text="{DisplayName}" Foreground="Black" Width="Stretched"/>
+               <Border CornerRadius="5" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=Black}" MouseLeave="{Foreground=Transparent}">
+                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Icons.exit2.svg"
+                                MouseClick="./butCloseTabClick"/>
+               </Border>
+       </HorizontalStack>
+       <Container Name="Content"/>
+</GenericStack>
\ No newline at end of file
diff --git a/CrowIDE/ui/editors/IMLEdit.itemp b/CrowIDE/ui/editors/IMLEdit.itemp
new file mode 100644 (file)
index 0000000..4ee3aba
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<TabItem DataSourceType="ImlProjectItem" QueryClose="OnQueryClose" IsSelected="{²IsSelected}" Template="#Crow.Coding.EditTabItem.template">
+       <VerticalStack>
+        <VerticalStack Height="60%">
+               <Label DataSource="{../editor.HoverWidget}" Width="Stretched" Margin="2" Text="{Name}"/>
+               <VerticalStack Width="Stretched" Margin="0" MinimumSize="10,10">
+                       <HorizontalStack>
+                               <Scroller Name="scroller1" Margin="2" >
+                                       <ImlVisualEditor  Foreground="SkyBlue" Name="editor" Background="Grey"                                          
+                                               VerticalAlignment="Top" HorizontalAlignment="Left" Margin="4"
+                                               ContextCommands="{/Commands}"
+                                               AllowDrop="true" AllowDrag="true" Focusable="true"
+                                               UpdateEnabled="{IsSelected}"
+                                               ProjectNode="{}" SelectedItem="{²SelectedItem}"/>
+                               </Scroller>
+                               <ScrollBar Name="scrollbar1" Orientation="Vertical"                    
+                                       Value="{²../scroller1.ScrollY}"        Maximum="{../scroller1.MaxScrollY}" 
+                                       CursorSize="{../scroller1.ChildHeightRatio}"
+                                       LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30"
+                                        />
+                       </HorizontalStack>
+                       <ScrollBar Style="HScrollBar" Name="scrollbarX" Orientation="Horizontal"                    
+                                       Value="{²../scroller1.ScrollX}" Maximum="{../scroller1.MaxScrollX}" 
+                                       CursorSize="{../scroller1.ChildWidthRatio}" 
+                                       LargeIncrement="{../scroller1.PageWidth}" SmallIncrement="30"/>
+               </VerticalStack>        
+            <HorizontalStack Height="Fit" Margin="2" Spacing="5" Background="vgradient|0:0.8,0.8,0.8,1|1:Grey">
+                <HorizontalStack Width="Fit" Spacing="1">
+                    <Label Text="Design Size:"/>
+                    <TextBox Text="{²../../../editor.DesignWidth}" Width="40" TextAlignment="Right"/>
+                    <Label Text="X"/>
+                    <TextBox Text="{²../../../editor.DesignHeight}" Width="40" TextAlignment="Right"/>
+                </HorizontalStack>
+                <HorizontalStack Width="Fit" Spacing="1">
+                    <Label Text="Zoom:"/>
+                    <Slider Value="{²../../../editor.Zoom}" Width="100" Height="10" Minimum="10" Maximum="200" SmallIncrement="10" LargeIncrement="50"/>
+                    <Label Text="{../../../editor.Zoom}"/>
+                </HorizontalStack>
+                <HorizontalStack Width="Fit" Spacing="1">
+                    <Label Text="Grid Spacing:"/>
+                    <Slider Value="{²../../../editor.GridSpacing}" Width="100" Height="10" Minimum="5" Maximum="100" SmallIncrement="5" LargeIncrement="20"/>
+                    <TextBox Text="{../../../editor.GridSpacing}"/>
+                </HorizontalStack>
+            </HorizontalStack>
+        </VerticalStack>               
+        <Splitter/>
+               <IMLContainer Path="#CrowIDE.ui.editors.SourceEditor.crow"/>
+               <Splitter Visible="{../editor.HasError}"/>
+               <Label DataSource="{../editor.Error}" Text="{}"
+                       Visible="{../editor.HasError}"
+                       Height="Fit" Width="Stretched" Background="DarkRed" Foreground="White"
+                       TextAlignment="TopLeft" Multiline="true"/>
+       </VerticalStack>
+</TabItem>
diff --git a/CrowIDE/ui/editors/SourceEditor.crow b/CrowIDE/ui/editors/SourceEditor.crow
new file mode 100644 (file)
index 0000000..17d3b1e
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<VerticalStack>
+       <HorizontalStack >
+               <SourceEditor Focusable="true" Name="editor" Font="monospace, 12" VerticalAlignment="Top" Margin="2"
+                               CurrentLine="{²CurrentLine}" CurrentColumn="{²CurrentColumn}" HasFocus="{IsSelected}"
+                               Foreground="Jet" Background="White" Width="Stretched" Height="Stretched"
+                               ProjectNode="{}"  KeyDown="textView_KeyDown"/>
+               <ScrollBar Name="scrollbarY" Value="{²../editor.ScrollY}"
+                                  LargeIncrement="{../editor.VisibleLines}"
+                                  CursorSize="{../editor.ChildHeightRatio}"
+                       Maximum="{../editor.MaxScrollY}" Orientation="Vertical"/>
+       </HorizontalStack>
+       <ScrollBar Style="HScrollBar" Name="scrollbarX" Value="{²../editor.ScrollX}"
+                       Maximum="{../editor.MaxScrollX}" Orientation="Horizontal"
+                       LargeIncrement="{../editor.VisibleColumns}"
+                       CursorSize="{../editor.ChildWidthRatio}"/>                      
+       <HorizontalStack Height="Fit">
+               <Label Text="{../../editor.HoverError}" Width="Stretched"/>
+               <Widget Background="Red" Width="5" Height="5" Visible="{IsDirty}"/>
+               <Label Text="Hover Line:" Foreground="Grey"/>
+               <Label Text="{../../editor.HoverLine}"/>
+               <Widget Height="5" Width="10"/>
+               <Label Text="Line:" Foreground="Grey"/>
+               <Label Text="{CurrentLine}"/>
+               <Widget Height="5" Width="10"/>
+               <Label Text="column:" Foreground="Grey"/>
+               <Label Text="{CurrentColumn}"/>
+               <Widget Height="5" Width="10"/>
+               <Label Text="ScrollX:" Foreground="Grey"/>
+               <Label Text="{../../editor.ScrollX}"/>
+       </HorizontalStack>
+</VerticalStack>
diff --git a/CrowIDE/ui/editors/SrcEdit.itemp b/CrowIDE/ui/editors/SrcEdit.itemp
new file mode 100644 (file)
index 0000000..330dac6
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<TabItem QueryClose="OnQueryClose" IsSelected="{²IsSelected}" Template="#Crow.Coding.EditTabItem.template">
+       <IMLContainer Path="#CrowIDE.ui.editors.SourceEditor.crow"/>
+</TabItem>
\ No newline at end of file
diff --git a/CrowIDE/ui/editors/SvgEdit.itemp b/CrowIDE/ui/editors/SvgEdit.itemp
new file mode 100644 (file)
index 0000000..e7318b8
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<TabItem QueryClose="OnQueryClose" IsSelected="{²IsSelected}" Template="#Crow.Coding.EditTabItem.template">
+       <VerticalStack>
+               <VerticalStack Height="50%">
+                       <HorizontalStack >
+                               <SvgEditor Margin="10" ProjectNode="{}" Focusable="true" Name="editor" MouseWheelSpeed="20" Foreground="Black"/>
+                               <ScrollBar Name="scrollbarY" Value="{²../editor.ScrollY}"
+                                                  LargeIncrement="10"
+                                                  CursorSize="{../editor.ChildHeightRatio}"
+                                       Maximum="{../editor.MaxScrollY}" Orientation="Vertical"/>
+                       </HorizontalStack>
+                       <ScrollBar Style="HScrollBar" Name="scrollbarX" Value="{²../editor.ScrollX}"
+                                       Maximum="{../editor.MaxScrollX}" Orientation="Horizontal"
+                                       LargeIncrement="10"
+                                       CursorSize="{../editor.ChildWidthRatio}"/>
+                       <HorizontalStack Height="Fit" Margin="3">
+                               <Label Text="Zoom:"/>
+                               <Label Text="{../../editor.Zoom}" Fit="true"/>
+                               <!--<Spinner Name="sldZoom" Value="{²../../editor.Zoom}" Maximum="800" Minimum="1" SmallIncrement="10" LargeIncrement="50" Width="40" />-->
+                               <Slider Value="{²../../editor.Zoom}" CursorSize="2" Height="8" Maximum="800" Minimum="1" SmallIncrement="1" LargeIncrement="10" Width="100" />
+                       </HorizontalStack>
+               </VerticalStack>
+               <Splitter/>
+               <IMLContainer Path="#Crow.Coding.ui.editors.SourceEditor.crow"/>
+               <Label DataSource="{../editor.Error}" Text="{Message}"
+                       Visible="{../editor.HasError}"
+                       Height="Fit" Width="Stretched" Background="DarkRed" Foreground="White"
+                       TextAlignment="TopLeft" Multiline="true"/>
+       </VerticalStack>
+</TabItem>
\ No newline at end of file
diff --git a/CrowIDE/ui/editors/TextEditor.crow b/CrowIDE/ui/editors/TextEditor.crow
new file mode 100644 (file)
index 0000000..a87d4ac
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<VerticalStack>
+       <HorizontalStack >
+               <TextEditor Focusable="true" Name="editor" Font="monospace, 12" VerticalAlignment="Top" Margin="1"
+                               CurrentLine="{²CurrentLine}" CurrentColumn="{²CurrentColumn}"
+                               Foreground="DimGrey" Background="White" Width="Stretched" Height="Stretched"
+                               ProjectNode="{}"  KeyDown="textView_KeyDown"/>
+               <ScrollBar Name="scrollbarY" Value="{²../editor.ScrollY}"
+                                  LargeIncrement="{../editor.VisibleLines}"
+                                  CursorSize="{../editor.ChildHeightRatio}"
+                       Maximum="{../editor.MaxScrollY}" Orientation="Vertical"/>
+       </HorizontalStack>
+       <ScrollBar Style="HScrollBar" Name="scrollbarX" Value="{²../editor.ScrollX}"
+                       Maximum="{../editor.MaxScrollX}" Orientation="Horizontal"
+                       LargeIncrement="{../editor.VisibleColumns}"
+                       CursorSize="{../editor.ChildWidthRatio}"/>                      
+       <HorizontalStack Height="Fit">
+               <Widget Height="5" Width="Stretched"/>
+               <Widget Background="Red" Width="5" Height="5" Visible="{IsDirty}"/>
+               <Label Text="Line:" Foreground="Grey"/>
+               <Label Text="{CurrentLine}"/>
+               <Widget Height="5" Width="10"/>
+               <Label Text="column:" Foreground="Grey"/>
+               <Label Text="{CurrentColumn}"/>
+               <Widget Height="5" Width="10"/>
+               <Label Text="ScrollX:" Foreground="Grey"/>
+               <Label Text="{../../editor.ScrollX}"/>
+       </HorizontalStack>
+</VerticalStack>
diff --git a/CrowIDE/ui/test.crow b/CrowIDE/ui/test.crow
new file mode 100644 (file)
index 0000000..37d4bdd
--- /dev/null
@@ -0,0 +1,4 @@
+<Container Margin="20" Background="DimGrey">
+       <ImlVisualEditor Width="80%" Height="80%" Margin="0" MinimumSize="10,10" Foreground="SkyBlue"
+                       Name="crowContainer" Background="DimGrey"/>
+</Container>
diff --git a/Doxyfile b/Doxyfile
new file mode 100644 (file)
index 0000000..9e06c61
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,2497 @@
+# Doxyfile 1.8.13
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = C.R.O.W
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = 0.5.5
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          = "C# Rapid Open Widgets"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           = /mnt/devel/Crow/Images/Icons/crow.svg
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ../Crow.wiki/xml
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                = "TODO{1}=\"@todo \1\""
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = YES
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      = 
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = NO
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 0.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS   = 0
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = NO
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    = 
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            = 
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT                  = src
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
+# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
+
+FILE_PATTERNS          = *.c \
+                         *.cc \
+                         *.cxx \
+                         *.cpp \
+                         *.c++ \
+                         *.java \
+                         *.ii \
+                         *.ixx \
+                         *.ipp \
+                         *.i++ \
+                         *.inl \
+                         *.idl \
+                         *.ddl \
+                         *.odl \
+                         *.h \
+                         *.hh \
+                         *.hxx \
+                         *.hpp \
+                         *.h++ \
+                         *.cs \
+                         *.d \
+                         *.php \
+                         *.php4 \
+                         *.php5 \
+                         *.phtml \
+                         *.inc \
+                         *.m \
+                         *.markdown \
+                         *.md \
+                         *.mm \
+                         *.dox \
+                         *.py \
+                         *.pyw \
+                         *.f90 \
+                         *.f95 \
+                         *.f03 \
+                         *.f08 \
+                         *.f \
+                         *.for \
+                         *.tcl \
+                         *.vhd \
+                         *.vhdl \
+                         *.ucf \
+                         *.qsf
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                = src/Cairo \
+                         src/Mono.Cairo \
+                         src/rsvg \
+                         src/win32
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS = 
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        = 
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  = 
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       = 
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 129
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 24
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 205
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               = 
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           = 
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     = 
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               = 
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   = 
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  = 
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  = 
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           = 
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = YES
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     = 
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       = 
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       = 
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     = 
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           = 
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           = 
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET = 
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    = 
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             = 
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = /mnt/devel/Crow.wiki/xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            = 
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               = 
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: YES.
+
+HAVE_DOT               = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           = 
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = YES
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = YES
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,
+# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,
+# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           = 
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           = 
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           = 
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      = 
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE      = 
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  = 
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/Images/crow.png b/Images/crow.png
new file mode 100644 (file)
index 0000000..7b737d0
Binary files /dev/null and b/Images/crow.png differ
diff --git a/Images/crow0.svg b/Images/crow0.svg
new file mode 100644 (file)
index 0000000..c621130
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   height="35.987217"
+   width="51.116982"
+   version="1.1"
+   id="svg2">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <path
+     id="path2818"
+     d="m 36.232985,35.977162 c -0.02345,-0.0094 -0.04263,-0.04436 -0.04263,-0.07772 0,-0.03337 -0.04543,-0.117846 -0.100965,-0.187724 -0.05553,-0.06987 -0.10986,-0.152552 -0.120738,-0.183728 -0.04888,-0.140096 -0.547064,-0.441575 -0.740404,-0.448061 -0.01333,-6.73e-4 -0.0417,0.06441 -0.06301,0.144127 -0.0213,0.07971 -0.05448,0.164118 -0.0737,0.187567 -0.06807,0.08303 -0.2351,0.04596 -0.448164,-0.09947 -0.114492,-0.07815 -0.231452,-0.140793 -0.259915,-0.139198 -0.103032,0.0057 -0.22753,-0.0647 -0.284401,-0.160973 -0.105659,-0.178872 -0.451937,-0.41031 -0.613884,-0.41031 -0.11287,0 -0.378547,-0.121442 -0.488394,-0.223239 -0.06283,-0.05824 -0.129597,-0.08369 -0.219515,-0.08369 -0.191898,0 -0.291236,-0.05025 -0.332315,-0.168082 -0.02007,-0.05761 -0.05795,-0.104746 -0.08415,-0.104746 -0.02621,0 -0.07371,-0.02879 -0.105549,-0.06398 -0.03185,-0.03519 -0.108169,-0.07213 -0.169604,-0.08211 -0.219849,-0.03568 -0.937873,-0.414299 -0.993727,-0.524009 -0.01875,-0.03685 -0.103161,-0.143806 -0.187567,-0.237705 -0.189643,-0.210956 -0.537045,-0.371869 -0.741262,-0.343338 -0.710425,0.09925 -0.737631,0.100685 -1.030367,0.05449 -0.337983,-0.05334 -0.630446,-0.05889 -1.115893,-0.02117 -0.331487,0.02576 -0.347801,0.02387 -0.368967,-0.04283 -0.01219,-0.03838 0.0026,-0.154623 0.03266,-0.258318 0.03015,-0.103694 0.04455,-0.205124 0.03202,-0.225402 -0.04471,-0.07234 -0.314032,-0.0065 -0.532991,0.130268 -0.165667,0.103489 -0.230973,0.169125 -0.288563,0.290041 -0.07126,0.149603 -0.19268,0.232754 -0.339892,0.232754 -0.09327,0 -0.01149,-0.448641 0.108895,-0.597398 0.0301,-0.03719 0.045,-0.04843 0.03312,-0.02499 -0.01262,0.02492 3.4e-5,0.04263 0.03051,0.04263 0.03229,0 0.04463,-0.01945 0.03247,-0.05115 -0.0108,-0.02813 -0.0027,-0.05115 0.01813,-0.05115 0.02077,0 0.03776,-0.02034 0.03776,-0.04521 0,-0.05853 0.151433,-0.201223 0.181571,-0.171088 0.01268,0.01268 0.02305,0.003 0.02305,-0.02158 0,-0.05501 0.190827,-0.241992 0.218611,-0.214209 0.01107,0.01107 0.02012,0.0013 0.02012,-0.02169 0,-0.02299 0.01358,-0.03341 0.03018,-0.02314 0.0166,0.01026 0.07415,0.0046 0.127887,-0.01261 0.05374,-0.01721 0.185946,-0.03746 0.293797,-0.04502 0.154262,-0.01082 0.196092,-0.0032 0.196092,0.03533 0,0.03062 0.02017,0.04134 0.05362,0.02851 0.02949,-0.01132 0.08321,-0.0048 0.119365,0.01461 0.04469,0.02391 0.06573,0.02399 0.06573,0 0,-0.0546 0.166343,-0.02716 0.19016,0.03136 0.01696,0.04168 0.02726,0.03685 0.05065,-0.02383 0.03017,-0.0782 0.05209,-0.07969 0.33327,-0.02256 0.04625,0.0094 0.07104,0.0023 0.05918,-0.01685 -0.01918,-0.03103 0.105189,-0.09308 0.158609,-0.07913 0.01351,0.0035 0.0409,-0.02412 0.06088,-0.06145 0.01998,-0.03733 0.06279,-0.06787 0.09513,-0.06787 0.03235,0 0.07872,-0.0319 0.103074,-0.07089 0.03874,-0.06204 0.03597,-0.07306 -0.02225,-0.08828 -0.04068,-0.01065 -0.07465,-0.05808 -0.08746,-0.122132 -0.01151,-0.0576 -0.03098,-0.0947 -0.04325,-0.08243 -0.02243,0.02243 -0.09396,-0.07925 -0.134223,-0.190818 -0.01192,-0.03303 -0.05709,-0.06895 -0.100386,-0.07981 -0.0433,-0.01087 -0.08702,-0.04139 -0.09717,-0.06783 -0.01015,-0.02644 -0.03811,-0.04866 -0.06215,-0.04937 -0.02403,-6.72e-4 -0.09734,-0.06977 -0.162897,-0.153463 -0.06556,-0.08369 -0.141017,-0.152171 -0.167679,-0.152171 -0.02665,0 -0.03909,-0.0094 -0.02762,-0.02084 0.02949,-0.02949 -0.161533,-0.183774 -0.227545,-0.183774 -0.03567,0 -0.05475,-0.02971 -0.05475,-0.08526 0,-0.04689 -0.01667,-0.08526 -0.03705,-0.08526 -0.02039,0 -0.132932,-0.09206 -0.250118,-0.204591 -0.117184,-0.112527 -0.225744,-0.193097 -0.241239,-0.179042 -0.0155,0.01404 -0.01813,0.008 -0.0059,-0.01351 0.02148,-0.0376 -0.06692,-0.09775 -0.12476,-0.08487 -0.01546,0.0034 -0.01943,-0.0078 -0.0088,-0.02496 0.01062,-0.01717 -0.02277,-0.05853 -0.0742,-0.09191 -0.05142,-0.03337 -0.113546,-0.08877 -0.138053,-0.123093 -0.02451,-0.03432 -0.06672,-0.0624 -0.09378,-0.0624 -0.02707,0 -0.04922,-0.01355 -0.04922,-0.03012 0,-0.0438 -0.778285,-0.624964 -0.930964,-0.695162 -0.0729,-0.03352 -0.164401,-0.05081 -0.209278,-0.03955 -0.05655,0.01418 -0.102151,-0.0031 -0.15683,-0.05944 -0.0424,-0.0437 -0.06447,-0.05739 -0.04905,-0.03043 0.01542,0.02698 -0.03574,-0.0023 -0.113694,-0.06486 -0.140423,-0.112848 -0.199258,-0.210672 -0.162485,-0.270173 0.01048,-0.01696 -0.0034,-0.03946 -0.03092,-0.05001 -0.03157,-0.0121 -0.04839,-0.06147 -0.04566,-0.133995 0.0046,-0.123415 -0.115972,-0.333547 -0.242202,-0.421962 -0.03969,-0.0278 -0.06324,-0.06494 -0.05237,-0.08255 0.01089,-0.01761 -0.0042,-0.04121 -0.03354,-0.05247 -0.02932,-0.01125 -0.05331,-0.04833 -0.05331,-0.0824 0,-0.03407 -0.03837,-0.107533 -0.08526,-0.163263 -0.07704,-0.09156 -0.08519,-0.130424 -0.08459,-0.403332 0.0011,-0.467434 0.102818,-0.951299 0.346875,-1.649081 0.133708,-0.382291 0.234679,-0.776483 0.280602,-1.095504 0.01999,-0.138863 0.01188,-0.170521 -0.06808,-0.265547 -0.09126,-0.108463 -0.277674,-0.207699 -0.390138,-0.207699 -0.03326,0 -0.167911,-0.04572 -0.299229,-0.101598 -0.334854,-0.142493 -0.698295,-0.199641 -1.524701,-0.239741 -0.393891,-0.01911 -0.856189,-0.05756 -1.027322,-0.08543 -0.171134,-0.02796 -0.404168,-0.05076 -0.517855,-0.05076 -0.113686,0 -0.249901,-0.01718 -0.302703,-0.03821 -0.0528,-0.02101 -0.22913,-0.0397 -0.391836,-0.04152 -0.16271,-0.0018 -0.288412,-0.01532 -0.27934,-0.03 0.0091,-0.01468 -0.01127,-0.02647 -0.0452,-0.02621 -0.03393,2.24e-4 -0.315468,-0.0481 -0.625641,-0.107494 l -0.563945,-0.107977 -0.33979,0.10758 c -0.186882,0.05917 -0.349511,0.107539 -0.361388,0.107494 -0.04086,-1.36e-4 -0.05638,-0.13324 -0.01741,-0.149221 0.02145,-0.0088 -0.0023,-0.01721 -0.05276,-0.01869 -0.05047,-0.0015 -0.100161,0.01089 -0.110412,0.02747 -0.03208,0.05191 -0.458126,0.118498 -0.505769,0.07904 -0.02811,-0.02328 -0.09385,-0.0242 -0.195783,-0.0028 -0.08441,0.01777 -0.280073,0.0495 -0.434816,0.07054 -0.154743,0.02104 -0.281352,0.05283 -0.281352,0.07068 0,0.01786 -0.02302,0.02362 -0.05115,0.01281 -0.02814,-0.0108 -0.05123,-0.0086 -0.05131,0.0049 0,0.01348 -0.05615,0.02741 -0.124603,0.03097 -0.06845,0.0036 -0.1336,0.01891 -0.144786,0.0341 -0.02606,0.03542 -0.139983,0.04146 -0.796184,0.04221 -0.297591,4.49e-4 -0.537126,0.01439 -0.537126,0.0315 0,0.01698 -0.134282,0.03143 -0.298403,0.0321 -0.369505,0.0015 -0.539084,0.01992 -0.844055,0.09164 -0.131298,0.03088 -0.373004,0.06513 -0.537126,0.0761 -0.164122,0.01097 -0.298404,0.03207 -0.298404,0.04687 0,0.01481 -0.05371,0.0182 -0.119361,0.0076 -0.08039,-0.01304 -0.119361,-0.0061 -0.119361,0.02122 0,0.02232 -0.01443,0.03166 -0.03208,0.02075 -0.03408,-0.02106 -0.587009,0.111706 -0.615884,0.147893 -0.0094,0.01176 -0.04775,0.02527 -0.08526,0.03003 -0.319552,0.04061 -0.388045,0.05571 -0.371812,0.08197 0.01026,0.01661 -0.02466,0.02725 -0.07759,0.02367 -0.107275,-0.0073 -0.331986,0.114563 -0.292219,0.15843 0.014,0.01544 0.0067,0.01729 -0.01626,0.0041 -0.03986,-0.0229 -0.410541,0.170723 -0.776766,0.405746 -0.09378,0.06018 -0.400713,0.229852 -0.682064,0.377042 -0.8431486,0.441091 -1.5106691,0.786933 -1.9438848,1.00712 -0.331279,0.168378 -0.7656083,0.411685 -1.2106655,0.678201 -0.1208071,0.07234 -0.7235464,0.348753 -1.0060453,0.461358 -0.1688108,0.06729 -0.3529682,0.143067 -0.4092389,0.168389 -0.3782305,0.170213 -0.4488005,0.204855 -0.4944967,0.24276 -0.1118065,0.09275 -0.7795227,0.48269 -0.974639,0.569184 -0.1140235,0.05055 -0.3212008,0.108223 -0.4603938,0.12817 -0.2794774,0.04005 -0.6793677,0.03386 -0.6793677,-0.01051 0,-0.01562 -0.014897,-0.01916 -0.033103,-0.0079 -0.018206,0.01125 -0.04289,-0.01852 -0.054852,-0.0662 -0.011962,-0.04766 -0.028767,-0.08665 -0.037344,-0.08665 -0.027842,0 -0.1640932,0.0777 -0.1816285,0.103583 -0.024028,0.03546 -0.2704515,0.135139 -0.3340901,0.135139 -0.040327,0 -0.033244,-0.02142 0.029742,-0.08996 l 0.082677,-0.08996 -0.1534646,0.02493 c -0.084405,0.01371 -0.2762361,0.02752 -0.4262904,0.0307 -0.1617809,0.0034 -0.3133657,0.02625 -0.3724277,0.0561 -0.076685,0.03876 -0.1028397,0.04063 -0.113677,0.0081 -0.00774,-0.02322 -0.050258,-0.04223 -0.09448,-0.04223 -0.044221,0 -0.090781,-0.0168 -0.1034652,-0.03732 -0.012684,-0.02052 -0.05963,-0.03032 -0.1043224,-0.02178 -0.044694,0.0085 -0.0812605,0.0028 -0.0812605,-0.01277 0,-0.01557 -0.0226251,-0.01963 -0.0502787,-0.009 -0.0276536,0.01062 -0.0747891,-0.0052 -0.10474605,-0.03517 -0.0299569,-0.02996 -0.0836695,-0.05446 -0.11936206,-0.05446 -0.0755134,0 -0.16300798,-0.155442 -0.14396948,-0.255775 0.0216458,-0.114071 0.0858903,-0.269677 0.13551736,-0.328235 0.0258287,-0.03048 0.0424846,-0.07582 0.0370134,-0.100762 -0.005471,-0.02494 0.0126179,-0.04604 0.0401989,-0.04689 0.0275816,-8.75e-4 0.0695576,-0.03992 0.0932812,-0.08681 0.0237239,-0.04689 0.0433594,-0.07187 0.0436366,-0.05551 2.7333e-4,0.01638 0.0233532,0.0108 0.0512819,-0.01239 0.0279281,-0.02318 0.0409047,-0.05812 0.0288344,-0.07765 -0.0120695,-0.01954 -0.00597,-0.02563 0.013563,-0.01355 0.03826,0.02364 0.1334119,-0.06902 0.102556,-0.09987 -0.010234,-0.01023 -0.081291,0.01337 -0.15790503,0.05246 -0.19132318,0.0976 -0.53029094,0.131726 -0.60948002,0.06135 -0.040574,-0.03605 -0.10602968,-0.04828 -0.20760549,-0.03876 L 0,26.723956 0.13129745,26.603285 c 0.20194096,-0.185598 1.15569925,-0.834706 1.22646285,-0.834706 0.017944,0 1.0011722,-0.593762 1.1596288,-0.700289 l 0.1062908,-0.07146 -0.097498,-0.04316 c -0.075194,-0.03329 -0.09082,-0.05618 -0.068306,-0.100101 0.016056,-0.03132 0.038207,-0.148677 0.049225,-0.2608 0.013936,-0.141813 0.038705,-0.216631 0.081377,-0.245814 0.1348325,-0.09221 0.317117,-0.268214 0.317117,-0.306188 0,-0.04333 -0.2144179,0.01817 -0.8473768,0.243035 -0.1940842,0.06895 -0.3609084,0.117337 -0.3707213,0.107524 -0.030038,-0.03004 0.1889381,-0.28351 0.3932649,-0.455219 0.1064018,-0.08942 0.2148835,-0.182797 0.2410706,-0.207519 0.134978,-0.127412 0.6824316,-0.46318 1.0116807,-0.620491 0.2054297,-0.09815 0.4118743,-0.205241 0.4587663,-0.237974 0.046892,-0.03274 0.2270451,-0.133333 0.40034,-0.223546 0.1732947,-0.09022 0.3093674,-0.169742 0.3023838,-0.176726 -0.00698,-0.007 -0.1087422,0.01965 -0.226129,0.0592 -0.1501313,0.05057 -0.2241353,0.06119 -0.249524,0.0358 -0.025388,-0.02539 -0.024637,-0.03609 0.00253,-0.03609 0.021244,0 0.048451,-0.03096 0.060459,-0.06879 0.019185,-0.06045 0.1680893,-0.221549 0.4635947,-0.501568 0.048755,-0.0462 0.1428871,-0.117089 0.2091823,-0.157532 0.2161395,-0.131856 0.3951126,-0.257621 0.4169899,-0.29302 0.022754,-0.03682 1.0610754,-0.562441 1.1881729,-0.601483 0.04125,-0.01267 0.1911105,-0.08059 0.3330257,-0.150923 0.1419153,-0.07034 0.2933966,-0.139111 0.3366242,-0.152832 0.043226,-0.01372 0.1463559,-0.07271 0.2291753,-0.131083 0.1199707,-0.08456 0.1625792,-0.09864 0.2096072,-0.06927 0.047284,0.02953 0.1538875,-0.0087 0.5358933,-0.192258 0.2622766,-0.126017 0.5689448,-0.264972 0.6814862,-0.308789 0.1125401,-0.04382 0.2249981,-0.09985 0.2499076,-0.124513 0.081951,-0.08115 0.1773194,-0.116582 0.3449729,-0.128175 0.1131113,-0.0078 0.1886589,-0.03475 0.2391522,-0.08524 0.040595,-0.0406 0.1438461,-0.118225 0.2294472,-0.172512 0.1733184,-0.109916 0.2284002,-0.176259 0.2623733,-0.316014 0.01334,-0.05486 0.06939,-0.123095 0.132975,-0.161862 0.06158,-0.03755 0.08742,-0.0685 0.05876,-0.07038 -0.08661,-0.0057 0.555593,-0.16351 0.673539,-0.16552 0.06836,-0.0011 0.110835,-0.01922 0.110835,-0.0471 0,-0.02486 0.03789,-0.08081 0.08421,-0.124319 0.09656,-0.09071 0.08465,-0.1374 -0.03506,-0.1374 -0.139172,0 -0.09502,-0.04884 0.164003,-0.181411 0.306614,-0.156928 0.449342,-0.161093 0.841624,-0.02456 0.28366,0.09873 0.288206,0.09917 0.345032,0.03364 0.03167,-0.03652 0.06838,-0.06639 0.08158,-0.06639 0.02544,0 0.444123,-0.288445 0.530711,-0.36562 0.02814,-0.02508 0.1816,-0.14031 0.341033,-0.256071 0.159432,-0.115763 0.427996,-0.311618 0.596806,-0.435234 0.324997,-0.237988 0.519973,-0.363211 0.852581,-0.547569 0.112541,-0.06238 0.272663,-0.181743 0.355823,-0.265252 l 0.151204,-0.151834 -0.279091,0.01616 c -0.295876,0.01713 -0.322422,0.0016 -0.24494,-0.143172 0.05332,-0.09963 0.736112,-0.634181 1.100461,-0.86154 0.05926,-0.03698 0.08714,-0.07645 0.07227,-0.102311 -0.01332,-0.02315 -0.01159,-0.03067 0.0038,-0.01669 0.01542,0.01398 0.07543,-0.01065 0.133354,-0.05471 0.219267,-0.166827 1.171023,-0.727058 1.367134,-0.804733 0.258942,-0.102562 0.861798,-0.404573 0.886111,-0.443911 0.0101,-0.01634 0.121786,-0.06366 0.248193,-0.105146 0.287589,-0.09439 0.30873,-0.106826 0.229061,-0.134772 -0.06732,-0.02362 -0.07326,-0.02127 0.880461,-0.347551 0.239998,-0.08211 0.429331,-0.156371 0.420748,-0.165033 -0.0086,-0.0087 0.03161,-0.01751 0.08933,-0.01966 0.05771,-0.0022 0.121598,-0.02517 0.141958,-0.05115 0.02171,-0.0277 0.120634,-0.05234 0.239187,-0.05957 0.210669,-0.01285 0.602989,-0.173276 0.928324,-0.379597 0.08567,-0.05433 0.264945,-0.123611 0.398397,-0.153965 0.133453,-0.03035 0.2584,-0.06637 0.277662,-0.08004 0.01927,-0.01367 0.09641,-0.04558 0.171433,-0.07092 0.07503,-0.02534 0.173013,-0.07458 0.217746,-0.109424 0.04473,-0.03484 0.09298,-0.06335 0.107228,-0.06335 0.01425,0 0.07348,-0.04445 0.131636,-0.09877 0.113963,-0.106457 0.351444,-0.240935 0.463279,-0.26234 0.038,-0.0073 0.08445,-0.03321 0.10321,-0.05764 0.01875,-0.02443 0.09498,-0.08983 0.169391,-0.145337 0.194156,-0.144837 0.214536,-0.162058 0.478569,-0.404414 0.251516,-0.230862 0.606848,-0.516232 1.227718,-0.98599 0.344093,-0.2603468 0.589539,-0.4332454 1.258562,-0.886573 0.133088,-0.09018 0.449157,-0.2640469 0.702374,-0.3863728 0.253216,-0.1223245 0.529451,-0.2557186 0.613857,-0.2964302 0.08441,-0.04071 0.158614,-0.085626 0.16491,-0.099811 0.0063,-0.014184 0.02548,-0.017112 0.04263,-0.00653 0.01716,0.010605 0.0312,0.00558 0.0312,-0.011156 0,-0.016741 0.02005,-0.030435 0.04455,-0.030435 0.0245,0 0.158784,-0.058252 0.298402,-0.129445 0.139619,-0.071195 0.430335,-0.1978034 0.646038,-0.2813523 0.215704,-0.083549 0.491939,-0.1954213 0.613858,-0.2486049 0.121921,-0.053185 0.306077,-0.1321049 0.40924,-0.1753788 0.103162,-0.043273 0.29828,-0.1359289 0.433601,-0.2058975 0.135324,-0.069969 0.361685,-0.1753594 0.503025,-0.2342005 0.141344,-0.058844 0.256987,-0.118339 0.256987,-0.1322199 0,-0.013882 0.01945,-0.02524 0.04319,-0.02524 0.02377,0 0.303834,-0.1227275 0.622385,-0.2727296 0.318551,-0.1500017 0.675102,-0.3078947 0.792333,-0.3508747 0.117228,-0.042978 0.213145,-0.092292 0.213145,-0.1095837 0,-0.017291 0.01918,-0.027759 0.04263,-0.02326 0.06969,0.013374 0.594379,-0.1884232 0.639435,-0.2459351 0.0094,-0.011971 0.04007,-0.021527 0.06821,-0.021238 0.121558,0.00127 0.660662,-0.1945862 0.918837,-0.3337747 0.241294,-0.1300895 0.587545,-0.3830342 0.701059,-0.5121391 0.01875,-0.021333 0.06131,-0.048999 0.09456,-0.061479 0.03325,-0.012481 0.07001,-0.047591 0.08169,-0.078024 0.02692,-0.070138 0.174568,-0.219039 0.217202,-0.219039 0.01774,0 0.05143,-0.030691 0.07486,-0.068207 0.02342,-0.037513 0.06448,-0.068206 0.09123,-0.068206 0.02675,0 0.03887,-0.00976 0.02696,-0.021682 -0.01192,-0.011924 0.05783,-0.09633 0.155007,-0.1875678 0.09718,-0.091238 0.161929,-0.1668596 0.143886,-0.168049 -0.01803,-0.00118 0.0028,-0.016405 0.04612,-0.033815 0.04747,-0.019039 0.06915,-0.047456 0.05441,-0.071314 -0.01348,-0.021822 -0.0098,-0.030553 0.0083,-0.019409 0.01801,0.011138 0.09144,-0.040204 0.163151,-0.1140923 0.0717,-0.073888 0.117738,-0.1343421 0.10229,-0.1343421 -0.01546,0 0.02072,-0.036015 0.08038,-0.080032 0.05967,-0.044017 0.09718,-0.091336 0.08336,-0.105152 -0.01383,-0.013815 -0.0095,-0.020006 0.0097,-0.013752 0.04939,0.01615 0.223702,-0.1274928 0.194271,-0.1600887 -0.01342,-0.014875 -0.0072,-0.017247 0.01376,-0.00527 0.06096,0.034779 0.607999,-0.4589859 0.563584,-0.5087016 -0.0121,-0.013544 -0.0039,-0.014234 0.01831,-0.00155 0.02248,0.012885 0.06394,-0.010665 0.09378,-0.053276 0.02942,-0.042001 0.05349,-0.064232 0.05349,-0.049403 0,0.035425 0.155483,-0.078134 0.314002,-0.2293306 0.06954,-0.066327 0.191209,-0.1634486 0.270384,-0.2158258 l 0.143933,-0.095226 -0.09461,-0.017052 c -0.09208,-0.016595 -0.08962,-0.020213 0.09234,-0.1351948 0.102836,-0.064979 0.180276,-0.1355869 0.172099,-0.1569075 -0.0082,-0.021322 0.03576,-0.063723 0.09766,-0.094226 l 0.112534,-0.055461 -0.110835,-7.738e-4 c -0.121681,-8.545e-4 -0.148951,-0.052289 -0.04518,-0.085223 0.03611,-0.011461 0.177308,-0.1287936 0.313783,-0.260741 0.136473,-0.1319475 0.294923,-0.2638643 0.352116,-0.2931487 0.05718,-0.029285 0.112307,-0.066044 0.122484,-0.081687 0.01017,-0.015643 0.08691,-0.0653452 0.170517,-0.1104495 0.08361,-0.0451035 0.148684,-0.0976873 0.144617,-0.11685267 -0.0041,-0.0191645 0.0331,-0.0450046 0.08257,-0.0574227 0.04948,-0.0124174 0.127764,-0.0523182 0.173974,-0.0886698 0.04622,-0.0363507 0.110775,-0.0660921 0.143466,-0.0660921 0.08441,0 0.311151,-0.09789 0.391757,-0.16912543 0.07224,-0.0638419 0.511584,-0.24011339 0.598463,-0.24011339 0.02826,0 0.08528,-0.0237481 0.126716,-0.0527741 0.137291,-0.09616158 0.661132,-0.14352007 1.525634,-0.1379271367 0.792642,0.005129127 0.827085,0.008206607 1.091305,0.0975625367 0.150053,0.050747 0.291903,0.09246343 0.315215,0.09270283 0.09396,9.6895e-4 0.976611,0.42511458 1.100071,0.52862744 0.02811,0.02359 0.159498,0.0947176 0.291932,0.15806233 0.235834,0.11281152 0.25372,0.12719829 0.25372,0.20412699 0,0.023291 0.03271,0.029587 0.08526,0.016402 0.05003,-0.012556 0.08526,-0.00673 0.08526,0.014086 0,0.019516 0.04219,0.054229 0.09378,0.077137 0.05158,0.022909 0.123537,0.06862 0.159895,0.1015785 0.03637,0.032959 0.08624,0.059926 0.110835,0.059926 0.02459,0 0.04471,0.012883 0.04471,0.028629 0,0.037801 0.156041,0.1077839 0.240323,0.1077839 0.03664,0 0.0666,0.015347 0.0666,0.034103 0,0.050098 0.102113,0.041678 0.103394,-0.00853 4.52e-4,-0.025512 0.01972,-0.01804 0.04753,0.018611 0.03352,0.044207 0.07116,0.055035 0.135327,0.038932 0.05776,-0.014496 0.08889,-0.00837 0.08889,0.017504 0,0.021897 0.01498,0.030556 0.0333,0.019242 0.0461,-0.028494 0.444224,0.057046 0.423279,0.090944 -0.0093,0.015101 0.01841,0.027008 0.06163,0.02646 0.09589,-0.00121 0.512136,0.096881 0.42817,0.100902 -0.03285,0.00157 -0.05968,0.016565 -0.05968,0.033318 0,0.03259 0.410853,0.1157062 0.437957,0.0886 0.0089,-0.00889 0.03294,-0.00257 0.0534,0.014024 0.06789,0.055028 0.736829,0.2457834 0.776319,0.2213777 0.02148,-0.013281 0.02951,-0.00894 0.01796,0.00974 -0.01146,0.018537 0.130919,0.1054296 0.316393,0.1930939 0.185473,0.087664 0.472547,0.2615323 0.637942,0.3863739 0.1654,0.1248417 0.319902,0.2270363 0.343352,0.2270984 0.02346,6.81e-5 0.03547,0.00725 0.02675,0.015975 -0.0087,0.00872 0.03686,0.077444 0.101278,0.1527108 0.06442,0.075267 0.110018,0.148369 0.101315,0.162449 -0.0087,0.014079 0.0071,0.034399 0.03515,0.045154 0.02802,0.010755 0.0512,8.546e-4 0.05148,-0.022004 4.51e-4,-0.032265 0.0064,-0.032371 0.02662,-4.693e-4 0.01435,0.022595 0.02243,0.1068802 0.01796,0.1872996 -0.0057,0.1024476 0.0013,0.1309839 0.024,0.09533 0.02653,-0.041988 0.03272,-0.038959 0.03537,0.017319 0.0018,0.037513 0.01096,0.049024 0.0204,0.025578 0.0094,-0.023446 0.02802,-0.042629 0.04119,-0.042629 0.03781,0 0.03799,0.1327189 0,0.1560674 -0.02003,0.012395 -0.01119,0.037667 0.0217,0.061689 0.03979,0.029097 0.04904,0.067036 0.03244,0.1331389 -0.01277,0.050846 -0.03781,0.092447 -0.05563,0.092447 -0.01783,0 -0.02058,-0.019183 -0.0061,-0.042629 0.01444,-0.023446 -0.01394,-0.016324 -0.06312,0.015829 -0.08648,0.056549 -0.219373,0.09752 -0.342779,0.1056776 -0.0328,0.00217 -0.05968,0.015832 -0.05968,0.030358 0,0.014528 -0.03452,0.026195 -0.07673,0.025926 -0.04219,-2.688e-4 -0.12277,0.00591 -0.17904,0.013737 -0.971882,0.1351175 -1.779858,0.2316536 -2.0803,0.2485518 -0.206324,0.011606 -0.393648,0.035672 -0.416267,0.053482 -0.02261,0.017814 -0.05578,0.023341 -0.07366,0.012286 -0.05845,-0.036117 -0.137867,0.016695 -0.115393,0.076729 0.01854,0.049502 0.01385,0.050803 -0.03628,0.010053 -0.03979,-0.032383 -0.05754,-0.034549 -0.05754,-0.00703 0,0.021875 -0.01918,0.037283 -0.04264,0.034238 -0.113695,-0.014764 -0.168405,0.00487 -0.149657,0.0537 0.02179,0.056803 -0.03027,0.070789 -0.06349,0.017051 -0.01159,-0.018757 -0.0547,-0.032889 -0.0958,-0.031409 -0.04111,0.00149 -0.0564,0.010143 -0.03402,0.019253 0.02238,0.00911 0.03199,0.039256 0.02134,0.066986 -0.01674,0.043659 -0.02757,0.043 -0.0805,-0.00493 -0.04614,-0.041755 -0.07725,-0.046733 -0.126687,-0.020273 -0.03605,0.019289 -0.100448,0.02594 -0.143132,0.014777 -0.06857,-0.017931 -0.07496,-0.010784 -0.05491,0.061432 0.02026,0.072941 0.01773,0.075587 -0.02355,0.024614 -0.043,-0.053101 -0.05392,-0.052267 -0.155229,0.011876 -0.05993,0.037942 -0.108954,0.096734 -0.108954,0.1306499 0,0.044877 -0.01859,0.056808 -0.0682,0.04383 -0.0459,-0.012002 -0.06821,-0.00104 -0.06821,0.033502 0,0.031463 -0.04526,0.059826 -0.11689,0.073265 -0.0945,0.017728 -0.121158,0.041367 -0.139184,0.1234405 -0.02175,0.099065 -0.131379,0.1912377 -0.208964,0.1757021 -0.0213,-0.00429 -0.04769,0.015535 -0.05861,0.044002 -0.01092,0.028466 -0.0342,0.051758 -0.05175,0.051758 -0.03502,0 -0.139325,0.089285 -0.496709,0.4251098 -0.130107,0.1222664 -0.264395,0.2311337 -0.298403,0.241927 -0.03401,0.010793 -0.0623,0.045447 -0.06289,0.077007 -6.73e-4,0.031562 -0.0658,0.1065697 -0.144939,0.1666874 -0.270923,0.2058155 -0.531097,0.4853767 -0.510157,0.5481845 0.0076,0.022891 -0.0026,0.041625 -0.02258,0.041625 -0.02005,0 -0.05384,0.069059 -0.0751,0.1534642 -0.02126,0.084405 -0.05168,0.153465 -0.06763,0.153465 -0.01593,0 -0.02014,0.023019 -0.0093,0.051153 0.0108,0.028133 0.0056,0.051153 -0.01149,0.051153 -0.01712,0 -0.03115,0.034533 -0.03119,0.076733 0,0.1328989 -0.05393,0.4006339 -0.07758,0.3860182 -0.02005,-0.012388 -0.02725,0.1344432 -0.04256,0.8672752 -0.002,0.1031621 -0.01694,0.1959073 -0.03288,0.2061001 -0.03087,0.019749 -0.0581,0.1355871 -0.06226,0.2648322 -0.0013,0.043314 -0.0177,0.069369 -0.03625,0.057909 -0.01933,-0.011951 -0.02505,0.00175 -0.0134,0.03209 0.01118,0.029109 0.0038,0.052929 -0.01638,0.052929 -0.02017,0 -0.02725,0.024567 -0.01573,0.054598 0.01151,0.030024 0.004,0.065088 -0.01676,0.077907 -0.02074,0.012818 -0.04479,0.099111 -0.05345,0.1917602 -0.0087,0.092648 -0.03066,0.1734248 -0.0489,0.1795037 -0.01824,0.00606 -0.02536,0.040824 -0.01584,0.077209 0.01077,0.041208 -0.0034,0.074092 -0.03753,0.087197 -0.03015,0.01157 -0.04634,0.03478 -0.03596,0.05157 0.01038,0.0168 0.005,0.03053 -0.01205,0.03053 -0.017,0 -0.03228,0.04742 -0.03393,0.105393 -0.0051,0.179718 -0.117438,0.644115 -0.15081,0.623489 -0.01741,-0.01076 -0.02813,0.0011 -0.02381,0.02649 0.0043,0.02533 -0.0024,0.08442 -0.01478,0.131309 -0.01244,0.04689 -0.02923,0.154317 -0.03733,0.238722 -0.03648,0.380211 -0.166541,0.813049 -0.262056,0.87208 -0.01658,0.01025 -0.03014,0.06376 -0.03014,0.118927 0,0.05516 -0.01494,0.100297 -0.03323,0.100297 -0.04322,0 -0.145532,0.197792 -0.122006,0.23586 0.01,0.01608 -0.0048,0.04821 -0.0327,0.07138 -0.02793,0.02318 -0.05078,0.06201 -0.05078,0.08628 0,0.02428 -0.01521,0.04926 -0.03381,0.05551 -0.01859,0.0063 -0.03965,0.06171 -0.0468,0.123232 -0.0071,0.06153 -0.03801,0.139504 -0.06858,0.173284 -0.03057,0.03378 -0.04532,0.07168 -0.03278,0.08423 0.01255,0.01254 0.0024,0.02281 -0.02266,0.02281 -0.02501,0 -0.03585,0.0096 -0.0241,0.02137 0.0306,0.0306 -0.07344,0.220798 -0.170284,0.311282 -0.04526,0.04228 -0.07383,0.09055 -0.06351,0.107262 0.01033,0.01671 -0.0042,0.03918 -0.03219,0.04993 -0.02803,0.01075 -0.05096,0.05164 -0.05096,0.09084 0,0.03921 -0.01459,0.06228 -0.03239,0.05127 -0.03561,-0.022 -0.113081,0.09788 -0.08282,0.128147 0.01035,0.01034 -0.02074,0.04474 -0.06911,0.07642 -0.04835,0.03169 -0.08004,0.07036 -0.0704,0.08595 0.01898,0.03069 -0.114371,0.168819 -0.162961,0.168819 -0.01633,0 -0.02025,0.01524 -0.0088,0.03387 0.01151,0.01863 -0.03329,0.0897 -0.09956,0.157928 -0.06627,0.06823 -0.110938,0.139503 -0.09927,0.158378 0.01168,0.01887 -0.01552,0.06424 -0.06042,0.100806 -0.0449,0.03656 -0.05862,0.05631 -0.03048,0.04387 0.02814,-0.01243 0.01662,0.0079 -0.02558,0.04514 -0.0422,0.03726 -0.07673,0.08078 -0.07673,0.09671 0,0.01593 -0.03129,0.0485 -0.06953,0.07238 -0.03825,0.02388 -0.06135,0.05666 -0.05135,0.07284 0.01,0.01618 -0.0057,0.03859 -0.03494,0.0498 -0.02921,0.01121 -0.04333,0.03622 -0.03137,0.05557 0.01196,0.01935 0.0028,0.03097 -0.02039,0.02582 -0.02317,-0.0052 -0.05348,0.02899 -0.06734,0.07589 -0.01387,0.04689 -0.02673,0.07265 -0.0286,0.05724 -0.0047,-0.0388 -0.105707,0.06596 -0.105707,0.109636 0,0.01944 -0.03113,0.05199 -0.06916,0.07235 -0.03805,0.02035 -0.06111,0.05004 -0.05127,0.06597 0.0099,0.01593 -0.03193,0.07271 -0.09283,0.126176 -0.0609,0.05347 -0.118399,0.112566 -0.127777,0.131323 -0.0094,0.01876 -0.0255,0.03129 -0.03584,0.02784 -0.01033,-0.0034 -0.03831,0.02502 -0.0622,0.06325 -0.03566,0.0571 -0.03535,0.06485 0.0018,0.0434 0.05754,-0.03329 -0.100394,0.1488 -0.202424,0.233387 -0.04238,0.03514 -0.06834,0.078 -0.05767,0.09525 0.01067,0.01725 -0.0028,0.03137 -0.02973,0.03137 -0.05121,0 -0.198718,0.175689 -0.238939,0.28459 -0.01279,0.0346 -0.05386,0.07092 -0.09128,0.08071 -0.03742,0.0098 -0.06803,0.03258 -0.06803,0.05064 0,0.01807 -0.09548,0.127541 -0.212171,0.243271 -0.116693,0.115729 -0.208771,0.221926 -0.204617,0.235994 0.0042,0.01407 -0.0136,0.02558 -0.03946,0.02558 -0.0419,0 -0.36223,0.342153 -0.36223,0.386912 0,0.01812 -0.168333,0.207786 -0.434598,0.489667 -0.0797,0.08438 -0.134927,0.169585 -0.122716,0.189342 0.01221,0.01976 0.0063,0.02606 -0.01324,0.01401 -0.01949,-0.01205 -0.148957,0.09803 -0.287676,0.244627 -0.138717,0.146595 -0.276317,0.280693 -0.305775,0.297993 -0.113761,0.06682 -0.575254,0.510672 -0.575254,0.553274 0,0.0247 -0.01457,0.0359 -0.03239,0.0249 -0.01781,-0.01102 -0.04944,0.01184 -0.07028,0.05078 -0.02084,0.03893 -0.07624,0.08538 -0.123127,0.103201 -0.04688,0.01782 -0.07681,0.04604 -0.06651,0.06271 0.01031,0.01667 0,0.04609 -0.02352,0.06537 -0.04179,0.03468 -0.06108,0.04086 -0.127513,0.04086 -0.01875,0 -0.03027,0.01782 -0.02558,0.03961 0.0047,0.02178 -0.02216,0.04864 -0.05968,0.05968 -0.09596,0.02823 -0.460392,0.278998 -0.460392,0.316789 0,0.01721 -0.01255,0.02353 -0.02789,0.01405 -0.01535,-0.0095 -0.06906,0.02093 -0.119362,0.06757 -0.05031,0.04665 -0.09193,0.07268 -0.09251,0.05785 -6.72e-4,-0.01482 -0.01667,-6.8e-5 -0.0358,0.03272 -0.01911,0.03282 -0.06469,0.05968 -0.101275,0.05968 -0.03659,0 -0.09465,0.02686 -0.129032,0.05968 -0.03439,0.03282 -0.08427,0.06436 -0.110835,0.07008 -0.02657,0.0057 -0.06461,0.03156 -0.08453,0.05742 -0.01992,0.02586 -0.07746,0.05738 -0.127885,0.07003 -0.05042,0.01265 -0.09168,0.03925 -0.09168,0.0591 0,0.01985 -0.0097,0.02636 -0.02162,0.01447 -0.04327,-0.04327 -0.532043,0.244878 -0.72163,0.425432 -0.107024,0.101924 -0.294339,0.269485 -0.416257,0.372357 -0.351072,0.296226 -0.477445,0.419441 -0.477445,0.465526 0,0.02358 -0.01248,0.03903 -0.02774,0.03434 -0.03696,-0.01136 -0.401163,0.357536 -0.389174,0.394188 0.0052,0.01575 -0.0044,0.02012 -0.0213,0.0097 -0.01687,-0.01042 -0.120842,0.08723 -0.231043,0.217028 -0.110194,0.129794 -0.21571,0.237324 -0.234468,0.238955 -0.01875,0.0015 -0.139775,0.102333 -0.268924,0.223779 -0.129156,0.121446 -0.242179,0.220809 -0.251161,0.220809 -0.02537,0 -0.405851,0.275683 -0.572008,0.414454 -0.08205,0.06852 -0.314931,0.239897 -0.51753,0.380842 -0.387603,0.269655 -0.569368,0.44102 -0.766137,0.7223 -0.153643,0.219636 -0.36955,0.618807 -0.36955,0.683236 0,0.02749 -0.01176,0.04998 -0.02616,0.04998 -0.03167,0 -0.156417,0.321733 -0.224782,0.579755 -0.02733,0.103161 -0.05974,0.38707 -0.07201,0.63091 -0.01228,0.243838 -0.0367,0.457921 -0.0543,0.47574 -0.01759,0.01781 -0.03199,0.148686 -0.03199,0.290814 0,0.176685 -0.01649,0.281962 -0.05214,0.332861 -0.06265,0.08945 -0.03628,0.229636 0.05526,0.293757 0.03494,0.02447 0.273134,0.242804 0.529317,0.485172 0.256175,0.242373 0.479046,0.445791 0.495268,0.452042 0.01622,0.0063 0.02949,0.03311 0.02949,0.05968 0,0.02657 0.01297,0.04831 0.02881,0.04831 0.01584,0 0.103231,0.07579 0.194197,0.168432 0.09096,0.09264 0.17544,0.16222 0.187725,0.154627 0.01228,-0.0076 0.05524,0.02404 0.09546,0.07029 0.04022,0.04625 0.08856,0.0841 0.107445,0.0841 0.01889,0 0.03433,0.02302 0.03433,0.05115 0,0.02814 0.02393,0.05115 0.05316,0.05115 0.02924,0 0.04403,0.01481 0.03285,0.03288 -0.01118,0.01808 0.0378,0.07056 0.108823,0.116611 0.146636,0.09507 0.410528,0.327953 0.371622,0.327953 -0.01411,0 -0.0027,0.02302 0.02548,0.05115 0.02813,0.02814 0.07527,0.05115 0.104743,0.05115 0.02948,0 0.04976,0.01918 0.04506,0.04263 -0.0047,0.02344 0.01067,0.03879 0.0341,0.0341 0.02345,-0.0047 0.03879,0.01066 0.0341,0.0341 -0.0047,0.02344 0.01067,0.03879 0.03411,0.0341 0.02345,-0.0047 0.04263,0.0068 0.04263,0.02558 0,0.01875 0.01151,0.03167 0.02558,0.02869 0.01407,-0.003 0.05372,0.0068 0.08812,0.0218 0.04921,0.02142 0.05285,0.03336 0.01705,0.05605 -0.03107,0.0197 -0.01515,0.029 0.05031,0.02936 0.05269,4.48e-4 0.08814,0.01291 0.07878,0.02806 -0.0094,0.01515 0.01658,0.05262 0.05767,0.08326 0.211981,0.158129 0.321478,0.232868 0.398667,0.272128 0.115603,0.05878 0.204537,0.136366 0.205017,0.178823 6.73e-4,0.01926 0.06544,0.06496 0.144938,0.101519 0.141447,0.06505 0.340091,0.238163 0.308982,0.269278 -0.02718,0.02718 0.06833,0.153699 0.127777,0.169241 0.06948,0.01817 0.188265,0.276674 0.320871,0.69827 0.08404,0.267179 0.118475,0.330863 0.220688,0.408197 0.06662,0.0504 0.147197,0.124217 0.17907,0.164057 0.09286,0.116054 0.407185,0.314295 0.561941,0.354407 0.212211,0.05501 0.317944,0.197997 0.317944,0.42998 0,0.177064 0.0046,0.186422 0.114315,0.232258 0.06286,0.02626 0.181802,0.05857 0.2643,0.07179 0.08249,0.01322 0.264143,0.05332 0.403658,0.08911 0.139516,0.0358 0.327111,0.06508 0.416878,0.06508 0.191088,0 0.623427,0.160645 0.804959,0.299105 0.06647,0.0507 0.148841,0.153773 0.183033,0.229045 0.08345,0.183693 0.08156,0.232392 -0.0079,0.203999 -0.0628,-0.01994 -0.06843,-0.01289 -0.04589,0.05738 0.06069,0.189278 0.08178,0.333911 0.08254,0.566071 l 8.75e-4,0.247251 -0.10231,0 c -0.141004,0 -0.224605,-0.0965 -0.270173,-0.311862 -0.02207,-0.104268 -0.09225,-0.260923 -0.163567,-0.365089 -0.119313,-0.174261 -0.130354,-0.181565 -0.24619,-0.162767 -0.149842,0.02432 -0.206755,0.09784 -0.206755,0.267096 l 0,0.130514 -0.144938,-0.0091 c -0.128781,-0.0081 -0.143506,-0.0015 -0.132061,0.05907 0.02757,0.146015 0.01951,0.403542 -0.01289,0.41185 -0.01875,0.0048 -0.05329,0.0011 -0.07673,-0.0083 z m -4.19369,-3.988246 c 0.03255,-0.03255 -0.11857,-0.219098 -0.220265,-0.271924 -0.05026,-0.0261 -0.100619,-0.07448 -0.111934,-0.107508 -0.01132,-0.03303 -0.08846,-0.113161 -0.171444,-0.178065 -0.08298,-0.06491 -0.144604,-0.124279 -0.136937,-0.131946 0.01826,-0.01826 -0.252842,-0.244541 -0.292968,-0.244541 -0.01698,0 -0.03088,-0.02302 -0.03088,-0.05116 0,-0.02813 -0.01918,-0.04732 -0.04263,-0.04263 -0.02345,0.0047 -0.03879,-0.01067 -0.03411,-0.0341 0.0047,-0.02344 -0.0145,-0.04263 -0.04263,-0.04263 -0.02814,0 -0.05115,-0.02165 -0.05115,-0.04811 0,-0.02646 -0.09552,-0.13005 -0.212251,-0.230198 -0.116736,-0.100146 -0.253339,-0.224289 -0.30356,-0.27587 -0.05022,-0.05158 -0.09883,-0.09379 -0.108026,-0.09379 -0.0092,0 -0.09926,-0.08057 -0.200152,-0.17904 -0.186476,-0.182007 -0.359788,-0.332507 -0.382912,-0.332507 -0.007,0 -0.08682,-0.06799 -0.177335,-0.151102 -0.09051,-0.08311 -0.17673,-0.143589 -0.191592,-0.1344 -0.01486,0.0092 -0.02702,0.0024 -0.02702,-0.01528 0,-0.04201 -0.511787,-0.42675 -0.567681,-0.42675 -0.02375,0 -0.03553,-0.01237 -0.02619,-0.02747 0.02194,-0.03549 -0.281469,-0.225376 -0.403641,-0.252609 -0.05158,-0.01149 -0.09378,-0.03557 -0.09378,-0.05349 0,-0.019 -0.02956,-0.01678 -0.07091,0.0054 -0.06793,0.03636 -0.064,0.04498 0.09378,0.205769 0.09058,0.0923 0.183871,0.167842 0.207322,0.167869 0.02344,2.7e-5 0.04263,0.01302 0.04263,0.02885 0,0.01584 0.117144,0.14245 0.26033,0.281352 0.143178,0.138902 0.292804,0.289504 0.332507,0.334665 0.125042,0.142265 0.487691,0.495555 0.560957,0.546484 0.03864,0.02686 0.06096,0.06523 0.04957,0.08526 -0.01138,0.02003 -0.0087,0.02557 0.0061,0.0123 0.0147,-0.01326 0.07471,0.01169 0.133356,0.05543 0.05864,0.04375 0.165259,0.106726 0.236917,0.139967 0.0936,0.04341 0.117608,0.06848 0.08526,0.08899 -0.03381,0.02144 -0.02966,0.02869 0.01667,0.02908 0.03393,4.48e-4 0.05331,0.01409 0.04306,0.03066 -0.01667,0.02698 0.14951,0.115529 0.236282,0.125904 0.01875,0.0023 0.05419,0.0064 0.07875,0.0093 0.02455,0.0029 0.03515,0.02054 0.02356,0.0393 -0.01161,0.01875 0.0036,0.0341 0.0339,0.0341 0.03023,0 0.111436,0.03837 0.180445,0.08526 0.06901,0.04689 0.10272,0.08549 0.07492,0.08578 -0.04424,6.72e-4 -0.04417,0.0046 6.73e-4,0.03333 0.02814,0.01803 0.0764,0.02496 0.107242,0.01537 0.05882,-0.01828 0.141637,0.04693 0.20138,0.15856 0.01945,0.03632 0.09688,0.104889 0.17209,0.152367 0.10982,0.06933 0.132322,0.100292 0.114247,0.157236 -0.01432,0.04508 -0.0096,0.06294 0.01288,0.04903 0.01947,-0.01203 0.04436,-0.0074 0.05532,0.01035 0.01095,0.01772 -0.01483,0.0389 -0.05733,0.04706 -0.06684,0.01286 -0.06461,0.01548 0.01656,0.01949 0.07775,0.0038 0.09378,0.02023 0.09378,0.09574 0,0.149781 0.08859,0.215831 0.289483,0.215831 0.09713,0 0.186006,-0.0094 0.197504,-0.02091 z m -3.916702,-3.351519 c 0.01031,-0.01667 -0.03866,-0.07277 -0.108823,-0.124668 -0.162544,-0.12024 -0.245198,-0.220673 -0.246159,-0.299097 -0.0011,-0.08664 -0.139045,-0.398508 -0.176318,-0.398508 -0.01692,0 -0.04534,-0.03837 -0.06316,-0.08526 -0.01784,-0.04689 -0.04766,-0.08526 -0.06629,-0.08526 -0.01864,0 -0.02504,-0.02302 -0.01425,-0.05115 0.0108,-0.02813 0.0057,-0.05115 -0.01129,-0.05115 -0.04968,0 -0.120395,0.399496 -0.08306,0.469258 0.01779,0.03321 0.143661,0.159902 0.279747,0.281536 0.13608,0.121632 0.279425,0.254059 0.318537,0.294281 0.07702,0.0792 0.141411,0.09803 0.17108,0.05003 z m -0.771004,-2.50443 c -0.0043,-0.02202 0.0183,-0.08917 0.05025,-0.149197 0.03194,-0.06003 0.05808,-0.149179 0.05808,-0.198109 0,-0.05436 0.01416,-0.08021 0.0364,-0.06647 0.03025,0.01869 0.09496,-0.116002 0.0709,-0.147575 -0.004,-0.0054 0.01613,-0.03331 0.04495,-0.06211 0.02881,-0.02881 0.05237,-0.08874 0.05237,-0.133183 0,-0.04445 0.01414,-0.08955 0.03142,-0.100225 0.01728,-0.01069 0.05839,-0.09215 0.09136,-0.181054 0.03297,-0.08891 0.08744,-0.201739 0.12104,-0.250748 0.0336,-0.04901 0.05132,-0.09889 0.03937,-0.110837 -0.01194,-0.01194 -0.0038,-0.02173 0.01806,-0.02173 0.02189,0 0.03955,-0.02686 0.03927,-0.05968 -6.73e-4,-0.05155 -0.0055,-0.05271 -0.03706,-0.0085 -0.03005,0.04207 -0.03367,0.03904 -0.02039,-0.01705 0.0089,-0.03751 0.02822,-0.09773 0.04298,-0.13381 0.02151,-0.05253 0.01548,-0.06124 -0.03023,-0.0437 -0.07092,0.02721 -0.07416,-0.02222 -0.0059,-0.09045 0.02814,-0.02813 0.05065,-0.07911 0.05002,-0.113272 -8.75e-4,-0.05383 -0.01019,-0.05124 -0.06906,0.01945 -0.03736,0.04486 -0.07781,0.07168 -0.08988,0.0596 -0.01208,-0.01207 -0.05363,0.0049 -0.09234,0.0378 -0.06688,0.05679 -0.06809,0.05679 -0.02417,0 0.02827,-0.0365 0.03201,-0.05968 0.0096,-0.05968 -0.02012,0 -0.04886,0.01918 -0.06386,0.04263 -0.01501,0.02344 -0.057,0.06565 -0.09334,0.09379 -0.06006,0.0465 -0.06403,0.04573 -0.0437,-0.0085 0.0123,-0.03282 0.0081,-0.05969 -0.0093,-0.05969 -0.01746,0 -0.04841,0.06522 -0.06882,0.144939 -0.02042,0.07972 -0.04562,0.167959 -0.05602,0.196096 -0.04849,0.131129 -0.111834,0.499144 -0.09503,0.552109 0.01033,0.03255 0.0018,0.09092 -0.01898,0.129723 -0.04485,0.08379 -0.0079,0.827525 0.03967,0.798134 0.01662,-0.01026 0.02669,-0.0367 0.02239,-0.05873 z m 0.415265,-1.487433 c 0,-0.01986 0.01535,-0.03611 0.0341,-0.03611 0.01875,0 0.03411,0.0068 0.03411,0.01503 0,0.0083 -0.01535,0.02453 -0.03411,0.03611 -0.01875,0.01158 -0.0341,0.0048 -0.0341,-0.01503 z m 0.06821,-0.102309 c 0,-0.01985 0.01535,-0.03611 0.0341,-0.03611 0.01875,0 0.0341,0.0068 0.0341,0.01503 0,0.0083 -0.01535,0.02452 -0.0341,0.03611 -0.01875,0.01158 -0.0341,0.0048 -0.0341,-0.01503 z M 50.350048,2.911456 c -0.04024,-0.04024 -0.0851,-0.060404 -0.09969,-0.044811 -0.01458,0.015594 -0.0073,0.035235 0.01633,0.043647 0.02355,0.00841 0.03614,0.026146 0.02793,0.039407 -0.0082,0.013261 0.01737,0.026543 0.05685,0.029515 l 0.07175,0.0054 -0.07316,-0.073163 z M 28.551232,31.653751 c 0,-0.0083 0.01534,-0.02453 0.0341,-0.03611 0.01875,-0.01158 0.0341,-0.0048 0.0341,0.01503 0,0.01987 -0.01534,0.03611 -0.0341,0.03611 -0.01875,0 -0.0341,-0.0067 -0.0341,-0.01503 z M 47.469354,1.6014697 c 0.0231,-0.00934 0.06912,-0.00991 0.102307,-0.00127 0.03317,0.00865 0.01431,0.016289 -0.04196,0.016985 -0.05627,6.93e-4 -0.08342,-0.00638 -0.06032,-0.015721 z"
+     style="fill:#000000" />
+</svg>
diff --git a/Images/screenshot.png b/Images/screenshot.png
new file mode 100644 (file)
index 0000000..3540d6b
Binary files /dev/null and b/Images/screenshot.png differ
diff --git a/Images/screenshot2.png b/Images/screenshot2.png
new file mode 100644 (file)
index 0000000..46a7bec
Binary files /dev/null and b/Images/screenshot2.png differ
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644 (file)
index 0000000..2c2a0a1
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) [2016] [Jean-Philippe Bruyère]
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/MDCrow/AddinInfo.cs b/MDCrow/AddinInfo.cs
new file mode 100644 (file)
index 0000000..331366c
--- /dev/null
@@ -0,0 +1,44 @@
+//
+// AddinInfo.cs
+//
+// Author:
+//       Mikayla Hutchinson <m.j.hutchinson@gmail.com>
+//
+// Copyright (c) 2017 Microsoft Corp.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Mono.Addins;
+using Mono.Addins.Description;
+
+[assembly: Addin (
+       "MDCrow",
+       Namespace = "MonoDevelop",
+       Version = "1.0"
+)]
+
+[assembly: AddinName ("MDCrow")]
+[assembly: AddinCategory ("IDE extensions")]
+[assembly: AddinDescription ("Crow interface designer")]
+[assembly: AddinAuthor ("JP Bruyère")]
+
+[assembly: AddinDependency ("Core", MonoDevelop.BuildInfo.Version)]
+[assembly: AddinDependency ("Ide", MonoDevelop.BuildInfo.Version)]
+//[assembly: AddinDependency ("::Core", "7.0")]
+//[assembly: AddinDependency ("::Ide", "7.0")]
diff --git a/MDCrow/MDCrow.addin.xml b/MDCrow/MDCrow.addin.xml
new file mode 100644 (file)
index 0000000..24998c4
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ExtensionModel>    
+    <Extension path = "/MonoDevelop/Ide/DisplayBindings">           
+        <DisplayBinding
+            id = "Crow Designer"
+            insertafter ="AssemblyBrowser" 
+            class = "MDCrow.CrowDisplayBinding" />
+    </Extension>
+    <Extension path = "/MonoDevelop/Ide/Pads/ProjectPad">
+        <NodeBuilder id = "CrowNodeExtension" class = "MDCrow.CrowNodeExtension"/>
+    </Extension>
+    <Extension path = "/MonoDevelop/Core/MimeTypes">
+        <MimeType id="text/x-crow" _description="Crow interface definition" icon="md-csharp-file" isText="false">
+            <File pattern="*.crow" />
+        </MimeType>
+        <MimeType id="text/x-goml" _description="GOlib interface definition" icon="md-csharp-file" isText="false">
+            <File pattern="*.goml" />
+        </MimeType>
+
+    </Extension>
+<!--    <Extension path = "/MonoDevelop/DesignerSupport/PropertyProviders" extension-nodes="Class">
+        <Class class = "MonoDevelop.GOLib.GOLibItemPropertyProvider"/>
+    </Extension>-->
+</ExtensionModel>
\ No newline at end of file
diff --git a/MDCrow/MDCrow.csproj b/MDCrow/MDCrow.csproj
new file mode 100644 (file)
index 0000000..96c83ae
--- /dev/null
@@ -0,0 +1,30 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net461</TargetFramework>
+    <ReleaseVersion>0.8.0</ReleaseVersion>
+  </PropertyGroup>
+  <ItemGroup>
+    <Folder Include="src\" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Crow\Crow.csproj" />
+  </ItemGroup>
+  <ItemGroup>
+<!--  <Reference Include="MonoDevelop.Core">
+      <HintPath>..\..\..\..\..\opt\lib\monodevelop\bin\MonoDevelop.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="MonoDevelop.Ide">
+      <HintPath>..\..\..\..\..\opt\lib\monodevelop\bin\MonoDevelop.Ide.dll</HintPath>
+    </Reference>
+    <Reference Include="Mono.Addins">
+      <HintPath>..\..\..\..\..\opt\lib\monodevelop\bin\Mono.Addins.dll</HintPath>
+    </Reference>     
+-->
+<!--    <Reference Include="MonoDevelop.Core" />
+    <Reference Include="MonoDevelop.Ide" />
+    <Reference Include="Mono.Addins" />-->
+  </ItemGroup>
+  <ItemGroup>
+    <PackageReference Include="MonoDevelop.Addins" Version="0.4.7" />
+  </ItemGroup>
+</Project>
diff --git a/MDCrow/src/CrowCanvas.cs b/MDCrow/src/CrowCanvas.cs
new file mode 100644 (file)
index 0000000..c1942b8
--- /dev/null
@@ -0,0 +1,48 @@
+//
+// CrowCanvas.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.Collections.Generic;
+using System.IO;
+
+namespace MDCrow
+{
+       [System.ComponentModel.Category ("Crow.CrowDesigner")]
+       [System.ComponentModel.ToolboxItem (true)]
+       public class CrowCanvas : Gtk.DrawingArea
+       {
+               DesignInterface iface;
+
+               public CrowCanvas ()
+               {
+               }
+               public override void Dispose ()
+               {
+                       base.Dispose ();
+                       iface.Dispose ();
+               }
+
+       }
+}
diff --git a/MDCrow/src/CrowDisplayBinding.cs b/MDCrow/src/CrowDisplayBinding.cs
new file mode 100644 (file)
index 0000000..627b480
--- /dev/null
@@ -0,0 +1,57 @@
+//
+// command.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2018 jp
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using MonoDevelop.Core;
+using MonoDevelop.Ide.Gui;
+using MonoDevelop.Projects;
+
+
+namespace MDCrow
+{
+       class CrowDisplayBinding : IViewDisplayBinding
+       {
+               bool canHandle = false;
+
+               public string Name {
+                       get {
+                               return GettextCatalog.GetString ("Crow designer");
+                       }
+               }
+               public bool CanUseAsDefault { get { return true; } }
+
+               public bool CanHandle (FilePath fileName, string mimeType, Project ownerProject)
+               {
+                       canHandle = mimeType.StartsWith ("text/x-goml", System.StringComparison.OrdinalIgnoreCase) |
+                                                               mimeType.StartsWith ("text/x-crow", System.StringComparison.OrdinalIgnoreCase);
+                       return canHandle;
+               }
+
+               ViewContent IViewDisplayBinding.CreateContent (FilePath fileName, string mimeType, Project ownerProject)
+               {
+                       return new CrowView ();
+               }
+       }
+}
\ No newline at end of file
diff --git a/MDCrow/src/CrowView.cs b/MDCrow/src/CrowView.cs
new file mode 100644 (file)
index 0000000..a1f7301
--- /dev/null
@@ -0,0 +1,64 @@
+//
+// CrowView.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using System.IO;
+using System.Threading.Tasks;
+using MonoDevelop.Components;
+using MonoDevelop.Ide.Gui;
+using Xwt;
+
+namespace MDCrow
+{
+       public class CrowView : ViewContent
+       {
+               CrowCanvas view;
+
+               public override Control Control {
+                       get { return view; }
+               }
+
+               public CrowView () {
+                       view = new CrowCanvas ();
+
+               }
+
+               string src;
+
+               public override async Task Load (FileOpenInformation fileOpenInformation)
+               {
+                       var fileName = fileOpenInformation.FileName;
+                       using (Stream stream = File.OpenRead (fileName)) {
+                               using (StreamReader sr = new StreamReader (stream)) {
+                                       src = await sr.ReadToEndAsync ();
+                               }
+                       }
+
+                       ContentName = fileName;
+                       this.IsDirty = false;
+                       view.SetFocus ();
+               }
+       }
+}
diff --git a/MDCrow/src/DesignInterface.cs b/MDCrow/src/DesignInterface.cs
new file mode 100644 (file)
index 0000000..64c10c2
--- /dev/null
@@ -0,0 +1,212 @@
+//
+// DesignInterface.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+using System.Globalization;
+using System.Threading;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using Crow.Cairo;
+
+namespace MDCrow
+{
+       public class DesignInterface : Interface, IValueChange
+       {
+               #region IValueChange implementation
+               /// <summary>
+               /// Raise to notify that the value of a property has changed, the binding system
+               /// rely mainly on this event. the member name may not be present in the class, this is 
+               /// used in **propertyless** bindings, this allow to raise custom named events without needing
+               /// to create an new one in the class or a new property.
+               /// </summary>
+               public event EventHandler<ValueChangeEventArgs> ValueChanged;
+               /// <summary>
+               /// Helper function to raise the value changed event
+               /// </summary>
+               public virtual void NotifyValueChanged(string MemberName, object _value)
+               {
+                       //Debug.WriteLine ("Value changed: {0}->{1} = {2}", this, MemberName, _value);
+                       ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value));
+               }
+               #endregion
+
+               public DesignInterface () : base()
+               {
+               }
+
+               //public ProjectFile ProjFile;
+
+
+
+               public override Widget CreateInstance (string path)
+               {
+                       ProjectFile pi;
+
+                       if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi))
+                               return CreateITorFromIMLFragment (pi.Source).CreateInstance();                                  
+               
+                       return null;
+               }
+               public override Stream GetStreamFromPath (string path)
+               {
+                       ProjectFile pi;
+                       if (ProjFile.Project.solution.GetProjectFileFromPath (path, out pi)) {
+                               return new FileStream (pi.AbsolutePath, FileMode.Open); 
+                       }
+                       throw new Exception ($"In Design File not found: {path}");
+               }
+
+               protected override void InitBackend ()
+               {
+                       //surf = new Cairo.ImageSurface (Format.Argb32, 100, 100);
+               }
+               public override void ProcessResize (Rectangle bounds)
+               {
+                       if (bounds == clientRectangle)
+                               return;
+                       lock (UpdateMutex) {
+                               clientRectangle = bounds;
+                               surf.Dispose ();
+                               surf = new ImageSurface (Format.Argb32, clientRectangle.Width, clientRectangle.Height);
+
+                               foreach (Widget g in GraphicTree)
+                                       g.RegisterForLayouting (LayoutingType.All);
+
+                               RegisterClip (clientRectangle);
+                       }
+
+               }
+               public override bool ProcessMouseMove (int x, int y)
+               {
+                       int deltaX = x - Mouse.X;
+                       int deltaY = y - Mouse.Y;
+                       Mouse.X = x;
+                       Mouse.Y = y;
+                       MouseMoveEventArgs e = new MouseMoveEventArgs (x, y, deltaX, deltaY);
+                       e.Mouse = Mouse;
+
+                       if (ActiveWidget != null) {
+                               //TODO, ensure object is still in the graphic tree
+                               //send move evt even if mouse move outside bounds
+                               ActiveWidget.onMouseMove (this, e);
+                               if (!ActiveWidget.IsDragged)//if active is dragged, process mouse move as it was not visible.
+                                       return true;
+                       }
+
+                       if (HoverWidget != null) {
+                               
+                               //check topmost graphicobject first
+                               Widget tmp = HoverWidget;
+                               Widget topc = null;
+                               while (tmp is Widget) {
+                                       topc = tmp;
+                                       tmp = tmp.LogicalParent as Widget;
+                               }
+                               int idxhw = GraphicTree.IndexOf (topc);
+                               if (idxhw != 0) {
+                                       int i = 0;
+                                       while (i < idxhw) {
+                                               if (GraphicTree [i].localLogicalParentIsNull) {
+                                                       if (GraphicTree [i].MouseIsIn (e.Position)) {
+                                                               while (HoverWidget != null) {
+                                                                       HoverWidget.onMouseLeave (HoverWidget, e);
+                                                                       HoverWidget = HoverWidget.LogicalParent as Widget;
+                                                               }
+
+                                                               GraphicTree [i].checkHoverWidget (e);
+                                                               return true;
+                                                       }
+                                               }
+                                               i++;
+                                       }
+                               }
+
+                               if (HoverWidget.MouseIsIn (e.Position)) {
+                                       if (!(HoverWidget is TemplatedControl))
+                                               HoverWidget.checkHoverWidget (e);
+                                       return true;
+                               } else {
+                                       HoverWidget.onMouseLeave (HoverWidget, e);
+                                       //seek upward from last focused graph obj's
+                                       while (HoverWidget.LogicalParent as Widget != null) {
+                                               HoverWidget = HoverWidget.LogicalParent as Widget;
+                                               if (HoverWidget.MouseIsIn (e.Position)) {
+                                                       HoverWidget.checkHoverWidget (e);
+                                                       return true;
+                                               } else
+                                                       HoverWidget.onMouseLeave (HoverWidget, e);
+                                       }
+                               }
+                       }
+
+                       //top level graphic obj's parsing
+                       lock (GraphicTree) {
+                               for (int i = 0; i < GraphicTree.Count; i++) {
+                                       Widget g = GraphicTree [i];
+                                       if (g.MouseIsIn (e.Position)) {
+                                               if (!(HoverWidget is TemplatedControl))
+                                                       g.checkHoverWidget (e);
+                                               if (g is Window)
+                                                       PutOnTop (g);
+                                               return true;
+                                       }
+                               }
+                       }
+                       HoverWidget = null;
+                       return false;           
+               }
+       
+               protected override void processLayouting ()
+               {
+                       #if MEASURE_TIME
+                       layoutingMeasure.StartCycle();
+                       #endif
+
+                       if (Monitor.TryEnter (LayoutMutex)) {
+                               DiscardQueue = new Queue<LayoutingQueueItem> ();
+                               LayoutingQueueItem lqi;
+                               while (LayoutingQueue.Count > 0) {
+                                       lqi = LayoutingQueue.Dequeue ();
+                                       //Console.WriteLine (lqi.ToString ());
+                                       #if DEBUG_LAYOUTING
+                                       currentLQI = lqi;
+                                       curLQIsTries.Add(currentLQI);
+                                       #endif
+                                       lqi.ProcessLayouting ();
+                               }
+                               LayoutingQueue = DiscardQueue;
+                               Monitor.Exit (LayoutMutex);
+                               DiscardQueue = null;
+                       }
+
+                       #if MEASURE_TIME
+                       layoutingMeasure.StopCycle();
+                       #endif
+               }
+       }
+}
+
diff --git a/MDCrow/src/MDCrowNodeExtension.cs b/MDCrow/src/MDCrowNodeExtension.cs
new file mode 100644 (file)
index 0000000..115acc4
--- /dev/null
@@ -0,0 +1,131 @@
+//
+// MDCrowNodeExtension.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using MonoDevelop.Components.Commands;
+using MonoDevelop.Ide;
+using MonoDevelop.Ide.Gui.Components;
+using MonoDevelop.Projects;
+
+namespace MDCrow
+{
+       enum Commands
+       {
+               ShowCrowViewer
+       }
+
+       class CrowNodeExtension : NodeBuilderExtension
+       {
+               public override Type CommandHandlerType {
+                       get { return typeof (CrowCommandHandler); }
+               }
+               public override bool CanBuildNode (Type dataType)
+               {
+                       return typeof (ProjectFile).IsAssignableFrom (dataType);
+               }
+               public override void BuildNode (ITreeBuilder treeBuilder, object dataObject, NodeInfo nodeInfo)
+               {
+                       ProjectFile pf = dataObject as ProjectFile;
+
+                       //                      string mimeType = DesktopService.GetMimeTypeForUri (pf.FilePath);
+                       //                      if (mimeType.StartsWith ("image/", StringComparison.CurrentCultureIgnoreCase)) {
+                       //                              Image i;
+                       //                              if (pf != null) {                               
+                       //                                      i = Image.FromFile (pf.FilePath);
+                       //                                      nodeInfo.Icon = i.Scale (16.0 / i.Width, 16.0 / i.Height);
+                       //                              }
+                       //                      }
+
+                       base.BuildNode (treeBuilder, dataObject, nodeInfo);
+               }
+       }
+
+       class CrowCommandHandler : NodeCommandHandler //, IPropertyPadProvider
+       {
+               [CommandHandler (Commands.ShowCrowViewer)]
+               protected void OnShowGOLibViewer ()
+               {
+
+                       CrowView view = new CrowView ();
+
+                       ProjectFile file = CurrentNode.DataItem as ProjectFile;
+
+                       if (file != null)
+                               view.Load (file.FilePath);
+
+
+                       IdeApp.Workbench.OpenDocument (view, true);
+                       //IdeApp.Workbench.Documents.Where (d => d.FileName == file.FilePath);
+               }
+
+               //              public override void ActivateItem ()
+               //              {
+               //                      ProjectFile o = this.CurrentNode.DataItem as ProjectFile;
+               //
+               //                      Ide.Gui.Document[] doc = IdeApp.Workbench.Documents.Where (d => d.FileName == o.FilePath).ToArray();
+               //                      var tmp = MonoDevelop.Ide.Gui.DisplayBindingService.GetFileViewers (o.FilePath, o.Project).ToList();
+               //
+               //                      OnShowGOLibViewer ();
+               //              }
+
+               //              #region IPropertyPadProvider implementation
+               //              public object GetActiveComponent ()
+               //              {
+               //                      if (CurrentNodes.Length == 1)
+               //                              return CurrentNode.DataItem;
+               //                      else
+               //                              return null;
+               //              }
+               //              public object GetProvider ()
+               //              {
+               //                      return null;
+               //              }
+               //              public void OnEndEditing (object obj)
+               //              {
+               //                      throw new NotImplementedException ();
+               //              }
+               //              public void OnChanged (object obj)
+               //              {
+               //                      
+               //              }
+               //              #endregion
+       }
+
+       //      class GOLibItemPropertyProvider : IPropertyProvider
+       //      {
+       //              #region IPropertyProvider implementation
+       //              public object CreateProvider (object obj)
+       //              {
+       //                      var projectFile = obj as ProjectFile;
+       //                      return projectFile;
+       //              }
+       //
+       //              public bool SupportsObject (object obj)
+       //              {
+       //                      return obj is ProjectFile;
+       //              }
+       //              #endregion
+       //      }
+}
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..dbae694
--- /dev/null
+++ b/README.md
@@ -0,0 +1,62 @@
+<h1 align="center">
+  <br>
+  <a href="http://www.amitmerchant.com/electron-markdownify">
+    <img src="https://github.com/jpbruyere/Crow/blob/master/Images/crow.png" alt="C.R.O.W." width="140">
+  </a>
+  <br>  
+    <br>
+  C# Rapid Open Widgets
+  <br>  
+<p align="center">
+  <a href="https://gitter.im/CSharpRapidOpenWidgets?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge">
+    <img src="https://badges.gitter.im/CSharpRapidOpenWidgets.svg">
+  </a>
+  <a href="https://www.paypal.me/GrandTetraSoftware">
+    <img src="https://img.shields.io/badge/Donate-PayPal-green.svg">
+  </a>
+  <a href="https://www.nuget.org/packages/Crow.OpenTK">
+    <img src="https://buildstats.info/nuget/Crow.OpenTK">
+  </a>
+  <a href="https://travis-ci.org/jpbruyere/Crow">
+      <img src="https://travis-ci.org/jpbruyere/Crow.svg?branch=master">
+  </a>
+  <a href="https://ci.appveyor.com/project/jpbruyere/Crow">
+    <img src="https://ci.appveyor.com/api/projects/status/j387lo59vnov8jbc?svg=true">
+  </a>
+</p>
+</h1>
+
+## Presentation
+**C.R.O.W.** is a [widget toolkit](https://en.wikipedia.org/wiki/Widget_toolkit) and rendering engine entirely developed in **C#**, offering a nice trade-off between complexity of language and performances. Crow provides a declarative interface language with styling and templates called [IML](interface-markup-language) for **Interface Markup Language** similar to [XAML](https://en.wikipedia.org/wiki/Extensible_Application_Markup_Language) and a binding system for easy c# code linking.
+<p align="center">
+  <a href="https://github.com/jpbruyere/Crow/blob/master/Images/screenshot.png">
+    <img src="https://github.com/jpbruyere/Crow/blob/master/Images/screenshot.png" width="400">
+  </a>
+</p>
+
+#### Features
+- [Declarative interface definition](https://github.com/jpbruyere/Crow/wiki/interface-markup-language).
+- [Templates](https://github.com/jpbruyere/Crow/wiki/Templates)
+- [Styling](https://github.com/jpbruyere/Crow/wiki/Styling)
+- [Dynamic binding system](https://github.com/jpbruyere/Crow/wiki/The-binding-system)
+- SVG rendering (with [rsvg library](https://developer.gnome.org/rsvg/))
+
+#### Status
+
+**C.R.O.W.** is in beta development state, api could change.
+
+#### Documentation
+* [Introduction](https://github.com/jpbruyere/Crow/wiki)
+* [Classes documentation autogenerated from doxygen](https://github.com/jpbruyere/Crow/wiki/index)
+* [Tutorials](https://github.com/jpbruyere/Crow/wiki/Tutorials)
+
+Please report bugs and issues on [GitHub](https://github.com/jpbruyere/Crow/issues)
+
+-------------------
+
+## Getting Start
+
+### Requirements
+- [Cairo Graphic Library](https://cairographics.org/) >= 1.20 
+- [rsvg library](https://developer.gnome.org/rsvg/) for svg rendering
+
diff --git a/Samples/HelloWorld/HelloWorld.csproj b/Samples/HelloWorld/HelloWorld.csproj
new file mode 100644 (file)
index 0000000..e9074cf
--- /dev/null
@@ -0,0 +1,34 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <Import Project="$(SolutionDir)netfx.props" />
+  <PropertyGroup>
+    <TargetFrameworks>net471</TargetFrameworks>
+    <OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
+    <OutputType>Exe</OutputType>        
+    <RepositoryUrl>https://github.com/jpbruyere/Crow</RepositoryUrl>
+    <License>https://opensource.org/licenses/MIT</License>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <EnableDefaultNoneItems>false</EnableDefaultNoneItems>     
+    <ReleaseVersion>0.8.0</ReleaseVersion>
+  </PropertyGroup>
+            
+  <ItemGroup Condition="$(TargetFramework.StartsWith('net4'))">
+    <Reference Include="System" />
+  </ItemGroup>    
+
+  <ItemGroup>  
+    <ProjectReference Include="..\..\Crow\Crow.csproj" />
+  </ItemGroup>    
+    
+  <ItemGroup>    
+    <Compile Include="..\common\CrowWin.cs" />
+    <Datas Include="..\data\**\*.*">      
+      <Link>data\%(RecursiveDir)%(Filename)%(Extension)</Link>
+    </Datas>
+    <EmbeddedResource Include="ui\**\*.*">
+      <LogicalName>HelloWorld.%(Filename)%(Extension)</LogicalName>
+    </EmbeddedResource>                
+  </ItemGroup>     
+  <ItemGroup>
+    <PackageReference Include="CVKL" Version="0.1.3.2-beta" />
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/Samples/HelloWorld/main.cs b/Samples/HelloWorld/main.cs
new file mode 100644 (file)
index 0000000..1590f28
--- /dev/null
@@ -0,0 +1,14 @@
+using Crow;
+
+namespace HelloWorld
+{
+       class Program : CrowVkWin {
+               static void Main (string[] args) {
+                       using (Program vke = new Program ()) {
+                               vke.crow.Load ("#HelloWorld.helloworld.crow").DataSource = vke;
+                               vke.Run ();
+                       }
+               }
+
+       }
+}
\ No newline at end of file
diff --git a/Samples/HelloWorld/ui/helloworld.crow b/Samples/HelloWorld/ui/helloworld.crow
new file mode 100644 (file)
index 0000000..1d1a351
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Window Caption="Hello World" Icon="#Crow.Icons.crow.svg" Width="40%" Height="40%" CornerRadius="5">
+    <VerticalStack>
+        <Label Text="Hello World" Font="mono, 20"/>
+        <Image Path="#Crow.Icons.crow.svg"/>
+    </VerticalStack>
+</Window>
+
diff --git a/Samples/ShowCase/ShowCase.csproj b/Samples/ShowCase/ShowCase.csproj
new file mode 100644 (file)
index 0000000..032f177
--- /dev/null
@@ -0,0 +1,47 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <Import Project="$(SolutionDir)netfx.props" />
+  <PropertyGroup>
+    <TargetFrameworks>net472</TargetFrameworks>
+    <OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
+    <OutputType>Exe</OutputType>        
+    <RepositoryUrl>https://github.com/jpbruyere/Crow</RepositoryUrl>
+    <License>https://opensource.org/licenses/MIT</License>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <EnableDefaultNoneItems>false</EnableDefaultNoneItems>    
+    <TargetFramework>net472</TargetFramework>
+    <ReleaseVersion>0.8.0</ReleaseVersion>
+  </PropertyGroup>
+            
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+  </PropertyGroup>
+    
+  <ItemGroup Condition="$(TargetFramework.StartsWith('net4'))">
+    <Reference Include="System" />
+  </ItemGroup>    
+
+  <ItemGroup>  
+    <ProjectReference Include="..\..\Crow\Crow.csproj" />
+  </ItemGroup>    
+    
+  <ItemGroup>    
+    <Compile Include="..\common\CrowWin.cs" />
+    <Datas Include="..\data\**\*.*">      
+      <Link>data\%(RecursiveDir)%(Filename)%(Extension)</Link>
+    </Datas>
+    <EmbeddedResource Include="ui\*.*">        
+      <LogicalName>ShowCase.%(Filename)%(Extension)</LogicalName>
+    </EmbeddedResource>                
+    <None Include="..\common\ui\Interfaces\**\*.*">  
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <Link>Interfaces\%(RecursiveDir)%(Filename)%(Extension)</Link>
+    </None>
+  </ItemGroup>     
+  <ItemGroup>
+    <PackageReference Include="CVKL" Version="0.1.3.2-beta" />
+  </ItemGroup>
+</Project>
+
+    
diff --git a/Samples/ShowCase/main.cs b/Samples/ShowCase/main.cs
new file mode 100644 (file)
index 0000000..6bd63bb
--- /dev/null
@@ -0,0 +1,63 @@
+using System.IO;
+using Crow;
+
+namespace HelloWorld
+{
+
+
+       class Program : CrowVkWin
+       {
+               static void Main (string[] args) {
+                       using (Program vke = new Program ()) {
+                               vke.Run ();
+                       }
+               }
+
+               Container crowContainer;
+               protected override void onLoad ()
+               {
+                       Widget w = crow.Load ("#ShowCase.showcase.crow");
+                       w.DataSource = this;
+                       crowContainer = w.FindByName ("CrowContainer") as Container;
+                       crowContainer.DataSource = new object ();
+                       hideError ();
+               }
+
+               void Dv_SelectedItemChanged (object sender, SelectionChangeEventArgs e)
+               {
+                       FileSystemInfo fi = e.NewValue as FileSystemInfo;
+                       if (fi == null)
+                               return;
+                       if (fi is DirectoryInfo)
+                               return;
+                       hideError ();
+                       lock (crow.UpdateMutex) {
+                               try {
+                                       Widget g = crow.Load (fi.FullName);
+                                       crowContainer.SetChild (g);
+                                       g.DataSource = this;
+                               } catch (Crow.IML.InstantiatorException ex) {
+                                       showError (ex);
+                               }
+                       }
+
+                       string source = "";
+                       using (Stream s = new FileStream (fi.FullName, FileMode.Open)) {
+                               using (StreamReader sr = new StreamReader (s)) {
+                                       source = sr.ReadToEnd ();
+                               }
+                       }
+                       NotifyValueChanged ("source", source);
+               }
+
+               void showError (Crow.IML.InstantiatorException ex)
+               {
+                       NotifyValueChanged ("ErrorMessage", ex.Path + ": " + ex.InnerException.Message);
+                       NotifyValueChanged ("ShowError", true);
+               }
+               void hideError ()
+               {
+                       NotifyValueChanged ("ShowError", false);
+               }
+       }
+}
\ No newline at end of file
diff --git a/Samples/ShowCase/packages.config b/Samples/ShowCase/packages.config
new file mode 100644 (file)
index 0000000..fba81eb
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="CVKL" version="0.1.2" targetFramework="net471" />
+  <package id="glTF2Loader" version="1.1.3-alpha" targetFramework="net471" />
+  <package id="Newtonsoft.Json" version="12.0.2" targetFramework="net471" />
+  <package id="System.Numerics.Vectors" version="4.6.0-preview4.19212.13" targetFramework="net471" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="4.6.0-preview4.19212.13" targetFramework="net471" />
+  <package id="Vulkan" version="0.1.2.6" targetFramework="net471" />
+</packages>
\ No newline at end of file
diff --git a/Samples/ShowCase/ui/showcase.crow b/Samples/ShowCase/ui/showcase.crow
new file mode 100755 (executable)
index 0000000..f14e965
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="Jet" Margin="5">
+       <DirectoryView Name="dv" CurrentDirectory="Interfaces" Width="25%" SelectedItemChanged="Dv_SelectedItemChanged"/>
+       <Splitter Width="6"/>
+       <VerticalStack>
+               <Container Name="CrowContainer" Height="60%" Background="DimGrey"/>
+               <Splitter/>
+               <HorizontalStack>
+                       <Scroller Name="scroller1" Background="White"
+                                       Margin="2" ScrollY="{../scrollbar1.Value}"
+                                       ValueChanged="./_scroller_ValueChanged">
+                               <TextBox VerticalAlignment="Top" TextChanged="Tb_TextChanged"
+                                       Text="{source}" Multiline="true" TextAlignment="TopLeft"
+                                       Font="Courriernew 10"/>
+                       </Scroller>
+                       <ScrollBar Name="scrollbar1" Value="{../scroller1.ScrollY}"
+                               LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30"
+                               CursorSize="{../scroller1.ChildHeightRatio}"
+                               Maximum="{../scroller1.MaxScrollY}" Orientation="Vertical"
+                               Width="14" />
+               </HorizontalStack>
+               <Label Visible="{ShowError}" Text="{ErrorMessage}" Background="Red" Foreground="White" Width="Stretched" Margin="2"
+                       Multiline="true"/>
+       </VerticalStack>
+</HorizontalStack>
diff --git a/Samples/Tests/Tests.csproj b/Samples/Tests/Tests.csproj
new file mode 100644 (file)
index 0000000..16b3e22
--- /dev/null
@@ -0,0 +1,41 @@
+<Project Sdk="Microsoft.NET.Sdk">
+  <Import Project="$(SolutionDir)netfx.props" />
+  <PropertyGroup>
+    <TargetFrameworks>net472</TargetFrameworks>
+    <OutputPath>$(SolutionDir)build\$(Configuration)\</OutputPath>
+    <OutputType>Exe</OutputType>        
+    <RepositoryUrl>https://github.com/jpbruyere/Crow</RepositoryUrl>
+    <License>https://opensource.org/licenses/MIT</License>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <EnableDefaultNoneItems>false</EnableDefaultNoneItems>    
+    <TargetFramework>net472</TargetFramework>
+    <ReleaseVersion>0.8.0</ReleaseVersion>
+  </PropertyGroup>
+            
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugType>full</DebugType>
+    <DefineConstants>TRACE;DEBUG</DefineConstants>
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+  </PropertyGroup>
+    
+  <ItemGroup Condition="$(TargetFramework.StartsWith('net4'))">
+    <Reference Include="System" />
+  </ItemGroup>    
+
+  <ItemGroup>  
+    <ProjectReference Include="..\..\Crow\Crow.csproj" />
+  </ItemGroup>    
+    
+  <ItemGroup>    
+    <Compile Include="..\common\CrowWin.cs" />
+    <None Include="..\common\ui\Interfaces\**\*.*">  
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+      <Link>Interfaces\%(RecursiveDir)%(Filename)%(Extension)</Link>
+    </None>
+  </ItemGroup>     
+  <ItemGroup>
+    <PackageReference Include="CVKL" Version="0.1.3.2-beta" />
+  </ItemGroup>
+</Project>
+
+    
diff --git a/Samples/Tests/main.cs b/Samples/Tests/main.cs
new file mode 100644 (file)
index 0000000..5f2e6b6
--- /dev/null
@@ -0,0 +1,198 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Reflection;
+using Crow;
+using Glfw;
+
+namespace HelloWorld
+{
+       class Program : CrowVkWin
+       {
+               static void Main (string [] args)
+               {
+                       using (Program vke = new Program ()) {
+                               vke.Run ();
+                       }
+               }
+
+               int idx = 0;
+               string [] testFiles;
+
+               public Version CrowVersion {
+                       get {
+                               return Assembly.GetAssembly (typeof (Widget)).GetName ().Version;
+                       }
+               }
+
+               #region Test values for Binding
+               public List<Crow.Command> Commands;
+               public int intValue = 500;
+               DirectoryInfo curDir = new DirectoryInfo (Path.GetDirectoryName (Assembly.GetEntryAssembly ().Location));
+               //DirectoryInfo curDir = new DirectoryInfo (@"/mnt/data/Images");
+               public FileSystemInfo [] CurDirectory {
+                       get { return curDir.GetFileSystemInfos (); }
+               }
+               public int IntValue {
+                       get {
+                               return intValue;
+                       }
+                       set {
+                               intValue = value;
+                               NotifyValueChanged ("IntValue", intValue);
+                       }
+               }
+               void onSpinnerValueChange (object sender, ValueChangeEventArgs e)
+               {
+                       if (e.MemberName != "Value")
+                               return;
+                       intValue = Convert.ToInt32 (e.NewValue);
+               }
+               void change_alignment (object sender, EventArgs e)
+               {
+                       RadioButton rb = sender as RadioButton;
+                       if (rb == null)
+                               return;
+                       NotifyValueChanged ("alignment", Enum.Parse (typeof (Alignment), rb.Caption));
+               }
+               public IList<String> List2 = new List<string> (new string []
+                       {
+                               "string1",
+                               "string2",
+                               "string3",
+//                             "string4",
+//                             "string5",
+//                             "string6",
+//                             "string7",
+//                             "string8",
+//                             "string8",
+//                             "string8",
+//                             "string8",
+//                             "string8",
+//                             "string8",
+//                             "string9"
+                       }
+               );
+               public IList<String> TestList2 {
+                       set {
+                               List2 = value;
+                               NotifyValueChanged ("TestList2", testList);
+                       }
+                       get { return List2; }
+               }
+               List<Color> testList = Color.ColorDic.Values//.OrderBy(c=>c.Hue)
+                                                                                                       //.ThenBy(c=>c.Value).ThenBy(c=>c.Saturation)
+                       .ToList ();
+               public List<Color> TestList {
+                       set {
+                               testList = value;
+                               NotifyValueChanged ("TestList", testList);
+                       }
+                       get { return testList; }
+               }
+               string curSources = "";
+               public string CurSources {
+                       get { return curSources; }
+                       set {
+                               if (value == curSources)
+                                       return;
+                               curSources = value;
+                               NotifyValueChanged ("CurSources", curSources);
+                       }
+               }
+               bool boolVal = true;
+               public bool BoolVal {
+                       get { return boolVal; }
+                       set {
+                               if (boolVal == value)
+                                       return;
+                               boolVal = value;
+                               NotifyValueChanged ("BoolVal", boolVal);
+                       }
+               }
+
+               #endregion
+
+               void OnClear (object sender, MouseButtonEventArgs e) => TestList = null;
+
+               void OnLoadList (object sender, MouseButtonEventArgs e) => TestList =
+                       Color.ColorDic.Values.OrderBy (c => c.Hue).ToList ();
+
+               void command1 ()
+               {
+                       Console.WriteLine ("command1 triggered");
+               }
+               void command2 ()
+               {
+                       Console.WriteLine ("command2 triggered");
+               }
+               void command3 ()
+               {
+                       Console.WriteLine ("command3 triggered");
+               }
+               void command4 ()
+               {
+                       Console.WriteLine ("command4 triggered");
+               }
+
+               protected override void onLoad ()
+               {
+                       Commands = new List<Crow.Command> (new Crow.Command [] {
+                               new Crow.Command(new Action(() => command1())) { Caption = "command1"},
+                               new Crow.Command(new Action(() => command2())) { Caption = "command2"},
+                               new Crow.Command(new Action(() => command3())) { Caption = "command3"},
+                               new Crow.Command(new Action(() => command4())) { Caption = "command4"},
+                       });
+
+                       //testFiles = new string [] { @"Interfaces/Experimental/testDock.crow" };
+                       testFiles = new string [] { @"Interfaces/Divers/welcome.crow" };
+                       //testFiles = new string [] { @"Interfaces/Divers/colorPicker.crow" };
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/GraphicObject", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Container", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Group", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Stack", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/TemplatedControl", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/TemplatedContainer", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/TemplatedGroup", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Splitter", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Wrapper", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Divers", "*.crow")).ToArray ();
+                       testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/DragAndDrop", "*.crow")).ToArray ();
+
+                       //testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Experimental", "*.crow")).ToArray ();
+
+                       Widget w = crow.Load (testFiles [idx]);
+                       w.DataSource = this;
+               }
+
+
+               protected override void onKeyDown (Glfw.Key key, int scanCode, Modifier modifiers)
+               {
+                       base.onKeyDown (key, scanCode, modifiers);
+
+                       switch (key) {
+                       case Glfw.Key.F2:
+                               idx--;
+                               break;
+                       case Glfw.Key.F3:
+                               idx++;
+                               break;
+                       }
+
+                       crow.ClearInterface ();
+
+                       if (idx == testFiles.Length)
+                               idx = 0;
+                       else if (idx < 0)
+                               idx = testFiles.Length - 1;
+
+                       try {
+                               Widget w = crow.Load (testFiles [idx]);
+                               w.DataSource = this;
+                       } catch (Exception ex) {
+                               MessageBox.Show (crow, MessageBox.Type.Error, ex.Message + "\n" + ex.InnerException.Message).Modal = true;
+                       }
+               }
+       }
+}
\ No newline at end of file
diff --git a/Samples/common/CrowWin.cs b/Samples/common/CrowWin.cs
new file mode 100644 (file)
index 0000000..666267e
--- /dev/null
@@ -0,0 +1,212 @@
+using System;
+using System.Threading;
+using Crow;
+using CVKL;
+using VK;
+
+namespace Crow
+{
+       public class CrowVkWin : VkWindow, IValueChange {
+        #region IValueChange implementation
+        public event EventHandler<Crow.ValueChangeEventArgs> ValueChanged;
+        public virtual void NotifyValueChanged(string MemberName, object _value)
+        {
+            if (ValueChanged != null)
+                ValueChanged.Invoke(this, new Crow.ValueChangeEventArgs(MemberName, _value));
+        }
+        #endregion
+
+        protected Crow.Interface crow;
+        protected CVKL.Image uiImage;
+        protected vkvg.Device vkvgDev;
+        bool isRunning;
+
+        protected CrowVkWin() : base()
+        {
+            Thread crowThread = new Thread(crow_thread_func);
+            crowThread.IsBackground = true;
+            crowThread.Start();
+
+            while (crow == null)
+                Thread.Sleep(2);
+
+            initUISurface();
+        }
+
+               protected virtual void onLoad () { }
+               public override void Run ()
+               {
+                       onLoad ();
+                       base.Run ();
+               }
+               protected override void render () {
+                       int idx = swapChain.GetNextImage ();
+
+                       if (idx < 0) {
+                               OnResize ();
+                               return;
+                       }
+
+                       lock (crow.RenderMutex) {
+                               presentQueue.Submit (cmds[idx], swapChain.presentComplete, drawComplete[idx]);
+                               presentQueue.Present (swapChain, drawComplete[idx]);
+                               presentQueue.WaitIdle ();
+                       }
+                       Thread.Sleep (1);
+               }
+
+               void crow_thread_func () {
+                       vkvgDev = new vkvg.Device (instance.Handle, phy.Handle, dev.VkDev.Handle, presentQueue.qFamIndex,
+                               vkvg.SampleCount.Sample_8, presentQueue.index);
+
+                       crow = new Crow.Interface (vkvgDev, 800, 600);
+
+                       isRunning = true;
+                       while (isRunning) {
+                               crow.Update ();
+                               Thread.Sleep (3);
+                       }
+
+                       crow.Dispose ();
+                       vkvgDev.Dispose ();
+                       crow = null;
+               }
+
+               void initUISurface () {
+                       lock (crow.UpdateMutex) {
+                               uiImage?.Dispose ();
+                               uiImage = new CVKL.Image (dev, new VkImage ((ulong)crow.surf.VkImage.ToInt64 ()), VkFormat.B8g8r8a8Unorm,
+                                       VkImageUsageFlags.Sampled, swapChain.Width, swapChain.Height);
+                               uiImage.SetName ("uiImage");
+                               uiImage.CreateView (VkImageViewType.ImageView2D, VkImageAspectFlags.Color);
+                               uiImage.CreateSampler (VkFilter.Nearest, VkFilter.Nearest, VkSamplerMipmapMode.Nearest, VkSamplerAddressMode.ClampToBorder);
+                               uiImage.Descriptor.imageLayout = VkImageLayout.ShaderReadOnlyOptimal;
+                       }
+               }
+
+               protected virtual void recordDraw (CommandBuffer cmd, int imageIndex) { }
+
+               void buildCommandBuffers () {
+                       for (int i = 0; i < swapChain.ImageCount; ++i) {
+                               cmds[i]?.Free ();
+                               cmds[i] = cmdPool.AllocateAndStart ();
+
+                               CommandBuffer cmd = cmds [i];
+
+                               recordDraw (cmd, i);
+
+                               swapChain.images [i].SetLayout (cmd, VkImageAspectFlags.Color,
+                                       VkImageLayout.Undefined, VkImageLayout.TransferDstOptimal,
+                                       VkPipelineStageFlags.BottomOfPipe, VkPipelineStageFlags.Transfer);
+                               uiImage.SetLayout (cmd, VkImageAspectFlags.Color,
+                                       VkImageLayout.ColorAttachmentOptimal, VkImageLayout.TransferSrcOptimal,
+                                       VkPipelineStageFlags.ColorAttachmentOutput, VkPipelineStageFlags.Transfer);
+                                       
+                               VkImageSubresourceLayers imgSubResLayer = new VkImageSubresourceLayers {
+                                       aspectMask = VkImageAspectFlags.Color,
+                                       mipLevel = 0,
+                                       baseArrayLayer = 0,
+                                       layerCount = 1
+                               };
+                               VkImageCopy cregion = new VkImageCopy {
+                                       srcSubresource = imgSubResLayer,
+                                       srcOffset = default (VkOffset3D),
+                                       dstSubresource = imgSubResLayer,
+                                       dstOffset = default (VkOffset3D),
+                                       extent = new VkExtent3D { width = swapChain.Width, height = swapChain.Height }
+                               };
+                               Vk.vkCmdCopyImage (cmds [i].Handle, uiImage.Handle, VkImageLayout.TransferSrcOptimal,
+                                       swapChain.images [i].Handle, VkImageLayout.TransferDstOptimal, 1, ref cregion);
+
+                               swapChain.images [i].SetLayout (cmd, VkImageAspectFlags.Color,
+                                       VkImageLayout.TransferDstOptimal, VkImageLayout.PresentSrcKHR,
+                                       VkPipelineStageFlags.Transfer, VkPipelineStageFlags.BottomOfPipe);
+                               uiImage.SetLayout (cmd, VkImageAspectFlags.Color,
+                                       VkImageLayout.TransferSrcOptimal, VkImageLayout.ColorAttachmentOptimal,
+                                       VkPipelineStageFlags.Transfer, VkPipelineStageFlags.ColorAttachmentOutput);
+
+                               cmds [i].End ();
+                       }
+               }
+
+               /// <summary>
+               /// rebuild command buffers if needed
+               /// </summary>
+               public override void Update () {
+                       if (rebuildBuffers) {
+                               buildCommandBuffers ();
+                               rebuildBuffers = false;
+                       }
+               }
+
+               protected override void OnResize () {
+                       dev.WaitIdle ();
+
+                       crow.ProcessResize (new Crow.Rectangle (0, 0, (int)swapChain.Width, (int)swapChain.Height));
+
+                       initUISurface ();
+
+                       buildCommandBuffers ();
+                       dev.WaitIdle ();
+               }
+
+               #region Mouse and keyboard
+               //protected override void onScroll (double xOffset, double yOffset)
+               //{
+               //      if (KeyModifiers.HasFlag (Glfw.Modifier.Shift))
+               //              crow.ProcessMouseWheelChanged ((float)xOffset);
+               //      else
+               //              crow.ProcessMouseWheelChanged ((float)yOffset);
+               //}
+               protected override void onMouseMove (double xPos, double yPos)
+               {
+                       if (crow.ProcessMouseMove ((int)xPos, (int)yPos))
+                               return;
+               }
+               protected override void onMouseButtonDown (Glfw.MouseButton button)
+               {
+                       if (crow.ProcessMouseButtonDown ((Crow.MouseButton)button))
+                               return;
+                       base.onMouseButtonDown (button);
+               }
+               protected override void onMouseButtonUp (Glfw.MouseButton button)
+               {
+                       if (crow.ProcessMouseButtonUp ((Crow.MouseButton)button))
+                               return;
+                       base.onMouseButtonUp (button);
+               }
+               protected override void onKeyDown (Glfw.Key key, int scanCode, Glfw.Modifier modifiers)
+               {
+                       if (crow.ProcessKeyDown ((Crow.Key)key))
+                               return;
+               }
+               protected override void onKeyUp (Glfw.Key key, int scanCode, Glfw.Modifier modifiers)
+               {
+                       if (crow.ProcessKeyUp ((Crow.Key)key))
+                               return;
+               }
+               //protected override void onChar (Glfw.CodePoint cp)
+               //{
+               //      if (crow.ProcessKeyPress (cp.ToChar ()))
+               //              return;
+               //}
+               #endregion
+
+               #region dispose
+               protected override void Dispose (bool disposing) {
+                       if (disposing) {
+                               if (!isDisposed) {
+                                       dev.WaitIdle ();
+
+                                       isRunning = false;
+                                       uiImage?.Dispose ();
+                                       while (crow != null)
+                                               Thread.Sleep (1);
+                               }
+                       }
+
+                       base.Dispose (disposing);
+               }
+               #endregion
+       }
+}
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/CheckBox2.imlt b/Samples/common/ui/Interfaces/CheckBox2.imlt
new file mode 100644 (file)
index 0000000..c2bfe8d
--- /dev/null
@@ -0,0 +1,7 @@
+<Label Font="{./Font}" Text="{./Caption}" Height="{./HeightPolicy}" Width="{./WidthPolicy}"
+       Margin="3"
+       Background="{./Background}"
+       Foreground="DimGrey"
+       TextAlignment="Center"
+       MouseEnter="{Foreground=White}"
+       MouseLeave="{Foreground=DimGrey}"/>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Container/0.crow b/Samples/common/ui/Interfaces/Container/0.crow
new file mode 100755 (executable)
index 0000000..5ad8de0
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Container Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10"  Background="SeaGreen"
+                       MinimumSize="50,50"/>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Container/1.crow b/Samples/common/ui/Interfaces/Container/1.crow
new file mode 100755 (executable)
index 0000000..e879bce
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Container Background="Lust" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="50%" Height="50%" Background="Maize"
+                       MinimumSize="50,50"/>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Container/2.crow b/Samples/common/ui/Interfaces/Container/2.crow
new file mode 100755 (executable)
index 0000000..98d1add
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Container Background="MediumSeaGreen" Margin="10" Fit="true">
+       <Widget Margin="10" Width="50%" Height="50%" Background="DarkGreen"
+                       MinimumSize="50,50"/>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Container/3.crow b/Samples/common/ui/Interfaces/Container/3.crow
new file mode 100755 (executable)
index 0000000..94655ca
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Container Background="DimGrey" Margin="10" Fit="true">
+       <Label Text="{fps}" Margin="10" Fit="true" Background="SeaGreen"/>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/0.crow b/Samples/common/ui/Interfaces/Divers/0.crow
new file mode 100755 (executable)
index 0000000..e7cf3e2
--- /dev/null
@@ -0,0 +1,162 @@
+<?xml version="1.0"?>
+<Window Caption="Showcase" Height="90%" Width="90%">
+       <HorizontalStack >
+               <VerticalStack Width="30%" Margin="5">
+                       <GroupBox Caption="Performance" Height="Fit">
+                               <VerticalStack DataSource="{drawingMeasure}" Width="90%" Height="Fit" Spacing="2" >
+                                       <HorizontalStack Height="Fit" Tooltip="Frame per second">
+                                               <Label Text="Fps:" Style="FpsLabel"/>
+                                               <Label Text="{minimum}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Minimum Frame per second">
+                                               <Label Text="Min:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMin}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Maximum Frame per second">
+                                               <Label Text="Max:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMax}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Update loop duration">
+                                               <Label Text="Update:" Style="FpsLabel"/>
+                                               <Label Text="{update}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Layouting process duration">
+                                               <Label Text="Layouting:" Style="FpsLabel"/>
+                                               <Label Text="{layouting}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Clipping duration">
+                                               <Label Text="Clipping:" Style="FpsLabel"/>
+                                               <Label Text="{clipping}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Drawing:" Style="FpsLabel"/>
+                                               <Label Text="{drawing}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                               </VerticalStack>
+                       </GroupBox>
+                       <Label Width="Stretched" Margin="3" Background="DimGrey"/>
+                       <TextBox Text="TextBox" Multiline="true" Margin="3"/>
+                       <HorizontalStack Height="Fit" Margin="5" Background="DimGrey" CornerRadius="10">
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <CheckBox Fit="true" Caption="test"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true" IsChecked="true"/>
+                               </VerticalStack>
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true" IsChecked="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                               </VerticalStack>
+                       </HorizontalStack>
+                       <HorizontalStack Height="Fit" Margin="5">
+                               <Label Text="MouseEvents" Width="50%" Margin="3" Focusable="true"
+                                       Background="Jet"
+                                       Foreground="DimGrey"
+                                       TextAlignment="Center"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGrey}"
+                                       MouseDown="{Background=DarkRed}"
+                                       MouseClick="{Foreground=Green}"
+                                       MouseDoubleClick="{Foreground=Yellow}"
+                                       MouseUp="{Background=Jet}"/>
+                               <Label Text="MouseEvents" Width="50%" Margin="3"
+                                       Background="Jet"
+                                       Foreground="DimGrey"
+                                       TextAlignment="Center"
+                                       MouseClick="{Foreground=Green}"
+                                       MouseDoubleClick="{Foreground=Yellow}"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGrey}"
+                                       MouseDown="{Background=SeaGreen}"
+                                       MouseUp="{Background=DimGrey}"/>
+                       </HorizontalStack>
+                       <GroupBox Caption="Templated controls" Height="Fit" Margin="5">
+                               <HorizontalStack Height="Fit">
+                                       <VerticalStack Width="50%">
+                                               <CheckBox IsChecked="true" Style="CheckBox2"/>
+                                               <CheckBox Style="CheckBox2"/>
+                                               <CheckBox Style="CheckBox2"/>
+                                               <CheckBox Style="CheckBox2"/>
+                                       </VerticalStack>
+                                       <Splitter/>
+                                       <VerticalStack Width="50%">
+                                               <RadioButton Style="RadioButton2"/>
+                                               <RadioButton Style="RadioButton2"/>
+                                               <RadioButton Style="RadioButton2"/>
+                                               <RadioButton Style="RadioButton2"/>
+                                       </VerticalStack>
+                               </HorizontalStack>
+                       </GroupBox>
+                       <HorizontalStack Height="Fit">
+                               <Label Text="Spinner"/>
+                               <Spinner Fit="true"/>
+                       </HorizontalStack>
+                       <HorizontalStack Height="Fit">
+                               <Button Caption="Button"/>
+                               <Button Caption="Button" IsEnabled="false"/>
+                       </HorizontalStack>
+               </VerticalStack>
+               <Splitter/>
+               <VerticalStack Width="40%" Margin="5" Spacing="5">
+                       <Expandable>
+                               <Image Path="#Crow.Icons.crow.svg"/>
+                       </Expandable>
+                       <Popper>
+                               <Border Fit="True" Background="DimGrey" CornerRadius="0" BorderWidth="1">
+                                       <Image Path="#Crow.Icons.crow.svg" Width="100" Height="100" Margin="10"
+                                               MouseEnter="{Background=LightGrey}"
+                                               MouseLeave="{Background=Transparent}"/>
+                               </Border>
+                       </Popper>
+                       <Slider Height="10" Width="90%"/>
+                       <Container Height="Fit" Width="200" Background="DimGrey" Margin="2" CornerRadius="5">
+                               <ProgressBar Background="DimGrey" Height="10" Value="50"/>
+                       </Container>
+                       <Image Path="#Crow.Icons.crow.svg" Width="60" Height="60" Background="LightGrey" />
+<!--                   <TabView Name="tabview1"
+                               Height="120" Orientation="Horizontal" Spacing="15">
+                               <TabItem Name="TabItem1" Caption="Tab 1" Margin="0">
+                                       <VerticalStack Fit="true">
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem2" Caption="Tab 2" Background="Grey">
+                                       <VerticalStack Fit="true">
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem3" Caption="Tab 3" Background="Grey">
+                                       <Container Margin="5" CornerRadius="2">
+                                               <TextBox Height="Stretched" Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                                       </Container>
+                               </TabItem>
+                       </TabView>-->
+                       <MessageBox Movable="false"/>
+                       <ColorPicker SelectedColor="{²../go.Background}" Name="colorPicker" Margin="5" Fit="True" />
+                       <Widget Name="go" Width="100" Height="60" Background="{../../colorList.SelectedItem}"/>
+                       <Label Text="{../colorPicker.SelectedColor}"/>
+               </VerticalStack>
+               <Splitter/>
+               <VerticalStack Width="30%" Margin="5">
+<!--                   <Border Margin="5" Height="Fit">
+                               <Label Width="Stretched" Margin="1" Text="{../../dv.SelectedItem}"/>
+                       </Border>
+                       <Border Margin="5" Height="30%">
+                               <DirectoryView Name="dv" CurrentDirectory="/" Margin="1"/>
+                       </Border>
+                       <Splitter/>-->
+                       <ListBox Name="colorList" Data="{TestList}" Margin="5"
+                                        ItemTemplate="Interfaces/colorItem.crow"
+                                        Template="#Crow.ScrollingListBox.template"
+                                        />
+               </VerticalStack>
+       </HorizontalStack>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/2.crow b/Samples/common/ui/Interfaces/Divers/2.crow
new file mode 100755 (executable)
index 0000000..b4a06b6
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <TextBox Font="droid, 20" Text="test text box" Width="Stretched"/>
+       <HorizontalStack Margin="5" Fit="true" MouseEnter="{Background=White}" MouseLeave="{Background=Transparent}">
+               <Label Text="centered" Width="80" Height="30" Background="DarkBlue" TextAlignment="Center"/>
+               <Label Text="top left" Width="80" Height="30" Background="DarkBlue" TextAlignment="TopLeft"/>
+               <Label Text="top right" Width="80" Height="30" Background="DarkBlue" TextAlignment="TopRight"/>
+               <Label Text="right center" Width="80" Height="30" Background="DarkBlue" TextAlignment="Right"/>
+               <Label Text="bottom left" Width="80" Height="30" Background="DarkBlue" TextAlignment="BottomLeft"/>
+               <Label Text="bottom center" Width="80" Height="30" Background="DarkBlue" TextAlignment="Bottom"/>
+               <Label Text="bottom right" Width="80" Height="30" Background="DarkBlue" TextAlignment="BottomRight"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/3.crow b/Samples/common/ui/Interfaces/Divers/3.crow
new file mode 100755 (executable)
index 0000000..a1f5e95
--- /dev/null
@@ -0,0 +1,377 @@
+<?xml version="1.0"?>
+<HorizontalStack Fit="true">   
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <ProgressBar CornerRadius="5" Background="DimGrey" Margin="1" Maximum="1000" Value="{fps}" Width="200" Height="15"/>
+               <HorizontalStack Fit="true">
+                       <Label Text="Memory:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{memory}" Font="droid,12" TextAlignment="Center"
+                               Background="vgradient|0:RoyalBlue|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/4.crow b/Samples/common/ui/Interfaces/Divers/4.crow
new file mode 100755 (executable)
index 0000000..ca69662
--- /dev/null
@@ -0,0 +1,1695 @@
+<?xml version="1.0"?>
+<HorizontalStack>      
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/5.crow b/Samples/common/ui/Interfaces/Divers/5.crow
new file mode 100755 (executable)
index 0000000..7e3df06
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<HorizontalStack Fit="true" Margin="5">
+       <VerticalStack Fit="true" Margin="2" Spacing="2">
+               <TextRun Text="text run test"/>
+<!--           <Label Text="label test"/>
+               <TextBox Text="text box test"/>
+               <Button Caption="test button"/>-->
+<!--           <CheckBox Caption="test checkbox"/>
+               <RadioButton Caption="test radiobutton"/>
+               <ComboBox/>
+               <Popper Caption="test popper">
+                       <Label Text="label test"/>
+               </Popper>
+               <Expandable Caption="test expandable">
+                       <Label Text="label test"/>
+               </Expandable>
+               <Border >
+                       <Label Text="border test" Margin="3"/>
+               </Border>
+               <GroupBox Caption="Group box" >
+                       <Label Text="border test" Margin="3"/>
+               </GroupBox>
+               <Container Fit="true" Background="DimGrey" Margin="3">
+                       <Widget Width="20" Height="20" Background="LightGrey"/>
+               </Container>-->
+<!--           <ProgressBar Height="10" Width="150" Background="DimGrey" Value="50" />
+               <Slider Value="5" Width="150" Height="10"/>
+               <ScrollBar Orientation="Horizontal" Maximum="100" Value="50" Height="16" Width="150"/>
+               <Spinner Value="100"/>-->
+       </VerticalStack>
+<!--   <VerticalStack Width="150" Height="Fit" Margin="2" Spacing="2">
+               <TextRun Text="text run test" Width="Stretched"/>
+               <Label Text="label test" Width="Stretched"/>
+               <TextBox Text="text box test" Width="Stretched"/>
+               <Button Caption="test button" Width="Stretched"/>
+               <CheckBox Caption="test checkbox" Width="Stretched"/>
+               <RadioButton Caption="test radiobutton" Width="Stretched"/>
+               <ComboBox Width="Stretched"/>
+               <Popper Caption="test popper" Width="Stretched">
+                       <Label Text="label test"/>
+               </Popper>
+               <Expandable Caption="test expandable" Width="Stretched">
+                       <Label Text="label test"/>
+               </Expandable>
+               <Border  Width="Stretched">
+                       <Label Text="border test" Margin="3"/>
+               </Border>
+               <GroupBox Caption="Group box"  Width="Stretched">
+                       <Label Text="border test" Margin="3"/>
+               </GroupBox>
+               <Container Height="Fit"  Width="Stretched" Background="DimGrey" Margin="3">
+                       <Widget Width="20" Height="20" Background="LightGrey"/>
+               </Container>
+               <ProgressBar Height="10" Width="Stretched" Background="DimGrey" Value="50" />
+               <Slider Value="5" Width="Stretched" Height="10"/>
+               <ScrollBar Orientation="Horizontal" Maximum="100" Value="50" Height="16" Width="Stretched"/>
+               <Spinner Value="100"  Width="Stretched"/>
+       </VerticalStack>-->
+</HorizontalStack>
+<!--<HorizontalStack Fit="true" Background="RoyalBlue" Margin="5">
+       <Widget Background="Red" Width="30" Height="20"/>
+       <Spinner Maximum="10000000000" SmallIncrement="10" Value="0"/>
+       <Widget Background="Green" Width="30" Height="20"/>
+</HorizontalStack>-->
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/6.crow b/Samples/common/ui/Interfaces/Divers/6.crow
new file mode 100755 (executable)
index 0000000..f537a71
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Background="DimGrey" Margin="5">
+<!--   <RadioButton/>-->
+       <Label Text="a" Width="Stretched" Background="Red"/>
+       <Label Text="{fps}" HorizontalAlignment="Right" Background="LimeGreen"/>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/Divers/clip0.crow b/Samples/common/ui/Interfaces/Divers/clip0.crow
new file mode 100755 (executable)
index 0000000..0dee2ef
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<Container Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=Grey}"
+               MouseLeave="{Background=LimeGreen}">
+       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="false"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+ </Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/clip1.crow b/Samples/common/ui/Interfaces/Divers/clip1.crow
new file mode 100755 (executable)
index 0000000..bc4c927
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<Container Fit="true" Margin="20" Background="SkyBlue" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=LightGrey}"
+               MouseLeave="{Background=SkyBlue}">
+               <Container Fit="true" Margin="20" Background="Red" CacheEnabled="true"
+                       HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                       MouseEnter="{Background=White}"
+                       MouseLeave="{Background=Red}">
+                       <Container Fit="true" Margin="20" Background="Yellow" CacheEnabled="false"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseEnter="{Background=Blue}"
+                               MouseLeave="{Background=Yellow}">
+                               <Container Margin="50" Background="LimeGreen" CacheEnabled="true"
+                                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                                               MouseEnter="{Background=Grey}"
+                                               MouseLeave="{Background=LimeGreen}">
+                                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                                               MouseEnter="{Background=DimGrey}"
+                                               MouseLeave="{Background=RoyalBlue}" 
+                                               Margin="1" Text="{drawing}" Background="RoyalBlue"/>
+                               </Container>
+                       </Container>
+               </Container>
+ </Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/clip2.crow b/Samples/common/ui/Interfaces/Divers/clip2.crow
new file mode 100755 (executable)
index 0000000..9292150
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<Group Fit="true" Margin="50" Background="Yellow" CacheEnabled="true"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=DimGrey}"
+               MouseLeave="{Background=Yellow}">
+<Group Width="300" Height="200" Margin="50" Background="LimeGreen" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=Grey}"
+               MouseLeave="{Background=LimeGreen}">
+       <Label Left="10" HorizontalAlignment="Right" VerticalAlignment="Center" CacheEnabled="true"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+ </Group>
+ </Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/clip3.crow b/Samples/common/ui/Interfaces/Divers/clip3.crow
new file mode 100755 (executable)
index 0000000..82a9888
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<Group Fit="true" Margin="50" Background="Yellow" CacheEnabled="true"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=DimGrey}"
+               MouseLeave="{Background=Yellow}">
+       <HorizontalStack Fit="true">
+               <VerticalStack Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseEnter="{Background=Grey}"
+                               MouseLeave="{Background=LimeGreen}">
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{fps}" Background="RoyalBlue"/>
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+                </VerticalStack>
+               <VerticalStack Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseEnter="{Background=Grey}"
+                               MouseLeave="{Background=LimeGreen}">
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{fpsMax}" Background="RoyalBlue"/>
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{fpsMin}" Background="RoyalBlue"/>
+                </VerticalStack>
+       </HorizontalStack>
+ </Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/clip4.crow b/Samples/common/ui/Interfaces/Divers/clip4.crow
new file mode 100755 (executable)
index 0000000..5caaf77
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<Border Fit="true" BorderWidth="2"  >
+<Scroller CornerRadius="2" Height="200" Width="300" Background="DimGrey" Margin="2">
+       <VerticalStack Margin="10" VerticalAlignment="Top" Fit="true" Background="vgradient|0:RoyalBlue|1:Black" >
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 1"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 2"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 3"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 4"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 5"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 6"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 7"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 8"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 9"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 10"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 11"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 12"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 13"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 14"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 15"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 16"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 17"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 18"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 19"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 20"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 21"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 22"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 23"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 24"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 25"/>
+       </VerticalStack>
+</Scroller>
+</Border>
+<!--<VerticalStack Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=Grey}"
+               MouseLeave="{Background=LimeGreen}">
+
+               <CheckBox Margin="20" Background="RoyalBlue"/>
+               <CheckBox/>
+               <CheckBox/>
+               <CheckBox/>
+               <CheckBox/>
+               <RadioButton/>
+               <RadioButton/>
+               <RadioButton/>
+               <RadioButton/>
+               <RadioButton/>
+               <CheckBox/>
+
+       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{fps}" Background="RoyalBlue"/>
+       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+ </VerticalStack>-->
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/colorPicker.crow b/Samples/common/ui/Interfaces/Divers/colorPicker.crow
new file mode 100755 (executable)
index 0000000..afdef14
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <ColorPicker SelectedColor="{²../go.Background}" Name="colorPicker" Background="DimGrey" Margin="5" Fit="True" />
+       <Widget Name="go" Width="100" Height="60" Background="DarkBlue"/>
+       <Widget Name="go" Width="100" Height="60" Background="{../colorPicker.SelectedColor}"/>
+       <Label Text="{../colorPicker.SelectedColor}"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/fps.crow b/Samples/common/ui/Interfaces/Divers/fps.crow
new file mode 100755 (executable)
index 0000000..1d515a1
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<Border Fit="true" CornerRadius="5" BorderWidth="1">
+       <Container Name="MainGrp" Background="0.5,0.5,0.5,0.4" Width="120" Fit="true"
+               Margin="10" Focusable="True" >
+                       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+                               <HorizontalStack Fit="true">
+                                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Name="labUpdate" Text="{update}" Font="droid,12" Background="SeaGreen" Width="50" TextAlignment="Center"/>
+                               </HorizontalStack>
+                               <HorizontalStack Fit="true">
+                                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" Background="SeaGreen"/>
+                               </HorizontalStack>
+                               <HorizontalStack Fit="true">
+                                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center" Background="SeaGreen"/>
+                               </HorizontalStack>
+                               <HorizontalStack Fit="true">
+                                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Text="{fpsMax}" Font="droid , 12" Background="SeaGreen" Width="50" TextAlignment="Center"/>
+                               </HorizontalStack>
+                       </VerticalStack>
+       </Container>
+</Border>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/perfMeasures.crow b/Samples/common/ui/Interfaces/Divers/perfMeasures.crow
new file mode 100755 (executable)
index 0000000..d2d5138
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Window Focusable="true" Caption="Measures" Width="30%" Height="300" MinimumSize="100,100">
+       <ListBox Data="{PerfMeasures}"
+               ItemTemplate="#ui.perfMsr.crow"/>
+</Window>
diff --git a/Samples/common/ui/Interfaces/Divers/test1.1.crow b/Samples/common/ui/Interfaces/Divers/test1.1.crow
new file mode 100755 (executable)
index 0000000..e6f8e2a
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<Group Name="TopGroup" Width="500" Height="400" Margin="5"
+       Focusable="True" Background="Yellow">
+       <Group Name="InnerGroup" Width="Fit" Height="Fit" Margin="50" 
+               VerticalAlignment="Top" HorizontalAlignment="Left"
+               Focusable="True" Background="Green">
+               <Image VerticalAlignment="Bottom"                       
+                       Name="PhaseOverlay1" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+               <Image Top="100"                
+                       Name="PhaseOverlay2" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+       </Group>
+       <Image VerticalAlignment="Center" HorizontalAlignment="Right"
+               Name="PhaseOverlay0" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/test1.2.crow b/Samples/common/ui/Interfaces/Divers/test1.2.crow
new file mode 100755 (executable)
index 0000000..00fb7d2
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Container Background="Green" Height="400" Width="400">
+<VerticalStack Margin="10" Background="DarkBlue" Height="Fit" Width="Stretched">
+       <Label Text="label11" Width="Stretched"/>
+       <Label Text="label21"/>
+       <HorizontalStack Width="Fit" Height="Fit" Margin="5"
+               Focusable="True" Background="Blue">
+               <Label Text="label12"/>
+               <Label Text="label22"/>
+               <Label Text="label32"/>
+               <Label Text="label42"/>
+               <Label Text="label52"/>
+       </HorizontalStack>
+       <Label Text="label33" Background="Green" Width="Stretched"/>
+       <Button/>
+       <Label Text="label43"/>
+       <Label Text="label53"/>
+
+</VerticalStack>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/test1.crow b/Samples/common/ui/Interfaces/Divers/test1.crow
new file mode 100755 (executable)
index 0000000..74da472
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<Container Name="TopContainer" Width="400" Height="350"
+       Margin="20" Focusable="True" Background="Yellow">
+       <Container Name="MiddleContainer" Width="50%" Height="Stretched"
+               Margin="20" Focusable="True" Background="Green">
+                       <Image VerticalAlignment="Bottom"                       
+                               Name="PhaseOverlay" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+       </Container>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/test2WayBinding.crow b/Samples/common/ui/Interfaces/Divers/test2WayBinding.crow
new file mode 100755 (executable)
index 0000000..cf76f72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <CheckBox IsChecked="{²BoolVal}"/>
+       <CheckBox Caption="second" IsChecked="{²BoolVal}"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testBind0.crow b/Samples/common/ui/Interfaces/Divers/testBind0.crow
new file mode 100755 (executable)
index 0000000..d8991c7
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <TextBox Text="{Datas}" Width="100" />
+       <Button Text="Set Text to Null" MouseClick="onSetDataToNull"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testCtxMenu.crow b/Samples/common/ui/Interfaces/Divers/testCtxMenu.crow
new file mode 100755 (executable)
index 0000000..5fd6072
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Widget Margin="10" Width="50%" Height="50%" Focusable="true"
+               Background="hgradient|0:Red|0.25:Blue|0.5:Green|0.75:Yellow|1:Red"
+               MinimumSize="50,50" ContextCommands="{Commands}"/>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testDisable.crow b/Samples/common/ui/Interfaces/Divers/testDisable.crow
new file mode 100644 (file)
index 0000000..68d1ceb
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" VerticalAlignment="Top" Background="0.7,0.7,0.7,0.5"
+       Margin="10" CornerRadius="10" ClipToClientRect="false">
+       <Label Font="20" Text="Enable / Disable test"/>
+       <Label Text="{fps}" IsEnabled="false" Font="30"/>
+       <Label Text="{fps}" IsEnabled="true" Font="30"/>
+               <Label Text="{fps}" IsEnabled="false" Font="30" Background="SeaGreen"/>
+       <Label Text="{fps}" IsEnabled="true" Font="30" Background="SeaGreen"/>
+       <Button Caption="Button" IsEnabled="true" Background="Grey"/>
+       <Button Caption="Button" IsEnabled="false" Background="Grey"/>
+       <Button Caption="Button" IsEnabled="true" />
+       <Button Caption="Button" IsEnabled="false" />
+       <Spinner Fit="true"/>
+       <Spinner IsEnabled="false" Fit="true"/>
+       <CheckBox/>
+       <CheckBox IsEnabled="false"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testFileDialog.crow b/Samples/common/ui/Interfaces/Divers/testFileDialog.crow
new file mode 100644 (file)
index 0000000..868baf6
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<FileDialog Caption="Open File" CurrentDirectory="/" SearchPattern="*.*"/>
+
diff --git a/Samples/common/ui/Interfaces/Divers/testFocus.crow b/Samples/common/ui/Interfaces/Divers/testFocus.crow
new file mode 100755 (executable)
index 0000000..1f26263
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <Menu>
+               <MenuItem Caption="File" Width="Fit">
+                       <MenuItem Command="{CMDTest}"/>
+                       <MenuItem Caption="Open"/>
+                       <MenuItem Caption="Save"/>
+                       <MenuItem Caption="Quit"/>
+               </MenuItem>
+               <MenuItem Caption="Edit" Name="edit" Width="Fit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+                       <MenuItem Caption="Special" Name="special" Width="Fit">
+                               <MenuItem Caption="Cut"/>
+                               <MenuItem Caption="Copy"/>
+                               <MenuItem Caption="Paste"/>
+                       </MenuItem>
+                       <MenuItem Caption="Special2" Name="special" Width="Fit">
+                               <MenuItem Caption="Cut"/>
+                               <MenuItem Caption="Copy"/>
+                               <MenuItem Caption="Paste"/>
+                       </MenuItem>
+               </MenuItem>
+               <MenuItem Caption="Help" Width="Fit">
+                       <MenuItem Caption="About"/>
+                       <MenuItem Caption="Help"/>
+               </MenuItem>
+       </Menu>
+       <HorizontalStack Height="Fit">
+               <Label Text="Hover:" Width="50" Foreground="Grey"/>
+               <Label Text="{HoverWidget}"/>
+       </HorizontalStack>
+       <HorizontalStack Height="Fit">
+               <Label Text="Focus:" Width="50" Foreground="Grey"/>
+               <Label Text="{FocusedWidget}"/>
+       </HorizontalStack>
+       <HorizontalStack Height="Fit">
+               <Label Text="Active:" Width="50" Foreground="Grey"/>
+               <Label Text="{ActiveWidget}"/>
+       </HorizontalStack>
+       <Container Fit="true" Margin="50" Background="SlateGrey">
+               <Label Text="MouseEvents" Margin="3" Focusable="true" Fit="true"
+                       Background="Jet"
+                       Foreground="DimGrey"
+                       TextAlignment="Center"
+                       MouseEnter="{Foreground=White}"
+                       MouseLeave="{Foreground=DimGrey}"
+                       MouseDown="{Background=DarkRed}"
+                       MouseClick="{Foreground=Green}"
+                       MouseDoubleClick="{Foreground=Yellow}"
+                       MouseUp="{Background=Jet}"/>
+       </Container>
+       <TextBox Width="300" Margin="10"/>
+       <Slider Width="300" Height="12"/>
+       <ComboBox Data="{TestList}" Width="120">
+               <ItemTemplate DataType="Crow.Color">
+                       <HorizontalStack
+                                               HorizontalAlignment="Left"
+                                               Height="Fit" Width="200" Margin="1" Focusable="true"
+                                               MouseEnter="{Background=hgradient|0:DarkRed|1:Transparent}"
+                                               MouseLeave="{Background=Transparent}">
+                               <Widget Height="12" Width="20" Background="{}" Margin="0" CornerRadius="3"/>
+                               <Label Text="{}" Margin="0" Width="Stretched"/>
+                       </HorizontalStack>
+               </ItemTemplate>
+       </ComboBox>
+       <HorizontalStack Height="Fit" Margin="1" Background="DimGrey" Width="200">
+                               <VerticalStack Spacing="2" Width="50%">
+                                       <CheckBox Caption="test" MouseEnter="{Background=Blue}" MouseLeave="{Background=Transparent}"/>
+                                       <CheckBox />
+                                       <CheckBox />
+                                       <CheckBox IsChecked="true"/>
+                               </VerticalStack>
+                               <VerticalStack Spacing="2" Width="50%">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true" IsChecked="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                               </VerticalStack>
+                       </HorizontalStack>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/Divers/testIMLContainer.crow b/Samples/common/ui/Interfaces/Divers/testIMLContainer.crow
new file mode 100644 (file)
index 0000000..2ba5f2c
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<IMLContainer Path="Interfaces/Divers/colorPicker.crow"/>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testImage.crow b/Samples/common/ui/Interfaces/Divers/testImage.crow
new file mode 100755 (executable)
index 0000000..ccdd87c
--- /dev/null
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED PROPORTIONNAL" Width="150"/>
+               <Image Width="10%" Height="Fit" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg"/>
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Margin="2" Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED NOT PROPORTIONNAL" Width="150"/>
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="2" Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="UNSCALED" Width="150"/>
+               <Image Scaled="false" Background="Blue" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="2" Background="Blue" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED PROPORTIONNAL" Width="150"/>
+               <Image Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="2" Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image Background="Blue" Width="50" Height="100" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Background="Blue" Width="100" Height="50" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Width="100" Height="50" Path="#Crow.Icons.tetra.png"/>
+               <Image Background="Blue" Width="50" Height="Fit" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Crow.Icons.tetra.png"/>
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED NOT PROPORTIONNAL" Width="150"/>
+               <Image KeepProportions="false" Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="2" Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="50" Height="100" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="UNSCALED" Width="150"/>
+               <Image Scaled="false" Background="Blue" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="20" Height="20" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="2" Background="Blue" Width="20" Height="20" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+       </HorizontalStack>
+       <HorizontalStack Width="Fit" Height="100" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Image Background="Blue" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="White" Path="#Tests.image.crow0.svg" />
+               <Image Background="White" Width="20" Height="10" Path="#Tests.image.crow0.svg" />
+               <Image Margin="1" Background="White" Width="20" Height="10" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testMenu.crow b/Samples/common/ui/Interfaces/Divers/testMenu.crow
new file mode 100755 (executable)
index 0000000..0882244
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="File" Width="Fit">
+               <MenuItem Command="{CMDTest}"/>
+       </MenuItem>
+</Menu>
diff --git a/Samples/common/ui/Interfaces/Divers/testOutOfClipUpdate.crow b/Samples/common/ui/Interfaces/Divers/testOutOfClipUpdate.crow
new file mode 100755 (executable)
index 0000000..22523b8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<Container Width="200" Height="100" Background="DimGrey" Margin="5">
+       <Container Width="Stretched" Height="800" Background="DarkBlue">
+               <Label Text="{fps}" Background="RoyalBlue" VerticalAlignment="Center"/>
+       </Container>
+</Container>
diff --git a/Samples/common/ui/Interfaces/Divers/testPropLess.crow b/Samples/common/ui/Interfaces/Divers/testPropLess.crow
new file mode 100755 (executable)
index 0000000..42282c1
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<Label Margin="50" MinimumSize="10,10" Background="DimGrey" Text="{PropertyLessBinding}"/>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testShape.crow b/Samples/common/ui/Interfaces/Divers/testShape.crow
new file mode 100644 (file)
index 0000000..d1f9f3c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<Container Fit="true" Background="Red" Tooltip="test tooltip" >
+       <Shape Foreground="Transparent" Background="DimGrey" Path="M 5.5,0.5 L 10.5,10.5 L 0.5,10.5 Z"
+               MouseEnter="{Background=hgradient|0:DimGrey|0.5:RoyalBlue|1:Black}"
+               MouseLeave="{Background=DimGrey}"/>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testStacks.crow b/Samples/common/ui/Interfaces/Divers/testStacks.crow
new file mode 100755 (executable)
index 0000000..99279cd
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<Window Width="500" Height="300" MinimumSize="50,50">
+<HorizontalStack Margin="5" Background="DimGrey">
+       <VerticalStack Width="200" Margin="5" Background="Grey">
+               <VerticalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </VerticalStack>
+               <VerticalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue" Height="Stretched"/>
+               </VerticalStack>
+               <HorizontalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+                       <HorizontalStack Width="Stretched" Height="Stretched" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="Stretched" Height="Stretched" Margin="5" Background="Grey">
+               <VerticalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </VerticalStack>
+               <VerticalStack Width="Stretched" Height="Stretched" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun TextAlignment="Center" Background="SkyBlue" Width="Stretched" Height="Stretched"/>
+               </VerticalStack>
+               <HorizontalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+                       <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="Fit" Margin="5" Background="Grey">
+               <VerticalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue" HorizontalAlignment="Left"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </VerticalStack>
+               <VerticalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue" Height="Stretched"/>
+               </VerticalStack>
+               <HorizontalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+                       <HorizontalStack Width="Stretched" Height="Stretched" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testTextBox.crow b/Samples/common/ui/Interfaces/Divers/testTextBox.crow
new file mode 100755 (executable)
index 0000000..d0fe0af
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<VerticalStack Background="SteelBlue" Fit="true">
+       <HorizontalStack Fit="true">
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="TopLeft"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Top"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="TopRight"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Left"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Center"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Right"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="BottomLeft"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Bottom"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="BottomRight"/>
+       </HorizontalStack>
+       <HorizontalStack Fit="true">
+               <TextBox Background="DarkGrey" Height="30" Width="70" TextAlignment="Top" HorizontalStretch="true" Text="TopStretch"/>
+               <TextBox Background="DarkGrey" Height="30" Width="60" TextAlignment="Center" HorizontalStretch="true" Text="HorizontalStretch" />
+               <TextBox Background="DarkGrey" Height="30" Width="60" TextAlignment="Bottom" HorizontalStretch="true" Text="BottomStretch"/>
+               <TextBox Background="DarkGrey" Height="10" Width="70" TextAlignment="Left" VerticalStretch="true" Text="LeftStretch"/>
+               <TextBox Background="DarkGrey" Height="10" Width="70" TextAlignment="Center" VerticalStretch="true" Text="VerticalStretch"/>
+               <TextBox Background="DarkGrey" Height="10" Width="70" TextAlignment="Right" VerticalStretch="true" Text="RightStretch"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" HorizontalStretch="true" VerticalStretch="true" Text="Fit"/>
+       </HorizontalStack>      
+       <TextBox Name="tb" Multiline="true" Font="droid,16" Margin="5" Text="A\nBB\nCCC\nDDDD"/>
+       <TextBox Multiline="true" Font="droid,16" Name="tb5" Margin="5" Text="{../tb.SelectedText}"/>
+<!--   <TextBox Font="droid,10" Name="tb1" Margin="5" Text="this is a test of a text box"/>
+       <TextBox Width="300" Height="35" Text="this is a test of a text box"/>-->
+       <TextBox Font="droid,10" Name="tb2" Margin="0" Text="this is a test of a text box"/>
+       <TextBox Font="droid,10" Name="tb3" Margin="5" Text="this is a test of a text box"/>
+       <TextBox Font="droid,10" Name="tb4" Margin="5" Text="this is a test of a text box"/>
+       <TextBox Font="droid,10" Name="tb5" Margin="20" Text="this is a test of a text box"/>
+       <TextBox Multiline="true" Font="droid,10" Name="tb6" Margin="5" Text="this is a test of a text box\nthis is a test of a text box"/>
+       <TextBox Multiline="true" Font="droid,10" Name="tb7" Margin="1" TextAlignment="Center"
+               Text="this is a test of a text box\nthis is a test\nthis is a test when line are centered"/>
+       <TextBox Multiline="true" Font="droid,10" Name="tb8" Margin="1" TextAlignment="Center"
+               Text="this is a test of a text box\n\n\nthis is a test\nthis is a test when line are centered"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Divers/testVisibility.crow b/Samples/common/ui/Interfaces/Divers/testVisibility.crow
new file mode 100755 (executable)
index 0000000..9f9464c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Container Margin="20" Background="Red" >
+       <Container Margin="20" Background="Green" MouseDown="{../go1.Visible=True}" >
+               <Widget Name="go1" Margin="20" Background="DimGrey" Visible="false" MouseDown="{Visible=false}"
+                       MouseEnter="{Background=Blue}"
+                       MouseLeave="{Background=DimGrey}"/>
+       </Container>
+</Container>
diff --git a/Samples/common/ui/Interfaces/Divers/test_stack.crow b/Samples/common/ui/Interfaces/Divers/test_stack.crow
new file mode 100755 (executable)
index 0000000..044fd7f
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DarkBlue" Height="300" Width="200">
+<!--   <Label Text="label11" Width="Stretched" Background="Green"/>
+       <Label Text="label21"/>-->
+       <HorizontalStack Width="Fit" Height="Fit" Margin="5"
+               Focusable="True" Background="Blue">
+
+               <Label Text="label12"/>
+               <VerticalStack Background="Red" Fit="true">
+                       <Label Text="label99"/>
+                       <Label Text="label999"/>
+               </VerticalStack>
+               <Label Text="label22"/>
+<!--           <Label Text="label32"/>
+               <Label Text="label42"/>
+               <Label Text="label52"/>-->
+       </HorizontalStack>
+<!--   <Label Text="label33" Background="Green" Width="Stretched"/>-->
+<!--   <Label Text="label43"/>-->
+<!--   <Border Margin="10">
+               <Label Text="label53" Background="Red" Height="Stretched" CornerRadius="10"/>
+       </Border>-->
+       <Label Text="label43"/>
+       <Label Text="label43"/>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/Divers/welcome.crow b/Samples/common/ui/Interfaces/Divers/welcome.crow
new file mode 100644 (file)
index 0000000..fa6da1e
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<Border BorderStyle="Sunken" Fit="true" Background="0.7,0.7,0.7,0.5" CornerRadius="10">
+       <VerticalStack Margin="20">
+               <Image Path="#Crow.Icons.crow.svg"/>
+<!--           <Label Font="Times bold, 60" Text="C.R.O.W"/>-->
+               <HorizontalStack Fit="true" DataSource="{CrowVersion}" Spacing="0">
+                       <Label Foreground="Black" Font="mono, 12" Text="version: "/>            
+                       <Label Foreground="Black" Font="mono, 12" Text="{Major}"/>              
+                       <Label Foreground="Black" Font="mono, 12" Text="."/>
+                       <Label Foreground="Black" Font="mono, 12" Text="{Minor}"/>
+                       <Label Foreground="Black" Font="mono, 12" Text="."/>
+                       <Label Foreground="DimGrey" Font="mono, 12" Text="{Build}"/>
+               </HorizontalStack>
+               <Widget Height="30"/>
+               <Label Font="20" Text="Press &lt;F2&gt; and &lt;F3&gt; to cycle into the examples"/>
+               <Label Font="20" Text="Those are basic tests used to validate changes,"/>
+               <Widget Height="30"/>
+               <Label Foreground="DimGrey" Font="20" Text="&lt;F5&gt; => File dialog example"/>
+               <Label Foreground="DimGrey" Font="20" Text="&lt;F6&gt; => Window example"/>
+       </VerticalStack>
+</Border>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/DragAndDrop/0.crow b/Samples/common/ui/Interfaces/DragAndDrop/0.crow
new file mode 100755 (executable)
index 0000000..ca1a7bb
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="90%" Spacing="100" Focusable="true">
+       <Container Name="source" StartDrag="{Background=DimGrey}" EndDrag="{Background=SeaGreen}" Focusable="true" Fit="true"
+                       Drop="{../target.Background=Green}"
+                       MouseEnter="{/txt.Foreground=Red}" MouseLeave="{/txt.Foreground=White}" MouseClick="{Background=SeaGreen}"
+                       AllowDrag="true" Width="200" Height="200" Background="SeaGreen">
+               <VerticalStack Margin="50">
+                       <Label Name="txt" Text="Drag me" Foreground="Grey"/>
+                       <Label Text="Dragged" Visible="{../../IsDragged}" Foreground="Grey"/>
+               </VerticalStack>
+       </Container>
+       <Container Name="target" DragEnter="{Background=SeaGreen}" DragLeave="{Background=DimGrey}" Focusable="true" Fit="true"
+                       MouseEnter="{/txt.Foreground=Red}" MouseLeave="{/txt.Foreground=White}"
+                       AllowDrop="true"  Background="DimGrey">
+               <VerticalStack Margin="50">
+                       <Label Name="txt" Text="Drop here" Foreground="Grey"/>
+                       <Label Text="Dragged" Visible="{../../IsDragged}" Foreground="Grey"/>
+               </VerticalStack>
+       </Container>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Experimental/DockWindow.template b/Samples/common/ui/Interfaces/Experimental/DockWindow.template
new file mode 100755 (executable)
index 0000000..6c91312
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!--<Widget Background="{./Background}"/>-->
+<Border BorderWidth="1" Foreground="Black" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+               <HorizontalStack Height="Fit">
+                       <Label  Text="{./Name}" TextAlignment="Left" Width="Fit"
+                                        Foreground="White" />
+                       <Label  Text="{./DockingPosition}" TextAlignment="Left" Width="Fit"
+                                        Foreground="White" />
+               </HorizontalStack>
+               <Label  Text="{./Width}" TextAlignment="Left" Width="Fit"
+                                Foreground="White" />
+               <Label  Text="{./Height}" TextAlignment="Left" Width="Fit"
+                                Foreground="White" />
+
+               <HorizontalStack Visible="{./IsDocked}" Height="Fit" Margin="1" Background="Grey">
+                       <Label  Text="{./Caption}" TextAlignment="Left" Width="Stretched"
+                                        Foreground="Jet" />
+                       <Image Width="8" Height="8" Focusable="true" Margin="0" Path="#Crow.Icons.exit2.svg"
+                                        MouseClick="./butQuitPress"/>
+               </HorizontalStack>
+               <HorizontalStack Background="vgradient|0:0.5,0.6,0.5,0.5|1:0.2,0.3,0.3,0.7"
+                               Name="hs" Margin="0" Spacing="0" Height="Fit" Visible="{./IsFloating}">
+                       <Widget Width="5"/>
+                       <Image Margin="1" Width="10" Height="10" Path="{./Icon}"/>
+                       <Label Width="Stretched" Foreground="White" Margin="1" TextAlignment="Left" Text="{./Caption}" />
+                       <Border CornerRadius="6" BorderWidth="1" Foreground="Transparent"  Height="10" Width="10"
+                               MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                               <Image Focusable="true" Name="Image" Margin="0" Path="#Crow.Icons.exit2.svg"
+                                        MouseClick="./butQuitPress"/>
+                       </Border>
+                       <Widget Width="5"/>
+               </HorizontalStack>
+               <Container Name="Content" MinimumSize="50,50"/>
+       </VerticalStack>
+</Border>
diff --git a/Samples/common/ui/Interfaces/Experimental/testDock.crow b/Samples/common/ui/Interfaces/Experimental/testDock.crow
new file mode 100644 (file)
index 0000000..f09552c
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<Window Width="Stretched" Height="Stretched" Background="Jet">
+       <DockStack Name="mainDock" Background="DarkRed" Margin="20">
+       </DockStack>
+</Window>
+<!---          
+               <DockWindow Left="450" Top="450" Width="150" Height="150" Background="Maize"/>-->
+       
+
+<!--<Group Background="DimGrey" Margin = "0" Focusable="true" >
+       <Window Top="100" Left="100" Focusable="true" Caption="View 1" Width="300" Height="300"><Widget Background="Green" Focusable="true" MouseEnter="{Background=Grey}" MouseLeave="{Background=Green}"/></Window>
+       <Window Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></Window>
+       <Window Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></Window>
+       <Window Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></Window>
+</Group>-->
+<!--<Docker >
+       <DockWindow Resizable = "true" Top="100" Left="100" Caption="View 1" Width="300" Height="300">
+               <VerticalStack Background="DarkGreen" Focusable="true">
+                       <Label Text="{../../Left}" Background="Black" Width="Stretched"/>
+                       <Label Text="{../../Top}" Background="Black"/>
+                       <Label Text="{../../LogicalParent}" Background="Black"/>
+               </VerticalStack>
+       </DockWindow>
+       <DockWindow Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></DockWindow>
+       <DockWindow Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></DockWindow>
+       <DockWindow Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></DockWindow>
+</Docker>-->
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Experimental/testDock2.crow b/Samples/common/ui/Interfaces/Experimental/testDock2.crow
new file mode 100644 (file)
index 0000000..5ff6f70
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<Docker >
+       <DockWindow Left="100" Top="100" Width="150" Height="150" Background="DarkRed"/>
+       <DockWindow Left="200" Top="200" Width="150" Height="150" Background="DarkGreen"/>
+       <DockWindow Left="300" Top="300" Width="150" Height="150" Background="Blue"/>
+       <DockWindow Left="400" Top="400" Width="150" Height="150" Background="DarkYellow"/>
+       <DockWindow Left="500" Top="500" Width="150" Height="150" Background="Yellow"/>
+</Docker>
+<!--<Group Background="DimGrey" Margin = "0" Focusable="true" >
+       <Window Top="100" Left="100" Focusable="true" Caption="View 1" Width="300" Height="300"><Widget Background="Green" Focusable="true" MouseEnter="{Background=Grey}" MouseLeave="{Background=Green}"/></Window>
+       <Window Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></Window>
+       <Window Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></Window>
+       <Window Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></Window>
+</Group>-->
+<!--<Docker >
+       <DockWindow Resizable = "true" Top="100" Left="100" Caption="View 1" Width="300" Height="300">
+               <VerticalStack Background="DarkGreen" Focusable="true">
+                       <Label Text="{../../Left}" Background="Black" Width="Stretched"/>
+                       <Label Text="{../../Top}" Background="Black"/>
+                       <Label Text="{../../LogicalParent}" Background="Black"/>
+               </VerticalStack>
+       </DockWindow>
+       <DockWindow Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></DockWindow>
+       <DockWindow Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></DockWindow>
+       <DockWindow Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></DockWindow>
+</Docker>-->
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Experimental/testStack.crow b/Samples/common/ui/Interfaces/Experimental/testStack.crow
new file mode 100644 (file)
index 0000000..0348f0b
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<Window Width="600" Height="500">
+<VerticalStack Margin="20" Background="DimGrey" Spacing="10">
+       <Widget Height="100" Width="500" Background="Green"/>
+       <Splitter/>
+       <HorizontalStack>
+               <Widget Height="Stretched" Width="100" Background="Red"/>
+               <Splitter/>
+               <Widget Height="Stretched" Width="100" Background="DarkRed"/>
+       </HorizontalStack>
+       <Splitter/>
+       <Widget Height="100" Width="500" Background="Green"/>
+</VerticalStack>
+</Window>
+<!--<Group Background="DimGrey" Margin = "0" Focusable="true" >
+       <Window Top="100" Left="100" Focusable="true" Caption="View 1" Width="300" Height="300"><Widget Background="Green" Focusable="true" MouseEnter="{Background=Grey}" MouseLeave="{Background=Green}"/></Window>
+       <Window Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></Window>
+       <Window Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></Window>
+       <Window Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></Window>
+</Group>-->
+<!--<Docker >
+       <DockWindow Resizable = "true" Top="100" Left="100" Caption="View 1" Width="300" Height="300">
+               <VerticalStack Background="DarkGreen" Focusable="true">
+                       <Label Text="{../../Left}" Background="Black" Width="Stretched"/>
+                       <Label Text="{../../Top}" Background="Black"/>
+                       <Label Text="{../../LogicalParent}" Background="Black"/>
+               </VerticalStack>
+       </DockWindow>
+       <DockWindow Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></DockWindow>
+       <DockWindow Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></DockWindow>
+       <DockWindow Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></DockWindow>
+</Docker>-->
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Experimental/testTypeViewer.goml b/Samples/common/ui/Interfaces/Experimental/testTypeViewer.goml
new file mode 100755 (executable)
index 0000000..caa454f
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+
+       <VerticalStack Height="Fit" Width="250" Name="hstack" Margin="0" Spacing="0">
+               <Border Height="Fit" Width="Stretched" BorderWidth="2" CornerRadius="10" Background="SteelBlue">
+                       <Label Name="labName" Text="{Name}" Width="Stretched" Height="Fit" Margin="3"/>
+               </Border>
+               <ListBox Data="{Members}" Width="Stretched" Height="400" ItemTemplate="Interfaces/tmpMembers.goml" Focusable="true">
+                       
+               </ListBox>
+       </VerticalStack>
diff --git a/Samples/common/ui/Interfaces/GraphicObject/0.crow b/Samples/common/ui/Interfaces/GraphicObject/0.crow
new file mode 100755 (executable)
index 0000000..542e2ba
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+
+    <Button CornerRadius="0" Background="Red"/>
+
diff --git a/Samples/common/ui/Interfaces/GraphicObject/1.crow b/Samples/common/ui/Interfaces/GraphicObject/1.crow
new file mode 100755 (executable)
index 0000000..d74f494
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<Widget Margin="10" Width="150" Height="150" Background="SeaGreen"
+               MinimumSize="50,50"/>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/GraphicObject/2.crow b/Samples/common/ui/Interfaces/GraphicObject/2.crow
new file mode 100755 (executable)
index 0000000..af2998a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Widget Margin="10" Width="50%" Height="50%"
+               Background="hgradient|0:Red|0.25:Blue|0.5:Green|0.75:Yellow|1:Red"
+               MinimumSize="50,50"/>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/GraphicObject/4.crow b/Samples/common/ui/Interfaces/GraphicObject/4.crow
new file mode 100755 (executable)
index 0000000..f696a9e
--- /dev/null
@@ -0,0 +1,377 @@
+<?xml version="1.0"?>
+<HorizontalStack Fit="true">
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <ProgressBar CornerRadius="5" Background="DimGray" Margin="1" Maximum="1000" Value="{fps}" Width="200" Height="15"/>
+               <HorizontalStack Fit="true">
+                       <Label Text="Memory:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{memory}" Font="droid,12" TextAlignment="Center"
+                               Background="vgradient|0:BlueCrayola|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/GraphicObject/5.crow b/Samples/common/ui/Interfaces/GraphicObject/5.crow
new file mode 100755 (executable)
index 0000000..4922474
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<HorizontalStack Width="Stretched" Height="Fit" Margin="5" Background="Mantis">
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="Stretched" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+</HorizontalStack>
diff --git a/Samples/common/ui/Interfaces/GraphicObject/6.crow b/Samples/common/ui/Interfaces/GraphicObject/6.crow
new file mode 100755 (executable)
index 0000000..c37ca36
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Background="DimGray" Margin="5">
+<!--   <RadioButton/>-->
+       <Label Text="a" Width="Stretched" Background="Red"/>
+       <Label Text="{fps}" HorizontalAlignment="Right" Background="LimeGreen"/>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/GraphicObject/7.crow b/Samples/common/ui/Interfaces/GraphicObject/7.crow
new file mode 100755 (executable)
index 0000000..d8e9cd3
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<VerticalStack Height="Fit" Width="Fit">
+       <Label Width="0"/>
+       <Expandable  Width="Fit" Background="Gray">
+               <Expandable Background="LightBlue">
+                       <Expandable Background="Green">
+                               <Expandable Background="LimeGreen">
+                                       <Expandable Background="DimGray">
+                                               <Expandable Width="0" Background="Yellow">
+                                                       <Expandable Background="NavyBlue">
+                                                               <Expandable Width="0" Background="Blue">
+                                                                       <Expandable Width="0" Background="BlueCrayola">
+                                                                               <Expandable Width="0" Background="Green">
+                                                                                       <Label Background="Red"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
+       <Expandable Width="0"  Background="Gray">
+               <Expandable Width="0" Background="LightBlue">
+                       <Expandable Width="0" Background="Green">
+                               <Expandable Width="0" Background="LimeGreen">
+                                       <Expandable Width="0" Background="DimGray">
+                                               <Expandable Width="0" Background="Yellow">
+                                                       <Expandable Width="0" Background="NavyBlue">
+                                                               <Expandable Width="0" Background="Blue">
+                                                                       <Expandable Width="0" Background="BlueCrayola">
+                                                                               <Expandable Width="0" Background="Green">
+                                                                                       <Label Background="Red"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/Group/0.crow b/Samples/common/ui/Interfaces/Group/0.crow
new file mode 100755 (executable)
index 0000000..db09cab
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<Group MinimumSize="50,50" Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"                        
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Group/1.crow b/Samples/common/ui/Interfaces/Group/1.crow
new file mode 100755 (executable)
index 0000000..2d378d3
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Group/2.crow b/Samples/common/ui/Interfaces/Group/2.crow
new file mode 100755 (executable)
index 0000000..721790d
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Fit="true">
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Group/3.crow b/Samples/common/ui/Interfaces/Group/3.crow
new file mode 100755 (executable)
index 0000000..bcb57b2
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Width="70%" Height="50%">
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="100%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Group/4.crow b/Samples/common/ui/Interfaces/Group/4.crow
new file mode 100755 (executable)
index 0000000..3e97341
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Fit="true">
+       <Label Font="droid bold,40" Text="{fps}" Margin="10"  Fit="true"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Splitter/1.crow b/Samples/common/ui/Interfaces/Splitter/1.crow
new file mode 100755 (executable)
index 0000000..48c1ea1
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<HorizontalStack Width="80%" Height="50%">
+       <Border Width="45%" CornerRadius="10" BorderWidth="1">
+               <VerticalStack>
+                       <VerticalStack Height="45%">
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 1" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 2"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="true" Caption="Check 3"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 4" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                       </VerticalStack>
+                       <Splitter Thickness="3"/>
+                       <VerticalStack Height="45%">
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 1" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 2"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="true" Caption="Check 3"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 4" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                       </VerticalStack>
+               </VerticalStack>
+       </Border>
+       <Splitter Thickness="3"/>
+       <Border Width="45%" CornerRadius="10" BorderWidth="1">
+               <VerticalStack Width="50%" Height="50%" Background="DimGrey">
+                       <RadioButton IsChecked="false" Caption="Choice 1" Background="hgradient|0:DarkRed|1:Transparent"/>
+                       <RadioButton IsChecked="false" Caption="Choice 2"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                       <RadioButton IsChecked="true" Caption="Choice 3"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                       <RadioButton IsChecked="false" Caption="Choice 4" Background="hgradient|0:DarkRed|1:Transparent"/>
+               </VerticalStack>
+       </Border>
+       <Splitter Thickness="3"/>
+</HorizontalStack>
diff --git a/Samples/common/ui/Interfaces/Splitter/3.crow b/Samples/common/ui/Interfaces/Splitter/3.crow
new file mode 100755 (executable)
index 0000000..582944a
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <GraphicObject CornerRadius="5" Height="10" Width="600" Background="vgradient|0:Transparent|0,5:White|1:Transparent"/>
+       <HorizontalStack Fit="true" HorizontalAlignment="Left">
+               <Border Fit="true" CornerRadius="10" BorderWidth="1">
+                       <VerticalStack Margin="10">
+                               <CheckBox IsChecked="false" Caption="Check 1" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox IsChecked="false" Caption="Check 2"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox IsChecked="true" Caption="Check 3"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox IsChecked="false" Caption="Check 4" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter/>
+               <Border Fit="true" CornerRadius="10" BorderWidth="1">
+                       <VerticalStack Margin="10">
+                               <RadioButton IsChecked="false" Caption="Choice 1" Background="hgradient|0:DarkRed|1:Transparent"/>
+                               <Splitter/>
+                               <RadioButton Width="Stretched" IsChecked="false" Caption="Choice 2"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                               <RadioButton IsChecked="true" Caption="Choice 3"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                               <RadioButton IsChecked="false" Caption="Choice 4" Background="hgradient|0:DarkRed|1:Transparent"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter Thickness="3" />
+               <Border Fit="true" CornerRadius="10" BorderWidth="1" MaximumSize="150;150" MinimumSize="50;50">
+                       <VerticalStack Margin="10">
+                               <Label Text="label 1" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                               <Label Text="label 2" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                               <Label Text="label 3" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                               <Label Text="label 4" Width="Stretched" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter/>
+               <Border Fit="true" CornerRadius="10" BorderWidth="1">
+                       <VerticalStack Margin="10">
+                               <Button Caption="Button 1" Background="hgradient|0:Red|1:DarkRed" CornerRadius="5"/>
+                               <Button Caption="Button 2"  Background="hgradient|0:AoEnglish|1:Arsenic" CornerRadius="3"/>
+                               <Button Caption="Button 3"  Background="hgradient|0:DarkRed|1:Transparent" CornerRadius="0"/>
+                               <Button Caption="Button 4" Background="hgradient|0:DarkRed|1:Transparent" CornerRadius="8"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter/>
+       </HorizontalStack>
+       <GraphicObject CornerRadius="5" Height="10" Width="600" Background="vgradient|0:Transparent|0,5:White|1:Transparent"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/0.crow b/Samples/common/ui/Interfaces/Stack/0.crow
new file mode 100755 (executable)
index 0000000..e2ce6bb
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<VerticalStack MinimumSize="50,50" Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/0h.crow b/Samples/common/ui/Interfaces/Stack/0h.crow
new file mode 100755 (executable)
index 0000000..af596cb
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<HorizontalStack MinimumSize="50,50" Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/1.crow b/Samples/common/ui/Interfaces/Stack/1.crow
new file mode 100755 (executable)
index 0000000..4b89bea
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="60%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/1h.crow b/Samples/common/ui/Interfaces/Stack/1h.crow
new file mode 100755 (executable)
index 0000000..5fb0551
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="60%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/2.crow b/Samples/common/ui/Interfaces/Stack/2.crow
new file mode 100755 (executable)
index 0000000..2498ee3
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DimGrey" Margin="10" Width="90%" Height="100%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/2h.crow b/Samples/common/ui/Interfaces/Stack/2h.crow
new file mode 100755 (executable)
index 0000000..c72e9da
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="100%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/3.crow b/Samples/common/ui/Interfaces/Stack/3.crow
new file mode 100755 (executable)
index 0000000..7aa7c9e
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/3h.crow b/Samples/common/ui/Interfaces/Stack/3h.crow
new file mode 100755 (executable)
index 0000000..2acdd49
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Stack/4.crow b/Samples/common/ui/Interfaces/Stack/4.crow
new file mode 100755 (executable)
index 0000000..33d57de
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="20%">
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Width="100%" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+       </HorizontalStack>
+       <HorizontalStack Background="DimGrey" Margin="10" Width="Fit" Height="20%">
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Width="100%" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TabItem.template b/Samples/common/ui/Interfaces/TabItem.template
new file mode 100644 (file)
index 0000000..fd0f310
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<GenericStack Orientation="Vertical" Spacing="0"
+               Background="{./Background}"
+               MouseEnter="{/caption.Foreground=White}"
+               MouseLeave="{/caption.Foreground=Grey}">
+       <HorizontalStack Left="{./TabOffset}"
+               Name="TabTitle"
+               HorizontalAlignment="Left"
+               Height="{./TabHeight}"
+               Width="{./TabWidth}">
+               <Label Name="caption" Text="{./Caption}" Foreground="Grey" Width="Stretched"/>
+               <Label Text="{./ViewIndex}" Foreground="Green"/>
+               <Label Text="{./TabOffset}" Foreground="Red"/>
+               <Border CornerRadius="5" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Icons.exit2.svg"
+                                MouseClick="./butCloseTabClick"/>
+               </Border>
+       </HorizontalStack>
+       <Container Margin="20">
+               <Container Background="DimGrey" Name="Content"/>
+       </Container>
+</GenericStack>
+
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/0.crow b/Samples/common/ui/Interfaces/TemplatedContainer/0.crow
new file mode 100755 (executable)
index 0000000..5b26740
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Expandable Fit="true" Caption="Test expandable" Background="DimGrey">
+               <VerticalStack Margin="5" >
+                       <CheckBox Name="chk1" />
+                       <CheckBox Name="chk2" IsChecked="true"/>
+                       <CheckBox Name="chk3" />
+                       <CheckBox Name="chk4" />
+                       <HorizontalStack Fit="true" Margin="2" Background="SeaGreen">
+                               <Label Name="captionFps" Text="Fps:" Width="30" TextAlignment="Right"/>
+                               <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="Fit" TextAlignment="Center" Background="SeaGreen"/>
+                       </HorizontalStack>
+               </VerticalStack>
+</Expandable>
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/6.crow b/Samples/common/ui/Interfaces/TemplatedContainer/6.crow
new file mode 100755 (executable)
index 0000000..641d58f
--- /dev/null
@@ -0,0 +1,21 @@
+<Expandable Width="Stretched"  Background="Grey">
+               <Expandable Width="Stretched" Background="LightBlue">
+                       <Expandable Width="Stretched" Background="Green">
+                               <Expandable Width="Stretched" Background="LimeGreen">
+                                       <Expandable Width="Stretched" Background="DimGrey">
+                                               <Expandable Width="Stretched" Background="Yellow">
+                                                       <Expandable Width="Stretched" Background="SeaGreen">
+                                                               <Expandable Width="Stretched" Background="Blue">
+                                                                       <Expandable Width="Stretched" Background="RoyalBlue">
+                                                                               <Expandable Width="Stretched" Background="Green">
+                                                                                       <Label Background="Red" Text="{fps}"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/7.crow b/Samples/common/ui/Interfaces/TemplatedContainer/7.crow
new file mode 100755 (executable)
index 0000000..99a7507
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<VerticalStack Height="Fit" Width="Fit">
+       <Label Width="Stretched"/>
+       <Expandable  Width="Fit" Background="Grey">
+               <Expandable Background="LightBlue">
+                       <Expandable Background="Green">
+                               <Expandable Background="LimeGreen">
+                                       <Expandable Background="DimGrey">
+                                               <Expandable Width="Stretched" Background="Yellow">
+                                                       <Expandable Background="SeaGreen">
+                                                               <Expandable Width="Stretched" Background="Blue">
+                                                                       <Expandable Width="Stretched" Background="RoyalBlue">
+                                                                               <Expandable Width="Stretched" Background="Green">
+                                                                                       <Label Background="Red" Text="{fps}"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testGroupBox.crow b/Samples/common/ui/Interfaces/TemplatedContainer/testGroupBox.crow
new file mode 100755 (executable)
index 0000000..4858180
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!--<Container Background="vgradient|0:DarkGrey|1:DimGrey">-->
+       <GroupBox Fit="true" Background="vgradient|0:SteelBlue|1:Transparent"
+               Foreground="White">
+<!--           <Label/>-->
+       </GroupBox>
+<!--</Container>-->
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testMsgBox.crow b/Samples/common/ui/Interfaces/TemplatedContainer/testMsgBox.crow
new file mode 100755 (executable)
index 0000000..d60c281
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<MessageBox Caption="message" Message="this is a message box"/>
+<!--   Ok="onMsgBoxOk"
+       Cancel="onMsgBoxCancel"/>-->
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testPopper.crow b/Samples/common/ui/Interfaces/TemplatedContainer/testPopper.crow
new file mode 100755 (executable)
index 0000000..27da8ea
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <Border Fit="true" Margin="10">
+               <VerticalStack Width="150" Height="Fit">
+                       <RadioButton Caption="Left" IsChecked="true" Checked="change_alignment"/>
+                       <RadioButton Caption="Right" Checked="change_alignment"/>
+                       <RadioButton Caption="Top" Checked="change_alignment"/>
+                       <RadioButton Caption="Bottom" Checked="change_alignment"/>
+               </VerticalStack>
+       </Border>
+       <Widget Height="200"/>
+       <Popper Caption="TestPopper" Width="100" Background="DimGrey" PopDirection="{alignment}">
+               <Border Fit="True" Background="SteelBlue">
+                       <Image Fit="true" Path="#go.Images.Icons.tetra.png" Margin="10"/>
+                       <VerticalStack Fit="true" Margin="10" Background="CornflowerBlue">
+                               <CheckBox Name="chk1" Background="Red"/>
+                               <CheckBox Name="chk2" IsChecked="true"/>
+                               <CheckBox Name="chk3"/>
+                               <CheckBox Name="chk4"/>
+                               <HorizontalStack Fit="true" Margin="20">
+                                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" Background="SeaGreen"/>
+                               </HorizontalStack>
+                       </VerticalStack>
+               </Border>
+       </Popper>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testTabView.crow b/Samples/common/ui/Interfaces/TemplatedContainer/testTabView.crow
new file mode 100644 (file)
index 0000000..e3717c8
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Group Height="90%" Width="95%">
+<VerticalStack >
+       <HorizontalStack Height="Fit">
+               <Label Text="Selected Tab:"/>
+               <Label Text="{../../tabview1.SelectedTab}"/>
+       </HorizontalStack>
+       <TabView Name="tabview1" Background="DimGrey" Orientation="Horizontal">
+               <TabItem Name="TabItem1" Caption="tab item 1" Background="DimGrey">
+                       <VerticalStack Margin="20">
+                               <CheckBox/>
+                               <CheckBox/>
+                               <CheckBox/>
+                               <CheckBox/>
+                       </VerticalStack>
+               </TabItem>
+               <TabItem Name="TabItem2" Caption="tab item 2" Background="DimGrey">
+                       <VerticalStack Height="Fit" Margin="10">
+                               <RadioButton Fit="true"/>
+                               <RadioButton/>
+                               <RadioButton/>
+                               <RadioButton/>
+                       </VerticalStack>
+               </TabItem>
+               <TabItem Name="TabItem3" Background="DimGrey" Caption="tab item 3">
+                       <Container Margin="5" CornerRadius="2" >
+                               <TextBox Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                       </Container>
+               </TabItem>
+               <TabItem Name="TabItem4" Background="DimGrey" Caption="tab item 4" Margin="0">
+                       <TextBox/>
+               </TabItem>
+       </TabView>
+       <Button Background="vgradient|0:DimGrey|1:Black" HorizontalAlignment="Right"
+               Caption="Add new tab" Width="Fit" Height="30" MouseDown="onAddTabButClick"/>
+</VerticalStack>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testTabView2.crow b/Samples/common/ui/Interfaces/TemplatedContainer/testTabView2.crow
new file mode 100644 (file)
index 0000000..67b87b0
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<HorizontalStack Height="90%" Width="99%" Spacing="50">
+       <VerticalStack Width="40%">     
+               <HorizontalStack Height="Fit">
+                       <Label Text="Selected Tab:"/>
+                       <Label Text="{../../tabview1.SelectedTab}"/>
+               </HorizontalStack>
+               <TabView Name="tabview1" Background="DimGrey" Orientation="Horizontal" Margin="5" >
+                       <TabItem Name="TabItem1" Caption="tab-1.1" Background="DimGrey">
+                               <VerticalStack Margin="20">
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem2" Caption="tab-1.2" Background="DimGrey">
+                               <VerticalStack Height="Fit" Margin="10">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem3" Background="DimGrey" Caption="tab-1.3">
+                               <Container Margin="5" CornerRadius="2" >
+                                       <TextBox Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                               </Container>
+                       </TabItem>
+               </TabView>
+               <Button Background="vgradient|0:DimGrey|1:Black" HorizontalAlignment="Right"
+                       Caption="Add new tab" Width="Fit" Height="30" MouseDown="onAddTabButClick"/>    
+       </VerticalStack>
+       <VerticalStack Width="40%">     
+               <HorizontalStack Height="Fit">
+                       <Label Text="Selected Tab:"/>
+                       <Label Text="{../../tabview2.SelectedTab}"/>
+               </HorizontalStack>
+               <TabView Name="tabview2" Background="DimGrey" Orientation="Horizontal" >
+                       <TabItem Name="TabItem1" Caption="tab-2.1" Background="DimGrey">
+                               <VerticalStack Margin="20">
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem2" Caption="tab-2.2" Background="DimGrey">
+                               <VerticalStack Height="Fit" Margin="10">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem3" Background="DimGrey" Caption="tab-2.3">
+                               <Container Margin="5" CornerRadius="2" >
+                                       <TextBox Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                               </Container>
+                       </TabItem>
+               </TabView>
+               <Button Background="vgradient|0:DimGrey|1:Black" HorizontalAlignment="Right"
+                       Caption="Add new tab" Width="Fit" Height="30" MouseDown="onAddTabButClick2"/>   
+       </VerticalStack>
+</HorizontalStack>
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testTreeView.crow b/Samples/common/ui/Interfaces/TemplatedContainer/testTreeView.crow
new file mode 100755 (executable)
index 0000000..099ce66
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Border Margin="5" Height="90%" Width="50%">
+       <DirectoryView Name="dv" CurrentDirectory="/" Margin="1"/>
+</Border>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testWindow.goml b/Samples/common/ui/Interfaces/TemplatedContainer/testWindow.goml
new file mode 100755 (executable)
index 0000000..e42a5c9
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<Window Left="10" Top="10" Caption="Test window"
+               Width="250" Height="550" >
+       <VerticalStack Name="contentVSStack" Margin="10" Spacing="10" Background="0.4,0.4,0.4,0.4">
+               <Slider Name="slider" Height="12" Width="Stretched" CornerRadius="3"/>
+               <GroupBox Caption="test"  Height="Fit" Width="Stretched" Margin="5">
+                       <VerticalStack  Height="Fit" Width="Stretched" >
+                               <RadioButton  Caption="Radio 1" Background="Red" Width="Stretched"/>
+                               <RadioButton  Caption="Radio 2" IsChecked="true" />
+                               <RadioButton  Caption="Radio 3" />
+                               <RadioButton  Caption="Radio 1" Background="SkyBlue" Width="Stretched"/>
+                       </VerticalStack>
+               </GroupBox>
+               <HorizontalStack Width="Stretched" Height="Fit" Margin="10" CornerRadius="5" Background="SkyBlue">
+                       <RadioButton Width="80" Height="Fit"  Caption="Radio 2" IsChecked="true" />
+                       <Widget Width="Stretched"/>
+                       <RadioButton Width="80" Height="Fit" Caption="Radio 3" />
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Stretched" MinimumSize="10,40" Margin="0" CornerRadius="5"
+                               Background="vgradient|0:White|0.1:SteelBlue|0.9:SteelBlue|1:Transparent">
+                       <CheckBox Height="Fit" Width="80"/>
+                       <Widget Width="Stretched"/>
+                       <CheckBox Height="Fit" Width="80" IsChecked="true"/>
+               </HorizontalStack>
+               <Border Fit="true" CornerRadius="5" BorderWidth="1" >
+                       <Container Name="MainGrp" Background="0.5,0.5,0.5,0.4" Width="120" Fit="true"
+                               Margin="10" Focusable="True" >
+                                       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                                                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Clipping:" Width="50" TextAlignment="Right"/>
+                                                       <Label Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                                                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                                                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                                                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                                                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                       </VerticalStack>
+                       </Container>
+               </Border>
+               <HorizontalStack Fit="true" Background="RoyalBlue" Margin="3">
+                       <Widget Margin="10" Background="LimeGreen" Width="5" Height="5"/>
+                       <TextBox Font="droid, 16" Multiline="true" Text="this is a test\nmultiline" Margin="2"/>
+                       <Widget Margin="10" Background="LimeGreen" Width="5" Height="5"/>
+               </HorizontalStack>
+       </VerticalStack>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testWindow2.goml b/Samples/common/ui/Interfaces/TemplatedContainer/testWindow2.goml
new file mode 100755 (executable)
index 0000000..cf88e8c
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Window Focusable="true" Caption="Measures" Width="30%" Height="Fit" MinimumSize="100,100">
+       <VerticalStack Width="90%" Height="Fit" Spacing="1" Margin="10">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="FpsLabel"/>
+                       <Label Text="{fps}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="FpsLabel"/>
+                       <Label Text="{fpsMin}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="FpsLabel"/>
+                       <Label Text="{fpsMax}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="FpsLabel"/>
+                       <Label Text="{update}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="FpsLabel"/>
+                       <Label Text="{layouting}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Clipping:" Style="FpsLabel"/>
+                       <Label Text="{clipping}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="FpsLabel"/>
+                       <Label Text="{drawing}" Style="FpsDisp"/>
+               </HorizontalStack>
+       </VerticalStack>
+</Window>
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/testWindow3.goml b/Samples/common/ui/Interfaces/TemplatedContainer/testWindow3.goml
new file mode 100755 (executable)
index 0000000..869615b
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<Window Left="10" Top="10" Caption="Test window" Width="200" Height="200" Background="0.5,0.5,0.5,0.8"
+       Focusable="True"  CornerRadius="20" MinimumSize="100,100" MaximumSize="500,500">
+       <Template>
+               <Container Margin="20" Name="Content" Height="{../HeightPolicy}" Width="{../WidthPolicy}" Background="0.5,0.5,0.5,0.5"/>
+       </Template>
+<!--   <Group Background="Green">-->
+               <Widget Height="50" Width="50" Background="Red" Margin="5"/>
+<!--           <Scrollbar Orientation="Vertical" Height="Stretched" Width="10" Background="Blue" Margin="0" HorizontalAlignment="Right"/>-->
+<!--   </Group>-->
+</Window>
diff --git a/Samples/common/ui/Interfaces/TemplatedContainer/test_Listbox.crow b/Samples/common/ui/Interfaces/TemplatedContainer/test_Listbox.crow
new file mode 100755 (executable)
index 0000000..47adb8c
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!--<ListBox Data="{TestList}" Focusable="true"/>-->
+<Border Margin="50">
+       <VerticalStack >
+               <Label Text="{../ColorList.SelectedItem}" Background="DarkGreen"/>
+               <Label Text="{Hover}" Background="DarkGreen"/>
+               <Button Caption="Clear" Width="Stretched" MouseClick="OnClear"/>
+               <ListBox Name="ColorList" Data="{TestList}"  Width="200" Height="200" 
+                                        ItemTemplate="#Tests.Interfaces.colorItem.crow">                       
+               </ListBox>
+               <Button Caption="Load list" Width="Stretched" MouseClick="OnLoadList"/>
+       </VerticalStack>
+</Border>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedControl/testButton.crow b/Samples/common/ui/Interfaces/TemplatedControl/testButton.crow
new file mode 100755 (executable)
index 0000000..8911619
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Background="vgradient|0:DimGrey|1:Black">
+       <HorizontalStack Fit="True">
+               <Button Caption="but" MouseClick="onButClick"/>
+               <Button Caption="but" MouseClick="onButClick" Fit="true"/>
+               <Button Width="60" Height="40" MouseClick="onButClick"/>
+               <Button Caption="Long text button" MouseClick="onButClick"/>
+               <Button Font="droid, 20" Caption="Button"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedControl/testCheckbox.crow b/Samples/common/ui/Interfaces/TemplatedControl/testCheckbox.crow
new file mode 100755 (executable)
index 0000000..7c8438c
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Margin="100" Background="DimGrey" >
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/TemplatedControl/testCombobox.crow b/Samples/common/ui/Interfaces/TemplatedControl/testCombobox.crow
new file mode 100755 (executable)
index 0000000..4363986
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Container Background="DimGrey" Width="300">
+       <ComboBox  Data="{TestList}" ItemTemplate="#Tests.Interfaces.colorItem.crow"/>
+</Container>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedControl/testItemTemplateTag.crow b/Samples/common/ui/Interfaces/TemplatedControl/testItemTemplateTag.crow
new file mode 100755 (executable)
index 0000000..b29be38
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<Border BorderWidth="2" Fit="true">
+       <VerticalStack Fit="true" Margin="5">
+               <ListBox Data="{TestList}" Background="0.5,0.5,0.5,0.7"
+                                        HorizontalAlignment="Center" Width="200" Height="200" Margin="5">
+                       <Template>
+                               <Border BorderWidth="1">
+                                       <HorizontalStack Margin="1">
+                                               <Scroller Name="scroller1" Margin="2">
+                                                       <VerticalStack Height="Fit" MinimumSize="10,10"
+                                                               Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+                                               </Scroller>
+                                               <ScrollBar Name="scrollbar1" Value="{²../scroller1.ScrollY}"
+                                                       LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30" CursorSize="{../scroller1.ChildHeightRatio}"
+                                                       Maximum="{../scroller1.MaxScrollY}" Orientation="Vertical" 
+                                                       Width="14" />
+                                       </HorizontalStack>
+                               </Border>
+                       </Template>
+                       <ItemTemplate DataType="Crow.Color">
+                               <HorizontalStack
+                                                       HorizontalAlignment="Left"
+                                                       Height="Fit" Width="200" Margin="1" Focusable="true"
+                                                       MouseEnter="{Background=hgradient|0:DarkRed|1:Transparent}"
+                                                       MouseLeave="{Background=Transparent}">
+                                       <Widget Height="12" Width="20" Background="{}" Margin="0" CornerRadius="3"/>
+                                       <Label Text="{}" Margin="0" Width="Stretched"/>
+                               </HorizontalStack>
+                       </ItemTemplate>
+               </ListBox>
+               <HorizontalStack Fit="true" HorizontalAlignment="Right">
+                       <Button Caption="Load list" MouseDown="OnLoadList"/>
+                       <Button Caption="Clear" MouseDown="OnClear"/>
+               </HorizontalStack>
+       </VerticalStack>
+</Border>
diff --git a/Samples/common/ui/Interfaces/TemplatedControl/testRadioButton.crow b/Samples/common/ui/Interfaces/TemplatedControl/testRadioButton.crow
new file mode 100755 (executable)
index 0000000..a01d904
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<VerticalStack Width="200" Height="Fit" Margin="20" Background="DimGrey">
+       <RadioButton Caption="Radio1"/>
+       <RadioButton Caption="Radio2" IsChecked="true"/>
+       <RadioButton Caption="Radio3"/>
+       <RadioButton Caption="Radio4"/>
+</VerticalStack>
diff --git a/Samples/common/ui/Interfaces/TemplatedControl/testScrollbar.crow b/Samples/common/ui/Interfaces/TemplatedControl/testScrollbar.crow
new file mode 100755 (executable)
index 0000000..f8c4a9a
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Group Name="TopContainer" Width="400" Height="400"
+       Focusable="True" Background="Grey">
+       <ScrollBar Height="16" Orientation="Horizontal" Width="Stretched" Maximum="100"/>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedControl/testSpinner.crow b/Samples/common/ui/Interfaces/TemplatedControl/testSpinner.crow
new file mode 100755 (executable)
index 0000000..01d5301
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<VerticalStack Name="TopContainer" Width="400" Height="Fit"
+       Margin="20" Background="DarkGrey">
+
+       <HorizontalStack Fit="true" Margin="5" Background="SkyBlue">
+               <Spinner Name="sp1" Value="5" ValueChanged="onSpinnerValueChange"/>
+               <Spinner Value="5"/>
+               <Spinner Value="5"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedGroup/0.crow b/Samples/common/ui/Interfaces/TemplatedGroup/0.crow
new file mode 100755 (executable)
index 0000000..92cd224
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="File" Width="Fit">
+               <MenuItem Caption="New" />
+               <MenuItem Caption="Open"/>
+               <MenuItem Caption="Save"/>
+               <MenuItem Caption="Quit"/>
+       </MenuItem>
+       <MenuItem Caption="Edit" Name="edit" Width="Fit">
+               <MenuItem Caption="Cut"/>
+               <MenuItem Caption="Copy"/>
+               <MenuItem Caption="Paste"/>
+               <MenuItem Caption="Special" Name="special" Width="Fit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+               </MenuItem>
+               <MenuItem Caption="Special2" Name="special" Width="Fit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+               </MenuItem>
+       </MenuItem>
+       <MenuItem Caption="Help" Width="Fit">
+               <MenuItem Caption="About"/>
+               <MenuItem Caption="Help"/>
+       </MenuItem>
+</Menu>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TemplatedGroup/1.crow b/Samples/common/ui/Interfaces/TemplatedGroup/1.crow
new file mode 100755 (executable)
index 0000000..f47e7aa
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="File">
+               <MenuItem Caption="New"/>
+               <MenuItem Caption="Open"/>
+               <MenuItem Caption="Save"/>
+               <MenuItem Caption="Quit"/>
+       </MenuItem>
+</Menu>
diff --git a/Samples/common/ui/Interfaces/TemplatedGroup/2.crow b/Samples/common/ui/Interfaces/TemplatedGroup/2.crow
new file mode 100755 (executable)
index 0000000..8d25db5
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="Menu">
+               <MenuItem Caption="File">
+                       <MenuItem Caption="New"></MenuItem>
+                       <MenuItem Caption="Open"></MenuItem>
+                       <MenuItem Caption="Save"></MenuItem>
+                       <MenuItem Caption="Quit"></MenuItem>
+               </MenuItem>
+               <MenuItem Caption="Edit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+                       <MenuItem Caption="Special">
+                               <MenuItem Caption="Cut"/>
+                               <MenuItem Caption="Copy"/>
+                               <MenuItem Caption="Paste"/>
+                       </MenuItem>
+               </MenuItem>
+               <MenuItem Caption="Help">
+                       <MenuItem Caption="About"/>
+                       <MenuItem Caption="Help"/>
+               </MenuItem>
+       </MenuItem>
+</Menu>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/TmpExpandable.goml b/Samples/common/ui/Interfaces/TmpExpandable.goml
new file mode 100755 (executable)
index 0000000..9dddceb
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--<VerticalStack Height="{../HeightPolicy}" Width="{../WidthPolicy}" MouseClick="../onMouseClick">
+       <Label Text="{../../Caption}" Width="{../../WidthPolicy}"/>
+       <Container Name="Content" Visible="false" Height="{../../HeightPolicy}" Width="{../../WidthPolicy}"/>
+</VerticalStack>-->
+<Group BorderWidth="1" Foreground="LightGray" 
+               MouseClick="../onMouseClick">
+       <VerticalStack>
+               <Label Text="{../../../Caption}"/>
+               <Container Name="Content" Visible="false"/>
+       </VerticalStack>
+</Group>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Wrapper/1.1.crow b/Samples/common/ui/Interfaces/Wrapper/1.1.crow
new file mode 100755 (executable)
index 0000000..548aab3
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Vertical Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Vertical" Height="Fit" Width="90%" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Wrapper/1.crow b/Samples/common/ui/Interfaces/Wrapper/1.crow
new file mode 100755 (executable)
index 0000000..58c79ee
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Vertical Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Vertical" Height="Fit" Width="Fit" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Wrapper/2.1.crow b/Samples/common/ui/Interfaces/Wrapper/2.1.crow
new file mode 100755 (executable)
index 0000000..2a35289
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Horizontal Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Horizontal" Height="90%" Width="Fit" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Wrapper/2.2.crow b/Samples/common/ui/Interfaces/Wrapper/2.2.crow
new file mode 100755 (executable)
index 0000000..4621c14
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<Window Caption="Horizontal Wrapper" Width="50%" Height="50%">
+               <Wrapper HorizontalAlignment="Left" Orientation="Horizontal" Height="100%" Width="Fit" Margin="0" Background="MediumSeaGreen" Spacing="1" >
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50%" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50%" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50%" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50%" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50%" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50%" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+               </Wrapper>      
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/Wrapper/2.crow b/Samples/common/ui/Interfaces/Wrapper/2.crow
new file mode 100755 (executable)
index 0000000..c1f234e
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Horizontal Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Horizontal" Height="Fit" Width="Fit" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/basicTests/7.crow b/Samples/common/ui/Interfaces/basicTests/7.crow
new file mode 100755 (executable)
index 0000000..8d1e441
--- /dev/null
@@ -0,0 +1,144 @@
+<?xml version="1.0"?>
+<Window Title="Showcase" Height="90%" Width="90%">
+       <HorizontalStack >
+               <VerticalStack Width="33%" Margin="5">
+                       <GroupBox Caption="Performance" Height="Fit">
+                               <VerticalStack Width="90%" Height="Fit" Spacing="2" >
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Fps:" Style="FpsLabel"/>
+                                               <Label Text="{fps}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Min:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMin}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Max:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMax}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Update:" Style="FpsLabel"/>
+                                               <Label Text="{update}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Layouting:" Style="FpsLabel"/>
+                                               <Label Text="{layouting}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Clipping:" Style="FpsLabel"/>
+                                               <Label Text="{clipping}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Drawing:" Style="FpsLabel"/>
+                                               <Label Text="{drawing}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                               </VerticalStack>
+                       </GroupBox>
+                       <Label Width="Stretched" Margin="3" Background="Onyx"/>
+                       <TextBox Text="TextBox" Multiline="true" Margin="3"/>
+                       <HorizontalStack Height="Fit" Margin="5" Background="Onyx" CornerRadius="10">
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                               </VerticalStack>
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                               </VerticalStack>
+                       </HorizontalStack>
+                       <HorizontalStack Height="Fit" Margin="5">
+                               <Label Text="MouseEvents" Width="50%" Margin="3"
+                                       Background="Onyx"
+                                       Foreground="DimGray"
+                                       TextAlignment="Center"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGray}"
+                                       MouseDown="{Background=DarkRed}"
+                                       MouseUp="{Background=Onyx}"/>
+                               <Label Text="MouseEvents" Width="50%" Margin="3"
+                                       Background="Onyx"
+                                       Foreground="DimGray"
+                                       TextAlignment="Center"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGray}"
+                                       MouseDown="{Background=Mantis}"
+                                       MouseUp="{Background=Onyx}"/>
+                       </HorizontalStack>
+                       <GroupBox Caption="Templated controls" Height="Fit" Margin="5">
+                               <HorizontalStack Height="Fit">
+                                       <VerticalStack Width="50%">
+                                               <CheckBox Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                               <CheckBox  Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                               <CheckBox  Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                               <CheckBox  Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                       </VerticalStack>
+                                       <Splitter/>
+                                       <VerticalStack Width="50%">
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                       </VerticalStack>
+                               </HorizontalStack>
+                       </GroupBox>
+                       <Spinner Fit="true"/>
+               </VerticalStack>
+               <VerticalStack Width="33%" Margin="5" Spacing="5">
+                       <Expandable Background="DimGray">
+                               <Image Path="#Crow.Icons.crow.svg"/>
+                       </Expandable>
+                       <Popper Background="DimGray" PopDirection="Bottom">
+                               <Border Fit="True" Background="DimGray" CornerRadius="0" BorderWidth="1">
+                                       <Image Path="#Crow.Icons.crow.svg" Width="100" Height="100" Margin="10"
+                                               MouseEnter="{Background=LightGray}"
+                                               MouseLeave="{Background=Transparent}"/>
+                               </Border>
+                       </Popper>
+                       <Slider Height="10" Width="90%"/>
+                       <Container Height="Fit" Background="Onyx" Margin="2" CornerRadius="5">
+                               <ProgressBar Background="DimGray" Height="10" Value="50"/>
+                       </Container>
+                       <Image Path="#Crow.Icons.crow.svg" Width="60" Height="60" Background="LightGray" />
+                       <TabView Name="tabview1"
+                               Height="120" Orientation="Horizontal" Spacing="15">
+                               <TabItem Name="TabItem1" Caption="Tab 1" Margin="0">
+                                       <VerticalStack Fit="true">
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem2" Caption="Tab 2" Background="Gray">
+                                       <VerticalStack Fit="true">
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem2" Caption="Tab 3" Background="Gray">
+                                       <Container Margin="5" CornerRadius="2">
+                                               <TextBox Height="Stretched" Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                                       </Container>
+                               </TabItem>
+                       </TabView>
+                       <MessageBox Movable="false"/>
+               </VerticalStack>
+               <VerticalStack Width="33%" Margin="5">
+                       <Border Margin="5" Background="Onyx" Height="Fit">
+                               <Label Width="Stretched" Margin="1" Text="{../../dv.SelectedItem}"/>
+                       </Border>
+                       <Border Margin="5" Background="Onyx" Height="50%">
+                               <DirectoryView Name="dv" Root="./" Margin="1"/>
+                       </Border>
+                       <ListBox Data="{TestList}" Background="Onyx" Margin="5"
+                                        ItemTemplate="#Tests.Interfaces.colorItem.crow"
+                                        Template="#Crow.Templates.ScrollingListBox.goml"/>
+               </VerticalStack>
+       </HorizontalStack>
+</Window>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/colorItem.crow b/Samples/common/ui/Interfaces/colorItem.crow
new file mode 100755 (executable)
index 0000000..30bfe3d
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<Border Foreground="Transparent" Focusable="true" HorizontalAlignment="Left" Height="Fit" Width="200">
+       <HorizontalStack Margin="0"
+                               MouseEnter="{Background=hgradient|0:DarkRed|1:Transparent}"
+                               MouseLeave="{Background=Transparent}">
+               <Widget Height="12" Width="20" Background="{}" Margin="0" CornerRadius="3"/>
+               <Label Text="{}" Margin="0" Width="Stretched"/>
+       </HorizontalStack>
+</Border>
+
diff --git a/Samples/common/ui/Interfaces/colorItem2.crow b/Samples/common/ui/Interfaces/colorItem2.crow
new file mode 100755 (executable)
index 0000000..83239b3
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<Border Foreground="Transparent" Focusable="true" HorizontalAlignment="Left" Height="Fit">
+       <HorizontalStack Margin="0"
+                               MouseEnter="{Background=CornflowerBlue}"
+                               MouseLeave="{Background=Transparent}">
+               <Widget Height="8" Width="14" Background="{}" Margin="0" CornerRadius="2"/>
+               <Label Text="{}" Margin="0" Width="Stretched" Font="mono, 8"/>
+       </HorizontalStack>
+</Border>
+
diff --git a/Samples/common/ui/Interfaces/itemTmp.goml b/Samples/common/ui/Interfaces/itemTmp.goml
new file mode 100755 (executable)
index 0000000..fadf5e6
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Border BorderWidth="3">
+       <Label Text="{Name}" Focusable="true" Width="Stretched" Height="Fit" Margin="0"
+                       MouseEnter="{Background=Red}"
+                       MouseLeave="{Background=Transparent}"
+       />
+</Border>
+
diff --git a/Samples/common/ui/Interfaces/log.xml b/Samples/common/ui/Interfaces/log.xml
new file mode 100755 (executable)
index 0000000..1039f7b
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Container Name="topContainer" HorizontalAlignment="Center" VerticalAlignment="Top"
+       Margin="2"
+       Width="600" Height="-1">
+       <Border Margin="2" BorderWidth="1" Background="0,6;0,6;0,6;0,6" Height="-1">
+               <Group Width="0" Name="logs">
+                       <VerticalStack Name="VerticalStack" Width="0" Focusable="False">
+                               <Label Name="line1" Width="0" Text="Line1" Margin="0"/>
+                               <Label Name="line2" Width="0" Text="Line2" Margin="0"/>
+                               <Label Name="line3" Width="0" Text="Line3" Margin="0"/>
+                               <Label Name="line4" Width="0" Text="Line4" Margin="0"/>
+                       </VerticalStack>
+                       <Button Name="btOk" Background="Gray" Fit="True"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseClick="BtOk_MouseClick">
+                               <Label Text="Ok" Margin="3" Foreground="White" />
+                       </Button>
+               </Group>
+       </Border>
+</Container>
+
diff --git a/Samples/common/ui/Interfaces/perfMsr.crow b/Samples/common/ui/Interfaces/perfMsr.crow
new file mode 100755 (executable)
index 0000000..22a62ea
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+
+       <VerticalStack Spacing="1" Height="Fit" Width="Stretched">
+               <HorizontalStack Background="DarkSlateGrey">
+                       <Label Text="{Name}" Width="Stretched" Font="doid bold, 10" Margin="2"/>
+                       <Button Caption="Reset" MouseClick="onResetClick" Height="Fit"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Current:" Style="FpsLabel"/>
+                       <Label Text="{current}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Minimum:" Style="FpsLabel"/>
+                       <Label Text="{minimum}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Mean:" Style="FpsLabel"/>
+                       <Label Text="{mean}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Maximum:" Style="FpsLabel"/>
+                       <Label Text="{maximum}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <Border Foreground="White" Width="Stretched" Height="60">
+                       <Trend Background="Black" NewValue="{current}" Minimum="0" Maximum="100"/>
+               </Border>
+<!--           <HorizontalStack>
+                       <Label Text="Total:" Style="FpsLabel"/>
+                       <Label Text="{total}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Cpt:" Style="FpsLabel"/>
+                       <Label Text="{cptMeasures}" Style="FpsDisp"/>
+               </HorizontalStack>-->
+       </VerticalStack>
+
diff --git a/Samples/common/ui/Interfaces/testMeter.goml b/Samples/common/ui/Interfaces/testMeter.goml
new file mode 100755 (executable)
index 0000000..2c840a8
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<AnalogMeter Width="Fit" Height="Fit" Background="White" Foreground="Black"  Value="{fps}" Minimum="Stretched" Maximum="100"/>
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/testWindow.goml.sav b/Samples/common/ui/Interfaces/testWindow.goml.sav
new file mode 100755 (executable)
index 0000000..42b4b74
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!--<Group>-->
+<Window Name="window1" Left="10" Top="10" Title="Test window" 
+               Width="250" Height="300" >
+       <VerticalStack Name="contentVSStack" Margin="10" Spacing="10">
+               <Slider Name="slider" Height="10" Width="0"/>
+
+               <HorizontalStack Width="0" Height="-1" Margin="10" Background="BlueCrayola">
+                       <Checkbox Height="-1" Width="80"/>
+                       <GraphicObject Width="0"/>
+                       <Checkbox Height="-1" Width="80"/>
+               </HorizontalStack>
+               <Groupbox Text="test"  Height="-1" Width="-1" Margin="5">
+                       <VerticalStack  Height="-1" Width="0" >
+                               <RadioButton  Caption="Radio 1" Background="Red" />
+                               <RadioButton  Caption="Radio 2" IsChecked="true" />
+                               <RadioButton  Caption="Radio 3" />
+                       </VerticalStack>
+               </Groupbox>
+<!--           <Checkbox Height="-1" Width="-1" Background="Red" Margin="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>-->
+       </VerticalStack>
+</Window>
+<!--</Group>-->
+<!--           <Label Text="{fps}"  Background="DarkRed"/>
+               <Label Text="{fpsMin}"  />
+               <Label Text="{fpsMax}"  />-->
\ No newline at end of file
diff --git a/Samples/common/ui/Interfaces/tmpDirItem.goml b/Samples/common/ui/Interfaces/tmpDirItem.goml
new file mode 100755 (executable)
index 0000000..41665d1
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+       <HorizontalStack Width="Fit" Height="Fit" Focusable="true"
+                       HorizontalAlignment="Left"
+                       MouseEnter="{Background=RoyalBlue}"
+                       MouseLeave="{Background=Transparent}">
+               <Image Width="16" Height="16" Path="#Tests.image.folder1.svg" SvgSub="{Attributes}"/>
+               <Label Text="{Name}" Width="Fit" Height="Fit" Margin="0"/>
+               <Label Text="{Attributes}" Width="Fit" Height="Fit" Margin="0"/>
+               <Label Text="{Extension}" Width="Fit" Height="Fit" Margin="0"/>
+       </HorizontalStack>
+
diff --git a/Samples/common/ui/Interfaces/tmpMembers.goml b/Samples/common/ui/Interfaces/tmpMembers.goml
new file mode 100755 (executable)
index 0000000..f48d8d6
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+       <HorizontalStack Width="Stretched" Height="Fit" Focusable="true" 
+                       MouseEnter="{Background=SkyBlue}"
+                       MouseLeave="{Background=Transparent}">
+               <Image Width="8" Height="8" Path="#Crow.Images.Icons.member.svg" SvgSub="{GetIcon}"/>
+               <Label Text="{Name}" Width="Stretched" Height="Fit" Margin="1"/>
+               <Label Text="{MemberType}" Width="Fit" Height="Fit" Margin="0"/>
+       </HorizontalStack>
+
diff --git a/Samples/common/ui/Interfaces/treeList.crow b/Samples/common/ui/Interfaces/treeList.crow
new file mode 100755 (executable)
index 0000000..ca59c17
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<VerticalStack Height="Fit" Name="List"/>
\ No newline at end of file
diff --git a/Tests/GraphicObjects/ColorCircleSelector.cs b/Tests/GraphicObjects/ColorCircleSelector.cs
new file mode 100644 (file)
index 0000000..43579d2
--- /dev/null
@@ -0,0 +1,149 @@
+//
+// TestCairoPatch.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow.Cairo;
+using Crow;
+
+namespace Test
+{
+       public class ColorCircleSelector : Widget
+       {
+               void computeControlPoints (
+                       double xc, double yc,
+                       double x1, double y1,
+                       out double x2, out double y2,
+                       out double x3, out double y3,
+                       double x4, double y4){
+                       double ax = x1 - xc;
+                       double ay = y1 - yc;
+                       double bx = x4 - xc;
+                       double byy = y4 - yc;
+                       double q1 = ax * ax + ay * ay;
+                       double q2 = q1 + ax * bx + ay * byy;
+                       double k2 = 4.0/3.0 * (Math.Sqrt(2.0 * q1 * q2) - q2) / (ax * byy - ay * bx);
+
+
+                       x2 = xc + ax - k2 * ay;
+                       y2 = yc + ay + k2 * ax;
+                       x3 = xc + bx + k2 * byy;
+                       y3 = yc + byy - k2 * bx;
+               }
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       double radius = 100;
+
+                       double pi3 = Math.PI / 3.0;
+
+                       MeshPattern mp = new MeshPattern ();
+
+                       double x1 = radius,y1 = 0,
+                       x2 = 0, y2 = 0, x3 = 0, y3 = 0, x4 = 0, y4 = 0,
+                       xc = radius,yc = radius;
+
+                       double dx = Math.Sin (pi3) * radius;
+                       double dy = Math.Cos (pi3) * radius;
+
+                       mp.BeginPatch ();
+                       mp.MoveTo (xc, yc);
+                       mp.LineTo (x1, y1);
+                       x4 = xc + dx;
+                       y4 = yc - dy;
+                       computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       mp.SetCornerColorRGB (0, 1, 1, 1);
+                       mp.SetCornerColorRGB (1, 1, 0, 0);
+                       mp.SetCornerColorRGB (2, 1, 1, 0);
+
+                       x1 = x4;
+                       y1 = y4;
+                       y4 = yc + dy;
+
+                       computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       mp.SetCornerColorRGB (3, 0, 1, 0);
+                       mp.EndPatch ();
+
+                       x1 = x4;
+                       y1 = y4;
+                       x4 = xc;
+                       y4 = yc * 2.0;
+
+                       mp.BeginPatch ();
+                       mp.MoveTo (xc, yc);
+                       mp.LineTo (x1, y1);
+                       computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       mp.SetCornerColorRGB (0, 1, 1, 1);
+                       mp.SetCornerColorRGB (1, 0, 1, 0);
+                       mp.SetCornerColorRGB (2, 0, 1, 1);
+
+                       x1 = x4;
+                       y1 = y4;
+                       x4 = xc-dx;
+                       y4 = yc+dy;
+
+                       computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       mp.SetCornerColorRGB (3, 0, 0, 1);
+                       mp.EndPatch ();
+
+                       x1 = x4;
+                       y1 = y4;
+                       y4 = yc - dy;
+
+                       mp.BeginPatch ();
+                       mp.MoveTo (xc, yc);
+                       mp.LineTo (x1, y1);
+                       computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       mp.SetCornerColorRGB (0, 1, 1, 1);
+                       mp.SetCornerColorRGB (1, 0, 0, 1);
+                       mp.SetCornerColorRGB (2, 1, 0, 1);
+
+                       x1 = x4;
+                       y1 = y4;
+                       x4 = radius;
+                       y4 = 0;
+
+                       computeControlPoints (xc, yc, x1, y1, out x2, out y2, out x3, out y3, x4, y4);
+                       mp.CurveTo (x2, y2, x3, y3, x4, y4);
+
+                       mp.SetCornerColorRGB (3, 1, 0, 0);
+                       mp.EndPatch ();
+
+                       gr.SetSource (mp);
+                       gr.Paint ();
+               }
+       }
+}
+
diff --git a/Tests/GraphicObjects/HexaContainer.cs b/Tests/GraphicObjects/HexaContainer.cs
new file mode 100644 (file)
index 0000000..c481095
--- /dev/null
@@ -0,0 +1,89 @@
+//
+// SimpleGauge.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+using Crow.Cairo;
+
+namespace Tutorials2
+{      
+       /// <summary>
+       /// Hexa container.
+       /// </summary>
+       /// <remarks>
+       /// </remarks>
+       public class HexaContainer : Container
+       {
+               const double pi3 = Math.PI / 3.0;
+
+               public HexaContainer () : base() {}
+               public HexaContainer (Interface iface): base (iface){}
+
+               protected override void onDraw (Context gr)
+               {
+                       gr.Save ();
+
+                       if (ClipToClientRect) {
+                               //clip to client zone
+                               CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius);
+                               gr.Clip ();
+                       }
+
+                       Rectangle r = ClientRectangle;
+                       double radius = 0,
+                       cx = r.Width / 2.0 + r.X,
+                       cy = r.Height / 2.0 + r.Y;
+
+                       if (r.Width > r.Height)
+                               radius = r.Height / 2.0;
+                       else
+                               radius = r.Width / 2.0;
+
+                       double dx = Math.Sin (pi3) * radius;
+                       double dy = Math.Cos (pi3) * radius;
+
+                       gr.MoveTo (cx - radius, cy);
+                       gr.LineTo (cx - dy, cy - dx);
+                       gr.LineTo (cx + dy, cy - dx);
+                       gr.LineTo (cx + radius, cy);
+                       gr.LineTo (cx + dy, cy + dx);
+                       gr.LineTo (cx - dy, cy + dx);
+                       gr.ClosePath ();
+
+                       gr.LineWidth = 1;
+                       Background.SetAsSource (gr);
+                       gr.FillPreserve ();
+                       Foreground.SetAsSource (gr);
+                       gr.Stroke ();
+
+                       if (child != null) {
+                               if (child.Visible)
+                                       child.Paint (ref gr);
+                       }
+                       gr.Restore ();
+               }
+       }
+}
+
diff --git a/Tests/GraphicObjects/LaggingGraphicObject.cs b/Tests/GraphicObjects/LaggingGraphicObject.cs
new file mode 100644 (file)
index 0000000..b3fb712
--- /dev/null
@@ -0,0 +1,86 @@
+//
+// SimpleGauge.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+using System.ComponentModel;
+using Crow.Cairo;
+using System.Diagnostics;
+
+namespace Crow
+{
+       public class LaggingGraphicObject : Widget
+       {
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       Stopwatch t = Stopwatch.StartNew ();
+
+                       IntPtr ctxHnd = gr.Handle;
+
+                       for (int i = 0; i < 1000000; i++) {
+                               
+                               /*gr.SetSourceRGBA (1.0,0.0,0.0,1.0);
+                               gr.Rectangle (0, 0, 100, 100);
+                               gr.Stroke ();*/
+
+                               /*Cairo.NativeMethods.SetSourceRGBA (ctxHnd, 1.0,0.0,0.0,1.0);
+                               Cairo.NativeMethods.Rectangle (ctxHnd, 0, 0, 100, 100);
+                               Cairo.NativeMethods.Stroke (ctxHnd);*/
+
+
+                               //tests.MainClass.cairo_set_rgba_func (ctxHnd, 1.0,0.0,0.0,1.0);
+                               //tests.MainClass.cairo_rect_func (ctxHnd, 0, 0, 100, 100);
+                               //tests.MainClass.cairo_stroke_func (ctxHnd);
+
+                               tests.MainClass.cairo_rgba_internal (ctxHnd, 1.0,0.0,0.0,1.0);
+                               tests.MainClass.cairo_rect_internal (ctxHnd, 0, 0, 100, 100);
+                               tests.MainClass.cairo_stroke_internal (ctxHnd);
+                               //tests.MainClass.cairo_stroke (ctxHnd);
+                               //tests.MainClass.cairo_stroke_icall (ctxHnd);
+
+
+
+                       }
+
+
+                       t.Stop ();
+
+                       Console.WriteLine("elapsed ticks = {0}", t.ElapsedTicks);
+
+                       //System.Threading.Thread.Sleep (1000);
+
+               }
+
+               public override void onMouseMove (object sender, MouseMoveEventArgs e)
+               {
+
+
+                       RegisterForRedraw ();
+               }
+       }               
+}
+
diff --git a/Tests/GraphicObjects/SimpleGauge.cs b/Tests/GraphicObjects/SimpleGauge.cs
new file mode 100644 (file)
index 0000000..170a48e
--- /dev/null
@@ -0,0 +1,66 @@
+//
+// SimpleGauge.cs
+//
+// Author:
+//       jp <>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+using System.ComponentModel;
+using Crow.Cairo;
+
+namespace Tutorials
+{
+       public class SimpleGauge : Widget
+       {               
+               public SimpleGauge () : base() {}
+               public SimpleGauge (Interface iface): base (iface){}
+
+               int level;
+
+               [DefaultValue(0)]
+               public int Level
+               {
+                       get { return level; }
+                       set {
+                               if (level == value)
+                                       return;
+                               level = value;
+                               NotifyValueChanged ("Level", level);
+                       }
+               }
+
+               protected override void onDraw (Context gr)
+               {
+                       base.onDraw (gr);
+
+                       Rectangle r = ClientRectangle;
+                       int height = r.Height / 100 * level;
+                       r.Y += r.Height - height;
+                       r.Height = height;
+                       Foreground.SetAsSource (gr);
+                       gr.Rectangle (r);
+                       gr.Fill ();
+               }
+       }
+}
+
diff --git a/Tests/GraphicObjects/TechBorder.cs b/Tests/GraphicObjects/TechBorder.cs
new file mode 100644 (file)
index 0000000..3701a7e
--- /dev/null
@@ -0,0 +1,88 @@
+//
+// TechBorder.cs
+//
+// Author:
+//       Jean-Philippe Bruyère <jp_bruyere@hotmail.com>
+//
+// Copyright (c) 2013-2017 Jean-Philippe Bruyère
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+using System;
+using Crow;
+
+namespace Tests
+{
+       public class TechBorder : Container
+       {
+               public TechBorder () : base() {}
+               public TechBorder (Interface iface): base (iface){}
+
+               protected override int measureRawSize (LayoutingType lt)
+               {
+                       return base.measureRawSize (lt) + 6;
+               }
+               protected override void onDraw (Crow.Cairo.Context gr)
+               {
+                       gr.Save ();
+
+                       drawTechBorder1 (gr);
+
+                       if (child != null) {
+                               if (child.Visible)
+                                       child.Paint (ref gr);
+                       }
+
+                       gr.Restore ();
+               }
+
+               void drawTechBorder1 (Crow.Cairo.Context gr){
+                       Rectangle r = ClientRectangle;
+
+                       double l1 = Math.Round(0.2 * Math.Min (r.Width, r.Height)) + 0.5;
+
+                       Foreground.SetAsSource (gr);
+                       gr.LineWidth = 6.0;
+                       gr.MoveTo (r.Left + 1.5, r.Top + l1);
+                       gr.LineTo (r.Left + 1.5, r.Top + 1.5);
+                       gr.LineTo (r.Left + l1, r.Top + 1.5);
+                       gr.MoveTo (r.Left + r.Width * 0.65, r.Bottom - 1.5);
+                       gr.LineTo (r.Left + r.Width * 0.85, r.Bottom - 1.5);
+                       gr.Stroke ();
+
+                       gr.MoveTo (r.Left + 2.5, r.Top + 2.5);
+                       gr.LineTo (r.Left + 2.5, r.Bottom - l1);
+                       gr.LineTo (r.Left + l1, r.Bottom - 2.5);
+                       gr.LineTo (r.Right - 2.5, r.Bottom - 2.5);
+                       gr.LineTo (r.Right - 2.5, r.Top + l1);
+                       gr.LineTo (r.Right - l1, r.Top + 2.5);
+                       gr.ClosePath ();
+
+                       if (ClipToClientRect) //clip to client zone                             
+                               gr.ClipPreserve ();                     
+
+                       Background.SetAsSource (gr);
+                       gr.FillPreserve ();
+
+                       gr.LineWidth = 1.0;
+                       Foreground.SetAsSource (gr);
+                       gr.Stroke ();                   
+               }
+       }
+}
+
diff --git a/Tests/Interfaces/CheckBox2.imlt b/Tests/Interfaces/CheckBox2.imlt
new file mode 100644 (file)
index 0000000..c2bfe8d
--- /dev/null
@@ -0,0 +1,7 @@
+<Label Font="{./Font}" Text="{./Caption}" Height="{./HeightPolicy}" Width="{./WidthPolicy}"
+       Margin="3"
+       Background="{./Background}"
+       Foreground="DimGrey"
+       TextAlignment="Center"
+       MouseEnter="{Foreground=White}"
+       MouseLeave="{Foreground=DimGrey}"/>
\ No newline at end of file
diff --git a/Tests/Interfaces/Container/0.crow b/Tests/Interfaces/Container/0.crow
new file mode 100755 (executable)
index 0000000..5ad8de0
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Container Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10"  Background="SeaGreen"
+                       MinimumSize="50,50"/>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Container/1.crow b/Tests/Interfaces/Container/1.crow
new file mode 100755 (executable)
index 0000000..e879bce
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Container Background="Lust" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="50%" Height="50%" Background="Maize"
+                       MinimumSize="50,50"/>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Container/2.crow b/Tests/Interfaces/Container/2.crow
new file mode 100755 (executable)
index 0000000..98d1add
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Container Background="MediumSeaGreen" Margin="10" Fit="true">
+       <Widget Margin="10" Width="50%" Height="50%" Background="DarkGreen"
+                       MinimumSize="50,50"/>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Container/3.crow b/Tests/Interfaces/Container/3.crow
new file mode 100755 (executable)
index 0000000..94655ca
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Container Background="DimGrey" Margin="10" Fit="true">
+       <Label Text="{fps}" Margin="10" Fit="true" Background="SeaGreen"/>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/0.crow b/Tests/Interfaces/Divers/0.crow
new file mode 100755 (executable)
index 0000000..e7cf3e2
--- /dev/null
@@ -0,0 +1,162 @@
+<?xml version="1.0"?>
+<Window Caption="Showcase" Height="90%" Width="90%">
+       <HorizontalStack >
+               <VerticalStack Width="30%" Margin="5">
+                       <GroupBox Caption="Performance" Height="Fit">
+                               <VerticalStack DataSource="{drawingMeasure}" Width="90%" Height="Fit" Spacing="2" >
+                                       <HorizontalStack Height="Fit" Tooltip="Frame per second">
+                                               <Label Text="Fps:" Style="FpsLabel"/>
+                                               <Label Text="{minimum}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Minimum Frame per second">
+                                               <Label Text="Min:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMin}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Maximum Frame per second">
+                                               <Label Text="Max:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMax}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Update loop duration">
+                                               <Label Text="Update:" Style="FpsLabel"/>
+                                               <Label Text="{update}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Layouting process duration">
+                                               <Label Text="Layouting:" Style="FpsLabel"/>
+                                               <Label Text="{layouting}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit" Tooltip="Clipping duration">
+                                               <Label Text="Clipping:" Style="FpsLabel"/>
+                                               <Label Text="{clipping}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Drawing:" Style="FpsLabel"/>
+                                               <Label Text="{drawing}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                               </VerticalStack>
+                       </GroupBox>
+                       <Label Width="Stretched" Margin="3" Background="DimGrey"/>
+                       <TextBox Text="TextBox" Multiline="true" Margin="3"/>
+                       <HorizontalStack Height="Fit" Margin="5" Background="DimGrey" CornerRadius="10">
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <CheckBox Fit="true" Caption="test"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true" IsChecked="true"/>
+                               </VerticalStack>
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true" IsChecked="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                               </VerticalStack>
+                       </HorizontalStack>
+                       <HorizontalStack Height="Fit" Margin="5">
+                               <Label Text="MouseEvents" Width="50%" Margin="3" Focusable="true"
+                                       Background="Jet"
+                                       Foreground="DimGrey"
+                                       TextAlignment="Center"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGrey}"
+                                       MouseDown="{Background=DarkRed}"
+                                       MouseClick="{Foreground=Green}"
+                                       MouseDoubleClick="{Foreground=Yellow}"
+                                       MouseUp="{Background=Jet}"/>
+                               <Label Text="MouseEvents" Width="50%" Margin="3"
+                                       Background="Jet"
+                                       Foreground="DimGrey"
+                                       TextAlignment="Center"
+                                       MouseClick="{Foreground=Green}"
+                                       MouseDoubleClick="{Foreground=Yellow}"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGrey}"
+                                       MouseDown="{Background=SeaGreen}"
+                                       MouseUp="{Background=DimGrey}"/>
+                       </HorizontalStack>
+                       <GroupBox Caption="Templated controls" Height="Fit" Margin="5">
+                               <HorizontalStack Height="Fit">
+                                       <VerticalStack Width="50%">
+                                               <CheckBox IsChecked="true" Style="CheckBox2"/>
+                                               <CheckBox Style="CheckBox2"/>
+                                               <CheckBox Style="CheckBox2"/>
+                                               <CheckBox Style="CheckBox2"/>
+                                       </VerticalStack>
+                                       <Splitter/>
+                                       <VerticalStack Width="50%">
+                                               <RadioButton Style="RadioButton2"/>
+                                               <RadioButton Style="RadioButton2"/>
+                                               <RadioButton Style="RadioButton2"/>
+                                               <RadioButton Style="RadioButton2"/>
+                                       </VerticalStack>
+                               </HorizontalStack>
+                       </GroupBox>
+                       <HorizontalStack Height="Fit">
+                               <Label Text="Spinner"/>
+                               <Spinner Fit="true"/>
+                       </HorizontalStack>
+                       <HorizontalStack Height="Fit">
+                               <Button Caption="Button"/>
+                               <Button Caption="Button" IsEnabled="false"/>
+                       </HorizontalStack>
+               </VerticalStack>
+               <Splitter/>
+               <VerticalStack Width="40%" Margin="5" Spacing="5">
+                       <Expandable>
+                               <Image Path="#Crow.Icons.crow.svg"/>
+                       </Expandable>
+                       <Popper>
+                               <Border Fit="True" Background="DimGrey" CornerRadius="0" BorderWidth="1">
+                                       <Image Path="#Crow.Icons.crow.svg" Width="100" Height="100" Margin="10"
+                                               MouseEnter="{Background=LightGrey}"
+                                               MouseLeave="{Background=Transparent}"/>
+                               </Border>
+                       </Popper>
+                       <Slider Height="10" Width="90%"/>
+                       <Container Height="Fit" Width="200" Background="DimGrey" Margin="2" CornerRadius="5">
+                               <ProgressBar Background="DimGrey" Height="10" Value="50"/>
+                       </Container>
+                       <Image Path="#Crow.Icons.crow.svg" Width="60" Height="60" Background="LightGrey" />
+<!--                   <TabView Name="tabview1"
+                               Height="120" Orientation="Horizontal" Spacing="15">
+                               <TabItem Name="TabItem1" Caption="Tab 1" Margin="0">
+                                       <VerticalStack Fit="true">
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem2" Caption="Tab 2" Background="Grey">
+                                       <VerticalStack Fit="true">
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem3" Caption="Tab 3" Background="Grey">
+                                       <Container Margin="5" CornerRadius="2">
+                                               <TextBox Height="Stretched" Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                                       </Container>
+                               </TabItem>
+                       </TabView>-->
+                       <MessageBox Movable="false"/>
+                       <ColorPicker SelectedColor="{²../go.Background}" Name="colorPicker" Margin="5" Fit="True" />
+                       <Widget Name="go" Width="100" Height="60" Background="{../../colorList.SelectedItem}"/>
+                       <Label Text="{../colorPicker.SelectedColor}"/>
+               </VerticalStack>
+               <Splitter/>
+               <VerticalStack Width="30%" Margin="5">
+<!--                   <Border Margin="5" Height="Fit">
+                               <Label Width="Stretched" Margin="1" Text="{../../dv.SelectedItem}"/>
+                       </Border>
+                       <Border Margin="5" Height="30%">
+                               <DirectoryView Name="dv" CurrentDirectory="/" Margin="1"/>
+                       </Border>
+                       <Splitter/>-->
+                       <ListBox Name="colorList" Data="{TestList}" Margin="5"
+                                        ItemTemplate="Interfaces/colorItem.crow"
+                                        Template="#Crow.ScrollingListBox.template"
+                                        />
+               </VerticalStack>
+       </HorizontalStack>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/2.crow b/Tests/Interfaces/Divers/2.crow
new file mode 100755 (executable)
index 0000000..b4a06b6
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <TextBox Font="droid, 20" Text="test text box" Width="Stretched"/>
+       <HorizontalStack Margin="5" Fit="true" MouseEnter="{Background=White}" MouseLeave="{Background=Transparent}">
+               <Label Text="centered" Width="80" Height="30" Background="DarkBlue" TextAlignment="Center"/>
+               <Label Text="top left" Width="80" Height="30" Background="DarkBlue" TextAlignment="TopLeft"/>
+               <Label Text="top right" Width="80" Height="30" Background="DarkBlue" TextAlignment="TopRight"/>
+               <Label Text="right center" Width="80" Height="30" Background="DarkBlue" TextAlignment="Right"/>
+               <Label Text="bottom left" Width="80" Height="30" Background="DarkBlue" TextAlignment="BottomLeft"/>
+               <Label Text="bottom center" Width="80" Height="30" Background="DarkBlue" TextAlignment="Bottom"/>
+               <Label Text="bottom right" Width="80" Height="30" Background="DarkBlue" TextAlignment="BottomRight"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/3.crow b/Tests/Interfaces/Divers/3.crow
new file mode 100755 (executable)
index 0000000..a1f5e95
--- /dev/null
@@ -0,0 +1,377 @@
+<?xml version="1.0"?>
+<HorizontalStack Fit="true">   
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <ProgressBar CornerRadius="5" Background="DimGrey" Margin="1" Maximum="1000" Value="{fps}" Width="200" Height="15"/>
+               <HorizontalStack Fit="true">
+                       <Label Text="Memory:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{memory}" Font="droid,12" TextAlignment="Center"
+                               Background="vgradient|0:RoyalBlue|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" 
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:SeaGreen|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/4.crow b/Tests/Interfaces/Divers/4.crow
new file mode 100755 (executable)
index 0000000..ca69662
--- /dev/null
@@ -0,0 +1,1695 @@
+<?xml version="1.0"?>
+<HorizontalStack>      
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="15%">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Memory:" Style="labPerf" />
+                       <Label Text="{memory}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="labPerf" />
+                       <Label Text="{update}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="labPerf" />
+                       <Label Text="{layouting}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="labPerf" />
+                       <Label Text="{drawing}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="labPerf" />
+                       <Label Text="{fps}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="labPerf" />
+                       <Label Text="{fpsMin}" Style="labPerfVal"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="labPerf" />
+                       <Label Text="{fpsMax}" Style="labPerfVal"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/5.crow b/Tests/Interfaces/Divers/5.crow
new file mode 100755 (executable)
index 0000000..7e3df06
--- /dev/null
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<HorizontalStack Fit="true" Margin="5">
+       <VerticalStack Fit="true" Margin="2" Spacing="2">
+               <TextRun Text="text run test"/>
+<!--           <Label Text="label test"/>
+               <TextBox Text="text box test"/>
+               <Button Caption="test button"/>-->
+<!--           <CheckBox Caption="test checkbox"/>
+               <RadioButton Caption="test radiobutton"/>
+               <ComboBox/>
+               <Popper Caption="test popper">
+                       <Label Text="label test"/>
+               </Popper>
+               <Expandable Caption="test expandable">
+                       <Label Text="label test"/>
+               </Expandable>
+               <Border >
+                       <Label Text="border test" Margin="3"/>
+               </Border>
+               <GroupBox Caption="Group box" >
+                       <Label Text="border test" Margin="3"/>
+               </GroupBox>
+               <Container Fit="true" Background="DimGrey" Margin="3">
+                       <Widget Width="20" Height="20" Background="LightGrey"/>
+               </Container>-->
+<!--           <ProgressBar Height="10" Width="150" Background="DimGrey" Value="50" />
+               <Slider Value="5" Width="150" Height="10"/>
+               <ScrollBar Orientation="Horizontal" Maximum="100" Value="50" Height="16" Width="150"/>
+               <Spinner Value="100"/>-->
+       </VerticalStack>
+<!--   <VerticalStack Width="150" Height="Fit" Margin="2" Spacing="2">
+               <TextRun Text="text run test" Width="Stretched"/>
+               <Label Text="label test" Width="Stretched"/>
+               <TextBox Text="text box test" Width="Stretched"/>
+               <Button Caption="test button" Width="Stretched"/>
+               <CheckBox Caption="test checkbox" Width="Stretched"/>
+               <RadioButton Caption="test radiobutton" Width="Stretched"/>
+               <ComboBox Width="Stretched"/>
+               <Popper Caption="test popper" Width="Stretched">
+                       <Label Text="label test"/>
+               </Popper>
+               <Expandable Caption="test expandable" Width="Stretched">
+                       <Label Text="label test"/>
+               </Expandable>
+               <Border  Width="Stretched">
+                       <Label Text="border test" Margin="3"/>
+               </Border>
+               <GroupBox Caption="Group box"  Width="Stretched">
+                       <Label Text="border test" Margin="3"/>
+               </GroupBox>
+               <Container Height="Fit"  Width="Stretched" Background="DimGrey" Margin="3">
+                       <Widget Width="20" Height="20" Background="LightGrey"/>
+               </Container>
+               <ProgressBar Height="10" Width="Stretched" Background="DimGrey" Value="50" />
+               <Slider Value="5" Width="Stretched" Height="10"/>
+               <ScrollBar Orientation="Horizontal" Maximum="100" Value="50" Height="16" Width="Stretched"/>
+               <Spinner Value="100"  Width="Stretched"/>
+       </VerticalStack>-->
+</HorizontalStack>
+<!--<HorizontalStack Fit="true" Background="RoyalBlue" Margin="5">
+       <Widget Background="Red" Width="30" Height="20"/>
+       <Spinner Maximum="10000000000" SmallIncrement="10" Value="0"/>
+       <Widget Background="Green" Width="30" Height="20"/>
+</HorizontalStack>-->
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/6.crow b/Tests/Interfaces/Divers/6.crow
new file mode 100755 (executable)
index 0000000..f537a71
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Background="DimGrey" Margin="5">
+<!--   <RadioButton/>-->
+       <Label Text="a" Width="Stretched" Background="Red"/>
+       <Label Text="{fps}" HorizontalAlignment="Right" Background="LimeGreen"/>
+</VerticalStack>
diff --git a/Tests/Interfaces/Divers/clip0.crow b/Tests/Interfaces/Divers/clip0.crow
new file mode 100755 (executable)
index 0000000..0dee2ef
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<Container Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=Grey}"
+               MouseLeave="{Background=LimeGreen}">
+       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="false"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+ </Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/clip1.crow b/Tests/Interfaces/Divers/clip1.crow
new file mode 100755 (executable)
index 0000000..bc4c927
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<Container Fit="true" Margin="20" Background="SkyBlue" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=LightGrey}"
+               MouseLeave="{Background=SkyBlue}">
+               <Container Fit="true" Margin="20" Background="Red" CacheEnabled="true"
+                       HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                       MouseEnter="{Background=White}"
+                       MouseLeave="{Background=Red}">
+                       <Container Fit="true" Margin="20" Background="Yellow" CacheEnabled="false"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseEnter="{Background=Blue}"
+                               MouseLeave="{Background=Yellow}">
+                               <Container Margin="50" Background="LimeGreen" CacheEnabled="true"
+                                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                                               MouseEnter="{Background=Grey}"
+                                               MouseLeave="{Background=LimeGreen}">
+                                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                                               MouseEnter="{Background=DimGrey}"
+                                               MouseLeave="{Background=RoyalBlue}" 
+                                               Margin="1" Text="{drawing}" Background="RoyalBlue"/>
+                               </Container>
+                       </Container>
+               </Container>
+ </Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/clip2.crow b/Tests/Interfaces/Divers/clip2.crow
new file mode 100755 (executable)
index 0000000..9292150
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<Group Fit="true" Margin="50" Background="Yellow" CacheEnabled="true"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=DimGrey}"
+               MouseLeave="{Background=Yellow}">
+<Group Width="300" Height="200" Margin="50" Background="LimeGreen" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=Grey}"
+               MouseLeave="{Background=LimeGreen}">
+       <Label Left="10" HorizontalAlignment="Right" VerticalAlignment="Center" CacheEnabled="true"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+ </Group>
+ </Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/clip3.crow b/Tests/Interfaces/Divers/clip3.crow
new file mode 100755 (executable)
index 0000000..82a9888
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<Group Fit="true" Margin="50" Background="Yellow" CacheEnabled="true"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=DimGrey}"
+               MouseLeave="{Background=Yellow}">
+       <HorizontalStack Fit="true">
+               <VerticalStack Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseEnter="{Background=Grey}"
+                               MouseLeave="{Background=LimeGreen}">
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{fps}" Background="RoyalBlue"/>
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+                </VerticalStack>
+               <VerticalStack Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseEnter="{Background=Grey}"
+                               MouseLeave="{Background=LimeGreen}">
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{fpsMax}" Background="RoyalBlue"/>
+                       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+                               MouseEnter="{Background=DimGrey}" Width="100"
+                               MouseLeave="{Background=RoyalBlue}"
+                               Margin="10" Text="{fpsMin}" Background="RoyalBlue"/>
+                </VerticalStack>
+       </HorizontalStack>
+ </Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/clip4.crow b/Tests/Interfaces/Divers/clip4.crow
new file mode 100755 (executable)
index 0000000..5caaf77
--- /dev/null
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<Border Fit="true" BorderWidth="2"  >
+<Scroller CornerRadius="2" Height="200" Width="300" Background="DimGrey" Margin="2">
+       <VerticalStack Margin="10" VerticalAlignment="Top" Fit="true" Background="vgradient|0:RoyalBlue|1:Black" >
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 1"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 2"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 3"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 4"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 5"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 6"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 7"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 8"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 9"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 10"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 11"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 12"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 13"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 14"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 15"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 16"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 17"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 18"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 19"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 20"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 21"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 22"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 23"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 24"/>
+                <Label MouseEnter="{Background=Grey}" MouseLeave="{Background=hgradient|0:DarkRed|1:Transparent}" Margin="5" Background="hgradient|0:DarkRed|1:Transparent" Font="droid,20" Text="label 25"/>
+       </VerticalStack>
+</Scroller>
+</Border>
+<!--<VerticalStack Fit="true" Margin="50" Background="LimeGreen" CacheEnabled="false"
+               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+               MouseEnter="{Background=Grey}"
+               MouseLeave="{Background=LimeGreen}">
+
+               <CheckBox Margin="20" Background="RoyalBlue"/>
+               <CheckBox/>
+               <CheckBox/>
+               <CheckBox/>
+               <CheckBox/>
+               <RadioButton/>
+               <RadioButton/>
+               <RadioButton/>
+               <RadioButton/>
+               <RadioButton/>
+               <CheckBox/>
+
+       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{fps}" Background="RoyalBlue"/>
+       <Label HorizontalAlignment="Center" VerticalAlignment="Center" CacheEnabled="true"
+               MouseEnter="{Background=DimGrey}" Width="100"
+               MouseLeave="{Background=RoyalBlue}"
+               Margin="10" Text="{drawing}" Background="RoyalBlue"/>
+ </VerticalStack>-->
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/colorPicker.crow b/Tests/Interfaces/Divers/colorPicker.crow
new file mode 100755 (executable)
index 0000000..afdef14
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <ColorPicker SelectedColor="{²../go.Background}" Name="colorPicker" Background="DimGrey" Margin="5" Fit="True" />
+       <Widget Name="go" Width="100" Height="60" Background="DarkBlue"/>
+       <Widget Name="go" Width="100" Height="60" Background="{../colorPicker.SelectedColor}"/>
+       <Label Text="{../colorPicker.SelectedColor}"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/fps.crow b/Tests/Interfaces/Divers/fps.crow
new file mode 100755 (executable)
index 0000000..1d515a1
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<Border Fit="true" CornerRadius="5" BorderWidth="1">
+       <Container Name="MainGrp" Background="0.5,0.5,0.5,0.4" Width="120" Fit="true"
+               Margin="10" Focusable="True" >
+                       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+                               <HorizontalStack Fit="true">
+                                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Name="labUpdate" Text="{update}" Font="droid,12" Background="SeaGreen" Width="50" TextAlignment="Center"/>
+                               </HorizontalStack>
+                               <HorizontalStack Fit="true">
+                                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" Background="SeaGreen"/>
+                               </HorizontalStack>
+                               <HorizontalStack Fit="true">
+                                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center" Background="SeaGreen"/>
+                               </HorizontalStack>
+                               <HorizontalStack Fit="true">
+                                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                                       <Label Margin="5" Text="{fpsMax}" Font="droid , 12" Background="SeaGreen" Width="50" TextAlignment="Center"/>
+                               </HorizontalStack>
+                       </VerticalStack>
+       </Container>
+</Border>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/perfMeasures.crow b/Tests/Interfaces/Divers/perfMeasures.crow
new file mode 100755 (executable)
index 0000000..d2d5138
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Window Focusable="true" Caption="Measures" Width="30%" Height="300" MinimumSize="100,100">
+       <ListBox Data="{PerfMeasures}"
+               ItemTemplate="#ui.perfMsr.crow"/>
+</Window>
diff --git a/Tests/Interfaces/Divers/test1.1.crow b/Tests/Interfaces/Divers/test1.1.crow
new file mode 100755 (executable)
index 0000000..e6f8e2a
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<Group Name="TopGroup" Width="500" Height="400" Margin="5"
+       Focusable="True" Background="Yellow">
+       <Group Name="InnerGroup" Width="Fit" Height="Fit" Margin="50" 
+               VerticalAlignment="Top" HorizontalAlignment="Left"
+               Focusable="True" Background="Green">
+               <Image VerticalAlignment="Bottom"                       
+                       Name="PhaseOverlay1" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+               <Image Top="100"                
+                       Name="PhaseOverlay2" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+       </Group>
+       <Image VerticalAlignment="Center" HorizontalAlignment="Right"
+               Name="PhaseOverlay0" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/test1.2.crow b/Tests/Interfaces/Divers/test1.2.crow
new file mode 100755 (executable)
index 0000000..00fb7d2
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Container Background="Green" Height="400" Width="400">
+<VerticalStack Margin="10" Background="DarkBlue" Height="Fit" Width="Stretched">
+       <Label Text="label11" Width="Stretched"/>
+       <Label Text="label21"/>
+       <HorizontalStack Width="Fit" Height="Fit" Margin="5"
+               Focusable="True" Background="Blue">
+               <Label Text="label12"/>
+               <Label Text="label22"/>
+               <Label Text="label32"/>
+               <Label Text="label42"/>
+               <Label Text="label52"/>
+       </HorizontalStack>
+       <Label Text="label33" Background="Green" Width="Stretched"/>
+       <Button/>
+       <Label Text="label43"/>
+       <Label Text="label53"/>
+
+</VerticalStack>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/test1.crow b/Tests/Interfaces/Divers/test1.crow
new file mode 100755 (executable)
index 0000000..74da472
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<Container Name="TopContainer" Width="400" Height="350"
+       Margin="20" Focusable="True" Background="Yellow">
+       <Container Name="MiddleContainer" Width="50%" Height="Stretched"
+               Margin="20" Focusable="True" Background="Green">
+                       <Image VerticalAlignment="Bottom"                       
+                               Name="PhaseOverlay" Width="100" Height="100" Path="image/u.svg" Background="Red"/>
+       </Container>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/test2WayBinding.crow b/Tests/Interfaces/Divers/test2WayBinding.crow
new file mode 100755 (executable)
index 0000000..cf76f72
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <CheckBox IsChecked="{²BoolVal}"/>
+       <CheckBox Caption="second" IsChecked="{²BoolVal}"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testBind0.crow b/Tests/Interfaces/Divers/testBind0.crow
new file mode 100755 (executable)
index 0000000..d8991c7
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <TextBox Text="{Datas}" Width="100" />
+       <Button Text="Set Text to Null" MouseClick="onSetDataToNull"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testCtxMenu.crow b/Tests/Interfaces/Divers/testCtxMenu.crow
new file mode 100755 (executable)
index 0000000..5fd6072
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Widget Margin="10" Width="50%" Height="50%" Focusable="true"
+               Background="hgradient|0:Red|0.25:Blue|0.5:Green|0.75:Yellow|1:Red"
+               MinimumSize="50,50" ContextCommands="{Commands}"/>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testDisable.crow b/Tests/Interfaces/Divers/testDisable.crow
new file mode 100644 (file)
index 0000000..68d1ceb
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" VerticalAlignment="Top" Background="0.7,0.7,0.7,0.5"
+       Margin="10" CornerRadius="10" ClipToClientRect="false">
+       <Label Font="20" Text="Enable / Disable test"/>
+       <Label Text="{fps}" IsEnabled="false" Font="30"/>
+       <Label Text="{fps}" IsEnabled="true" Font="30"/>
+               <Label Text="{fps}" IsEnabled="false" Font="30" Background="SeaGreen"/>
+       <Label Text="{fps}" IsEnabled="true" Font="30" Background="SeaGreen"/>
+       <Button Caption="Button" IsEnabled="true" Background="Grey"/>
+       <Button Caption="Button" IsEnabled="false" Background="Grey"/>
+       <Button Caption="Button" IsEnabled="true" />
+       <Button Caption="Button" IsEnabled="false" />
+       <Spinner Fit="true"/>
+       <Spinner IsEnabled="false" Fit="true"/>
+       <CheckBox/>
+       <CheckBox IsEnabled="false"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testFileDialog.crow b/Tests/Interfaces/Divers/testFileDialog.crow
new file mode 100644 (file)
index 0000000..868baf6
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<FileDialog Caption="Open File" CurrentDirectory="/" SearchPattern="*.*"/>
+
diff --git a/Tests/Interfaces/Divers/testFocus.crow b/Tests/Interfaces/Divers/testFocus.crow
new file mode 100755 (executable)
index 0000000..1f26263
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <Menu>
+               <MenuItem Caption="File" Width="Fit">
+                       <MenuItem Command="{CMDTest}"/>
+                       <MenuItem Caption="Open"/>
+                       <MenuItem Caption="Save"/>
+                       <MenuItem Caption="Quit"/>
+               </MenuItem>
+               <MenuItem Caption="Edit" Name="edit" Width="Fit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+                       <MenuItem Caption="Special" Name="special" Width="Fit">
+                               <MenuItem Caption="Cut"/>
+                               <MenuItem Caption="Copy"/>
+                               <MenuItem Caption="Paste"/>
+                       </MenuItem>
+                       <MenuItem Caption="Special2" Name="special" Width="Fit">
+                               <MenuItem Caption="Cut"/>
+                               <MenuItem Caption="Copy"/>
+                               <MenuItem Caption="Paste"/>
+                       </MenuItem>
+               </MenuItem>
+               <MenuItem Caption="Help" Width="Fit">
+                       <MenuItem Caption="About"/>
+                       <MenuItem Caption="Help"/>
+               </MenuItem>
+       </Menu>
+       <HorizontalStack Height="Fit">
+               <Label Text="Hover:" Width="50" Foreground="Grey"/>
+               <Label Text="{HoverWidget}"/>
+       </HorizontalStack>
+       <HorizontalStack Height="Fit">
+               <Label Text="Focus:" Width="50" Foreground="Grey"/>
+               <Label Text="{FocusedWidget}"/>
+       </HorizontalStack>
+       <HorizontalStack Height="Fit">
+               <Label Text="Active:" Width="50" Foreground="Grey"/>
+               <Label Text="{ActiveWidget}"/>
+       </HorizontalStack>
+       <Container Fit="true" Margin="50" Background="SlateGrey">
+               <Label Text="MouseEvents" Margin="3" Focusable="true" Fit="true"
+                       Background="Jet"
+                       Foreground="DimGrey"
+                       TextAlignment="Center"
+                       MouseEnter="{Foreground=White}"
+                       MouseLeave="{Foreground=DimGrey}"
+                       MouseDown="{Background=DarkRed}"
+                       MouseClick="{Foreground=Green}"
+                       MouseDoubleClick="{Foreground=Yellow}"
+                       MouseUp="{Background=Jet}"/>
+       </Container>
+       <TextBox Width="300" Margin="10"/>
+       <Slider Width="300" Height="12"/>
+       <ComboBox Data="{TestList}" Width="120">
+               <ItemTemplate DataType="Crow.Color">
+                       <HorizontalStack
+                                               HorizontalAlignment="Left"
+                                               Height="Fit" Width="200" Margin="1" Focusable="true"
+                                               MouseEnter="{Background=hgradient|0:DarkRed|1:Transparent}"
+                                               MouseLeave="{Background=Transparent}">
+                               <Widget Height="12" Width="20" Background="{}" Margin="0" CornerRadius="3"/>
+                               <Label Text="{}" Margin="0" Width="Stretched"/>
+                       </HorizontalStack>
+               </ItemTemplate>
+       </ComboBox>
+       <HorizontalStack Height="Fit" Margin="1" Background="DimGrey" Width="200">
+                               <VerticalStack Spacing="2" Width="50%">
+                                       <CheckBox Caption="test" MouseEnter="{Background=Blue}" MouseLeave="{Background=Transparent}"/>
+                                       <CheckBox />
+                                       <CheckBox />
+                                       <CheckBox IsChecked="true"/>
+                               </VerticalStack>
+                               <VerticalStack Spacing="2" Width="50%">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true" IsChecked="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                               </VerticalStack>
+                       </HorizontalStack>
+</VerticalStack>
diff --git a/Tests/Interfaces/Divers/testIMLContainer.crow b/Tests/Interfaces/Divers/testIMLContainer.crow
new file mode 100644 (file)
index 0000000..2ba5f2c
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<IMLContainer Path="Interfaces/Divers/colorPicker.crow"/>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testImage.crow b/Tests/Interfaces/Divers/testImage.crow
new file mode 100755 (executable)
index 0000000..ccdd87c
--- /dev/null
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED PROPORTIONNAL" Width="150"/>
+               <Image Width="10%" Height="Fit" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg"/>
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Margin="2" Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED NOT PROPORTIONNAL" Width="150"/>
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="2" Background="vgradient|0:SkyBlue|1:White" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+               <Image KeepProportions="false" Margin="10" Background="vgradient|0:SkyBlue|1:White" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="UNSCALED" Width="150"/>
+               <Image Scaled="false" Background="Blue" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="2" Background="Blue" Width="20" Height="20" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="100" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Width="100" Height="50" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Background="Blue" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED PROPORTIONNAL" Width="150"/>
+               <Image Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="2" Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image Background="Blue" Width="50" Height="100" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Background="Blue" Width="100" Height="50" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Width="100" Height="50" Path="#Crow.Icons.tetra.png"/>
+               <Image Background="Blue" Width="50" Height="Fit" Path="#Crow.Icons.tetra.png"/>
+               <Image Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Crow.Icons.tetra.png"/>
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="SCALED NOT PROPORTIONNAL" Width="150"/>
+               <Image KeepProportions="false" Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="2" Background="Blue" Width="20" Height="20" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="50" Height="100" Path="#Crow.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image KeepProportions="false" Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+       </HorizontalStack>
+       <HorizontalStack Fit="true" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Label Text="UNSCALED" Width="150"/>
+               <Image Scaled="false" Background="Blue" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="20" Height="20" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="2" Background="Blue" Width="20" Height="20" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="100" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Width="100" Height="50" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+               <Image Scaled="false" Margin="10" Background="Blue" Width="50" Height="Fit" Path="#Crow.Images.Icons.tetra.png"/>
+       </HorizontalStack>
+       <HorizontalStack Width="Fit" Height="100" Background="hgradient|0:DarkRed|1:Transparent" Margin="5">
+               <Image Background="Blue" Path="#Tests.image.crow0.svg" />
+               <Image Margin="10" Background="White" Path="#Tests.image.crow0.svg" />
+               <Image Background="White" Width="20" Height="10" Path="#Tests.image.crow0.svg" />
+               <Image Margin="1" Background="White" Width="20" Height="10" Path="#Tests.image.crow0.svg" />
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testMenu.crow b/Tests/Interfaces/Divers/testMenu.crow
new file mode 100755 (executable)
index 0000000..0882244
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="File" Width="Fit">
+               <MenuItem Command="{CMDTest}"/>
+       </MenuItem>
+</Menu>
diff --git a/Tests/Interfaces/Divers/testOutOfClipUpdate.crow b/Tests/Interfaces/Divers/testOutOfClipUpdate.crow
new file mode 100755 (executable)
index 0000000..22523b8
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<Container Width="200" Height="100" Background="DimGrey" Margin="5">
+       <Container Width="Stretched" Height="800" Background="DarkBlue">
+               <Label Text="{fps}" Background="RoyalBlue" VerticalAlignment="Center"/>
+       </Container>
+</Container>
diff --git a/Tests/Interfaces/Divers/testPropLess.crow b/Tests/Interfaces/Divers/testPropLess.crow
new file mode 100755 (executable)
index 0000000..42282c1
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<Label Margin="50" MinimumSize="10,10" Background="DimGrey" Text="{PropertyLessBinding}"/>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testShape.crow b/Tests/Interfaces/Divers/testShape.crow
new file mode 100644 (file)
index 0000000..d1f9f3c
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<Container Fit="true" Background="Red" Tooltip="test tooltip" >
+       <Shape Foreground="Transparent" Background="DimGrey" Path="M 5.5,0.5 L 10.5,10.5 L 0.5,10.5 Z"
+               MouseEnter="{Background=hgradient|0:DimGrey|0.5:RoyalBlue|1:Black}"
+               MouseLeave="{Background=DimGrey}"/>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testStacks.crow b/Tests/Interfaces/Divers/testStacks.crow
new file mode 100755 (executable)
index 0000000..99279cd
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+<Window Width="500" Height="300" MinimumSize="50,50">
+<HorizontalStack Margin="5" Background="DimGrey">
+       <VerticalStack Width="200" Margin="5" Background="Grey">
+               <VerticalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </VerticalStack>
+               <VerticalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue" Height="Stretched"/>
+               </VerticalStack>
+               <HorizontalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+                       <HorizontalStack Width="Stretched" Height="Stretched" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="Stretched" Height="Stretched" Margin="5" Background="Grey">
+               <VerticalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </VerticalStack>
+               <VerticalStack Width="Stretched" Height="Stretched" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun TextAlignment="Center" Background="SkyBlue" Width="Stretched" Height="Stretched"/>
+               </VerticalStack>
+               <HorizontalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+                       <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Width="Fit" Margin="5" Background="Grey">
+               <VerticalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue" HorizontalAlignment="Left"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </VerticalStack>
+               <VerticalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue" Height="Stretched"/>
+               </VerticalStack>
+               <HorizontalStack Fit="true" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Fit" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+                       <HorizontalStack Width="Stretched" Height="Stretched" Background="DimGrey" Margin="5">
+                       <TextRun Background="SkyBlue"/>
+                       <TextRun Background="SkyBlue" Width="Stretched"/>
+                       <TextRun Background="SkyBlue"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testTextBox.crow b/Tests/Interfaces/Divers/testTextBox.crow
new file mode 100755 (executable)
index 0000000..d0fe0af
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<VerticalStack Background="SteelBlue" Fit="true">
+       <HorizontalStack Fit="true">
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="TopLeft"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Top"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="TopRight"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Left"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Center"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Right"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="BottomLeft"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="Bottom"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" TextAlignment="BottomRight"/>
+       </HorizontalStack>
+       <HorizontalStack Fit="true">
+               <TextBox Background="DarkGrey" Height="30" Width="70" TextAlignment="Top" HorizontalStretch="true" Text="TopStretch"/>
+               <TextBox Background="DarkGrey" Height="30" Width="60" TextAlignment="Center" HorizontalStretch="true" Text="HorizontalStretch" />
+               <TextBox Background="DarkGrey" Height="30" Width="60" TextAlignment="Bottom" HorizontalStretch="true" Text="BottomStretch"/>
+               <TextBox Background="DarkGrey" Height="10" Width="70" TextAlignment="Left" VerticalStretch="true" Text="LeftStretch"/>
+               <TextBox Background="DarkGrey" Height="10" Width="70" TextAlignment="Center" VerticalStretch="true" Text="VerticalStretch"/>
+               <TextBox Background="DarkGrey" Height="10" Width="70" TextAlignment="Right" VerticalStretch="true" Text="RightStretch"/>
+               <TextBox Background="DarkGrey" Height="30" Width="50" HorizontalStretch="true" VerticalStretch="true" Text="Fit"/>
+       </HorizontalStack>      
+       <TextBox Name="tb" Multiline="true" Font="droid,16" Margin="5" Text="A\nBB\nCCC\nDDDD"/>
+       <TextBox Multiline="true" Font="droid,16" Name="tb5" Margin="5" Text="{../tb.SelectedText}"/>
+<!--   <TextBox Font="droid,10" Name="tb1" Margin="5" Text="this is a test of a text box"/>
+       <TextBox Width="300" Height="35" Text="this is a test of a text box"/>-->
+       <TextBox Font="droid,10" Name="tb2" Margin="0" Text="this is a test of a text box"/>
+       <TextBox Font="droid,10" Name="tb3" Margin="5" Text="this is a test of a text box"/>
+       <TextBox Font="droid,10" Name="tb4" Margin="5" Text="this is a test of a text box"/>
+       <TextBox Font="droid,10" Name="tb5" Margin="20" Text="this is a test of a text box"/>
+       <TextBox Multiline="true" Font="droid,10" Name="tb6" Margin="5" Text="this is a test of a text box\nthis is a test of a text box"/>
+       <TextBox Multiline="true" Font="droid,10" Name="tb7" Margin="1" TextAlignment="Center"
+               Text="this is a test of a text box\nthis is a test\nthis is a test when line are centered"/>
+       <TextBox Multiline="true" Font="droid,10" Name="tb8" Margin="1" TextAlignment="Center"
+               Text="this is a test of a text box\n\n\nthis is a test\nthis is a test when line are centered"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Divers/testVisibility.crow b/Tests/Interfaces/Divers/testVisibility.crow
new file mode 100755 (executable)
index 0000000..9f9464c
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Container Margin="20" Background="Red" >
+       <Container Margin="20" Background="Green" MouseDown="{../go1.Visible=True}" >
+               <Widget Name="go1" Margin="20" Background="DimGrey" Visible="false" MouseDown="{Visible=false}"
+                       MouseEnter="{Background=Blue}"
+                       MouseLeave="{Background=DimGrey}"/>
+       </Container>
+</Container>
diff --git a/Tests/Interfaces/Divers/test_stack.crow b/Tests/Interfaces/Divers/test_stack.crow
new file mode 100755 (executable)
index 0000000..044fd7f
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DarkBlue" Height="300" Width="200">
+<!--   <Label Text="label11" Width="Stretched" Background="Green"/>
+       <Label Text="label21"/>-->
+       <HorizontalStack Width="Fit" Height="Fit" Margin="5"
+               Focusable="True" Background="Blue">
+
+               <Label Text="label12"/>
+               <VerticalStack Background="Red" Fit="true">
+                       <Label Text="label99"/>
+                       <Label Text="label999"/>
+               </VerticalStack>
+               <Label Text="label22"/>
+<!--           <Label Text="label32"/>
+               <Label Text="label42"/>
+               <Label Text="label52"/>-->
+       </HorizontalStack>
+<!--   <Label Text="label33" Background="Green" Width="Stretched"/>-->
+<!--   <Label Text="label43"/>-->
+<!--   <Border Margin="10">
+               <Label Text="label53" Background="Red" Height="Stretched" CornerRadius="10"/>
+       </Border>-->
+       <Label Text="label43"/>
+       <Label Text="label43"/>
+</VerticalStack>
diff --git a/Tests/Interfaces/Divers/welcome.crow b/Tests/Interfaces/Divers/welcome.crow
new file mode 100644 (file)
index 0000000..fa6da1e
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<Border BorderStyle="Sunken" Fit="true" Background="0.7,0.7,0.7,0.5" CornerRadius="10">
+       <VerticalStack Margin="20">
+               <Image Path="#Crow.Icons.crow.svg"/>
+<!--           <Label Font="Times bold, 60" Text="C.R.O.W"/>-->
+               <HorizontalStack Fit="true" DataSource="{CrowVersion}" Spacing="0">
+                       <Label Foreground="Black" Font="mono, 12" Text="version: "/>            
+                       <Label Foreground="Black" Font="mono, 12" Text="{Major}"/>              
+                       <Label Foreground="Black" Font="mono, 12" Text="."/>
+                       <Label Foreground="Black" Font="mono, 12" Text="{Minor}"/>
+                       <Label Foreground="Black" Font="mono, 12" Text="."/>
+                       <Label Foreground="DimGrey" Font="mono, 12" Text="{Build}"/>
+               </HorizontalStack>
+               <Widget Height="30"/>
+               <Label Font="20" Text="Press &lt;F2&gt; and &lt;F3&gt; to cycle into the examples"/>
+               <Label Font="20" Text="Those are basic tests used to validate changes,"/>
+               <Widget Height="30"/>
+               <Label Foreground="DimGrey" Font="20" Text="&lt;F5&gt; => File dialog example"/>
+               <Label Foreground="DimGrey" Font="20" Text="&lt;F6&gt; => Window example"/>
+       </VerticalStack>
+</Border>
\ No newline at end of file
diff --git a/Tests/Interfaces/DragAndDrop/0.crow b/Tests/Interfaces/DragAndDrop/0.crow
new file mode 100755 (executable)
index 0000000..ca1a7bb
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="90%" Spacing="100" Focusable="true">
+       <Container Name="source" StartDrag="{Background=DimGrey}" EndDrag="{Background=SeaGreen}" Focusable="true" Fit="true"
+                       Drop="{../target.Background=Green}"
+                       MouseEnter="{/txt.Foreground=Red}" MouseLeave="{/txt.Foreground=White}" MouseClick="{Background=SeaGreen}"
+                       AllowDrag="true" Width="200" Height="200" Background="SeaGreen">
+               <VerticalStack Margin="50">
+                       <Label Name="txt" Text="Drag me" Foreground="Grey"/>
+                       <Label Text="Dragged" Visible="{../../IsDragged}" Foreground="Grey"/>
+               </VerticalStack>
+       </Container>
+       <Container Name="target" DragEnter="{Background=SeaGreen}" DragLeave="{Background=DimGrey}" Focusable="true" Fit="true"
+                       MouseEnter="{/txt.Foreground=Red}" MouseLeave="{/txt.Foreground=White}"
+                       AllowDrop="true"  Background="DimGrey">
+               <VerticalStack Margin="50">
+                       <Label Name="txt" Text="Drop here" Foreground="Grey"/>
+                       <Label Text="Dragged" Visible="{../../IsDragged}" Foreground="Grey"/>
+               </VerticalStack>
+       </Container>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Experimental/DockWindow.template b/Tests/Interfaces/Experimental/DockWindow.template
new file mode 100755 (executable)
index 0000000..6c91312
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+<!--<Widget Background="{./Background}"/>-->
+<Border BorderWidth="1" Foreground="Black" CornerRadius="{./CornerRadius}"
+                               Background="{./Background}"
+                               MouseEnter="./onBorderMouseEnter"
+                               MouseLeave="./onBorderMouseLeave">
+       <VerticalStack Spacing="0">
+               <HorizontalStack Height="Fit">
+                       <Label  Text="{./Name}" TextAlignment="Left" Width="Fit"
+                                        Foreground="White" />
+                       <Label  Text="{./DockingPosition}" TextAlignment="Left" Width="Fit"
+                                        Foreground="White" />
+               </HorizontalStack>
+               <Label  Text="{./Width}" TextAlignment="Left" Width="Fit"
+                                Foreground="White" />
+               <Label  Text="{./Height}" TextAlignment="Left" Width="Fit"
+                                Foreground="White" />
+
+               <HorizontalStack Visible="{./IsDocked}" Height="Fit" Margin="1" Background="Grey">
+                       <Label  Text="{./Caption}" TextAlignment="Left" Width="Stretched"
+                                        Foreground="Jet" />
+                       <Image Width="8" Height="8" Focusable="true" Margin="0" Path="#Crow.Icons.exit2.svg"
+                                        MouseClick="./butQuitPress"/>
+               </HorizontalStack>
+               <HorizontalStack Background="vgradient|0:0.5,0.6,0.5,0.5|1:0.2,0.3,0.3,0.7"
+                               Name="hs" Margin="0" Spacing="0" Height="Fit" Visible="{./IsFloating}">
+                       <Widget Width="5"/>
+                       <Image Margin="1" Width="10" Height="10" Path="{./Icon}"/>
+                       <Label Width="Stretched" Foreground="White" Margin="1" TextAlignment="Left" Text="{./Caption}" />
+                       <Border CornerRadius="6" BorderWidth="1" Foreground="Transparent"  Height="10" Width="10"
+                               MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                               <Image Focusable="true" Name="Image" Margin="0" Path="#Crow.Icons.exit2.svg"
+                                        MouseClick="./butQuitPress"/>
+                       </Border>
+                       <Widget Width="5"/>
+               </HorizontalStack>
+               <Container Name="Content" MinimumSize="50,50"/>
+       </VerticalStack>
+</Border>
diff --git a/Tests/Interfaces/Experimental/testDock.crow b/Tests/Interfaces/Experimental/testDock.crow
new file mode 100644 (file)
index 0000000..f09552c
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<Window Width="Stretched" Height="Stretched" Background="Jet">
+       <DockStack Name="mainDock" Background="DarkRed" Margin="20">
+       </DockStack>
+</Window>
+<!---          
+               <DockWindow Left="450" Top="450" Width="150" Height="150" Background="Maize"/>-->
+       
+
+<!--<Group Background="DimGrey" Margin = "0" Focusable="true" >
+       <Window Top="100" Left="100" Focusable="true" Caption="View 1" Width="300" Height="300"><Widget Background="Green" Focusable="true" MouseEnter="{Background=Grey}" MouseLeave="{Background=Green}"/></Window>
+       <Window Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></Window>
+       <Window Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></Window>
+       <Window Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></Window>
+</Group>-->
+<!--<Docker >
+       <DockWindow Resizable = "true" Top="100" Left="100" Caption="View 1" Width="300" Height="300">
+               <VerticalStack Background="DarkGreen" Focusable="true">
+                       <Label Text="{../../Left}" Background="Black" Width="Stretched"/>
+                       <Label Text="{../../Top}" Background="Black"/>
+                       <Label Text="{../../LogicalParent}" Background="Black"/>
+               </VerticalStack>
+       </DockWindow>
+       <DockWindow Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></DockWindow>
+       <DockWindow Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></DockWindow>
+       <DockWindow Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></DockWindow>
+</Docker>-->
\ No newline at end of file
diff --git a/Tests/Interfaces/Experimental/testDock2.crow b/Tests/Interfaces/Experimental/testDock2.crow
new file mode 100644 (file)
index 0000000..5ff6f70
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<Docker >
+       <DockWindow Left="100" Top="100" Width="150" Height="150" Background="DarkRed"/>
+       <DockWindow Left="200" Top="200" Width="150" Height="150" Background="DarkGreen"/>
+       <DockWindow Left="300" Top="300" Width="150" Height="150" Background="Blue"/>
+       <DockWindow Left="400" Top="400" Width="150" Height="150" Background="DarkYellow"/>
+       <DockWindow Left="500" Top="500" Width="150" Height="150" Background="Yellow"/>
+</Docker>
+<!--<Group Background="DimGrey" Margin = "0" Focusable="true" >
+       <Window Top="100" Left="100" Focusable="true" Caption="View 1" Width="300" Height="300"><Widget Background="Green" Focusable="true" MouseEnter="{Background=Grey}" MouseLeave="{Background=Green}"/></Window>
+       <Window Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></Window>
+       <Window Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></Window>
+       <Window Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></Window>
+</Group>-->
+<!--<Docker >
+       <DockWindow Resizable = "true" Top="100" Left="100" Caption="View 1" Width="300" Height="300">
+               <VerticalStack Background="DarkGreen" Focusable="true">
+                       <Label Text="{../../Left}" Background="Black" Width="Stretched"/>
+                       <Label Text="{../../Top}" Background="Black"/>
+                       <Label Text="{../../LogicalParent}" Background="Black"/>
+               </VerticalStack>
+       </DockWindow>
+       <DockWindow Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></DockWindow>
+       <DockWindow Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></DockWindow>
+       <DockWindow Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></DockWindow>
+</Docker>-->
\ No newline at end of file
diff --git a/Tests/Interfaces/Experimental/testStack.crow b/Tests/Interfaces/Experimental/testStack.crow
new file mode 100644 (file)
index 0000000..0348f0b
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<Window Width="600" Height="500">
+<VerticalStack Margin="20" Background="DimGrey" Spacing="10">
+       <Widget Height="100" Width="500" Background="Green"/>
+       <Splitter/>
+       <HorizontalStack>
+               <Widget Height="Stretched" Width="100" Background="Red"/>
+               <Splitter/>
+               <Widget Height="Stretched" Width="100" Background="DarkRed"/>
+       </HorizontalStack>
+       <Splitter/>
+       <Widget Height="100" Width="500" Background="Green"/>
+</VerticalStack>
+</Window>
+<!--<Group Background="DimGrey" Margin = "0" Focusable="true" >
+       <Window Top="100" Left="100" Focusable="true" Caption="View 1" Width="300" Height="300"><Widget Background="Green" Focusable="true" MouseEnter="{Background=Grey}" MouseLeave="{Background=Green}"/></Window>
+       <Window Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></Window>
+       <Window Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></Window>
+       <Window Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></Window>
+</Group>-->
+<!--<Docker >
+       <DockWindow Resizable = "true" Top="100" Left="100" Caption="View 1" Width="300" Height="300">
+               <VerticalStack Background="DarkGreen" Focusable="true">
+                       <Label Text="{../../Left}" Background="Black" Width="Stretched"/>
+                       <Label Text="{../../Top}" Background="Black"/>
+                       <Label Text="{../../LogicalParent}" Background="Black"/>
+               </VerticalStack>
+       </DockWindow>
+       <DockWindow Top="200" Left="200" Focusable="true" Caption="View 2" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Blue" MouseEnter="{Background=Grey}" MouseLeave="{Background=Blue}"/></DockWindow>
+       <DockWindow Top="300" Left="300" Focusable="true" Caption="View 3" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Yellow" MouseEnter="{Background=Grey}" MouseLeave="{Background=Yellow}"/></DockWindow>
+       <DockWindow Top="400" Left="400" Focusable="true" Caption="View 4" Resizable = "true" Width="300" Height="300"><Widget Focusable="true" Background="Black" MouseEnter="{Background=Grey}" MouseLeave="{Background=Black}"/></DockWindow>
+</Docker>-->
\ No newline at end of file
diff --git a/Tests/Interfaces/Experimental/testTypeViewer.goml b/Tests/Interfaces/Experimental/testTypeViewer.goml
new file mode 100755 (executable)
index 0000000..caa454f
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+
+       <VerticalStack Height="Fit" Width="250" Name="hstack" Margin="0" Spacing="0">
+               <Border Height="Fit" Width="Stretched" BorderWidth="2" CornerRadius="10" Background="SteelBlue">
+                       <Label Name="labName" Text="{Name}" Width="Stretched" Height="Fit" Margin="3"/>
+               </Border>
+               <ListBox Data="{Members}" Width="Stretched" Height="400" ItemTemplate="Interfaces/tmpMembers.goml" Focusable="true">
+                       
+               </ListBox>
+       </VerticalStack>
diff --git a/Tests/Interfaces/GraphicObject/0.crow b/Tests/Interfaces/GraphicObject/0.crow
new file mode 100755 (executable)
index 0000000..542e2ba
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+
+    <Button CornerRadius="0" Background="Red"/>
+
diff --git a/Tests/Interfaces/GraphicObject/1.crow b/Tests/Interfaces/GraphicObject/1.crow
new file mode 100755 (executable)
index 0000000..d74f494
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<Widget Margin="10" Width="150" Height="150" Background="SeaGreen"
+               MinimumSize="50,50"/>
\ No newline at end of file
diff --git a/Tests/Interfaces/GraphicObject/2.crow b/Tests/Interfaces/GraphicObject/2.crow
new file mode 100755 (executable)
index 0000000..af2998a
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Widget Margin="10" Width="50%" Height="50%"
+               Background="hgradient|0:Red|0.25:Blue|0.5:Green|0.75:Yellow|1:Red"
+               MinimumSize="50,50"/>
\ No newline at end of file
diff --git a/Tests/Interfaces/GraphicObject/4.crow b/Tests/Interfaces/GraphicObject/4.crow
new file mode 100755 (executable)
index 0000000..f696a9e
--- /dev/null
@@ -0,0 +1,377 @@
+<?xml version="1.0"?>
+<HorizontalStack Fit="true">
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <ProgressBar CornerRadius="5" Background="DimGray" Margin="1" Maximum="1000" Value="{fps}" Width="200" Height="15"/>
+               <HorizontalStack Fit="true">
+                       <Label Text="Memory:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{memory}" Font="droid,12" TextAlignment="Center"
+                               Background="vgradient|0:BlueCrayola|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Update:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labUpdate" Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+               <HorizontalStack Fit="true">
+                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                               Background="vgradient|0:AoEnglish|1:Black"/>
+               </HorizontalStack>
+       </VerticalStack>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/GraphicObject/5.crow b/Tests/Interfaces/GraphicObject/5.crow
new file mode 100755 (executable)
index 0000000..4922474
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<HorizontalStack Width="Stretched" Height="Fit" Margin="5" Background="Mantis">
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="Stretched" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+       <GraphicObject Background="Carmine" Width="10%" Height="20"/>
+</HorizontalStack>
diff --git a/Tests/Interfaces/GraphicObject/6.crow b/Tests/Interfaces/GraphicObject/6.crow
new file mode 100755 (executable)
index 0000000..c37ca36
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Background="DimGray" Margin="5">
+<!--   <RadioButton/>-->
+       <Label Text="a" Width="Stretched" Background="Red"/>
+       <Label Text="{fps}" HorizontalAlignment="Right" Background="LimeGreen"/>
+</VerticalStack>
diff --git a/Tests/Interfaces/GraphicObject/7.crow b/Tests/Interfaces/GraphicObject/7.crow
new file mode 100755 (executable)
index 0000000..d8e9cd3
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<VerticalStack Height="Fit" Width="Fit">
+       <Label Width="0"/>
+       <Expandable  Width="Fit" Background="Gray">
+               <Expandable Background="LightBlue">
+                       <Expandable Background="Green">
+                               <Expandable Background="LimeGreen">
+                                       <Expandable Background="DimGray">
+                                               <Expandable Width="0" Background="Yellow">
+                                                       <Expandable Background="NavyBlue">
+                                                               <Expandable Width="0" Background="Blue">
+                                                                       <Expandable Width="0" Background="BlueCrayola">
+                                                                               <Expandable Width="0" Background="Green">
+                                                                                       <Label Background="Red"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
+       <Expandable Width="0"  Background="Gray">
+               <Expandable Width="0" Background="LightBlue">
+                       <Expandable Width="0" Background="Green">
+                               <Expandable Width="0" Background="LimeGreen">
+                                       <Expandable Width="0" Background="DimGray">
+                                               <Expandable Width="0" Background="Yellow">
+                                                       <Expandable Width="0" Background="NavyBlue">
+                                                               <Expandable Width="0" Background="Blue">
+                                                                       <Expandable Width="0" Background="BlueCrayola">
+                                                                               <Expandable Width="0" Background="Green">
+                                                                                       <Label Background="Red"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
+</VerticalStack>
diff --git a/Tests/Interfaces/Group/0.crow b/Tests/Interfaces/Group/0.crow
new file mode 100755 (executable)
index 0000000..db09cab
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<Group MinimumSize="50,50" Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"                        
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Group/1.crow b/Tests/Interfaces/Group/1.crow
new file mode 100755 (executable)
index 0000000..2d378d3
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Group/2.crow b/Tests/Interfaces/Group/2.crow
new file mode 100755 (executable)
index 0000000..721790d
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Fit="true">
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Group/3.crow b/Tests/Interfaces/Group/3.crow
new file mode 100755 (executable)
index 0000000..bcb57b2
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Width="70%" Height="50%">
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="100%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Left"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Bottom"
+                       HorizontalAlignment="Right"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Group/4.crow b/Tests/Interfaces/Group/4.crow
new file mode 100755 (executable)
index 0000000..3e97341
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<Group Background="DimGrey" Margin="10" Fit="true">
+       <Label Font="droid bold,40" Text="{fps}" Margin="10"  Fit="true"/>
+       <Widget Margin="10" Width="20%" Height="20%" Background="SeaGreen"
+                       VerticalAlignment="Top"
+                       MinimumSize="10,10"/>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Splitter/1.crow b/Tests/Interfaces/Splitter/1.crow
new file mode 100755 (executable)
index 0000000..48c1ea1
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<HorizontalStack Width="80%" Height="50%">
+       <Border Width="45%" CornerRadius="10" BorderWidth="1">
+               <VerticalStack>
+                       <VerticalStack Height="45%">
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 1" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 2"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="true" Caption="Check 3"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 4" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                       </VerticalStack>
+                       <Splitter Thickness="3"/>
+                       <VerticalStack Height="45%">
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 1" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 2"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="true" Caption="Check 3"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox Height="25%" IsChecked="false" Caption="Check 4" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                       </VerticalStack>
+               </VerticalStack>
+       </Border>
+       <Splitter Thickness="3"/>
+       <Border Width="45%" CornerRadius="10" BorderWidth="1">
+               <VerticalStack Width="50%" Height="50%" Background="DimGrey">
+                       <RadioButton IsChecked="false" Caption="Choice 1" Background="hgradient|0:DarkRed|1:Transparent"/>
+                       <RadioButton IsChecked="false" Caption="Choice 2"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                       <RadioButton IsChecked="true" Caption="Choice 3"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                       <RadioButton IsChecked="false" Caption="Choice 4" Background="hgradient|0:DarkRed|1:Transparent"/>
+               </VerticalStack>
+       </Border>
+       <Splitter Thickness="3"/>
+</HorizontalStack>
diff --git a/Tests/Interfaces/Splitter/3.crow b/Tests/Interfaces/Splitter/3.crow
new file mode 100755 (executable)
index 0000000..582944a
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true">
+       <GraphicObject CornerRadius="5" Height="10" Width="600" Background="vgradient|0:Transparent|0,5:White|1:Transparent"/>
+       <HorizontalStack Fit="true" HorizontalAlignment="Left">
+               <Border Fit="true" CornerRadius="10" BorderWidth="1">
+                       <VerticalStack Margin="10">
+                               <CheckBox IsChecked="false" Caption="Check 1" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox IsChecked="false" Caption="Check 2"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox IsChecked="true" Caption="Check 3"  Background="hgradient|0:LimeGreen|1:Transparent"/>
+                               <CheckBox IsChecked="false" Caption="Check 4" Background="hgradient|0:LimeGreen|1:Transparent"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter/>
+               <Border Fit="true" CornerRadius="10" BorderWidth="1">
+                       <VerticalStack Margin="10">
+                               <RadioButton IsChecked="false" Caption="Choice 1" Background="hgradient|0:DarkRed|1:Transparent"/>
+                               <Splitter/>
+                               <RadioButton Width="Stretched" IsChecked="false" Caption="Choice 2"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                               <RadioButton IsChecked="true" Caption="Choice 3"  Background="hgradient|0:DarkRed|1:Transparent"/>
+                               <RadioButton IsChecked="false" Caption="Choice 4" Background="hgradient|0:DarkRed|1:Transparent"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter Thickness="3" />
+               <Border Fit="true" CornerRadius="10" BorderWidth="1" MaximumSize="150;150" MinimumSize="50;50">
+                       <VerticalStack Margin="10">
+                               <Label Text="label 1" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                               <Label Text="label 2" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                               <Label Text="label 3" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                               <Label Text="label 4" Width="Stretched" Background="hgradient|0:BlueCrayola|1:Transparent"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter/>
+               <Border Fit="true" CornerRadius="10" BorderWidth="1">
+                       <VerticalStack Margin="10">
+                               <Button Caption="Button 1" Background="hgradient|0:Red|1:DarkRed" CornerRadius="5"/>
+                               <Button Caption="Button 2"  Background="hgradient|0:AoEnglish|1:Arsenic" CornerRadius="3"/>
+                               <Button Caption="Button 3"  Background="hgradient|0:DarkRed|1:Transparent" CornerRadius="0"/>
+                               <Button Caption="Button 4" Background="hgradient|0:DarkRed|1:Transparent" CornerRadius="8"/>
+                       </VerticalStack>
+               </Border>
+               <Splitter/>
+       </HorizontalStack>
+       <GraphicObject CornerRadius="5" Height="10" Width="600" Background="vgradient|0:Transparent|0,5:White|1:Transparent"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/0.crow b/Tests/Interfaces/Stack/0.crow
new file mode 100755 (executable)
index 0000000..e2ce6bb
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<VerticalStack MinimumSize="50,50" Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/0h.crow b/Tests/Interfaces/Stack/0h.crow
new file mode 100755 (executable)
index 0000000..af596cb
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<HorizontalStack MinimumSize="50,50" Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/1.crow b/Tests/Interfaces/Stack/1.crow
new file mode 100755 (executable)
index 0000000..4b89bea
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="60%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/1h.crow b/Tests/Interfaces/Stack/1h.crow
new file mode 100755 (executable)
index 0000000..5fb0551
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="60%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="20%" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/2.crow b/Tests/Interfaces/Stack/2.crow
new file mode 100755 (executable)
index 0000000..2498ee3
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DimGrey" Margin="10" Width="90%" Height="100%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/2h.crow b/Tests/Interfaces/Stack/2h.crow
new file mode 100755 (executable)
index 0000000..c72e9da
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="100%">
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+       <Widget Margin="10" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="10,10"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/3.crow b/Tests/Interfaces/Stack/3.crow
new file mode 100755 (executable)
index 0000000..7aa7c9e
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<VerticalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/3h.crow b/Tests/Interfaces/Stack/3h.crow
new file mode 100755 (executable)
index 0000000..2acdd49
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="90%">
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Stretched" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+       <Widget Margin="1" Width="Stretched" Height="Fit" Background="SeaGreen"
+                       MinimumSize="2,2"/>
+</HorizontalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/Stack/4.crow b/Tests/Interfaces/Stack/4.crow
new file mode 100755 (executable)
index 0000000..33d57de
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <HorizontalStack Background="DimGrey" Margin="10" Width="90%" Height="20%">
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Width="100%" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+       </HorizontalStack>
+       <HorizontalStack Background="DimGrey" Margin="10" Width="Fit" Height="20%">
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Width="100%" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+               <Label Font="droid bold, 20" Text="{fps}" Margin="5" Fit="true" Background="SeaGreen"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/TabItem.template b/Tests/Interfaces/TabItem.template
new file mode 100644 (file)
index 0000000..fd0f310
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<GenericStack Orientation="Vertical" Spacing="0"
+               Background="{./Background}"
+               MouseEnter="{/caption.Foreground=White}"
+               MouseLeave="{/caption.Foreground=Grey}">
+       <HorizontalStack Left="{./TabOffset}"
+               Name="TabTitle"
+               HorizontalAlignment="Left"
+               Height="{./TabHeight}"
+               Width="{./TabWidth}">
+               <Label Name="caption" Text="{./Caption}" Foreground="Grey" Width="Stretched"/>
+               <Label Text="{./ViewIndex}" Foreground="Green"/>
+               <Label Text="{./TabOffset}" Foreground="Red"/>
+               <Border CornerRadius="5" BorderWidth="1" Foreground="Transparent"  Height="12" Width="12"
+                                       MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                       <Image Focusable="true" Name="Image" Margin="0" Width="Stretched" Height="Stretched" Path="#Crow.Icons.exit2.svg"
+                                MouseClick="./butCloseTabClick"/>
+               </Border>
+       </HorizontalStack>
+       <Container Margin="20">
+               <Container Background="DimGrey" Name="Content"/>
+       </Container>
+</GenericStack>
+
diff --git a/Tests/Interfaces/TemplatedContainer/0.crow b/Tests/Interfaces/TemplatedContainer/0.crow
new file mode 100755 (executable)
index 0000000..5b26740
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Expandable Fit="true" Caption="Test expandable" Background="DimGrey">
+               <VerticalStack Margin="5" >
+                       <CheckBox Name="chk1" />
+                       <CheckBox Name="chk2" IsChecked="true"/>
+                       <CheckBox Name="chk3" />
+                       <CheckBox Name="chk4" />
+                       <HorizontalStack Fit="true" Margin="2" Background="SeaGreen">
+                               <Label Name="captionFps" Text="Fps:" Width="30" TextAlignment="Right"/>
+                               <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="Fit" TextAlignment="Center" Background="SeaGreen"/>
+                       </HorizontalStack>
+               </VerticalStack>
+</Expandable>
diff --git a/Tests/Interfaces/TemplatedContainer/6.crow b/Tests/Interfaces/TemplatedContainer/6.crow
new file mode 100755 (executable)
index 0000000..641d58f
--- /dev/null
@@ -0,0 +1,21 @@
+<Expandable Width="Stretched"  Background="Grey">
+               <Expandable Width="Stretched" Background="LightBlue">
+                       <Expandable Width="Stretched" Background="Green">
+                               <Expandable Width="Stretched" Background="LimeGreen">
+                                       <Expandable Width="Stretched" Background="DimGrey">
+                                               <Expandable Width="Stretched" Background="Yellow">
+                                                       <Expandable Width="Stretched" Background="SeaGreen">
+                                                               <Expandable Width="Stretched" Background="Blue">
+                                                                       <Expandable Width="Stretched" Background="RoyalBlue">
+                                                                               <Expandable Width="Stretched" Background="Green">
+                                                                                       <Label Background="Red" Text="{fps}"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedContainer/7.crow b/Tests/Interfaces/TemplatedContainer/7.crow
new file mode 100755 (executable)
index 0000000..99a7507
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<VerticalStack Height="Fit" Width="Fit">
+       <Label Width="Stretched"/>
+       <Expandable  Width="Fit" Background="Grey">
+               <Expandable Background="LightBlue">
+                       <Expandable Background="Green">
+                               <Expandable Background="LimeGreen">
+                                       <Expandable Background="DimGrey">
+                                               <Expandable Width="Stretched" Background="Yellow">
+                                                       <Expandable Background="SeaGreen">
+                                                               <Expandable Width="Stretched" Background="Blue">
+                                                                       <Expandable Width="Stretched" Background="RoyalBlue">
+                                                                               <Expandable Width="Stretched" Background="Green">
+                                                                                       <Label Background="Red" Text="{fps}"/>
+                                                                               </Expandable>
+                                                                       </Expandable>
+                                                               </Expandable>
+                                                       </Expandable>
+                                               </Expandable>
+                                       </Expandable>
+                               </Expandable>
+                       </Expandable>
+               </Expandable>
+       </Expandable>
+</VerticalStack>
diff --git a/Tests/Interfaces/TemplatedContainer/testGroupBox.crow b/Tests/Interfaces/TemplatedContainer/testGroupBox.crow
new file mode 100755 (executable)
index 0000000..4858180
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!--<Container Background="vgradient|0:DarkGrey|1:DimGrey">-->
+       <GroupBox Fit="true" Background="vgradient|0:SteelBlue|1:Transparent"
+               Foreground="White">
+<!--           <Label/>-->
+       </GroupBox>
+<!--</Container>-->
diff --git a/Tests/Interfaces/TemplatedContainer/testMsgBox.crow b/Tests/Interfaces/TemplatedContainer/testMsgBox.crow
new file mode 100755 (executable)
index 0000000..d60c281
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<MessageBox Caption="message" Message="this is a message box"/>
+<!--   Ok="onMsgBoxOk"
+       Cancel="onMsgBoxCancel"/>-->
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedContainer/testPopper.crow b/Tests/Interfaces/TemplatedContainer/testPopper.crow
new file mode 100755 (executable)
index 0000000..27da8ea
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <Border Fit="true" Margin="10">
+               <VerticalStack Width="150" Height="Fit">
+                       <RadioButton Caption="Left" IsChecked="true" Checked="change_alignment"/>
+                       <RadioButton Caption="Right" Checked="change_alignment"/>
+                       <RadioButton Caption="Top" Checked="change_alignment"/>
+                       <RadioButton Caption="Bottom" Checked="change_alignment"/>
+               </VerticalStack>
+       </Border>
+       <Widget Height="200"/>
+       <Popper Caption="TestPopper" Width="100" Background="DimGrey" PopDirection="{alignment}">
+               <Border Fit="True" Background="SteelBlue">
+                       <Image Fit="true" Path="#go.Images.Icons.tetra.png" Margin="10"/>
+                       <VerticalStack Fit="true" Margin="10" Background="CornflowerBlue">
+                               <CheckBox Name="chk1" Background="Red"/>
+                               <CheckBox Name="chk2" IsChecked="true"/>
+                               <CheckBox Name="chk3"/>
+                               <CheckBox Name="chk4"/>
+                               <HorizontalStack Fit="true" Margin="20">
+                                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center" Background="SeaGreen"/>
+                               </HorizontalStack>
+                       </VerticalStack>
+               </Border>
+       </Popper>
+</VerticalStack>
diff --git a/Tests/Interfaces/TemplatedContainer/testTabView.crow b/Tests/Interfaces/TemplatedContainer/testTabView.crow
new file mode 100644 (file)
index 0000000..e3717c8
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Group Height="90%" Width="95%">
+<VerticalStack >
+       <HorizontalStack Height="Fit">
+               <Label Text="Selected Tab:"/>
+               <Label Text="{../../tabview1.SelectedTab}"/>
+       </HorizontalStack>
+       <TabView Name="tabview1" Background="DimGrey" Orientation="Horizontal">
+               <TabItem Name="TabItem1" Caption="tab item 1" Background="DimGrey">
+                       <VerticalStack Margin="20">
+                               <CheckBox/>
+                               <CheckBox/>
+                               <CheckBox/>
+                               <CheckBox/>
+                       </VerticalStack>
+               </TabItem>
+               <TabItem Name="TabItem2" Caption="tab item 2" Background="DimGrey">
+                       <VerticalStack Height="Fit" Margin="10">
+                               <RadioButton Fit="true"/>
+                               <RadioButton/>
+                               <RadioButton/>
+                               <RadioButton/>
+                       </VerticalStack>
+               </TabItem>
+               <TabItem Name="TabItem3" Background="DimGrey" Caption="tab item 3">
+                       <Container Margin="5" CornerRadius="2" >
+                               <TextBox Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                       </Container>
+               </TabItem>
+               <TabItem Name="TabItem4" Background="DimGrey" Caption="tab item 4" Margin="0">
+                       <TextBox/>
+               </TabItem>
+       </TabView>
+       <Button Background="vgradient|0:DimGrey|1:Black" HorizontalAlignment="Right"
+               Caption="Add new tab" Width="Fit" Height="30" MouseDown="onAddTabButClick"/>
+</VerticalStack>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedContainer/testTabView2.crow b/Tests/Interfaces/TemplatedContainer/testTabView2.crow
new file mode 100644 (file)
index 0000000..67b87b0
--- /dev/null
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<HorizontalStack Height="90%" Width="99%" Spacing="50">
+       <VerticalStack Width="40%">     
+               <HorizontalStack Height="Fit">
+                       <Label Text="Selected Tab:"/>
+                       <Label Text="{../../tabview1.SelectedTab}"/>
+               </HorizontalStack>
+               <TabView Name="tabview1" Background="DimGrey" Orientation="Horizontal" Margin="5" >
+                       <TabItem Name="TabItem1" Caption="tab-1.1" Background="DimGrey">
+                               <VerticalStack Margin="20">
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem2" Caption="tab-1.2" Background="DimGrey">
+                               <VerticalStack Height="Fit" Margin="10">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem3" Background="DimGrey" Caption="tab-1.3">
+                               <Container Margin="5" CornerRadius="2" >
+                                       <TextBox Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                               </Container>
+                       </TabItem>
+               </TabView>
+               <Button Background="vgradient|0:DimGrey|1:Black" HorizontalAlignment="Right"
+                       Caption="Add new tab" Width="Fit" Height="30" MouseDown="onAddTabButClick"/>    
+       </VerticalStack>
+       <VerticalStack Width="40%">     
+               <HorizontalStack Height="Fit">
+                       <Label Text="Selected Tab:"/>
+                       <Label Text="{../../tabview2.SelectedTab}"/>
+               </HorizontalStack>
+               <TabView Name="tabview2" Background="DimGrey" Orientation="Horizontal" >
+                       <TabItem Name="TabItem1" Caption="tab-2.1" Background="DimGrey">
+                               <VerticalStack Margin="20">
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                                       <CheckBox/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem2" Caption="tab-2.2" Background="DimGrey">
+                               <VerticalStack Height="Fit" Margin="10">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                                       <RadioButton/>
+                               </VerticalStack>
+                       </TabItem>
+                       <TabItem Name="TabItem3" Background="DimGrey" Caption="tab-2.3">
+                               <Container Margin="5" CornerRadius="2" >
+                                       <TextBox Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                               </Container>
+                       </TabItem>
+               </TabView>
+               <Button Background="vgradient|0:DimGrey|1:Black" HorizontalAlignment="Right"
+                       Caption="Add new tab" Width="Fit" Height="30" MouseDown="onAddTabButClick2"/>   
+       </VerticalStack>
+</HorizontalStack>
diff --git a/Tests/Interfaces/TemplatedContainer/testTreeView.crow b/Tests/Interfaces/TemplatedContainer/testTreeView.crow
new file mode 100755 (executable)
index 0000000..099ce66
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Border Margin="5" Height="90%" Width="50%">
+       <DirectoryView Name="dv" CurrentDirectory="/" Margin="1"/>
+</Border>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedContainer/testWindow.goml b/Tests/Interfaces/TemplatedContainer/testWindow.goml
new file mode 100755 (executable)
index 0000000..e42a5c9
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<Window Left="10" Top="10" Caption="Test window"
+               Width="250" Height="550" >
+       <VerticalStack Name="contentVSStack" Margin="10" Spacing="10" Background="0.4,0.4,0.4,0.4">
+               <Slider Name="slider" Height="12" Width="Stretched" CornerRadius="3"/>
+               <GroupBox Caption="test"  Height="Fit" Width="Stretched" Margin="5">
+                       <VerticalStack  Height="Fit" Width="Stretched" >
+                               <RadioButton  Caption="Radio 1" Background="Red" Width="Stretched"/>
+                               <RadioButton  Caption="Radio 2" IsChecked="true" />
+                               <RadioButton  Caption="Radio 3" />
+                               <RadioButton  Caption="Radio 1" Background="SkyBlue" Width="Stretched"/>
+                       </VerticalStack>
+               </GroupBox>
+               <HorizontalStack Width="Stretched" Height="Fit" Margin="10" CornerRadius="5" Background="SkyBlue">
+                       <RadioButton Width="80" Height="Fit"  Caption="Radio 2" IsChecked="true" />
+                       <Widget Width="Stretched"/>
+                       <RadioButton Width="80" Height="Fit" Caption="Radio 3" />
+               </HorizontalStack>
+               <HorizontalStack Width="Stretched" Height="Stretched" MinimumSize="10,40" Margin="0" CornerRadius="5"
+                               Background="vgradient|0:White|0.1:SteelBlue|0.9:SteelBlue|1:Transparent">
+                       <CheckBox Height="Fit" Width="80"/>
+                       <Widget Width="Stretched"/>
+                       <CheckBox Height="Fit" Width="80" IsChecked="true"/>
+               </HorizontalStack>
+               <Border Fit="true" CornerRadius="5" BorderWidth="1" >
+                       <Container Name="MainGrp" Background="0.5,0.5,0.5,0.4" Width="120" Fit="true"
+                               Margin="10" Focusable="True" >
+                                       <VerticalStack Fit="true" Name="vsFps"  Spacing="10" >
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Layouting:" Width="50" TextAlignment="Right"/>
+                                                       <Label Name="labLayouting" Text="{layouting}" Font="droid,12" Width="80" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Clipping:" Width="50" TextAlignment="Right"/>
+                                                       <Label Text="{update}" Font="droid,12" Width="80" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Drawing:" Width="50" TextAlignment="Right"/>
+                                                       <Label Name="labDrawing" Text="{drawing}" Font="droid,12" Width="80" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Name="captionFps" Text="Fps:" Width="50" TextAlignment="Right"/>
+                                                       <Label Name="valueFps" Text="{fps}" Font="droid , 12" Width="50" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Min:" Width="50" TextAlignment="Right"/>
+                                                       <Label Text="{fpsMin}" Font="droid , 12" Width="50" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                               <HorizontalStack Fit="true">
+                                                       <Label Text="Max:" Width="50" TextAlignment="Right"/>
+                                                       <Label Text="{fpsMax}" Font="droid , 12" Width="50" TextAlignment="Center"
+                                                               Background="vgradient|0:SeaGreen|1:Black"/>
+                                               </HorizontalStack>
+                                       </VerticalStack>
+                       </Container>
+               </Border>
+               <HorizontalStack Fit="true" Background="RoyalBlue" Margin="3">
+                       <Widget Margin="10" Background="LimeGreen" Width="5" Height="5"/>
+                       <TextBox Font="droid, 16" Multiline="true" Text="this is a test\nmultiline" Margin="2"/>
+                       <Widget Margin="10" Background="LimeGreen" Width="5" Height="5"/>
+               </HorizontalStack>
+       </VerticalStack>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedContainer/testWindow2.goml b/Tests/Interfaces/TemplatedContainer/testWindow2.goml
new file mode 100755 (executable)
index 0000000..cf88e8c
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Window Focusable="true" Caption="Measures" Width="30%" Height="Fit" MinimumSize="100,100">
+       <VerticalStack Width="90%" Height="Fit" Spacing="1" Margin="10">
+               <HorizontalStack Height="Fit">
+                       <Label Text="Fps:" Style="FpsLabel"/>
+                       <Label Text="{fps}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Min:" Style="FpsLabel"/>
+                       <Label Text="{fpsMin}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Max:" Style="FpsLabel"/>
+                       <Label Text="{fpsMax}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Update:" Style="FpsLabel"/>
+                       <Label Text="{update}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Layouting:" Style="FpsLabel"/>
+                       <Label Text="{layouting}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Clipping:" Style="FpsLabel"/>
+                       <Label Text="{clipping}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Drawing:" Style="FpsLabel"/>
+                       <Label Text="{drawing}" Style="FpsDisp"/>
+               </HorizontalStack>
+       </VerticalStack>
+</Window>
diff --git a/Tests/Interfaces/TemplatedContainer/testWindow3.goml b/Tests/Interfaces/TemplatedContainer/testWindow3.goml
new file mode 100755 (executable)
index 0000000..869615b
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<Window Left="10" Top="10" Caption="Test window" Width="200" Height="200" Background="0.5,0.5,0.5,0.8"
+       Focusable="True"  CornerRadius="20" MinimumSize="100,100" MaximumSize="500,500">
+       <Template>
+               <Container Margin="20" Name="Content" Height="{../HeightPolicy}" Width="{../WidthPolicy}" Background="0.5,0.5,0.5,0.5"/>
+       </Template>
+<!--   <Group Background="Green">-->
+               <Widget Height="50" Width="50" Background="Red" Margin="5"/>
+<!--           <Scrollbar Orientation="Vertical" Height="Stretched" Width="10" Background="Blue" Margin="0" HorizontalAlignment="Right"/>-->
+<!--   </Group>-->
+</Window>
diff --git a/Tests/Interfaces/TemplatedContainer/test_Listbox.crow b/Tests/Interfaces/TemplatedContainer/test_Listbox.crow
new file mode 100755 (executable)
index 0000000..47adb8c
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!--<ListBox Data="{TestList}" Focusable="true"/>-->
+<Border Margin="50">
+       <VerticalStack >
+               <Label Text="{../ColorList.SelectedItem}" Background="DarkGreen"/>
+               <Label Text="{Hover}" Background="DarkGreen"/>
+               <Button Caption="Clear" Width="Stretched" MouseClick="OnClear"/>
+               <ListBox Name="ColorList" Data="{TestList}"  Width="200" Height="200" 
+                                        ItemTemplate="#Tests.Interfaces.colorItem.crow">                       
+               </ListBox>
+               <Button Caption="Load list" Width="Stretched" MouseClick="OnLoadList"/>
+       </VerticalStack>
+</Border>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedControl/testButton.crow b/Tests/Interfaces/TemplatedControl/testButton.crow
new file mode 100755 (executable)
index 0000000..8911619
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Background="vgradient|0:DimGrey|1:Black">
+       <HorizontalStack Fit="True">
+               <Button Caption="but" MouseClick="onButClick"/>
+               <Button Caption="but" MouseClick="onButClick" Fit="true"/>
+               <Button Width="60" Height="40" MouseClick="onButClick"/>
+               <Button Caption="Long text button" MouseClick="onButClick"/>
+               <Button Font="droid, 20" Caption="Button"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedControl/testCheckbox.crow b/Tests/Interfaces/TemplatedControl/testCheckbox.crow
new file mode 100755 (executable)
index 0000000..7c8438c
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<VerticalStack Fit="true" Margin="100" Background="DimGrey" >
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+       <CheckBox Background="Grey" MouseEnter="{Background=Red}" MouseLeave="{Background=Transparent}"/>
+</VerticalStack>
diff --git a/Tests/Interfaces/TemplatedControl/testCombobox.crow b/Tests/Interfaces/TemplatedControl/testCombobox.crow
new file mode 100755 (executable)
index 0000000..4363986
--- /dev/null
@@ -0,0 +1,4 @@
+<?xml version="1.0"?>
+<Container Background="DimGrey" Width="300">
+       <ComboBox  Data="{TestList}" ItemTemplate="#Tests.Interfaces.colorItem.crow"/>
+</Container>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedControl/testItemTemplateTag.crow b/Tests/Interfaces/TemplatedControl/testItemTemplateTag.crow
new file mode 100755 (executable)
index 0000000..b29be38
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<Border BorderWidth="2" Fit="true">
+       <VerticalStack Fit="true" Margin="5">
+               <ListBox Data="{TestList}" Background="0.5,0.5,0.5,0.7"
+                                        HorizontalAlignment="Center" Width="200" Height="200" Margin="5">
+                       <Template>
+                               <Border BorderWidth="1">
+                                       <HorizontalStack Margin="1">
+                                               <Scroller Name="scroller1" Margin="2">
+                                                       <VerticalStack Height="Fit" MinimumSize="10,10"
+                                                               Name="ItemsContainer" Margin="0" VerticalAlignment="Top"/>
+                                               </Scroller>
+                                               <ScrollBar Name="scrollbar1" Value="{²../scroller1.ScrollY}"
+                                                       LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30" CursorSize="{../scroller1.ChildHeightRatio}"
+                                                       Maximum="{../scroller1.MaxScrollY}" Orientation="Vertical" 
+                                                       Width="14" />
+                                       </HorizontalStack>
+                               </Border>
+                       </Template>
+                       <ItemTemplate DataType="Crow.Color">
+                               <HorizontalStack
+                                                       HorizontalAlignment="Left"
+                                                       Height="Fit" Width="200" Margin="1" Focusable="true"
+                                                       MouseEnter="{Background=hgradient|0:DarkRed|1:Transparent}"
+                                                       MouseLeave="{Background=Transparent}">
+                                       <Widget Height="12" Width="20" Background="{}" Margin="0" CornerRadius="3"/>
+                                       <Label Text="{}" Margin="0" Width="Stretched"/>
+                               </HorizontalStack>
+                       </ItemTemplate>
+               </ListBox>
+               <HorizontalStack Fit="true" HorizontalAlignment="Right">
+                       <Button Caption="Load list" MouseDown="OnLoadList"/>
+                       <Button Caption="Clear" MouseDown="OnClear"/>
+               </HorizontalStack>
+       </VerticalStack>
+</Border>
diff --git a/Tests/Interfaces/TemplatedControl/testRadioButton.crow b/Tests/Interfaces/TemplatedControl/testRadioButton.crow
new file mode 100755 (executable)
index 0000000..a01d904
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<VerticalStack Width="200" Height="Fit" Margin="20" Background="DimGrey">
+       <RadioButton Caption="Radio1"/>
+       <RadioButton Caption="Radio2" IsChecked="true"/>
+       <RadioButton Caption="Radio3"/>
+       <RadioButton Caption="Radio4"/>
+</VerticalStack>
diff --git a/Tests/Interfaces/TemplatedControl/testScrollbar.crow b/Tests/Interfaces/TemplatedControl/testScrollbar.crow
new file mode 100755 (executable)
index 0000000..f8c4a9a
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<Group Name="TopContainer" Width="400" Height="400"
+       Focusable="True" Background="Grey">
+       <ScrollBar Height="16" Orientation="Horizontal" Width="Stretched" Maximum="100"/>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedControl/testSpinner.crow b/Tests/Interfaces/TemplatedControl/testSpinner.crow
new file mode 100755 (executable)
index 0000000..01d5301
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<VerticalStack Name="TopContainer" Width="400" Height="Fit"
+       Margin="20" Background="DarkGrey">
+
+       <HorizontalStack Fit="true" Margin="5" Background="SkyBlue">
+               <Spinner Name="sp1" Value="5" ValueChanged="onSpinnerValueChange"/>
+               <Spinner Value="5"/>
+               <Spinner Value="5"/>
+       </HorizontalStack>
+</VerticalStack>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedGroup/0.crow b/Tests/Interfaces/TemplatedGroup/0.crow
new file mode 100755 (executable)
index 0000000..92cd224
--- /dev/null
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="File" Width="Fit">
+               <MenuItem Caption="New" />
+               <MenuItem Caption="Open"/>
+               <MenuItem Caption="Save"/>
+               <MenuItem Caption="Quit"/>
+       </MenuItem>
+       <MenuItem Caption="Edit" Name="edit" Width="Fit">
+               <MenuItem Caption="Cut"/>
+               <MenuItem Caption="Copy"/>
+               <MenuItem Caption="Paste"/>
+               <MenuItem Caption="Special" Name="special" Width="Fit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+               </MenuItem>
+               <MenuItem Caption="Special2" Name="special" Width="Fit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+               </MenuItem>
+       </MenuItem>
+       <MenuItem Caption="Help" Width="Fit">
+               <MenuItem Caption="About"/>
+               <MenuItem Caption="Help"/>
+       </MenuItem>
+</Menu>
\ No newline at end of file
diff --git a/Tests/Interfaces/TemplatedGroup/1.crow b/Tests/Interfaces/TemplatedGroup/1.crow
new file mode 100755 (executable)
index 0000000..f47e7aa
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="File">
+               <MenuItem Caption="New"/>
+               <MenuItem Caption="Open"/>
+               <MenuItem Caption="Save"/>
+               <MenuItem Caption="Quit"/>
+       </MenuItem>
+</Menu>
diff --git a/Tests/Interfaces/TemplatedGroup/2.crow b/Tests/Interfaces/TemplatedGroup/2.crow
new file mode 100755 (executable)
index 0000000..8d25db5
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<Menu>
+       <MenuItem Caption="Menu">
+               <MenuItem Caption="File">
+                       <MenuItem Caption="New"></MenuItem>
+                       <MenuItem Caption="Open"></MenuItem>
+                       <MenuItem Caption="Save"></MenuItem>
+                       <MenuItem Caption="Quit"></MenuItem>
+               </MenuItem>
+               <MenuItem Caption="Edit">
+                       <MenuItem Caption="Cut"/>
+                       <MenuItem Caption="Copy"/>
+                       <MenuItem Caption="Paste"/>
+                       <MenuItem Caption="Special">
+                               <MenuItem Caption="Cut"/>
+                               <MenuItem Caption="Copy"/>
+                               <MenuItem Caption="Paste"/>
+                       </MenuItem>
+               </MenuItem>
+               <MenuItem Caption="Help">
+                       <MenuItem Caption="About"/>
+                       <MenuItem Caption="Help"/>
+               </MenuItem>
+       </MenuItem>
+</Menu>
\ No newline at end of file
diff --git a/Tests/Interfaces/TmpExpandable.goml b/Tests/Interfaces/TmpExpandable.goml
new file mode 100755 (executable)
index 0000000..9dddceb
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!--<VerticalStack Height="{../HeightPolicy}" Width="{../WidthPolicy}" MouseClick="../onMouseClick">
+       <Label Text="{../../Caption}" Width="{../../WidthPolicy}"/>
+       <Container Name="Content" Visible="false" Height="{../../HeightPolicy}" Width="{../../WidthPolicy}"/>
+</VerticalStack>-->
+<Group BorderWidth="1" Foreground="LightGray" 
+               MouseClick="../onMouseClick">
+       <VerticalStack>
+               <Label Text="{../../../Caption}"/>
+               <Container Name="Content" Visible="false"/>
+       </VerticalStack>
+</Group>
\ No newline at end of file
diff --git a/Tests/Interfaces/Wrapper/1.1.crow b/Tests/Interfaces/Wrapper/1.1.crow
new file mode 100755 (executable)
index 0000000..548aab3
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Vertical Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Vertical" Height="Fit" Width="90%" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/Wrapper/1.crow b/Tests/Interfaces/Wrapper/1.crow
new file mode 100755 (executable)
index 0000000..58c79ee
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Vertical Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Vertical" Height="Fit" Width="Fit" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/Wrapper/2.1.crow b/Tests/Interfaces/Wrapper/2.1.crow
new file mode 100755 (executable)
index 0000000..2a35289
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Horizontal Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Horizontal" Height="90%" Width="Fit" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/Wrapper/2.2.crow b/Tests/Interfaces/Wrapper/2.2.crow
new file mode 100755 (executable)
index 0000000..4621c14
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<Window Caption="Horizontal Wrapper" Width="50%" Height="50%">
+               <Wrapper HorizontalAlignment="Left" Orientation="Horizontal" Height="100%" Width="Fit" Margin="0" Background="MediumSeaGreen" Spacing="1" >
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50%" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50%" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50%" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50%" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50%" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50%" Background="SeaGreen"/>
+                       <Widget Width="50" Height="50" Background="SeaGreen"/>
+               </Wrapper>      
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/Wrapper/2.crow b/Tests/Interfaces/Wrapper/2.crow
new file mode 100755 (executable)
index 0000000..c1f234e
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Window Caption="Horizontal Wrapper" Width="50%" Height="50%">
+       <Wrapper Orientation="Horizontal" Height="Fit" Width="Fit" Margin="5" Background="MediumSeaGreen" Spacing="1" >
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50%" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+               <Widget Width="50" Height="50%" Background="SeaGreen"/>
+               <Widget Width="50" Height="50" Background="SeaGreen"/>
+       </Wrapper>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/basicTests/7.crow b/Tests/Interfaces/basicTests/7.crow
new file mode 100755 (executable)
index 0000000..8d1e441
--- /dev/null
@@ -0,0 +1,144 @@
+<?xml version="1.0"?>
+<Window Title="Showcase" Height="90%" Width="90%">
+       <HorizontalStack >
+               <VerticalStack Width="33%" Margin="5">
+                       <GroupBox Caption="Performance" Height="Fit">
+                               <VerticalStack Width="90%" Height="Fit" Spacing="2" >
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Fps:" Style="FpsLabel"/>
+                                               <Label Text="{fps}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Min:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMin}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Max:" Style="FpsLabel"/>
+                                               <Label Text="{fpsMax}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Update:" Style="FpsLabel"/>
+                                               <Label Text="{update}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Layouting:" Style="FpsLabel"/>
+                                               <Label Text="{layouting}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Clipping:" Style="FpsLabel"/>
+                                               <Label Text="{clipping}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                                       <HorizontalStack Height="Fit">
+                                               <Label Text="Drawing:" Style="FpsLabel"/>
+                                               <Label Text="{drawing}" Style="FpsDisp"/>
+                                       </HorizontalStack>
+                               </VerticalStack>
+                       </GroupBox>
+                       <Label Width="Stretched" Margin="3" Background="Onyx"/>
+                       <TextBox Text="TextBox" Multiline="true" Margin="3"/>
+                       <HorizontalStack Height="Fit" Margin="5" Background="Onyx" CornerRadius="10">
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                                       <CheckBox Fit="true"/>
+                               </VerticalStack>
+                               <VerticalStack Spacing="5" Width="50%">
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                                       <RadioButton Fit="true"/>
+                               </VerticalStack>
+                       </HorizontalStack>
+                       <HorizontalStack Height="Fit" Margin="5">
+                               <Label Text="MouseEvents" Width="50%" Margin="3"
+                                       Background="Onyx"
+                                       Foreground="DimGray"
+                                       TextAlignment="Center"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGray}"
+                                       MouseDown="{Background=DarkRed}"
+                                       MouseUp="{Background=Onyx}"/>
+                               <Label Text="MouseEvents" Width="50%" Margin="3"
+                                       Background="Onyx"
+                                       Foreground="DimGray"
+                                       TextAlignment="Center"
+                                       MouseEnter="{Foreground=White}"
+                                       MouseLeave="{Foreground=DimGray}"
+                                       MouseDown="{Background=Mantis}"
+                                       MouseUp="{Background=Onyx}"/>
+                       </HorizontalStack>
+                       <GroupBox Caption="Templated controls" Height="Fit" Margin="5">
+                               <HorizontalStack Height="Fit">
+                                       <VerticalStack Width="50%">
+                                               <CheckBox Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                               <CheckBox  Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                               <CheckBox  Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                               <CheckBox  Template="#Tests.Interfaces.CheckBox2.imlt" Style="CheckBox2"/>
+                                       </VerticalStack>
+                                       <Splitter/>
+                                       <VerticalStack Width="50%">
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                               <RadioButton  Template="#Tests.Interfaces.CheckBox2.imlt" Style="RadioButton2"/>
+                                       </VerticalStack>
+                               </HorizontalStack>
+                       </GroupBox>
+                       <Spinner Fit="true"/>
+               </VerticalStack>
+               <VerticalStack Width="33%" Margin="5" Spacing="5">
+                       <Expandable Background="DimGray">
+                               <Image Path="#Crow.Icons.crow.svg"/>
+                       </Expandable>
+                       <Popper Background="DimGray" PopDirection="Bottom">
+                               <Border Fit="True" Background="DimGray" CornerRadius="0" BorderWidth="1">
+                                       <Image Path="#Crow.Icons.crow.svg" Width="100" Height="100" Margin="10"
+                                               MouseEnter="{Background=LightGray}"
+                                               MouseLeave="{Background=Transparent}"/>
+                               </Border>
+                       </Popper>
+                       <Slider Height="10" Width="90%"/>
+                       <Container Height="Fit" Background="Onyx" Margin="2" CornerRadius="5">
+                               <ProgressBar Background="DimGray" Height="10" Value="50"/>
+                       </Container>
+                       <Image Path="#Crow.Icons.crow.svg" Width="60" Height="60" Background="LightGray" />
+                       <TabView Name="tabview1"
+                               Height="120" Orientation="Horizontal" Spacing="15">
+                               <TabItem Name="TabItem1" Caption="Tab 1" Margin="0">
+                                       <VerticalStack Fit="true">
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                               <CheckBox/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem2" Caption="Tab 2" Background="Gray">
+                                       <VerticalStack Fit="true">
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                               <RadioButton/>
+                                       </VerticalStack>
+                               </TabItem>
+                               <TabItem Name="TabItem2" Caption="Tab 3" Background="Gray">
+                                       <Container Margin="5" CornerRadius="2">
+                                               <TextBox Height="Stretched" Margin="5" Multiline="true" TextAlignment="TopLeft"/>
+                                       </Container>
+                               </TabItem>
+                       </TabView>
+                       <MessageBox Movable="false"/>
+               </VerticalStack>
+               <VerticalStack Width="33%" Margin="5">
+                       <Border Margin="5" Background="Onyx" Height="Fit">
+                               <Label Width="Stretched" Margin="1" Text="{../../dv.SelectedItem}"/>
+                       </Border>
+                       <Border Margin="5" Background="Onyx" Height="50%">
+                               <DirectoryView Name="dv" Root="./" Margin="1"/>
+                       </Border>
+                       <ListBox Data="{TestList}" Background="Onyx" Margin="5"
+                                        ItemTemplate="#Tests.Interfaces.colorItem.crow"
+                                        Template="#Crow.Templates.ScrollingListBox.goml"/>
+               </VerticalStack>
+       </HorizontalStack>
+</Window>
\ No newline at end of file
diff --git a/Tests/Interfaces/colorItem.crow b/Tests/Interfaces/colorItem.crow
new file mode 100755 (executable)
index 0000000..30bfe3d
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<Border Foreground="Transparent" Focusable="true" HorizontalAlignment="Left" Height="Fit" Width="200">
+       <HorizontalStack Margin="0"
+                               MouseEnter="{Background=hgradient|0:DarkRed|1:Transparent}"
+                               MouseLeave="{Background=Transparent}">
+               <Widget Height="12" Width="20" Background="{}" Margin="0" CornerRadius="3"/>
+               <Label Text="{}" Margin="0" Width="Stretched"/>
+       </HorizontalStack>
+</Border>
+
diff --git a/Tests/Interfaces/colorItem2.crow b/Tests/Interfaces/colorItem2.crow
new file mode 100755 (executable)
index 0000000..83239b3
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<Border Foreground="Transparent" Focusable="true" HorizontalAlignment="Left" Height="Fit">
+       <HorizontalStack Margin="0"
+                               MouseEnter="{Background=CornflowerBlue}"
+                               MouseLeave="{Background=Transparent}">
+               <Widget Height="8" Width="14" Background="{}" Margin="0" CornerRadius="2"/>
+               <Label Text="{}" Margin="0" Width="Stretched" Font="mono, 8"/>
+       </HorizontalStack>
+</Border>
+
diff --git a/Tests/Interfaces/itemTmp.goml b/Tests/Interfaces/itemTmp.goml
new file mode 100755 (executable)
index 0000000..fadf5e6
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Border BorderWidth="3">
+       <Label Text="{Name}" Focusable="true" Width="Stretched" Height="Fit" Margin="0"
+                       MouseEnter="{Background=Red}"
+                       MouseLeave="{Background=Transparent}"
+       />
+</Border>
+
diff --git a/Tests/Interfaces/log.xml b/Tests/Interfaces/log.xml
new file mode 100755 (executable)
index 0000000..1039f7b
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<Container Name="topContainer" HorizontalAlignment="Center" VerticalAlignment="Top"
+       Margin="2"
+       Width="600" Height="-1">
+       <Border Margin="2" BorderWidth="1" Background="0,6;0,6;0,6;0,6" Height="-1">
+               <Group Width="0" Name="logs">
+                       <VerticalStack Name="VerticalStack" Width="0" Focusable="False">
+                               <Label Name="line1" Width="0" Text="Line1" Margin="0"/>
+                               <Label Name="line2" Width="0" Text="Line2" Margin="0"/>
+                               <Label Name="line3" Width="0" Text="Line3" Margin="0"/>
+                               <Label Name="line4" Width="0" Text="Line4" Margin="0"/>
+                       </VerticalStack>
+                       <Button Name="btOk" Background="Gray" Fit="True"
+                               HorizontalAlignment="Right" VerticalAlignment="Bottom"
+                               MouseClick="BtOk_MouseClick">
+                               <Label Text="Ok" Margin="3" Foreground="White" />
+                       </Button>
+               </Group>
+       </Border>
+</Container>
+
diff --git a/Tests/Interfaces/perfMsr.crow b/Tests/Interfaces/perfMsr.crow
new file mode 100755 (executable)
index 0000000..22a62ea
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+
+       <VerticalStack Spacing="1" Height="Fit" Width="Stretched">
+               <HorizontalStack Background="DarkSlateGrey">
+                       <Label Text="{Name}" Width="Stretched" Font="doid bold, 10" Margin="2"/>
+                       <Button Caption="Reset" MouseClick="onResetClick" Height="Fit"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Current:" Style="FpsLabel"/>
+                       <Label Text="{current}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Minimum:" Style="FpsLabel"/>
+                       <Label Text="{minimum}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Mean:" Style="FpsLabel"/>
+                       <Label Text="{mean}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Maximum:" Style="FpsLabel"/>
+                       <Label Text="{maximum}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <Border Foreground="White" Width="Stretched" Height="60">
+                       <Trend Background="Black" NewValue="{current}" Minimum="0" Maximum="100"/>
+               </Border>
+<!--           <HorizontalStack>
+                       <Label Text="Total:" Style="FpsLabel"/>
+                       <Label Text="{total}" Style="FpsDisp"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <Label Text="Cpt:" Style="FpsLabel"/>
+                       <Label Text="{cptMeasures}" Style="FpsDisp"/>
+               </HorizontalStack>-->
+       </VerticalStack>
+
diff --git a/Tests/Interfaces/testMeter.goml b/Tests/Interfaces/testMeter.goml
new file mode 100755 (executable)
index 0000000..2c840a8
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<AnalogMeter Width="Fit" Height="Fit" Background="White" Foreground="Black"  Value="{fps}" Minimum="Stretched" Maximum="100"/>
\ No newline at end of file
diff --git a/Tests/Interfaces/testWindow.goml.sav b/Tests/Interfaces/testWindow.goml.sav
new file mode 100755 (executable)
index 0000000..42b4b74
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!--<Group>-->
+<Window Name="window1" Left="10" Top="10" Title="Test window" 
+               Width="250" Height="300" >
+       <VerticalStack Name="contentVSStack" Margin="10" Spacing="10">
+               <Slider Name="slider" Height="10" Width="0"/>
+
+               <HorizontalStack Width="0" Height="-1" Margin="10" Background="BlueCrayola">
+                       <Checkbox Height="-1" Width="80"/>
+                       <GraphicObject Width="0"/>
+                       <Checkbox Height="-1" Width="80"/>
+               </HorizontalStack>
+               <Groupbox Text="test"  Height="-1" Width="-1" Margin="5">
+                       <VerticalStack  Height="-1" Width="0" >
+                               <RadioButton  Caption="Radio 1" Background="Red" />
+                               <RadioButton  Caption="Radio 2" IsChecked="true" />
+                               <RadioButton  Caption="Radio 3" />
+                       </VerticalStack>
+               </Groupbox>
+<!--           <Checkbox Height="-1" Width="-1" Background="Red" Margin="0" VerticalAlignment="Center" HorizontalAlignment="Right"/>-->
+       </VerticalStack>
+</Window>
+<!--</Group>-->
+<!--           <Label Text="{fps}"  Background="DarkRed"/>
+               <Label Text="{fpsMin}"  />
+               <Label Text="{fpsMax}"  />-->
\ No newline at end of file
diff --git a/Tests/Interfaces/tmpDirItem.goml b/Tests/Interfaces/tmpDirItem.goml
new file mode 100755 (executable)
index 0000000..41665d1
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+       <HorizontalStack Width="Fit" Height="Fit" Focusable="true"
+                       HorizontalAlignment="Left"
+                       MouseEnter="{Background=RoyalBlue}"
+                       MouseLeave="{Background=Transparent}">
+               <Image Width="16" Height="16" Path="#Tests.image.folder1.svg" SvgSub="{Attributes}"/>
+               <Label Text="{Name}" Width="Fit" Height="Fit" Margin="0"/>
+               <Label Text="{Attributes}" Width="Fit" Height="Fit" Margin="0"/>
+               <Label Text="{Extension}" Width="Fit" Height="Fit" Margin="0"/>
+       </HorizontalStack>
+
diff --git a/Tests/Interfaces/tmpMembers.goml b/Tests/Interfaces/tmpMembers.goml
new file mode 100755 (executable)
index 0000000..f48d8d6
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+       <HorizontalStack Width="Stretched" Height="Fit" Focusable="true" 
+                       MouseEnter="{Background=SkyBlue}"
+                       MouseLeave="{Background=Transparent}">
+               <Image Width="8" Height="8" Path="#Crow.Images.Icons.member.svg" SvgSub="{GetIcon}"/>
+               <Label Text="{Name}" Width="Stretched" Height="Fit" Margin="1"/>
+               <Label Text="{MemberType}" Width="Fit" Height="Fit" Margin="0"/>
+       </HorizontalStack>
+
diff --git a/Tests/Interfaces/treeList.crow b/Tests/Interfaces/treeList.crow
new file mode 100755 (executable)
index 0000000..ca59c17
--- /dev/null
@@ -0,0 +1,2 @@
+<?xml version="1.0"?>
+<VerticalStack Height="Fit" Name="List"/>
\ No newline at end of file
diff --git a/Tests/Tests.NetStd.csproj b/Tests/Tests.NetStd.csproj
new file mode 100644 (file)
index 0000000..bb8a203
--- /dev/null
@@ -0,0 +1,42 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netcoreapp2.0</TargetFramework>
+
+    <OutputType>Exe</OutputType>
+    <StartupObject>tests.Showcase</StartupObject>
+        
+    <OutputPath>$(SolutionDir)build/$(Configuration)</OutputPath>
+    <IntermediateOutputPath>$(SolutionDir)build/obj/$(Configuration)</IntermediateOutputPath>  
+    
+    <EnableDefaultItems>false</EnableDefaultItems>
+    <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
+  </PropertyGroup>
+
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugType>portable</DebugType>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="*.cs" Exclude="testClass.cs" />  
+        
+    <ProjectReference Include="..\Crow\Crow.NetStd.csproj" />
+        
+    <EmbeddedResource Include="image\**\*.*">
+      <LogicalName>Tests.image.%(Filename)%(Extension)</LogicalName>
+    </EmbeddedResource>
+
+    <EmbeddedResource Include="ui\**\*.*">
+      <LogicalName>Tests.ui.%(Filename)%(Extension)</LogicalName>
+    </EmbeddedResource>
+        
+    <EmbeddedResource Include="test.style" />
+        
+    <None Include="Interfaces\**\*.*">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+    
+<!--  <ItemGroup>
+    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="2.10.0" />
+  </ItemGroup>-->
+</Project>
diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj
new file mode 100644 (file)
index 0000000..3e9e2cb
--- /dev/null
@@ -0,0 +1,472 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <ProductVersion>8.0.30703</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{74289092-9F70-4941-AFCB-DFD7BE2140B6}</ProjectGuid>
+    <OutputType>Exe</OutputType>
+    <RootNamespace>Tests</RootNamespace>
+    <AssemblyName>Tests</AssemblyName>
+    <StartupObject>tests.Showcase</StartupObject>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ReleaseVersion>0.8.0</ReleaseVersion>
+    <OutputPath>$(SolutionDir)build/$(Configuration)</OutputPath>
+    <IntermediateOutputPath>$(SolutionDir)build/obj/$(Configuration)</IntermediateOutputPath>
+    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <DefineConstants>DEBUG;TRACE;MEASURE_TIME</DefineConstants>
+    <IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
+    <OutputPath>$(SolutionDir)build\Debug</OutputPath>
+<!--    <EnvironmentVariables>
+      <EnvironmentVariables>
+        <Variable name="MONO_CAIRO_DEBUG_DISPOSE" value="1" />
+      </EnvironmentVariables>
+    </EnvironmentVariables>-->
+    <ConsolePause>false</ConsolePause>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>none</DebugType>
+    <Optimize>true</Optimize>
+    <WarningLevel>0</WarningLevel>
+    <ConsolePause>false</ConsolePause>
+    <IntermediateOutputPath>$(SolutionDir)build\obj\$(Configuration)</IntermediateOutputPath>
+    <OutputPath>$(SolutionDir)build\Release</OutputPath>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.AppContext">
+      <HintPath>..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Core" />
+    <Reference Include="System.Collections.Immutable">
+      <HintPath>..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Console">
+      <HintPath>..\packages\System.Console.4.3.0\lib\net46\System.Console.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Diagnostics.FileVersionInfo">
+      <HintPath>..\packages\System.Diagnostics.FileVersionInfo.4.3.0\lib\net46\System.Diagnostics.FileVersionInfo.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Diagnostics.StackTrace">
+      <HintPath>..\packages\System.Diagnostics.StackTrace.4.3.0\lib\net46\System.Diagnostics.StackTrace.dll</HintPath>
+    </Reference>
+    <Reference Include="System.IO.FileSystem.Primitives">
+      <HintPath>..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll</HintPath>
+    </Reference>
+    <Reference Include="System.IO.FileSystem">
+      <HintPath>..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reflection.Metadata">
+      <HintPath>..\packages\System.Reflection.Metadata.1.6.0\lib\netstandard2.0\System.Reflection.Metadata.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Security.Cryptography.Encoding">
+      <HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Security.Cryptography.Primitives">
+      <HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Security.Cryptography.Algorithms">
+      <HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Security.Cryptography.X509Certificates">
+      <HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Text.Encoding.CodePages">
+      <HintPath>..\packages\System.Text.Encoding.CodePages.4.3.0\lib\net46\System.Text.Encoding.CodePages.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Threading.Tasks.Extensions">
+      <HintPath>..\packages\System.Threading.Tasks.Extensions.4.3.0\lib\portable-net45+win8+wp8+wpa81\System.Threading.Tasks.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Threading.Thread">
+      <HintPath>..\packages\System.Threading.Thread.4.3.0\lib\net46\System.Threading.Thread.dll</HintPath>
+    </Reference>
+    <Reference Include="System.ValueTuple">
+      <HintPath>..\packages\System.ValueTuple.4.3.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.ReaderWriter">
+      <HintPath>..\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Xml.XmlDocument">
+      <HintPath>..\packages\System.Xml.XmlDocument.4.3.0\lib\net46\System.Xml.XmlDocument.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.XPath">
+      <HintPath>..\packages\System.Xml.XPath.4.3.0\lib\net46\System.Xml.XPath.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.XPath.XDocument">
+      <HintPath>..\packages\System.Xml.XPath.XDocument.4.3.0\lib\net46\System.Xml.XPath.XDocument.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.CodeAnalysis">
+      <HintPath>..\packages\Microsoft.CodeAnalysis.Common.2.10.0\lib\netstandard1.3\Microsoft.CodeAnalysis.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.CodeAnalysis.CSharp">
+      <HintPath>..\packages\Microsoft.CodeAnalysis.CSharp.2.10.0\lib\netstandard1.3\Microsoft.CodeAnalysis.CSharp.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ItemGroup>
+    <Compile Include="GraphicObjects\ColorCircleSelector.cs" />
+    <Compile Include="GraphicObjects\SimpleGauge.cs" />
+    <Compile Include="GraphicObjects\HexaContainer.cs" />
+    <Compile Include="GraphicObjects\TechBorder.cs" />
+    <Compile Include="GraphicObjects\LaggingGraphicObject.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="image\u.svg">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\log.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\testMeter.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\tmpMembers.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\itemTmp.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\tmpDirItem.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\GraphicObject\0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\GraphicObject\1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\GraphicObject\2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Container\0.crow">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Container\1.crow" />
+    <None Include="Interfaces\Container\2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\3.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Container\3.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Group\0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Group\1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Group\2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Group\3.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Group\4.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\0h.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\1h.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\2h.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\3h.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Stack\4.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\4.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\5.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\6.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\clip0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\clip1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\clip2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\clip3.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\clip4.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\fps.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\test_stack.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\test1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\test1.1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\test1.2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testStacks.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testTextBox.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Splitter\1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="image\textest.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\welcome.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testPropLess.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Wrapper\1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Wrapper\2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testImage.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testOutOfClipUpdate.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testDisable.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\3.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\6.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\7.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedControl\testButton.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedControl\testCheckbox.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedControl\testCombobox.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedControl\testItemTemplateTag.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedControl\testRadioButton.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\test_Listbox.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testGroupBox.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testMsgBox.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testPopper.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testTabView.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testTreeView.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testWindow.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testWindow2.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testWindow3.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedGroup\0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedGroup\1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedGroup\2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedControl\testScrollbar.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedControl\testSpinner.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\colorPicker.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\test2WayBinding.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\perfMeasures.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Wrapper\2.1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Wrapper\1.1.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Wrapper\2.2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testShape.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\DragAndDrop\0.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testIMLContainer.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testCtxMenu.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testFileDialog.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Experimental\testTypeViewer.goml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Experimental\testDock.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Experimental\testStack.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Experimental\testDock2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\TemplatedContainer\testTabView2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testFocus.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testMenu.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\Divers\testVisibility.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Interfaces\CheckBox2.imlt">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="testClass.cs">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Interfaces\" />
+    <Folder Include="image\" />
+    <Folder Include="Interfaces\GraphicObject\" />
+    <Folder Include="Interfaces\Group\" />
+    <Folder Include="Interfaces\Divers\" />
+    <Folder Include="Interfaces\Splitter\" />
+    <Folder Include="Interfaces\Wrapper\" />
+    <Folder Include="Interfaces\TemplatedControl\" />
+    <Folder Include="Interfaces\TemplatedContainer\" />
+    <Folder Include="Interfaces\TemplatedGroup\" />
+    <Folder Include="GraphicObjects\" />
+    <Folder Include="Interfaces\DragAndDrop\" />
+    <Folder Include="Interfaces\Experimental\" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="image\tetra.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="image\folder0.svg" />
+    <EmbeddedResource Include="image\folder1.svg" />
+    <EmbeddedResource Include="image\crow0.svg" />
+    <EmbeddedResource Include="Interfaces\colorItem.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Interfaces\TmpExpandable.goml" />
+    <EmbeddedResource Include="ui\tmpWindow.crow" />
+    <EmbeddedResource Include="ui\test.crow" />
+    <EmbeddedResource Include="ui\LabelButton.style" />
+    <EmbeddedResource Include="ui\Popper.template" />
+    <EmbeddedResource Include="ui\MenuItem.style" />
+    <EmbeddedResource Include="test.style" />
+    <EmbeddedResource Include="Interfaces\treeList.crow" />
+    <EmbeddedResource Include="Interfaces\perfMsr.crow" />
+    <EmbeddedResource Include="ui\showcase.crow" />
+    <EmbeddedResource Include="Interfaces\TabItem.template">
+      <LogicalName>Crow.TabItem.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\dbgLog.crow" />
+    <EmbeddedResource Include="Interfaces\Experimental\DockWindow.template">
+      <LogicalName>Crow.DockWindow.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\MenuItem.template">
+      <LogicalName>Crow.MenuItem.template</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="image\blank-file.svg" />
+    <EmbeddedResource Include="ui\dbgLogColors.crow" />
+    <EmbeddedResource Include="Interfaces\colorItem2.crow">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </EmbeddedResource>
+    <EmbeddedResource Include="ui\TreeExpandable.template" />
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\Crow\Crow.csproj">
+      <Project>{C2980F9B-4798-4C05-99E2-E174810F7C7B}</Project>
+      <Name>Crow</Name>
+    </ProjectReference>
+  </ItemGroup>
+</Project>
diff --git a/Tests/image/Mana.svg b/Tests/image/Mana.svg
new file mode 100755 (executable)
index 0000000..ef455e0
--- /dev/null
@@ -0,0 +1,725 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Layer_1"
+   x="0px"
+   y="0px"
+   width="1045px"
+   height="730.002px"
+   viewBox="-945 -210.002 1045 730.002"
+   enable-background="new -945 -210.002 1045 730.002"
+   xml:space="preserve"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="Mana.svg"><metadata
+     id="metadata509"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs507" /><sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1280"
+     inkscape:window-height="1000"
+     id="namedview505"
+     showgrid="false"
+     inkscape:zoom="0.64657356"
+     inkscape:cx="542.84311"
+     inkscape:cy="332.40761"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="Layer_1" /><g
+     id="g3"><circle
+       fill="#CAC5C0"
+       cx="-895"
+       cy="-160"
+       r="50"
+       id="circle5" /></g><path
+     fill="#0D0F0F"
+     d="M-922-157.572c0-9.787,2.061-18.813,6.191-27.072c5.117-10.236,12.123-15.355,21.012-15.355  c8.797,0,15.666,4.359,20.605,13.064c4.127,7.186,6.191,15.537,6.191,25.051c0,9.881-2.064,18.814-6.191,26.803  C-879.223-125.023-886.227-120-895.203-120c-8.531,0-15.305-4.307-20.336-12.926C-919.847-140.287-922-148.502-922-157.572z   M-910.691-162.016c0,12.926,1.93,22.984,5.795,30.168c2.691,5.025,6.146,7.541,10.367,7.541c10.146,0,15.221-10.506,15.221-31.518  c0-9.244-0.809-17.059-2.422-23.434c-2.785-10.504-7.498-15.76-14.145-15.76c-9.879,0-14.816,10.15-14.816,30.443V-162.016z"
+     id="path7" /><g
+     id="g9"><circle
+       fill="#CAC5C0"
+       cx="-790"
+       cy="-160.002"
+       r="50"
+       id="circle11" /></g><path
+     fill="#0D0F0F"
+     d="M-784.315-199.999v64.108c0,7.671,3.226,11.504,9.687,11.504h1.684v4.388h-34.111v-4.388h2.141  c6.247,0,9.369-3.833,9.369-11.504v-42.054c0-7.758-2.697-11.643-8.081-11.643h-3.429v-4.247h1.237c6.66,0,12.691-2.057,18.08-6.165  L-784.315-199.999L-784.315-199.999z"
+     id="path13" /><g
+     id="g15"><circle
+       fill="#CAC5C0"
+       cx="-685"
+       cy="-160.002"
+       r="50"
+       id="circle17" /></g><path
+     fill="#0D0F0F"
+     d="M-657.558-139.897l-5.896,19.898h-48.991v-4.254c2.38-2.652,7.595-8.001,15.646-16.053  c4.849-4.852,9.649-9.972,14.407-15.371c2.378-2.651,4.21-4.942,5.487-6.862c2.836-4.114,4.255-8.32,4.255-12.624  c0-4.204-1.301-7.912-3.908-11.112c-2.607-3.204-5.97-4.808-10.09-4.808c-8.871,0-15.823,5.998-20.854,17.98l-4.395-1.647  c5.947-16.829,15.321-25.249,28.131-25.249c6.313,0,11.687,2.149,16.124,6.448c4.439,4.3,6.656,9.604,6.656,15.92  c0,8.052-4.617,15.918-13.858,23.601l-9.604,7.956c-6.131,5.127-11.212,9.929-15.231,14.412c-0.28,0.273-0.826,0.916-1.647,1.921  h25.521c3.932,0,6.907-0.776,8.918-2.335c1.735-1.372,3.434-3.98,5.08-7.821H-657.558z"
+     id="path19" /><g
+     id="g21"><circle
+       fill="#CAC5C0"
+       cx="-580"
+       cy="-160.002"
+       r="50"
+       id="circle23" /></g><path
+     fill="#0D0F0F"
+     d="M-590.439-157.438l-2.018-3.771l1.337-0.807c5.174-3.145,9.903-6.33,14.189-9.563  c4.284-3.232,6.427-6.915,6.427-11.048c0-2.778-1.029-5.112-3.085-6.998c-2.061-1.892-4.472-2.834-7.244-2.834  c-6.439,0-13.234,4.001-20.392,11.991l-3.354-2.559c7.453-11.316,16.566-16.974,27.341-16.974c4.757,0,8.795,1.168,12.122,3.503  c3.771,2.607,5.655,6.153,5.655,10.642c0,3.229-1.349,6.374-4.039,9.426c-1.528,1.798-4.226,4.132-8.083,7.004l-1.616,1.213  c0.718-0.089,1.572-0.134,2.56-0.134c4.937,0,8.998,1.887,12.188,5.657c3.188,3.771,4.783,8.17,4.783,13.196  c0,8.532-3.595,15.667-10.774,21.416c-6.647,5.387-14.325,8.077-23.032,8.077c-7.991,0-14.276-1.748-18.858-5.249l2.429-3.371  c5.387,2.608,10.279,3.907,14.681,3.907c6.373,0,12.051-2.109,17.032-6.33c4.988-4.22,7.475-9.469,7.475-15.755  c0-4.132-1.255-7.655-3.77-10.576c-2.516-2.915-5.793-4.374-9.832-4.374C-582.001-161.747-586.04-160.312-590.439-157.438z"
+     id="path25" /><g
+     id="g27"><circle
+       fill="#CAC5C0"
+       cx="-475"
+       cy="-160.002"
+       r="50"
+       id="circle29" /></g><path
+     fill="#0D0F0F"
+     d="M-460.73-142.641v6.723c0,7.684,2.695,11.525,8.094,11.525h2.33v4.394h-32.658v-4.394h2.607  c5.303,0,7.961-3.798,7.961-11.392v-6.856h-32.795v-6.861l34.578-50.497h9.883v51.592h0.82c3.383,0,5.852-2.608,7.408-7.816h4.115  l-1.92,13.583L-460.73-142.641L-460.73-142.641z M-472.396-148.407v-41.458l-27.893,41.458H-472.396z"
+     id="path31" /><g
+     id="g33"><circle
+       fill="#CAC5C0"
+       cx="-370"
+       cy="-160.002"
+       r="50"
+       id="circle35" /></g><path
+     fill="#0D0F0F"
+     d="M-385.043-198.648h28.941c3.754,0,5.988-0.45,6.703-1.352h4.156l-2.422,10.925h-35.314l-3.408,15.789  c5.127-2.07,9.668-3.104,13.625-3.104c7.729,0,14.25,2.587,19.559,7.758c5.305,5.171,7.961,11.622,7.961,19.357  c0,8.996-3.465,16.237-10.394,21.722c-6.385,5.039-14.162,7.553-23.338,7.553c-5.395,0-10.66-0.808-15.785-2.426l1.617-4.046  c4.32,1.169,8.141,1.751,11.469,1.751c6.654,0,12.477-2.18,17.473-6.544c4.99-4.358,7.488-9.826,7.488-16.392  c0-5.665-1.844-10.32-5.533-13.959c-3.689-3.646-8.365-5.468-14.033-5.468c-5.213,0-10.07,1.8-14.568,5.396l-2.701-0.538  L-385.043-198.648z"
+     id="path37" /><g
+     id="g39"><circle
+       fill="#CAC5C0"
+       cx="-265"
+       cy="-160.002"
+       r="50"
+       id="circle41" /></g><path
+     fill="#0D0F0F"
+     d="M-278.42-165.325c5.934-5.577,11.91-8.364,17.939-8.364c6.564,0,11.828,2.606,15.787,7.821  c3.682,4.77,5.529,10.521,5.529,17.27c0,7.376-2.158,13.849-6.475,19.425c-4.768,6.114-10.703,9.174-17.807,9.174  c-8.547,0-15.381-3.69-20.504-11.063c-4.59-6.477-6.883-14.167-6.883-23.071c0-9.44,2.607-18.141,7.824-26.101  c5.213-7.958,12.184-13.602,20.906-16.928c4.947-1.888,10.168-2.839,15.65-2.839v4.184c-11.691,0.631-20.414,5.308-26.174,14.031  C-275.586-177.285-277.523-171.803-278.42-165.325z M-279.232-157.233c-0.086,1.618-0.133,3.238-0.133,4.857  c0,6.203,1.078,11.96,3.236,17.269c2.785,6.922,6.883,10.385,12.279,10.385c4.674,0,8.18-2.381,10.52-7.151  c1.797-3.684,2.697-8.135,2.697-13.355c0-5.571-0.857-10.342-2.563-14.299c-2.34-5.396-5.936-8.092-10.793-8.092  C-269.922-167.62-275.006-164.155-279.232-157.233z"
+     id="path43" /><g
+     id="g45"><circle
+       fill="#CAC5C0"
+       cx="-160"
+       cy="-160.002"
+       r="50"
+       id="circle47" /></g><path
+     fill="#0D0F0F"
+     d="M-156.506-120h-11.643v-1.238c0-7.396,2.328-16.659,6.98-27.808c7.035-16.799,13.52-29.673,19.453-38.624  l0.822-1.232h-27.256c-3.93,0-6.92,0.819-8.975,2.463c-2.059,1.645-3.582,4.387-4.586,8.222h-4.52l4.926-21.782h2.881  c1.734,0.914,4.742,1.371,9.041,1.371h35.609v6.165c-1.275,1.829-2.918,4.75-4.926,8.768c-3.838,7.485-7.352,16.208-10.553,26.163  C-153.996-142.83-156.416-130.323-156.506-120z"
+     id="path49" /><g
+     id="g51"><circle
+       fill="#CAC5C0"
+       cx="-55"
+       cy="-160.002"
+       r="50"
+       id="circle53" /></g><path
+     fill="#0D0F0F"
+     d="M-64.035-160.537l-1.746-1.211c-5.119-3.502-8.492-6.33-10.107-8.489c-2.066-2.691-3.096-5.83-3.096-9.426  c0-6.105,2.557-11.087,7.678-14.949c4.758-3.59,10.281-5.388,16.568-5.388c5.922,0,11.18,1.573,15.756,4.713  c5.203,3.503,7.813,8.127,7.813,13.876c0,7.004-4.898,12.66-14.682,16.967c11.131,5.388,16.699,12.884,16.699,22.492  c0,6.914-2.646,12.389-7.949,16.434C-41.854-121.836-47.83-120-55.01-120c-6.734,0-12.525-1.703-17.377-5.119  c-5.568-3.856-8.348-8.976-8.348-15.349c0-6.373,2.963-11.63,8.889-15.761C-70.23-157.303-67.623-158.739-64.035-160.537z   M-59.463-158.625c-8.08,3.677-12.111,9.466-12.111,17.361c0,5.113,1.635,9.218,4.916,12.314c3.277,3.097,7.475,4.643,12.594,4.643  c4.574,0,8.461-1.232,11.646-3.695c3.186-2.464,4.781-5.891,4.781-10.28c0-6.626-4.367-12.001-13.098-16.122L-59.463-158.625z   M-50.432-166.598c7.088-3.141,10.641-7.854,10.641-14.139c0-4.313-1.506-7.766-4.51-10.375c-3.012-2.603-6.715-3.906-11.113-3.906  c-3.684,0-6.869,0.991-9.563,2.964c-2.965,2.154-4.443,5.03-4.443,8.62c0,4.4,2.063,7.948,6.195,10.643  c0.805,0.537,4.396,2.286,10.775,5.25L-50.432-166.598z"
+     id="path55" /><g
+     id="g57"><circle
+       fill="#CAC5C0"
+       cx="50"
+       cy="-160.002"
+       r="50"
+       id="circle59" /></g><path
+     fill="#0D0F0F"
+     d="M63.402-154.476c-5.922,5.567-11.898,8.353-17.91,8.353c-6.555,0-11.809-2.604-15.758-7.814  c-3.684-4.758-5.523-10.507-5.523-17.241c0-7.272,2.152-13.777,6.461-19.526C35.344-196.903,41.227-200,48.32-200  c8.622,0,15.489,3.728,20.605,11.181c4.582,6.554,6.867,14.319,6.867,23.302c0,12.746-4.224,23.498-12.655,32.257  c-8.441,8.752-18.993,13.174-31.653,13.261v-4.175c3.859-0.176,6.953-0.626,9.297-1.344  C53.703-129.469,61.25-139.119,63.402-154.476z M64.215-162.558c0.086-1.706,0.129-3.322,0.129-4.846  c0-6.285-1.074-12.034-3.23-17.24c-2.875-6.916-7-10.374-12.386-10.374c-4.676,0-8.125,2.385-10.375,7.141  c-1.797,3.683-2.691,8.126-2.691,13.334c0,5.566,0.852,10.324,2.559,14.275c2.332,5.387,5.926,8.083,10.777,8.083  C54.918-152.185,59.988-155.643,64.215-162.558z"
+     id="path61" /><g
+     id="g63"><circle
+       fill="#CAC5C0"
+       cx="50"
+       cy="-55.002"
+       r="50"
+       id="circle65" /></g><path
+     fill="#0D0F0F"
+     d="M37.162-86.426v50.205c0,5.962,2.51,8.939,7.537,8.939h1.277v3.451H19.152v-3.451h1.787  c5.027,0,7.537-2.978,7.537-8.939V-69.18c0-6.045-2.131-9.07-6.389-9.07h-2.682v-3.446h1.023c5.193,0,9.918-1.575,14.18-4.729  L37.162-86.426L37.162-86.426z M77.912-50.655c-4.684,4.429-9.365,6.643-14.049,6.643c-5.109,0-9.242-2.089-12.393-6.263  c-2.812-3.659-4.216-8.13-4.216-13.41c0-5.708,1.658-10.817,4.979-15.329c3.746-4.854,8.39-7.281,13.925-7.281  c6.728,0,12.049,2.895,15.967,8.686c3.66,5.197,5.494,11.284,5.494,18.265c0,10.053-3.3,18.504-9.899,25.359  c-6.602,6.855-14.881,10.327-24.846,10.41v-3.321c3.066-0.171,5.494-0.515,7.281-1.023C70.293-30.987,76.207-38.565,77.912-50.655z   M78.553-56.919c0.082-1.356,0.129-2.635,0.129-3.83c0-4.938-0.852-9.45-2.557-13.54c-2.299-5.364-5.535-8.047-9.711-8.047  c-3.658,0-6.346,1.83-8.045,5.494c-1.451,2.979-2.174,6.472-2.174,10.474c0,4.34,0.682,8.093,2.043,11.237  c1.789,4.174,4.602,6.264,8.432,6.264C71.27-48.867,75.23-51.549,78.553-56.919z"
+     id="path67" /><g
+     id="g69"><circle
+       fill="#CAC5C0"
+       cx="-55"
+       cy="-55.002"
+       r="50"
+       id="circle71" /></g><path
+     fill="#0D0F0F"
+     d="M-69.025-85.786v49.436c0,5.879,2.428,8.815,7.281,8.815h1.279v3.321h-26.316v-3.321h1.664  c5.021,0,7.537-2.937,7.537-8.815v-32.444c0-5.962-2.133-8.939-6.389-8.939h-2.557v-3.322h1.023c5.109,0,9.709-1.574,13.795-4.729  h2.683V-85.786z M-46.416-55.385l-1.277-1.019c-4.002-2.724-6.643-4.896-7.916-6.513c-1.533-2.131-2.303-4.6-2.303-7.412  c0-4.683,2-8.514,6.002-11.497c3.576-2.807,7.84-4.216,12.777-4.216c4.6,0,8.686,1.195,12.262,3.576  c3.918,2.729,5.879,6.347,5.879,10.858c0,5.452-3.748,9.839-11.244,13.16c8.604,4.174,12.902,10.006,12.902,17.501  c0,5.364-2.086,9.621-6.26,12.771c-3.574,2.813-8.133,4.215-13.67,4.215c-5.279,0-9.791-1.32-13.539-3.961  c-4.34-2.978-6.514-6.938-6.514-11.876c0-5.026,2.34-9.112,7.027-12.268C-51.098-52.91-49.139-54.018-46.416-55.385z M-42.84-53.976  c-6.215,2.895-9.324,7.406-9.324,13.54c0,3.919,1.279,7.09,3.83,9.517c2.559,2.428,5.75,3.639,9.586,3.639  c3.576,0,6.596-0.956,9.07-2.874c2.469-1.913,3.701-4.574,3.701-7.984c0-5.192-3.322-9.366-9.965-12.516L-42.84-53.976z   M-35.813-60.109c5.537-2.469,8.301-6.128,8.301-10.982c0-3.321-1.168-6.004-3.508-8.052c-2.344-2.043-5.219-3.062-8.623-3.062  c-2.813,0-5.322,0.806-7.537,2.422c-2.219,1.622-3.32,3.837-3.32,6.644c0,3.409,1.574,6.133,4.725,8.176  c0.68,0.426,3.492,1.788,8.43,4.091L-35.813-60.109z"
+     id="path73" /><g
+     id="g75"><circle
+       fill="#CAC5C0"
+       cx="-160"
+       cy="-55.002"
+       r="50"
+       id="circle77" /></g><path
+     fill="#0D0F0F"
+     d="M-176.289-85.848v49.307c0,5.879,2.43,8.814,7.285,8.814h1.148v3.322h-26.188v-3.322h1.789  c4.938,0,7.41-2.936,7.41-8.814v-32.318c0-5.957-2.129-8.941-6.387-8.941h-2.559v-3.32h1.023c5.109,0,9.711-1.576,13.797-4.727  L-176.289-85.848L-176.289-85.848z M-143.582-24.023h-8.945v-1.02c0-5.707,1.789-12.902,5.363-21.586  c5.453-12.949,10.48-22.912,15.074-29.893l0.516-0.895h-20.953c-3.066,0-5.387,0.639-6.961,1.912  c-1.574,1.279-2.793,3.41-3.645,6.389h-3.445l3.832-16.861h2.301c1.273,0.598,3.578,0.895,6.898,0.895h27.59v4.855  c-1.02,1.449-2.297,3.746-3.832,6.896c-2.984,5.795-5.707,12.521-8.176,20.182C-141.629-41.734-143.5-32.023-143.582-24.023z"
+     id="path79" /><g
+     id="g81"><circle
+       fill="#CAC5C0"
+       cx="-265"
+       cy="-55.002"
+       r="50"
+       id="circle83" /></g><path
+     fill="#0D0F0F"
+     d="M-280.691-86.678v50.838c0,6.047,2.516,9.07,7.537,9.07h1.279v3.447h-27.082v-3.447h1.789  c5.109,0,7.668-3.023,7.668-9.07v-33.344c0-6.127-2.174-9.193-6.52-9.193h-2.682v-3.451h1.023c5.281,0,10.049-1.617,14.305-4.85  H-280.691z M-260.633-59.219c4.684-4.422,9.408-6.643,14.18-6.643c5.109,0,9.236,2.049,12.391,6.135  c2.895,3.746,4.34,8.305,4.34,13.668c0,5.791-1.703,10.859-5.109,15.199c-3.746,4.855-8.43,7.281-14.049,7.281  c-6.643,0-12.006-2.895-16.098-8.684c-3.576-5.109-5.365-11.156-5.365-18.141c0-7.49,2.043-14.371,6.135-20.631  c4.084-6.258,9.58-10.707,16.477-13.348c3.83-1.451,7.922-2.174,12.262-2.174v3.322c-9.193,0.428-16.051,4.092-20.563,10.988  C-258.336-68.668-259.869-64.328-260.633-59.219z M-261.273-52.955c-0.082,1.273-0.129,2.553-0.129,3.83  c0,4.938,0.852,9.496,2.559,13.672c2.213,5.445,5.445,8.17,9.707,8.17c3.66,0,6.43-1.871,8.301-5.619  c1.363-2.895,2.043-6.43,2.043-10.604c0-4.34-0.633-8.088-1.912-11.236c-1.877-4.262-4.729-6.389-8.561-6.389  C-253.949-61.131-257.951-58.406-261.273-52.955z"
+     id="path85" /><g
+     id="g87"><path
+       fill="#CAC5C0"
+       d="M-320-55.002C-320-27.387-342.387-5-370.002-5C-397.615-5-420-27.387-420-55.002   C-420-82.615-397.615-105-370.002-105C-342.387-105-320-82.615-320-55.002z"
+       id="path89" /></g><path
+     fill="#0D0F0F"
+     d="M-385.33-86.871v50.84c0,6.045,2.516,9.07,7.537,9.07h1.277v3.445h-27.078v-3.445h1.787  c5.109,0,7.666-3.025,7.666-9.07v-33.344c0-6.129-2.172-9.195-6.518-9.195h-2.682v-3.449h1.023c5.281,0,10.047-1.617,14.305-4.852  H-385.33z M-367.445-85.598h23.121c2.984,0,4.771-0.336,5.369-1.02h3.322l-1.918,8.688h-28.229l-2.682,12.516  c3.998-1.617,7.578-2.428,10.729-2.428c6.133,0,11.305,2.049,15.52,6.135c4.215,4.084,6.32,9.193,6.32,15.328  c0,7.152-2.723,12.898-8.17,17.246c-5.115,4-11.291,6.004-18.525,6.004c-4.258,0-8.43-0.641-12.516-1.918l1.273-3.191  c3.404,0.934,6.43,1.402,9.07,1.402c5.281,0,9.902-1.742,13.861-5.234c3.961-3.492,5.936-7.84,5.936-13.031  c0-4.512-1.465-8.219-4.402-11.113c-2.941-2.895-6.621-4.344-11.051-4.344c-4.172,0-8.045,1.449-11.625,4.344l-2.168-0.383  L-367.445-85.598z"
+     id="path91" /><g
+     id="g93"><circle
+       fill="#CAC5C0"
+       cx="-475"
+       cy="-55.002"
+       r="50"
+       id="circle95" /></g><path
+     fill="#0D0F0F"
+     d="M-488.692-85.529v49.053c0,5.789,2.427,8.684,7.276,8.684h1.154v3.322h-26.062v-3.322h1.663  c4.938,0,7.407-2.895,7.407-8.684v-32.191c0-5.879-2.09-8.816-6.259-8.816h-2.557v-3.32h1.023c5.021,0,9.579-1.574,13.665-4.725  L-488.692-85.529L-488.692-85.529z M-445.645-41.842v5.109c0,5.707,1.996,8.561,6.003,8.561h1.658v3.316h-24.398v-3.316h1.918  c4.003,0,6.004-2.813,6.004-8.43v-5.24h-24.528v-5.109l25.932-37.814h7.412v38.578h0.639c2.47,0,4.299-1.953,5.489-5.873h3.066  l-1.533,10.219L-445.645-41.842L-445.645-41.842z M-452.418-46.951V-79.14l-21.716,32.189H-452.418z"
+     id="path97" /><g
+     id="g99"><circle
+       fill="#CAC5C0"
+       cx="-580"
+       cy="-55.002"
+       r="50"
+       id="circle101" /></g><path
+     fill="#0D0F0F"
+     d="M-592.033-85.211v48.543c0,5.707,2.428,8.555,7.282,8.555h1.149v3.322h-25.802v-3.322h1.663  c4.938,0,7.406-2.848,7.406-8.555v-31.811c0-5.873-2.089-8.814-6.258-8.814h-2.558v-3.316h1.024c5.021,0,9.538-1.535,13.54-4.602  H-592.033z M-570.316-53.02l-1.533-2.813l1.153-0.641c3.831-2.379,7.387-4.785,10.666-7.215c3.274-2.426,4.917-5.17,4.917-8.238  c0-2.129-0.811-3.898-2.427-5.301c-1.617-1.408-3.41-2.109-5.364-2.109c-4.943,0-10.136,2.982-15.588,8.945l-2.553-1.918  c5.619-8.516,12.517-12.777,20.692-12.777c3.576,0,6.602,0.895,9.07,2.684c2.896,1.965,4.346,4.645,4.346,8.051  c0,2.387-1.024,4.725-3.067,7.021c-1.195,1.279-3.238,3.025-6.133,5.24l-1.149,1.023c0.51-0.082,1.149-0.129,1.918-0.129  c3.748,0,6.81,1.43,9.195,4.277c2.386,2.852,3.576,6.113,3.576,9.771c0,6.475-2.724,11.84-8.177,16.096  c-4.938,4.086-10.687,6.135-17.24,6.135c-6.051,0-10.775-1.279-14.18-3.836l1.788-2.553c4.002,1.871,7.661,2.813,10.982,2.813  c4.771,0,9.029-1.574,12.776-4.73c3.748-3.148,5.619-7.068,5.619-11.752c0-3.15-0.936-5.83-2.807-8.045  c-1.877-2.215-4.346-3.322-7.412-3.322C-563.97-56.342-566.995-55.234-570.316-53.02z"
+     id="path103" /><g
+     id="g105"><circle
+       fill="#CAC5C0"
+       cx="-685"
+       cy="-55.002"
+       r="50"
+       id="circle107" /></g><path
+     fill="#0D0F0F"
+     d="M-699.37-85.785v49.18c0,5.875,2.428,8.816,7.277,8.816h1.278v3.445H-717v-3.445h1.533  c4.938,0,7.406-2.941,7.406-8.816v-32.32c0-5.955-2.043-8.939-6.128-8.939h-2.682v-3.322h1.019c5.109,0,9.709-1.531,13.795-4.598  L-699.37-85.785L-699.37-85.785z M-648.405-39.418l-4.471,15.203h-37.429v-3.32c1.793-2.043,5.749-6.133,11.882-12.266  c3.659-3.66,7.324-7.578,10.988-11.748c1.788-2.049,3.191-3.748,4.215-5.115c2.126-3.232,3.191-6.465,3.191-9.703  c0-3.238-0.981-6.092-2.938-8.561c-1.959-2.471-4.559-3.705-7.791-3.705c-6.731,0-12.012,4.598-15.843,13.799l-3.321-1.279  c4.601-12.775,11.752-19.164,21.461-19.164c4.767,0,8.857,1.621,12.262,4.855c3.404,3.238,5.109,7.281,5.109,12.137  c0,6.215-3.534,12.262-10.598,18.141l-7.282,5.873c-4.688,3.92-8.561,7.625-11.628,11.111c-0.254,0.262-0.681,0.729-1.273,1.41  h19.544c2.979,0,5.192-0.557,6.643-1.664c1.445-1.102,2.766-3.107,3.956-6.004H-648.405z"
+     id="path109" /><g
+     id="g111"><circle
+       fill="#CAC5C0"
+       cx="-790"
+       cy="-55.002"
+       r="50"
+       id="circle113" /></g><path
+     fill="#0D0F0F"
+     d="M-800.169-86.68v50.84c0,6.049,2.516,9.07,7.536,9.07h1.279v3.449h-27.081v-3.449h1.788  c5.109,0,7.667-3.021,7.667-9.07v-33.34c0-6.133-2.173-9.195-6.518-9.195h-2.683v-3.449h1.024c5.28,0,10.047-1.617,14.304-4.855  L-800.169-86.68L-800.169-86.68z M-767.72-86.68v50.84c0,6.049,2.511,9.07,7.537,9.07h1.278v3.449h-27.086v-3.449h1.788  c5.115,0,7.667-3.021,7.667-9.07v-33.34c0-6.133-2.173-9.195-6.513-9.195h-2.682v-3.449h1.019c5.28,0,10.047-1.617,14.31-4.855  L-767.72-86.68L-767.72-86.68z"
+     id="path115" /><g
+     id="g117"><circle
+       fill="#CAC5C0"
+       cx="-895"
+       cy="-55.002"
+       r="50"
+       id="circle119" /></g><path
+     fill="#0D0F0F"
+     d="M-909.694-86.367v50.439c0,5.998,2.567,8.998,7.693,8.998h1.305v3.42h-26.866v-3.42h1.727  c4.931,0,7.4-3,7.4-8.998v-33.08c0-6.08-2.155-9.123-6.467-9.123h-2.66v-3.424h1.016c5.238,0,9.969-1.604,14.191-4.813  L-909.694-86.367L-909.694-86.367z M-899.934-53.039c0-7.857,1.646-15.082,4.94-21.668C-890.852-82.9-885.189-87-878.012-87  c6.931,0,12.422,3.508,16.476,10.516c3.296,5.748,4.945,12.381,4.945,19.898c0,7.859-1.648,15.039-4.945,21.545  C-865.677-27.012-871.293-23-878.389-23c-6.842,0-12.293-3.465-16.352-10.395C-898.205-39.223-899.934-45.771-899.934-53.039z   M-890.812-56.715c0,6.68,0.718,12.676,2.156,17.996c2.197,8.195,5.785,12.295,10.771,12.295c8.111,0,12.165-8.447,12.165-25.346  c0-20.869-4.394-31.301-13.182-31.301c-7.941,0-11.912,8.105-11.912,24.328L-890.812-56.715L-890.812-56.715z"
+     id="path121" /><g
+     id="g123"><circle
+       fill="#CAC5C0"
+       cx="-895"
+       cy="49.998"
+       r="50"
+       id="circle125" /></g><path
+     fill="#0D0F0F"
+     d="M-891.756,63.266l-4.471,14.945h-36.791v-3.068c1.789-2.041,5.75-6.086,11.883-12.131  c3.576-3.66,7.152-7.496,10.729-11.498c1.871-2.042,3.238-3.789,4.09-5.24c2.209-3.066,3.316-6.258,3.316-9.578  c0-3.066-0.998-5.813-2.998-8.238c-2.002-2.428-4.539-3.639-7.6-3.639c-6.643,0-11.84,4.512-15.588,13.541l-3.447-1.279  c4.512-12.689,11.582-19.033,21.203-19.033c4.771,0,8.836,1.615,12.199,4.854c3.367,3.238,5.047,7.24,5.047,12.006  c0,6.051-3.535,11.965-10.604,17.756l-7.152,6.004c-4.6,3.92-8.389,7.537-11.367,10.857c-0.256,0.172-0.682,0.682-1.279,1.535  h19.164c2.979,0,5.234-0.642,6.768-1.918c1.279-1.021,2.557-2.98,3.83-5.875h3.068V63.266z M-892.266,49.852  c0-7.408,1.533-14.264,4.6-20.563c4.002-7.834,9.408-11.754,16.223-11.754c6.555,0,11.793,3.363,15.713,10.09  c3.061,5.453,4.594,11.752,4.594,18.904c0,7.495-1.533,14.311-4.594,20.444c-4.008,7.659-9.373,11.491-16.098,11.491  c-6.471,0-11.67-3.274-15.584-9.836C-890.65,63.094-892.266,56.836-892.266,49.852z M-883.58,46.404  c0,6.389,0.68,12.096,2.043,17.116c2.041,7.84,5.451,11.754,10.219,11.754c7.748,0,11.627-8.047,11.627-24.146  c0-19.928-4.217-29.891-12.646-29.891c-7.496,0-11.242,7.748-11.242,23.248L-883.58,46.404L-883.58,46.404z"
+     id="path127" /><g
+     id="g129"><path
+       fill="#A3C095"
+       d="M-5,49.998C-5,77.613-27.385,100-55.002,100C-82.615,100-105,77.613-105,49.998   C-105,22.385-82.615,0-55.002,0C-27.385,0-5,22.385-5,49.998z"
+       id="path131" /></g><path
+     fill="#0D0F0F"
+     d="M-11.238,56.225c0,1.668-0.645,3.164-1.936,4.498c-1.289,1.332-2.77,1.998-4.436,1.998  c-2.662,0-4.623-1.25-5.869-3.748l-5.871-0.25c-1.252,0-3.709,0.543-7.371,1.625c-3.914,1.082-6.164,1.957-6.746,2.623  c-0.916,0.998-1.664,3.332-2.248,6.996c-0.502,2.998-0.748,5.205-0.748,6.621c0,2.246,0.352,3.893,1.061,4.934  s2.166,1.916,4.371,2.623c2.205,0.707,3.561,1.104,4.061,1.187c0.332,0,0.873-0.041,1.625-0.125h1.498c1.08,0,2.205,0.17,3.373,0.5  c1.666,0.5,2.375,1.166,2.125,2c-1.168-0.166-3.207,0.084-6.121,0.75l3.496,1.748c0,1-1.416,1.498-4.246,1.498  c-0.752,0-1.771-0.166-3.063-0.498c-1.291-0.336-2.145-0.5-2.559-0.5h-1.625c-0.082,0.832-0.334,2.08-0.75,3.746  c-1.418-0.084-3.08-0.918-4.996-2.498c-1.918-1.58-3.123-2.373-3.621-2.373c-0.502,0-1.211,0.793-2.125,2.373  c-0.918,1.58-1.375,2.664-1.375,3.248c-1.082-0.584-1.996-1.668-2.75-3.248c-0.332-1.084-0.707-2.166-1.121-3.248  c-0.832,0.084-2.375,1.834-4.621,5.248h-0.627c-0.166-0.252-0.795-2-1.873-5.248c-2.582-0.832-4.996-1.248-7.246-1.248  c-1.082,0-2.748,0.25-4.996,0.748l-3.496-0.248c0.498-0.5,1.955-1.457,4.371-2.873c2.83-1.666,4.996-2.5,6.496-2.5  c0.246,0,0.578,0.043,1,0.125c0.414,0.086,0.75,0.125,1,0.125c0.578,0,1.518-0.312,2.809-0.938c1.291-0.623,2.039-1.186,2.246-1.684  c0.211-0.504,0.316-1.793,0.316-3.875c0-4.746-1.25-8.285-3.75-10.617c-2.168-2.082-5.746-3.58-10.744-4.498  c-1.332,4.746-5.08,7.123-11.24,7.123c-2,0-3.998-1.207-5.996-3.623c-1.996-2.416-2.996-4.623-2.996-6.621  c0-3.082,1.287-5.621,3.869-7.623c-2.08-2.162-3.121-4.369-3.121-6.617c0-2.084,0.643-3.914,1.936-5.5  c1.291-1.578,2.977-2.496,5.059-2.748c-0.166-2.662,0.707-4.496,2.623-5.496c-0.916-0.914-1.373-2.537-1.373-4.869  c0-2.748,0.916-5.039,2.748-6.871c1.83-1.832,4.121-2.75,6.869-2.75c3,0,5.457,1.045,7.371,3.125  c2.416-8.244,7.621-12.367,15.613-12.367c4.164,0,7.828,1.666,10.994,4.998c1.166,1.248,1.748,1.916,1.748,1.996  c-1,0-0.498-0.188,1.5-0.561c1.996-0.375,3.453-0.563,4.373-0.563c3.246,0,6.119,1.207,8.619,3.623  c2.164,2.166,3.664,4.912,4.498,8.244c0.58,0.084,1.498,0.332,2.748,0.748c1.83,0.92,2.748,2.498,2.748,4.748  c0,0.418-0.336,1.209-1,2.373c5.328,2.998,7.994,7.162,7.994,12.492c0,1.498-0.582,3.584-1.748,6.247  C-12.318,51.977-11.238,53.811-11.238,56.225z M-62.705,61.721v-1.623c0-1.914-0.936-3.664-2.809-5.246  c-1.875-1.582-3.77-2.373-5.684-2.373c-2.334,0-4.496,0.541-6.496,1.621C-73.281,53.852-68.283,56.393-62.705,61.721z   M-64.951,46.232c-1.25-1.418-2.332-2.875-3.25-4.373c-3.498,0.916-5.246,1.957-5.246,3.121c1-0.08,2.457,0.105,4.371,0.564  C-67.162,46.003-65.785,46.232-64.951,46.232z M-57.33,42.359v-5.496c-2-0.332-3.211-0.5-3.623-0.5v1.873L-57.33,42.359z   M-41.092,38.861c-1-0.416-2.875-1.25-5.621-2.498v10.742C-42.801,44.855-40.928,42.107-41.092,38.861z M-34.225,53.602  l-2.746-3.373c-1.664,1.167-3.352,2.354-5.061,3.561c-1.709,1.207-3.186,2.563-4.432,4.06  C-42.717,55.848-38.635,54.436-34.225,53.602z"
+     id="path133" /><g
+     id="g135"><circle
+       fill="#E49977"
+       cx="-160"
+       cy="50"
+       r="50"
+       id="circle137" /></g><path
+     d="M-118.035,66.617c-3.736,8.912-11.16,13.367-22.275,13.367c-2.037,0-4.246,0.254-6.621,0.762  c-3.564,0.764-5.346,1.828-5.346,3.186c0,0.424,0.295,0.91,0.891,1.463c0.592,0.553,1.104,0.826,1.527,0.826  c-2.123,0-0.68,0.064,4.326,0.191c5.008,0.127,8.148,0.191,9.422,0.191c-7.383,4.326-19.732,6.319-37.043,5.981  c-5.688-0.084-10.566-2.588-14.639-7.51c-3.992-4.669-5.984-9.888-5.984-15.658c0-6.108,2.057-11.308,6.176-15.595  c4.113-4.282,9.229-6.427,15.338-6.427c1.357,0,3.16,0.297,5.41,0.891c2.248,0.594,3.756,0.891,4.518,0.891  c3.139,0,7.045-1.293,11.713-3.883c4.666-2.588,6.875-3.883,6.621-3.883c-0.85,8.912-3.82,14.896-8.914,17.948  c-3.648,2.123-5.473,4.201-5.473,6.236c0,1.273,0.764,2.293,2.291,3.057c1.188,0.595,2.502,0.892,3.945,0.892  c2.207,0,4.371-1.356,6.494-4.071c2.119-2.718,3.055-5.177,2.801-7.386c-0.254-2.545-0.084-5.603,0.51-9.164  c0.168-1.02,0.783-2.27,1.844-3.754c1.061-1.486,2.016-2.398,2.865-2.738c0,0.762-0.275,2.037-0.828,3.818  c-0.553,1.781-0.826,3.1-0.826,3.947c0,1.867,0.508,3.309,1.527,4.326c1.525-0.592,2.883-2.502,4.074-5.729  c1.016-2.459,1.609-4.836,1.781-7.127c-3.566-0.17-6.982-1.781-10.248-4.838c-3.268-3.057-4.9-6.365-4.9-9.928  c0-0.594,0.082-1.188,0.256-1.783c0.508,0.764,1.271,1.953,2.289,3.564c1.443,2.121,2.547,3.182,3.313,3.182  c1.016,0,1.525-1.061,1.525-3.182c0-2.715-0.723-5.176-2.164-7.383c-1.613-2.631-3.693-3.947-6.238-3.947  c-1.189,0-2.971,0.637-5.344,1.91c-2.379,1.271-4.543,1.91-6.492,1.91c-0.596,0-3.229-0.766-7.895-2.293  c8.23-1.355,12.348-2.586,12.348-3.691c0-2.885-5.645-4.838-16.93-5.855c-1.105-0.084-3.141-0.254-6.111-0.51  c0.338-0.424,2.758-0.891,7.258-1.4c3.818-0.422,6.492-0.637,8.018-0.637c20.197,0,33.012,9.805,38.443,29.408  c0.934-0.773,1.402-2.066,1.402-3.871c0-2.324-0.68-5.25-2.037-8.777c-0.512-1.375-1.318-3.441-2.42-6.193  c6.957,8.867,10.439,17.27,10.439,25.199c0,4.178-0.979,7.973-2.93,11.381c-1.27,2.303-3.65,5.244-7.127,8.826  c-3.48,3.58-5.857,6.352-7.131,8.313c4.668-1.271,7.725-2.248,9.168-2.928c3.223-1.44,6.15-3.606,8.783-6.492  C-116.635,62.756-117.102,64.412-118.035,66.617z M-173.537,16.592c0,1.525-0.85,2.502-2.545,2.926l-3.311,0.51  c-1.189,0.594-2.928,2.928-5.219,7c-0.256-1.271-0.637-3.053-1.146-5.346c-0.764,0.086-2.035,0.764-3.818,2.037  c-0.764,0.594-1.996,1.484-3.693,2.672c0.512-3.055,2.207-6.148,5.094-9.293c3.055-3.477,6.025-5.217,8.91-5.217  C-175.447,11.881-173.537,13.453-173.537,16.592z M-151.387,28.301c0,1.443-0.785,2.654-2.355,3.629  c-1.57,0.977-3.119,1.465-4.646,1.465c-2.037,0-3.863-1.146-5.473-3.438c-1.955-2.801-3.947-4.625-5.984-5.477  c0.424-0.422,0.934-0.635,1.529-0.635c0.764,0,2.055,0.594,3.881,1.781c1.824,1.189,2.99,1.783,3.502,1.783  c0.424,0,1.123-0.594,2.1-1.783c0.975-1.188,2.057-1.781,3.246-1.781C-152.787,23.846-151.387,25.332-151.387,28.301z"
+     id="path139"
+     fill="#0D0F0F" /><g
+     id="g141"><circle
+       fill="#BAB1AB"
+       cx="-265"
+       cy="49.998"
+       r="50"
+       id="circle143" /></g><path
+     fill="#0D0F0F"
+     d="M-224.305,48.619c0,5.518-2.008,9.281-6.02,11.287c-1.172,0.586-4.85,1.379-11.037,2.383  c-4.012,0.67-6.018,2.217-6.018,4.639v10.158c0,0.422,0.125,1.715,0.375,3.889l0.377,4.014c0,1.255-0.293,3.306-0.879,6.146  c-1.588,0.334-3.428,0.709-5.518,1.132c-0.67-2.511-1.004-4.224-1.004-5.146c0-0.416,0.105-1.045,0.313-1.882  c0.207-0.834,0.316-1.461,0.316-1.883c0-0.58-0.52-2.213-1.559-4.887h-1.945c-0.258,0.418-0.344,0.961-0.26,1.629  c0.334,1.422,0.459,2.633,0.377,3.637c-1.422,1.004-3.387,2.341-5.895,4.013c-0.586-0.166-0.793-0.25-0.629-0.25v-8.904  c-0.164-0.416-0.584-0.581-1.254-0.502h-1.504l-1.504,11.787c-1.174,0.084-2.592,0.084-4.264,0  c-0.588-2.758-1.631-6.853-3.135-12.289h-1.004c-0.922,2.929-1.422,4.519-1.506,4.769c0,0.334,0.104,0.981,0.314,1.942  c0.207,0.962,0.313,1.609,0.313,1.943c0,0.25-0.084,0.877-0.25,1.881l-0.377,3.01c-0.168,0.166-0.377,0.25-0.627,0.25  c-2.508,0-4.182-0.627-5.016-1.879c-0.836-1.256-1.172-3.012-1.004-5.271l1.004-15.047c0-0.252,0.082-0.586,0.25-1.004  c0.164-0.418,0.25-0.711,0.25-0.877c0-0.67-0.711-2.008-2.131-4.014c-0.248-0.082-1.549-0.377-3.887-0.879  c-1.424-0.334-4.225-0.918-8.402-1.756c-5.771-1.084-8.654-5.725-8.654-13.92c0-12.207,5.018-22.365,15.051-30.475  c0.414,2.258,1.127,5.266,2.129,9.029c0.754,0.17,2.385,0.545,4.891,1.129c0.504,0.168,3.053,1.088,7.652,2.76  c-2.344-1.422-5.393-3.719-9.156-6.898c-1.422-1.672-2.133-4.471-2.133-8.4c0-0.92,1.59-2.008,4.768-3.264  c2.84-1.17,4.975-1.836,6.396-2.006c4.514-0.582,7.984-0.879,10.41-0.879c10.449,0,18.891,2.678,25.328,8.029  c-2.088,2.426-5.684,5.014-10.783,7.773c2.008,0.084,4.934-0.707,8.779-2.383c3.844-1.67,5.475-2.508,4.891-2.508  c0.668,0,2.008,1.34,4.014,4.014c1.504,2.006,2.715,3.807,3.637,5.391c2.674,4.768,4.471,9.908,5.393,15.426  c0,1.926,0.041,3.305,0.125,4.139v1.004H-224.305z M-272.336,50.877c0-3.594-1.568-7.002-4.703-10.223  c-3.137-3.219-6.502-4.826-10.096-4.826c-3.178,0-5.977,1.348-8.402,4.039c-2.426,2.693-3.637,5.682-3.637,8.963  c0,2.859,1.379,4.713,4.139,5.553c1.756,0.506,4.219,0.801,7.398,0.883h6.898C-275.141,55.35-272.336,53.887-272.336,50.877z   M-258.668,66.43v-3.889c-0.584-1.086-1.17-2.215-1.754-3.387c-0.502-1.674-1.422-4.014-2.76-7.025l-1.381,14.674  c0,1.172-0.25,1.756-0.752,1.756c-0.334,0-0.584-0.082-0.752-0.248c-0.586-8.863-0.879-12.709-0.879-11.541v-4.387  c-0.168-0.254-0.375-0.379-0.625-0.379c-2.844,2.93-4.264,7.652-4.264,14.172c0,3.596,0.33,5.811,1.002,6.648  c0.67-0.166,1.422-0.459,2.258-0.877c0.334-0.168,1.295-0.252,2.887-0.252c1.584,0,3.51,0.502,5.766,1.504  C-259.086,73.199-258.668,70.943-258.668,66.43z M-230.324,48.955c0-3.367-1.254-6.375-3.762-9.025  c-2.51-2.648-5.395-3.975-8.652-3.975c-3.512,0-6.795,1.607-9.846,4.826c-3.053,3.219-4.578,6.584-4.578,10.096  c0,2.928,1.42,4.389,4.264,4.389h14.422C-233.043,55.184-230.324,53.08-230.324,48.955z"
+     id="path145" /><g
+     id="g147"><circle
+       fill="#C1D7E9"
+       cx="-370"
+       cy="50"
+       r="50"
+       id="circle149" /></g><path
+     fill="#0D0F0F"
+     d="M-352.512,83.719c-4.787,4.871-10.684,7.307-17.688,7.307c-7.861,0-14.098-2.69-18.711-8.073  c-4.359-5.127-6.537-11.662-6.537-19.606c0-8.543,3.717-18.286,11.15-29.224c6.064-8.969,13.199-16.83,21.402-23.58  c-1.197,5.469-1.793,9.355-1.793,11.662c0,5.299,1.664,10.467,4.996,15.508c4.102,5.98,7.219,10.426,9.357,13.328  c3.332,5.043,4.998,9.955,4.998,14.737C-345.336,72.871-347.729,78.852-352.512,83.719z M-352.641,56.357  c-1.281-2.861-2.777-4.762-4.486-5.703c0.256,0.514,0.385,1.24,0.385,2.18c0,1.795-0.512,4.357-1.539,7.689l-1.664,5.127  c0,2.99,1.492,4.486,4.484,4.486c3.16,0,4.742-2.095,4.742-6.281C-350.719,61.721-351.359,59.223-352.641,56.357z"
+     id="path151" /><g
+     id="g153"><circle
+       fill="#F8F6D8"
+       cx="-475"
+       cy="50"
+       r="50"
+       id="circle155" /></g><path
+     fill="#0D0F0F"
+     d="M-427.309,57.064c-6.561-3.699-10.768-5.551-12.617-5.551c-1.344,0-2.395,1.032-3.154,3.092  c-0.758,2.063-2.27,3.09-4.541,3.09c-0.926,0-2.818-0.336-5.678-1.008c-1.598,2.44-2.398,3.996-2.398,4.668  c0,0.926,0.689,2.016,2.064,3.281c1.375,1.262,2.535,1.891,3.482,1.891c0.602,0,1.416-0.125,2.449-0.379  c1.031-0.25,1.721-0.377,2.064-0.377c1.033,0,1.547,1.893,1.547,5.678c0,3.617-0.84,9.168-2.523,16.654  c-2.188-8.58-4.5-12.871-6.938-12.871c-0.338,0-1.031,0.252-2.082,0.76c-1.053,0.502-1.83,0.754-2.334,0.754  c-2.438,0-4.625-2.227-6.561-6.688c-3.869,0.59-5.805,2.567-5.805,5.934c0,1.684,0.777,3.027,2.336,4.035  c1.553,1.008,2.334,1.727,2.334,2.145c0,2.273-3.324,5.764-9.969,10.473c-3.531,2.523-5.973,4.289-7.316,5.297  c1.174-1.512,2.352-3.487,3.533-5.928c1.344-2.775,2.018-4.92,2.018-6.436c0-0.84-0.967-2.02-2.902-3.533  c-1.936-1.512-2.9-3.111-2.9-4.793c0-1.428,0.502-3.193,1.512-5.299c-1.094-1.262-2.395-1.895-3.91-1.895  c-3.365,0-5.045,1.096-5.045,3.28c0-1.514,0-0.379,0,3.406c0.082,2.776-2.02,4.164-6.311,4.164c-3.279,0-8.791-0.759-16.527-2.271  c8.748-2.188,13.121-4.711,13.121-7.57c0,0.336-0.168-0.672-0.504-3.028c-0.338-2.604,1.514-4.961,5.551-7.063  c-0.758-3.867-2.773-5.806-6.057-5.806c-0.504,0-1.432,0.884-2.775,2.647c-1.346,1.771-2.607,2.652-3.783,2.652  c-2.02,0-4.629-2.186-7.822-6.563c-1.516-2.184-3.83-5.424-6.941-9.715c1.934,1.012,3.869,2.02,5.805,3.031  c2.523,1.176,4.541,1.766,6.057,1.766c1.178,0,2.334-1.031,3.469-3.092c1.135-2.061,2.629-3.092,4.479-3.092  c0.254,0,1.936,0.504,5.047,1.516c1.596-2.439,2.398-4.248,2.398-5.426c0-1.01-0.611-2.166-1.83-3.471  c-1.221-1.303-2.334-1.955-3.344-1.955c-0.422,0-1.072,0.125-1.957,0.379c-0.881,0.252-1.533,0.379-1.953,0.379  c-1.516,0-2.273-1.893-2.273-5.678c0-1.01,0.969-6.77,2.904-17.285c-0.086,1.26,0.461,3.617,1.639,7.064  c1.43,4.207,3.111,6.309,5.049,6.309c0.334,0,1.008-0.252,2.018-0.758c1.008-0.504,1.807-0.754,2.396-0.754  c1.934,0,3.531,1.094,4.795,3.277l1.893,3.406c1.766,0,3.238-0.629,4.414-1.891c1.178-1.262,1.768-2.777,1.768-4.543  c0-1.85-0.777-3.26-2.334-4.227c-1.559-0.967-2.336-1.703-2.336-2.207c0-1.768,2.777-4.752,8.328-8.958  c4.457-3.363,7.359-5.34,8.707-5.93c-3.617,4.879-5.426,8.451-5.426,10.724c0,1.178,0.713,2.441,2.145,3.785  c1.766,1.598,2.775,2.734,3.027,3.406c0.84,1.938,0.756,4.586-0.252,7.949c2.271,1.6,3.994,2.396,5.174,2.396  c2.436,0,3.658-1.264,3.658-3.785c0-0.252-0.105-1.051-0.314-2.396c-0.213-1.344-0.273-2.102-0.191-2.271  c0.336-1.178,2.65-1.768,6.939-1.768c2.691,0,8.283,0.758,16.781,2.273c-1.852,0.504-4.627,1.26-8.326,2.27  c-3.365,1.01-5.049,2.145-5.049,3.406c0,0.59,0.209,1.598,0.631,3.027c0.42,1.432,0.633,2.48,0.633,3.156  c0,1.176-0.758,2.27-2.271,3.277l-4.291,3.031c1.01,1.852,1.682,2.945,2.02,3.279c0.84,1.008,1.975,1.514,3.406,1.514  c1.01,0,1.934-0.883,2.775-2.648c0.84-1.768,2.188-2.65,4.037-2.65c2.27,0,4.838,2.104,7.697,6.311  C-433.156,48.697-430.674,52.27-427.309,57.064z M-455.316,49.748c0-5.381-1.979-10.051-5.932-14.006  c-3.953-3.953-8.621-5.93-14.004-5.93c-5.469,0-10.18,1.957-14.131,5.869c-3.953,3.91-5.973,8.6-6.055,14.066  c-0.086,5.383,1.912,10.03,5.992,13.938c4.08,3.912,8.811,5.869,14.193,5.869c5.719,0,10.492-1.873,14.318-5.615  C-457.105,60.199-455.234,55.469-455.316,49.748z M-457.209,49.748c0,5.131-1.725,9.381-5.174,12.74  c-3.451,3.367-7.74,5.049-12.869,5.049c-4.963,0-9.211-1.723-12.742-5.174c-3.531-3.445-5.299-7.652-5.299-12.615  c0-4.877,1.785-9.064,5.359-12.553c3.578-3.49,7.803-5.238,12.682-5.238c4.877,0,9.104,1.766,12.68,5.301  C-458.998,40.791-457.209,44.953-457.209,49.748z"
+     id="path157" /><g
+     id="g159"><path
+       fill="#CAC5C0"
+       d="M-740,49.998C-740,77.613-762.383,100-790,100c-27.613,0-50-22.387-50-50.002C-840,22.385-817.613,0-790,0   C-762.383,0-740,22.385-740,49.998z"
+       id="path161" /></g><g
+     id="g163"><path
+       fill="#0D0F0F"
+       d="M-783.359,80v-3.297c4.703-0.521,7.059-1.887,7.059-4.082c0-1.582-0.629-3.164-1.883-4.746l-13.008-16.01   l-10.273,12.111c-2.57,2.973-3.863,5.432-3.863,7.354c0,2.976,2.354,4.771,7.07,5.387V80h-25.051v-3.287   c3.172-0.609,5.867-1.752,8.102-3.416c1.539-1.223,3.637-3.371,6.285-6.438l15.449-17.915l-17.867-21.66   c-2.315-2.797-4.121-4.633-5.401-5.51c-1.724-1.225-4.121-2.012-7.203-2.361V16h29.539v3.285c-4.453,0.877-6.676,2.234-6.676,4.074   c0,1.23,0.594,2.586,1.793,4.072l11.816,14.322l9.508-11.691c1.711-2.104,2.57-3.941,2.57-5.52c0-2.629-2.105-4.34-6.301-5.129V16   h23.512v3.291c-2.055,0.439-3.473,0.834-4.23,1.188c-2.57,1.229-6.496,4.869-11.797,10.92c-0.852,0.969-4.453,5.393-10.789,13.285   l18.977,23.363c4.113,5.078,8.305,7.971,12.586,8.666V80H-783.359z"
+       id="path165" /></g><g
+     id="g167"><path
+       fill="#C1D7E9"
+       d="M-859.651,119.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50.001,50.003   c-13.806,0-26.305-5.596-35.354-14.646"
+       id="path169" /><path
+       fill="#F8F6D8"
+       d="M-930.354,190.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.386-49.997,49.999-49.997   c13.804,0,26.302,5.594,35.35,14.637"
+       id="path171" /></g><path
+     fill="#0D0F0F"
+     d="M-868.278,188.675c-2.693,2.739-6.007,4.109-9.946,4.109c-4.423,0-7.93-1.515-10.525-4.541  c-2.452-2.884-3.676-6.558-3.676-11.028c0-4.804,2.09-10.281,6.271-16.434c3.41-5.047,7.423-9.467,12.037-13.264  c-0.672,3.076-1.009,5.262-1.009,6.561c0,2.98,0.935,5.886,2.812,8.721c2.305,3.365,4.06,5.864,5.261,7.496  c1.874,2.835,2.813,5.6,2.813,8.289C-864.241,182.574-865.588,185.938-868.278,188.675z M-868.349,173.287  c-0.722-1.609-1.563-2.68-2.524-3.208c0.145,0.288,0.216,0.698,0.216,1.226c0,1.01-0.287,2.453-0.864,4.324l-0.938,2.885  c0,1.68,0.84,2.522,2.524,2.522c1.776,0,2.667-1.177,2.667-3.532C-867.269,176.303-867.629,174.896-868.349,173.287z"
+     id="path173" /><path
+     fill="#0D0F0F"
+     d="M-890.333,143.264c-2.436-2.264-4.054-3.492-4.848-3.682c-0.577-0.139-1.135,0.197-1.672,1.005  s-1.292,1.095-2.268,0.858c-0.397-0.094-1.175-0.434-2.333-1.016c-0.938,0.885-1.441,1.471-1.511,1.758  c-0.095,0.397,0.089,0.938,0.55,1.621c0.46,0.685,0.894,1.072,1.301,1.17c0.257,0.063,0.622,0.092,1.09,0.09  s0.777,0.015,0.926,0.051c0.444,0.104,0.469,0.971,0.079,2.597c-0.37,1.552-1.302,3.853-2.794,6.892  c-0.058-3.908-0.609-5.988-1.655-6.238c-0.145-0.035-0.469,0.003-0.972,0.111c-0.505,0.106-0.864,0.138-1.08,0.086  c-1.048-0.252-1.758-1.434-2.131-3.547c-1.722-0.145-2.757,0.506-3.103,1.949c-0.173,0.725,0.024,1.383,0.589,1.975  c0.564,0.594,0.824,0.98,0.783,1.16c-0.232,0.978-2.021,2.133-5.355,3.474c-1.777,0.721-3.007,1.228-3.688,1.522  c0.659-0.527,1.369-1.257,2.126-2.183c0.862-1.056,1.372-1.905,1.528-2.558c0.086-0.359-0.208-0.967-0.883-1.815  c-0.676-0.849-0.926-1.633-0.753-2.354c0.146-0.614,0.543-1.319,1.193-2.121c-0.34-0.653-0.834-1.06-1.484-1.215  c-1.444-0.346-2.279-0.049-2.504,0.892c0.156-0.649,0.039-0.162-0.349,1.462c-0.25,1.2-1.296,1.58-3.138,1.141  c-1.409-0.339-3.696-1.229-6.864-2.673c3.982-0.04,6.119-0.675,6.412-1.903c-0.033,0.146-0.003-0.307,0.096-1.353  c0.123-1.153,1.16-1.976,3.108-2.464c0.073-1.738-0.593-2.775-2.003-3.114c-0.216-0.052-0.706,0.232-1.463,0.853  c-0.76,0.621-1.393,0.871-1.898,0.748c-0.867-0.205-1.762-1.412-2.684-3.619c-0.426-1.096-1.087-2.723-1.982-4.885  c0.727,0.631,1.453,1.266,2.181,1.896c0.963,0.766,1.77,1.225,2.419,1.382c0.506,0.12,1.108-0.204,1.808-0.973  c0.698-0.769,1.446-1.058,2.24-0.866c0.111,0.025,0.78,0.414,2.012,1.169c0.937-0.884,1.466-1.577,1.588-2.084  c0.102-0.435-0.04-0.991-0.431-1.678c-0.389-0.685-0.802-1.078-1.235-1.185c-0.181-0.043-0.472-0.057-0.877-0.037  c-0.406,0.018-0.699,0.004-0.879-0.039c-0.65-0.155-0.781-1.045-0.392-2.672c0.102-0.434,1.111-2.808,3.022-7.123  c-0.166,0.531-0.173,1.601-0.021,3.203c0.181,1.953,0.687,3.026,1.518,3.228c0.144,0.034,0.459-0.005,0.945-0.119  c0.485-0.112,0.853-0.14,1.105-0.078c0.83,0.198,1.404,0.833,1.722,1.901l0.463,1.656c0.757,0.182,1.455,0.063,2.089-0.358  c0.636-0.42,1.046-1.011,1.227-1.769c0.189-0.795,0-1.479-0.568-2.056c-0.57-0.575-0.829-0.971-0.775-1.188  c0.181-0.758,1.68-1.754,4.495-2.989c2.26-0.985,3.709-1.537,4.349-1.651c-2.054,1.725-3.199,3.07-3.431,4.047  c-0.121,0.506,0.055,1.123,0.531,1.848c0.595,0.867,0.912,1.459,0.95,1.771c0.162,0.92-0.146,2.047-0.924,3.389  c0.811,0.92,1.469,1.439,1.977,1.562c1.044,0.25,1.699-0.167,1.958-1.25c0.027-0.108,0.063-0.462,0.112-1.062  c0.046-0.6,0.098-0.931,0.151-0.996c0.267-0.471,1.32-0.486,3.162-0.045c1.156,0.277,3.479,1.176,6.972,2.699  c-0.846,0.026-2.116,0.065-3.809,0.12c-1.549,0.087-2.388,0.402-2.519,0.943c-0.059,0.254-0.074,0.708-0.04,1.364  c0.034,0.656,0.016,1.133-0.053,1.42c-0.12,0.507-0.558,0.896-1.311,1.176l-2.156,0.859c0.246,0.897,0.42,1.438,0.531,1.615  c0.259,0.52,0.693,0.854,1.307,1.002c0.434,0.104,0.922-0.181,1.465-0.854c0.542-0.672,1.212-0.912,2.006-0.723  c0.975,0.232,1.861,1.398,2.658,3.5C-891.984,139.068-891.286,140.859-890.333,143.264z M-901.608,137.243  c0.552-2.312,0.183-4.521-1.108-6.623c-1.292-2.104-3.094-3.433-5.404-3.986c-2.349-0.562-4.573-0.206-6.671,1.069  c-2.098,1.271-3.448,3.078-4.045,5.417c-0.59,2.303-0.21,4.505,1.141,6.603c1.35,2.1,3.18,3.426,5.493,3.979  c2.455,0.587,4.698,0.275,6.725-0.941C-903.452,141.547-902.162,139.706-901.608,137.243z M-902.422,137.049  c-0.527,2.203-1.703,3.852-3.53,4.939c-1.826,1.09-3.843,1.373-6.044,0.846c-2.131-0.51-3.777-1.688-4.94-3.531  s-1.489-3.828-0.979-5.962c0.503-2.095,1.698-3.708,3.592-4.841c1.896-1.129,3.889-1.445,5.983-0.943  c2.094,0.5,3.728,1.693,4.899,3.577C-902.27,133.02-901.929,134.988-902.422,137.049z"
+     id="path175" /><g
+     id="g177"><path
+       fill="#BAB1AB"
+       d="M-754.651,119.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.386,50.003-50.001,50.003   c-13.806,0-26.305-5.596-35.354-14.646"
+       id="path179" /><path
+       fill="#F8F6D8"
+       d="M-825.354,190.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.386-49.997,49.999-49.997   c13.804,0,26.302,5.594,35.35,14.637"
+       id="path181" /></g><path
+     fill="#0D0F0F"
+     d="M-750.38,170.99c0,2.701-0.982,4.544-2.947,5.525c-0.574,0.287-2.374,0.678-5.404,1.166  c-1.963,0.33-2.946,1.086-2.946,2.271v4.973c0,0.209,0.063,0.842,0.185,1.905l0.185,1.966c0,0.613-0.144,1.617-0.431,3.008  c-0.777,0.163-1.678,0.348-2.701,0.555c-0.328-1.23-0.491-2.069-0.491-2.52c0-0.203,0.05-0.512,0.153-0.921  c0.102-0.407,0.154-0.716,0.154-0.922c0-0.284-0.253-1.083-0.762-2.394h-0.953c-0.126,0.205-0.167,0.472-0.127,0.797  c0.164,0.697,0.225,1.289,0.186,1.781c-0.697,0.491-1.657,1.146-2.885,1.965c-0.289-0.082-0.389-0.123-0.308-0.123v-4.359  c-0.081-0.203-0.285-0.285-0.614-0.246h-0.737l-0.737,5.771c-0.573,0.041-1.268,0.041-2.086,0c-0.287-1.351-0.799-3.354-1.535-6.017  h-0.493c-0.45,1.433-0.695,2.211-0.737,2.334c0,0.163,0.052,0.479,0.155,0.951c0.102,0.472,0.153,0.787,0.153,0.951  c0,0.122-0.042,0.43-0.125,0.921l-0.184,1.475c-0.083,0.079-0.183,0.12-0.306,0.12c-1.228,0-2.048-0.307-2.455-0.919  c-0.412-0.615-0.576-1.475-0.493-2.58l0.493-7.365c0-0.123,0.039-0.287,0.121-0.492c0.082-0.203,0.123-0.348,0.123-0.428  c0-0.328-0.348-0.984-1.043-1.968c-0.123-0.04-0.757-0.185-1.904-0.431c-0.695-0.162-2.066-0.449-4.112-0.857  c-2.825-0.531-4.238-2.803-4.238-6.814c0-5.978,2.457-10.949,7.367-14.92c0.204,1.106,0.554,2.578,1.045,4.42  c0.368,0.084,1.167,0.269,2.394,0.554c0.247,0.081,1.494,0.532,3.745,1.351c-1.145-0.695-2.64-1.818-4.48-3.375  c-0.697-0.818-1.046-2.19-1.046-4.113c0-0.452,0.778-0.982,2.335-1.6c1.391-0.572,2.434-0.896,3.131-0.979  c2.209-0.286,3.908-0.431,5.096-0.431c5.115,0,9.25,1.311,12.401,3.932c-1.022,1.188-2.783,2.453-5.279,3.806  c0.982,0.041,2.415-0.347,4.298-1.168c1.882-0.815,2.68-1.228,2.394-1.228c0.327,0,0.983,0.656,1.965,1.965  c0.734,0.982,1.329,1.863,1.78,2.64c1.31,2.333,2.19,4.853,2.641,7.552c0,0.942,0.02,1.617,0.061,2.025L-750.38,170.99  L-750.38,170.99z M-773.896,172.098c0-1.761-0.767-3.429-2.301-5.006c-1.536-1.576-3.186-2.363-4.944-2.363  c-1.555,0-2.925,0.66-4.113,1.978c-1.187,1.319-1.78,2.782-1.78,4.39c0,1.4,0.675,2.309,2.026,2.719  c0.86,0.248,2.066,0.392,3.621,0.434h3.377C-775.267,174.285-773.896,173.568-773.896,172.098z M-767.203,179.71v-1.901  c-0.286-0.533-0.573-1.088-0.858-1.66c-0.246-0.817-0.697-1.963-1.351-3.439l-0.676,7.184c0,0.576-0.122,0.861-0.369,0.861  c-0.163,0-0.287-0.04-0.368-0.123c-0.287-4.338-0.429-6.222-0.429-5.646v-2.148c-0.083-0.126-0.185-0.188-0.308-0.188  c-1.391,1.437-2.086,3.748-2.086,6.938c0,1.761,0.163,2.845,0.49,3.257c0.329-0.082,0.695-0.226,1.106-0.431  c0.163-0.083,0.633-0.123,1.411-0.123c0.775,0,1.72,0.245,2.823,0.735C-767.407,183.023-767.203,181.921-767.203,179.71z   M-753.327,171.154c0-1.646-0.614-3.119-1.842-4.418c-1.228-1.297-2.64-1.945-4.234-1.945c-1.72,0-3.328,0.787-4.821,2.361  c-1.495,1.576-2.242,3.224-2.242,4.945c0,1.432,0.697,2.147,2.088,2.147h7.059C-754.657,174.204-753.327,173.176-753.327,171.154z"
+     id="path183" /><path
+     fill="#0D0F0F"
+     d="M-785.333,143.264c-2.436-2.264-4.054-3.492-4.848-3.682c-0.577-0.139-1.135,0.197-1.672,1.005  s-1.292,1.095-2.268,0.858c-0.397-0.094-1.175-0.432-2.333-1.016c-0.938,0.885-1.441,1.471-1.511,1.758  c-0.095,0.397,0.089,0.938,0.55,1.623c0.46,0.683,0.894,1.07,1.301,1.168c0.257,0.063,0.622,0.092,1.09,0.09  c0.468,0,0.777,0.015,0.926,0.051c0.444,0.105,0.469,0.971,0.079,2.597c-0.37,1.552-1.302,3.853-2.794,6.892  c-0.058-3.908-0.609-5.988-1.655-6.238c-0.145-0.035-0.469,0.003-0.972,0.111c-0.505,0.106-0.864,0.138-1.08,0.086  c-1.048-0.25-1.758-1.434-2.131-3.547c-1.722-0.145-2.757,0.506-3.103,1.949c-0.173,0.725,0.024,1.383,0.589,1.975  c0.564,0.594,0.824,0.981,0.783,1.16c-0.232,0.978-2.021,2.133-5.355,3.474c-1.777,0.723-3.007,1.229-3.688,1.524  c0.659-0.529,1.369-1.258,2.126-2.185c0.862-1.054,1.372-1.905,1.528-2.558c0.086-0.357-0.208-0.965-0.883-1.813  c-0.676-0.851-0.926-1.634-0.753-2.354c0.146-0.616,0.543-1.321,1.193-2.123c-0.34-0.653-0.834-1.059-1.484-1.213  c-1.444-0.348-2.279-0.051-2.504,0.89c0.156-0.649,0.039-0.162-0.349,1.464c-0.25,1.198-1.296,1.578-3.138,1.139  c-1.409-0.336-3.696-1.228-6.864-2.672c3.982-0.041,6.119-0.675,6.412-1.904c-0.033,0.146-0.003-0.307,0.096-1.353  c0.123-1.151,1.16-1.976,3.108-2.464c0.073-1.736-0.593-2.775-2.003-3.111c-0.216-0.055-0.706,0.229-1.463,0.85  c-0.76,0.621-1.393,0.871-1.898,0.75c-0.867-0.207-1.762-1.414-2.684-3.621c-0.426-1.096-1.087-2.723-1.982-4.885  c0.727,0.631,1.453,1.266,2.181,1.896c0.963,0.766,1.77,1.225,2.419,1.382c0.506,0.12,1.108-0.202,1.808-0.973  c0.698-0.767,1.446-1.056,2.24-0.866c0.111,0.025,0.78,0.414,2.012,1.169c0.937-0.882,1.466-1.577,1.588-2.084  c0.102-0.432-0.04-0.991-0.431-1.678c-0.389-0.685-0.802-1.078-1.235-1.185c-0.181-0.043-0.472-0.057-0.877-0.037  c-0.406,0.018-0.699,0.006-0.879-0.039c-0.65-0.155-0.781-1.045-0.392-2.67c0.102-0.436,1.111-2.809,3.022-7.125  c-0.166,0.531-0.173,1.601-0.021,3.205c0.181,1.953,0.687,3.024,1.518,3.226c0.144,0.034,0.459-0.005,0.945-0.119  c0.485-0.112,0.853-0.14,1.105-0.078c0.83,0.2,1.404,0.833,1.722,1.901l0.463,1.656c0.757,0.182,1.455,0.063,2.089-0.357  c0.636-0.421,1.046-1.012,1.227-1.77c0.189-0.793,0-1.479-0.568-2.056c-0.57-0.575-0.829-0.971-0.775-1.188  c0.181-0.758,1.68-1.754,4.495-2.987c2.26-0.987,3.709-1.539,4.349-1.653c-2.054,1.725-3.199,3.07-3.431,4.047  c-0.121,0.506,0.055,1.123,0.531,1.848c0.595,0.867,0.912,1.459,0.95,1.771c0.162,0.92-0.146,2.049-0.924,3.389  c0.811,0.92,1.469,1.439,1.977,1.562c1.044,0.25,1.699-0.167,1.958-1.25c0.027-0.108,0.063-0.462,0.112-1.06  c0.046-0.602,0.098-0.933,0.151-0.998c0.267-0.471,1.32-0.484,3.162-0.045c1.156,0.277,3.479,1.176,6.972,2.699  c-0.846,0.026-2.116,0.065-3.809,0.12c-1.549,0.087-2.388,0.403-2.519,0.945c-0.059,0.252-0.074,0.707-0.04,1.364  c0.034,0.656,0.016,1.131-0.053,1.418c-0.12,0.507-0.558,0.896-1.311,1.176l-2.156,0.859c0.246,0.899,0.42,1.438,0.531,1.615  c0.259,0.521,0.693,0.855,1.307,1.002c0.434,0.104,0.922-0.181,1.465-0.854c0.542-0.672,1.212-0.911,2.006-0.723  c0.975,0.233,1.861,1.399,2.658,3.5C-786.984,139.07-786.286,140.859-785.333,143.264z M-796.608,137.244  c0.552-2.311,0.183-4.521-1.108-6.624c-1.292-2.104-3.094-3.433-5.404-3.983c-2.349-0.564-4.573-0.209-6.671,1.066  c-2.098,1.271-3.448,3.078-4.045,5.417c-0.59,2.303-0.21,4.505,1.141,6.604c1.35,2.096,3.18,3.424,5.493,3.977  c2.455,0.586,4.698,0.273,6.725-0.939C-798.452,141.547-797.162,139.706-796.608,137.244z M-797.422,137.049  c-0.527,2.203-1.703,3.852-3.53,4.939c-1.826,1.092-3.843,1.373-6.044,0.846c-2.131-0.51-3.777-1.688-4.94-3.531  c-1.163-1.843-1.489-3.828-0.979-5.962c0.503-2.095,1.698-3.708,3.592-4.841c1.896-1.129,3.889-1.443,5.983-0.943  c2.094,0.5,3.728,1.693,4.899,3.577C-797.27,133.02-796.929,134.988-797.422,137.049z"
+     id="path185" /><g
+     id="g187"><path
+       fill="#BAB1AB"
+       d="M-649.651,119.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path189" /><path
+       fill="#C1D7E9"
+       d="M-720.354,190.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.802,0,26.301,5.594,35.349,14.637"
+       id="path191" /></g><path
+     fill="#0D0F0F"
+     d="M-693.884,153.156c-2.692,2.736-6.007,4.107-9.946,4.107c-4.422,0-7.929-1.513-10.524-4.541  c-2.452-2.885-3.677-6.56-3.677-11.027c0-4.805,2.09-10.284,6.271-16.436c3.411-5.044,7.423-9.465,12.037-13.262  c-0.673,3.077-1.009,5.262-1.009,6.559c0,2.98,0.935,5.889,2.811,8.723c2.306,3.363,4.061,5.863,5.262,7.496  c1.874,2.836,2.812,5.6,2.812,8.287C-689.847,147.055-691.194,150.416-693.884,153.156z M-693.956,137.77  c-0.721-1.611-1.561-2.681-2.523-3.211c0.145,0.289,0.216,0.697,0.216,1.228c0,1.01-0.287,2.45-0.864,4.323l-0.938,2.885  c0,1.681,0.841,2.521,2.523,2.521c1.777,0,2.668-1.178,2.668-3.531C-692.875,140.783-693.236,139.378-693.956,137.77z"
+     id="path193" /><path
+     fill="#0D0F0F"
+     d="M-645.38,170.99c0,2.701-0.982,4.544-2.947,5.525c-0.574,0.287-2.374,0.678-5.404,1.166  c-1.963,0.33-2.946,1.086-2.946,2.271v4.973c0,0.209,0.063,0.842,0.184,1.905l0.185,1.966c0,0.613-0.144,1.617-0.431,3.008  c-0.777,0.163-1.678,0.348-2.701,0.555c-0.328-1.23-0.491-2.069-0.491-2.52c0-0.203,0.05-0.512,0.153-0.921  c0.102-0.407,0.154-0.716,0.154-0.922c0-0.284-0.253-1.083-0.762-2.394h-0.953c-0.126,0.205-0.167,0.472-0.127,0.797  c0.164,0.697,0.225,1.289,0.185,1.781c-0.697,0.491-1.657,1.146-2.885,1.965c-0.289-0.082-0.389-0.123-0.308-0.123v-4.359  c-0.081-0.203-0.285-0.285-0.614-0.246h-0.737l-0.737,5.771c-0.573,0.041-1.268,0.041-2.086,0c-0.287-1.351-0.799-3.354-1.535-6.017  h-0.493c-0.45,1.433-0.695,2.211-0.737,2.334c0,0.163,0.052,0.479,0.155,0.951c0.101,0.472,0.153,0.787,0.153,0.951  c0,0.122-0.042,0.43-0.125,0.921l-0.184,1.475c-0.083,0.079-0.183,0.12-0.306,0.12c-1.228,0-2.048-0.307-2.455-0.919  c-0.412-0.615-0.576-1.475-0.493-2.58l0.493-7.365c0-0.123,0.039-0.287,0.121-0.492c0.082-0.203,0.123-0.348,0.123-0.428  c0-0.328-0.348-0.984-1.043-1.968c-0.123-0.04-0.757-0.185-1.904-0.431c-0.695-0.162-2.067-0.449-4.112-0.857  c-2.825-0.531-4.238-2.803-4.238-6.814c0-5.978,2.457-10.949,7.367-14.92c0.204,1.106,0.554,2.578,1.045,4.42  c0.368,0.084,1.167,0.269,2.394,0.554c0.247,0.081,1.494,0.532,3.745,1.351c-1.145-0.695-2.64-1.818-4.48-3.375  c-0.697-0.818-1.046-2.19-1.046-4.113c0-0.452,0.778-0.982,2.335-1.6c1.391-0.572,2.434-0.896,3.131-0.979  c2.209-0.286,3.908-0.431,5.096-0.431c5.115,0,9.25,1.311,12.401,3.932c-1.022,1.188-2.783,2.453-5.279,3.806  c0.982,0.041,2.415-0.347,4.298-1.168c1.882-0.815,2.68-1.228,2.394-1.228c0.327,0,0.983,0.656,1.965,1.965  c0.735,0.982,1.329,1.863,1.78,2.64c1.31,2.333,2.19,4.853,2.641,7.552c0,0.942,0.02,1.617,0.061,2.025L-645.38,170.99  L-645.38,170.99z M-668.896,172.098c0-1.761-0.767-3.429-2.301-5.006c-1.536-1.576-3.185-2.363-4.944-2.363  c-1.555,0-2.925,0.66-4.113,1.978c-1.187,1.319-1.78,2.782-1.78,4.39c0,1.4,0.675,2.309,2.026,2.719  c0.86,0.248,2.066,0.392,3.621,0.434h3.377C-670.267,174.285-668.896,173.568-668.896,172.098z M-662.203,179.71v-1.901  c-0.286-0.533-0.573-1.088-0.858-1.66c-0.246-0.817-0.697-1.963-1.351-3.439l-0.676,7.184c0,0.576-0.122,0.861-0.369,0.861  c-0.163,0-0.287-0.04-0.368-0.123c-0.287-4.338-0.429-6.222-0.429-5.646v-2.148c-0.083-0.126-0.185-0.188-0.308-0.188  c-1.391,1.437-2.086,3.748-2.086,6.938c0,1.761,0.163,2.845,0.49,3.257c0.329-0.082,0.695-0.226,1.107-0.431  c0.163-0.083,0.633-0.123,1.411-0.123c0.775,0,1.72,0.245,2.823,0.735C-662.407,183.023-662.203,181.921-662.203,179.71z   M-648.327,171.154c0-1.646-0.614-3.119-1.842-4.418c-1.228-1.297-2.64-1.945-4.234-1.945c-1.72,0-3.328,0.787-4.821,2.361  c-1.495,1.576-2.242,3.224-2.242,4.945c0,1.432,0.697,2.147,2.088,2.147h7.059C-649.657,174.204-648.327,173.176-648.327,171.154z"
+     id="path195" /><g
+     id="g197"><path
+       fill="#E49977"
+       d="M-544.651,119.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path199" /><path
+       fill="#C1D7E9"
+       d="M-615.354,190.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.802,0,26.301,5.594,35.349,14.637"
+       id="path201" /></g><path
+     fill="#0D0F0F"
+     d="M-541.7,179.439c-1.718,4.1-5.13,6.146-10.24,6.146c-0.937,0-1.952,0.115-3.044,0.35  c-1.639,0.353-2.458,0.84-2.458,1.465c0,0.195,0.136,0.418,0.41,0.674c0.272,0.253,0.508,0.381,0.703,0.381  c-0.977,0-0.314,0.029,1.987,0.085c2.303,0.06,3.747,0.089,4.333,0.089c-3.394,1.989-9.07,2.906-17.029,2.75  c-2.614-0.037-4.857-1.188-6.729-3.451c-1.835-2.146-2.751-4.545-2.751-7.197c0-2.81,0.946-5.198,2.839-7.17  c1.89-1.968,4.242-2.953,7.051-2.953c0.623,0,1.453,0.137,2.486,0.408c1.034,0.273,1.727,0.41,2.077,0.41  c1.444,0,3.239-0.597,5.385-1.785c2.146-1.189,3.16-1.785,3.043-1.785c-0.391,4.097-1.756,6.849-4.097,8.25  c-1.678,0.978-2.516,1.934-2.516,2.867c0,0.586,0.35,1.055,1.052,1.406c0.546,0.271,1.151,0.408,1.815,0.408  c1.014,0,2.008-0.623,2.984-1.872c0.974-1.247,1.403-2.379,1.286-3.394c-0.116-1.172-0.037-2.576,0.235-4.213  c0.077-0.47,0.361-1.045,0.848-1.727c0.488-0.684,0.928-1.104,1.317-1.262c0,0.354-0.127,0.939-0.38,1.756  c-0.254,0.82-0.38,1.427-0.38,1.814c0,0.86,0.234,1.523,0.703,1.99c0.701-0.271,1.324-1.15,1.872-2.634  c0.468-1.13,0.74-2.224,0.82-3.274c-1.64-0.078-3.211-0.82-4.711-2.227c-1.501-1.404-2.252-2.925-2.252-4.563  c0-0.271,0.037-0.547,0.117-0.819c0.232,0.353,0.583,0.899,1.053,1.64c0.662,0.975,1.17,1.463,1.521,1.463  c0.468,0,0.702-0.488,0.702-1.463c0-1.249-0.332-2.38-0.995-3.395c-0.743-1.211-1.699-1.814-2.867-1.814  c-0.548,0-1.366,0.292-2.458,0.878c-1.093,0.584-2.088,0.878-2.983,0.878c-0.273,0-1.484-0.353-3.629-1.054  c3.783-0.625,5.676-1.19,5.676-1.699c0-1.325-2.594-2.223-7.783-2.688c-0.508-0.039-1.443-0.117-2.809-0.235  c0.155-0.194,1.268-0.407,3.336-0.644c1.755-0.192,2.983-0.293,3.685-0.293c9.285,0,15.175,4.506,17.673,13.521  c0.431-0.358,0.645-0.95,0.645-1.78c0-1.068-0.312-2.412-0.937-4.033c-0.235-0.635-0.607-1.584-1.113-2.849  c3.198,4.075,4.8,7.938,4.8,11.583c0,1.922-0.451,3.667-1.348,5.232c-0.583,1.059-1.678,2.41-3.276,4.059  c-1.6,1.645-2.691,2.919-3.277,3.821c2.146-0.586,3.551-1.035,4.214-1.347c1.481-0.664,2.828-1.66,4.037-2.985  C-541.057,177.668-541.272,178.43-541.7,179.439z M-567.214,156.443c0,0.701-0.391,1.152-1.17,1.348l-1.521,0.232  c-0.547,0.272-1.347,1.348-2.398,3.219c-0.119-0.584-0.293-1.403-0.528-2.457c-0.351,0.037-0.935,0.352-1.755,0.936  c-0.351,0.273-0.917,0.684-1.699,1.229c0.235-1.403,1.017-2.826,2.342-4.271c1.404-1.598,2.77-2.396,4.096-2.396  C-568.092,154.281-567.214,155.002-567.214,156.443z M-557.032,161.828c0,0.662-0.361,1.22-1.083,1.668  c-0.722,0.447-1.434,0.673-2.135,0.673c-0.938,0-1.777-0.524-2.517-1.581c-0.898-1.285-1.814-2.125-2.75-2.516  c0.194-0.195,0.429-0.293,0.704-0.293c0.349,0,0.944,0.271,1.783,0.818c0.837,0.549,1.375,0.82,1.61,0.82  c0.195,0,0.516-0.271,0.964-0.82c0.448-0.547,0.946-0.818,1.493-0.818C-557.675,159.779-557.032,160.463-557.032,161.828z"
+     id="path203" /><path
+     fill="#0D0F0F"
+     d="M-588.884,153.156c-2.693,2.736-6.007,4.107-9.946,4.107c-4.422,0-7.929-1.513-10.524-4.541  c-2.452-2.885-3.677-6.56-3.677-11.027c0-4.805,2.09-10.284,6.272-16.436c3.411-5.044,7.423-9.465,12.037-13.262  c-0.673,3.077-1.009,5.262-1.009,6.559c0,2.98,0.935,5.889,2.811,8.723c2.306,3.363,4.061,5.863,5.262,7.496  c1.874,2.836,2.812,5.6,2.812,8.287C-584.847,147.055-586.194,150.416-588.884,153.156z M-588.956,137.77  c-0.721-1.611-1.561-2.681-2.523-3.211c0.145,0.289,0.216,0.697,0.216,1.228c0,1.01-0.287,2.45-0.864,4.323l-0.938,2.885  c0,1.681,0.841,2.521,2.523,2.521c1.777,0,2.668-1.178,2.668-3.531C-587.875,140.783-588.236,139.378-588.956,137.77z"
+     id="path205" /><g
+     id="g207"><path
+       fill="#E49977"
+       d="M-439.651,119.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path209" /><path
+       fill="#BAB1AB"
+       d="M-510.354,190.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.802,0,26.301,5.594,35.349,14.637"
+       id="path211" /></g><path
+     fill="#0D0F0F"
+     d="M-436.7,179.439c-1.718,4.1-5.13,6.146-10.24,6.146c-0.937,0-1.952,0.115-3.044,0.35  c-1.639,0.353-2.458,0.84-2.458,1.465c0,0.195,0.136,0.418,0.41,0.674c0.271,0.253,0.508,0.381,0.703,0.381  c-0.977,0-0.314,0.029,1.987,0.085c2.303,0.06,3.747,0.089,4.333,0.089c-3.394,1.989-9.07,2.906-17.029,2.75  c-2.614-0.037-4.857-1.188-6.729-3.451c-1.835-2.146-2.751-4.545-2.751-7.197c0-2.81,0.946-5.198,2.839-7.17  c1.89-1.968,4.242-2.953,7.051-2.953c0.623,0,1.453,0.137,2.486,0.408c1.034,0.273,1.727,0.41,2.077,0.41  c1.444,0,3.239-0.597,5.385-1.785c2.146-1.189,3.16-1.785,3.043-1.785c-0.391,4.097-1.756,6.849-4.097,8.25  c-1.678,0.978-2.516,1.934-2.516,2.867c0,0.586,0.35,1.055,1.052,1.406c0.546,0.271,1.151,0.408,1.815,0.408  c1.014,0,2.008-0.623,2.984-1.872c0.974-1.247,1.403-2.379,1.286-3.394c-0.116-1.172-0.037-2.576,0.235-4.213  c0.077-0.47,0.361-1.045,0.848-1.727c0.488-0.684,0.928-1.104,1.317-1.262c0,0.354-0.127,0.939-0.38,1.756  c-0.254,0.82-0.38,1.427-0.38,1.814c0,0.86,0.234,1.523,0.703,1.99c0.701-0.271,1.324-1.15,1.872-2.634  c0.468-1.13,0.74-2.224,0.82-3.274c-1.64-0.078-3.211-0.82-4.711-2.227c-1.501-1.404-2.252-2.925-2.252-4.563  c0-0.271,0.037-0.547,0.117-0.819c0.232,0.353,0.583,0.899,1.053,1.64c0.662,0.975,1.17,1.463,1.521,1.463  c0.468,0,0.702-0.488,0.702-1.463c0-1.249-0.332-2.38-0.995-3.395c-0.743-1.211-1.699-1.814-2.867-1.814  c-0.548,0-1.366,0.292-2.458,0.878c-1.093,0.584-2.088,0.878-2.983,0.878c-0.273,0-1.484-0.353-3.629-1.054  c3.783-0.625,5.676-1.19,5.676-1.699c0-1.325-2.594-2.223-7.783-2.688c-0.508-0.039-1.443-0.117-2.809-0.235  c0.155-0.194,1.268-0.407,3.336-0.644c1.755-0.192,2.983-0.293,3.685-0.293c9.285,0,15.175,4.506,17.673,13.521  c0.431-0.358,0.646-0.95,0.646-1.78c0-1.068-0.313-2.412-0.938-4.033c-0.235-0.635-0.607-1.584-1.113-2.849  c3.198,4.075,4.8,7.938,4.8,11.583c0,1.922-0.451,3.667-1.348,5.232c-0.583,1.059-1.678,2.41-3.276,4.059  c-1.6,1.645-2.691,2.919-3.277,3.821c2.146-0.586,3.551-1.035,4.214-1.347c1.481-0.664,2.828-1.66,4.037-2.985  C-436.057,177.668-436.272,178.43-436.7,179.439z M-462.214,156.443c0,0.701-0.391,1.152-1.17,1.348l-1.521,0.232  c-0.547,0.272-1.347,1.348-2.398,3.219c-0.119-0.584-0.293-1.403-0.528-2.457c-0.351,0.037-0.935,0.352-1.755,0.936  c-0.351,0.273-0.917,0.684-1.699,1.229c0.235-1.403,1.017-2.826,2.342-4.271c1.404-1.598,2.77-2.396,4.096-2.396  C-463.092,154.281-462.214,155.002-462.214,156.443z M-452.032,161.828c0,0.662-0.361,1.22-1.083,1.668  c-0.722,0.447-1.434,0.673-2.135,0.673c-0.938,0-1.777-0.524-2.517-1.581c-0.898-1.285-1.814-2.125-2.75-2.516  c0.194-0.195,0.429-0.293,0.704-0.293c0.349,0,0.944,0.271,1.783,0.818c0.837,0.549,1.375,0.82,1.61,0.82  c0.195,0,0.516-0.271,0.964-0.82c0.448-0.547,0.946-0.818,1.493-0.818C-452.675,159.779-452.032,160.463-452.032,161.828z"
+     id="path213" /><path
+     fill="#0D0F0F"
+     d="M-471.743,133.111c0,2.701-0.982,4.543-2.948,5.525c-0.574,0.287-2.373,0.678-5.403,1.166  c-1.964,0.329-2.946,1.088-2.946,2.271v4.973c0,0.209,0.063,0.842,0.184,1.906l0.185,1.965c0,0.613-0.144,1.617-0.431,3.008  c-0.777,0.163-1.678,0.348-2.7,0.555c-0.329-1.229-0.491-2.069-0.491-2.52c0-0.203,0.05-0.512,0.152-0.921  c0.102-0.408,0.154-0.716,0.154-0.921c0-0.284-0.253-1.084-0.762-2.393h-0.953c-0.126,0.203-0.167,0.469-0.127,0.795  c0.165,0.696,0.225,1.289,0.185,1.781c-0.697,0.491-1.657,1.146-2.885,1.965c-0.289-0.082-0.389-0.123-0.308-0.123v-4.359  c-0.082-0.202-0.286-0.285-0.614-0.245h-0.737l-0.737,5.771c-0.573,0.041-1.268,0.041-2.086,0c-0.287-1.35-0.799-3.354-1.534-6.015  h-0.493c-0.45,1.433-0.696,2.21-0.737,2.333c0,0.163,0.052,0.48,0.155,0.951c0.101,0.471,0.152,0.787,0.152,0.951  c0,0.121-0.042,0.43-0.125,0.921l-0.183,1.474c-0.083,0.08-0.184,0.121-0.307,0.121c-1.228,0-2.048-0.306-2.455-0.919  c-0.411-0.614-0.576-1.476-0.493-2.58l0.493-7.366c0-0.121,0.039-0.285,0.121-0.492c0.082-0.203,0.123-0.348,0.123-0.428  c0-0.328-0.348-0.984-1.043-1.967c-0.123-0.039-0.758-0.184-1.904-0.43c-0.696-0.163-2.067-0.45-4.112-0.858  c-2.824-0.53-4.237-2.803-4.237-6.815c0-5.977,2.456-10.948,7.367-14.918c0.204,1.105,0.553,2.576,1.044,4.418  c0.368,0.086,1.167,0.27,2.394,0.555c0.247,0.081,1.495,0.533,3.745,1.352c-1.146-0.695-2.64-1.82-4.48-3.377  c-0.697-0.818-1.046-2.189-1.046-4.113c0-0.45,0.778-0.981,2.335-1.599c1.391-0.571,2.434-0.897,3.131-0.979  c2.209-0.286,3.908-0.432,5.096-0.432c5.115,0,9.249,1.312,12.401,3.932c-1.022,1.188-2.783,2.453-5.279,3.807  c0.982,0.041,2.415-0.348,4.298-1.168c1.882-0.816,2.68-1.227,2.394-1.227c0.327,0,0.982,0.654,1.965,1.963  c0.735,0.982,1.329,1.865,1.78,2.641c1.31,2.333,2.19,4.852,2.641,7.553c0,0.941,0.02,1.616,0.061,2.024V133.111z M-495.259,134.219  c0-1.761-0.767-3.429-2.301-5.006c-1.536-1.576-3.184-2.363-4.943-2.363c-1.555,0-2.925,0.66-4.114,1.978  c-1.187,1.319-1.78,2.782-1.78,4.389c0,1.401,0.675,2.31,2.027,2.72c0.859,0.248,2.065,0.392,3.621,0.434h3.376  C-496.631,136.407-495.259,135.689-495.259,134.219z M-488.567,141.831v-1.901c-0.286-0.533-0.573-1.087-0.858-1.66  c-0.246-0.817-0.697-1.963-1.351-3.439l-0.676,7.186c0,0.574-0.121,0.859-0.368,0.859c-0.163,0-0.287-0.04-0.369-0.122  c-0.287-4.339-0.429-6.224-0.429-5.647v-2.148c-0.083-0.126-0.185-0.188-0.308-0.188c-1.391,1.437-2.086,3.748-2.086,6.938  c0,1.761,0.163,2.845,0.49,3.257c0.329-0.083,0.695-0.226,1.107-0.431c0.163-0.083,0.633-0.123,1.412-0.123  c0.775,0,1.719,0.246,2.823,0.735C-488.771,145.146-488.567,144.042-488.567,141.831z M-474.691,133.275  c0-1.646-0.614-3.118-1.842-4.418c-1.229-1.297-2.64-1.945-4.235-1.945c-1.719,0-3.328,0.787-4.821,2.363  c-1.494,1.574-2.242,3.223-2.242,4.942c0,1.433,0.697,2.148,2.088,2.148h7.06C-476.021,136.325-474.691,135.297-474.691,133.275z"
+     id="path215" /><g
+     id="g217"><path
+       fill="#A3C095"
+       d="M-334.651,119.637c9.053,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path219" /><path
+       fill="#BAB1AB"
+       d="M-405.354,190.354c-9.05-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.802,0,26.301,5.594,35.349,14.637"
+       id="path221" /></g><path
+     fill="#0D0F0F"
+     d="M-366.743,133.111c0,2.701-0.982,4.543-2.947,5.525c-0.574,0.287-2.374,0.678-5.404,1.166  c-1.963,0.329-2.945,1.088-2.945,2.271v4.973c0,0.209,0.062,0.842,0.184,1.906l0.185,1.965c0,0.613-0.144,1.617-0.431,3.008  c-0.776,0.163-1.678,0.348-2.7,0.555c-0.328-1.229-0.491-2.069-0.491-2.52c0-0.203,0.05-0.512,0.152-0.921  c0.102-0.408,0.153-0.716,0.153-0.921c0-0.284-0.253-1.084-0.762-2.393h-0.953c-0.125,0.203-0.167,0.469-0.127,0.795  c0.164,0.696,0.225,1.289,0.186,1.781c-0.697,0.491-1.657,1.146-2.886,1.965c-0.288-0.082-0.39-0.123-0.308-0.123v-4.359  c-0.082-0.202-0.286-0.285-0.614-0.245h-0.737l-0.736,5.771c-0.572,0.041-1.269,0.041-2.086,0c-0.287-1.35-0.8-3.354-1.535-6.015  h-0.492c-0.45,1.433-0.695,2.21-0.737,2.333c0,0.163,0.052,0.48,0.155,0.951c0.101,0.471,0.152,0.787,0.152,0.951  c0,0.121-0.041,0.43-0.124,0.921l-0.184,1.474c-0.083,0.08-0.184,0.121-0.306,0.121c-1.229,0-2.048-0.306-2.455-0.919  c-0.411-0.614-0.575-1.476-0.493-2.58l0.493-7.366c0-0.121,0.038-0.285,0.121-0.492c0.082-0.203,0.123-0.348,0.123-0.428  c0-0.328-0.348-0.984-1.043-1.967c-0.123-0.039-0.758-0.184-1.904-0.43c-0.695-0.163-2.067-0.45-4.112-0.858  c-2.824-0.53-4.237-2.803-4.237-6.815c0-5.977,2.456-10.948,7.367-14.918c0.204,1.105,0.553,2.576,1.044,4.418  c0.369,0.086,1.168,0.27,2.396,0.555c0.247,0.081,1.494,0.533,3.745,1.352c-1.146-0.695-2.64-1.82-4.48-3.377  c-0.697-0.818-1.046-2.189-1.046-4.113c0-0.45,0.778-0.981,2.335-1.599c1.391-0.571,2.434-0.897,3.131-0.979  c2.209-0.286,3.907-0.432,5.096-0.432c5.115,0,9.249,1.312,12.4,3.932c-1.022,1.188-2.783,2.453-5.279,3.807  c0.982,0.041,2.415-0.348,4.299-1.168c1.882-0.816,2.68-1.227,2.394-1.227c0.327,0,0.982,0.654,1.965,1.963  c0.735,0.982,1.329,1.865,1.78,2.641c1.31,2.333,2.19,4.852,2.642,7.553c0,0.941,0.019,1.616,0.061,2.024v0.489H-366.743z   M-390.259,134.219c0-1.761-0.767-3.429-2.302-5.006c-1.535-1.576-3.184-2.363-4.943-2.363c-1.555,0-2.925,0.66-4.113,1.978  c-1.187,1.319-1.779,2.782-1.779,4.389c0,1.401,0.674,2.31,2.026,2.72c0.86,0.248,2.065,0.392,3.621,0.434h3.376  C-391.631,136.407-390.259,135.689-390.259,134.219z M-383.566,141.831v-1.901c-0.286-0.533-0.573-1.087-0.858-1.66  c-0.246-0.817-0.697-1.963-1.352-3.439l-0.676,7.186c0,0.574-0.121,0.859-0.368,0.859c-0.163,0-0.287-0.04-0.369-0.122  c-0.286-4.339-0.429-6.224-0.429-5.647v-2.148c-0.083-0.126-0.185-0.188-0.308-0.188c-1.391,1.437-2.086,3.748-2.086,6.938  c0,1.761,0.162,2.845,0.489,3.257c0.328-0.083,0.695-0.226,1.106-0.431c0.163-0.083,0.634-0.123,1.412-0.123  c0.775,0,1.719,0.246,2.823,0.735C-383.771,145.146-383.566,144.042-383.566,141.831z M-369.69,133.275  c0-1.646-0.614-3.118-1.843-4.418c-1.229-1.297-2.64-1.945-4.234-1.945c-1.72,0-3.328,0.787-4.82,2.363  c-1.495,1.574-2.242,3.223-2.242,4.942c0,1.433,0.697,2.148,2.088,2.148h7.06C-371.021,136.325-369.69,135.297-369.69,133.275z"
+     id="path223" /><path
+     fill="#0D0F0F"
+     d="M-330.481,172.618c0,0.758-0.293,1.437-0.879,2.043c-0.586,0.604-1.258,0.905-2.016,0.905  c-1.207,0-2.098-0.566-2.663-1.701l-2.667-0.112c-0.567,0-1.684,0.246-3.345,0.737c-1.777,0.49-2.798,0.888-3.064,1.189  c-0.414,0.454-0.755,1.514-1.02,3.178c-0.228,1.36-0.339,2.363-0.339,3.006c0,1.02,0.16,1.768,0.48,2.24  c0.321,0.473,0.984,0.869,1.984,1.189c1,0.318,1.616,0.502,1.844,0.539c0.151,0,0.396-0.018,0.737-0.057h0.681  c0.491,0,1.001,0.076,1.532,0.227c0.755,0.227,1.077,0.527,0.965,0.907c-0.531-0.074-1.456,0.038-2.778,0.34l1.586,0.795  c0,0.454-0.643,0.679-1.928,0.679c-0.342,0-0.806-0.072-1.39-0.225c-0.588-0.154-0.976-0.229-1.163-0.229h-0.737  c-0.038,0.379-0.15,0.943-0.34,1.701c-0.646-0.037-1.399-0.416-2.27-1.133c-0.87-0.72-1.418-1.079-1.643-1.079  c-0.228,0-0.551,0.359-0.965,1.079c-0.417,0.717-0.624,1.207-0.624,1.475c-0.491-0.268-0.906-0.758-1.249-1.475  c-0.151-0.494-0.321-0.986-0.509-1.479c-0.379,0.039-1.077,0.836-2.099,2.385h-0.284c-0.077-0.113-0.36-0.906-0.852-2.385  c-1.172-0.375-2.268-0.563-3.288-0.563c-0.491,0-1.249,0.112-2.27,0.341l-1.587-0.113c0.226-0.228,0.888-0.662,1.984-1.305  c1.284-0.758,2.269-1.137,2.949-1.137c0.112,0,0.264,0.021,0.454,0.059c0.188,0.039,0.341,0.058,0.454,0.058  c0.262,0,0.689-0.142,1.275-0.427c0.586-0.283,0.927-0.539,1.019-0.766c0.098-0.229,0.145-0.813,0.145-1.759  c0-2.153-0.568-3.763-1.703-4.819c-0.983-0.945-2.608-1.625-4.877-2.043c-0.604,2.154-2.307,3.234-5.103,3.234  c-0.909,0-1.816-0.549-2.723-1.646c-0.907-1.098-1.361-2.099-1.361-3.007c0-1.399,0.586-2.551,1.758-3.459  c-0.944-0.981-1.418-1.983-1.418-3.006c0-0.944,0.292-1.776,0.879-2.496c0.586-0.716,1.353-1.133,2.297-1.248  c-0.074-1.208,0.321-2.042,1.19-2.495c-0.415-0.414-0.622-1.15-0.622-2.211c0-1.246,0.414-2.287,1.247-3.119  c0.83-0.83,1.871-1.248,3.117-1.248c1.363,0,2.479,0.475,3.348,1.418c1.098-3.742,3.459-5.613,7.089-5.613  c1.889,0,3.554,0.756,4.99,2.27c0.53,0.565,0.793,0.868,0.793,0.905c-0.452,0-0.225-0.086,0.681-0.254  c0.909-0.171,1.568-0.257,1.986-0.257c1.474,0,2.778,0.55,3.915,1.646c0.982,0.984,1.663,2.229,2.042,3.742  c0.263,0.039,0.679,0.151,1.245,0.341c0.832,0.417,1.249,1.135,1.249,2.155c0,0.188-0.152,0.549-0.454,1.079  c2.419,1.361,3.63,3.251,3.63,5.67c0,0.681-0.266,1.627-0.793,2.836C-330.973,170.689-330.481,171.521-330.481,172.618z   M-353.849,175.113v-0.736c0-0.869-0.424-1.664-1.275-2.382c-0.851-0.72-1.71-1.077-2.58-1.077c-1.06,0-2.042,0.246-2.949,0.734  C-358.649,171.542-356.382,172.693-353.849,175.113z M-354.869,168.083c-0.566-0.646-1.058-1.306-1.474-1.985  c-1.589,0.414-2.383,0.889-2.383,1.416c0.453-0.037,1.116,0.047,1.984,0.256C-355.872,167.979-355.246,168.083-354.869,168.083z   M-351.407,166.322v-2.495c-0.909-0.149-1.459-0.226-1.646-0.226v0.851L-351.407,166.322z M-344.035,164.736  c-0.454-0.189-1.305-0.568-2.554-1.135v4.877C-344.811,167.456-343.961,166.21-344.035,164.736z M-340.919,171.428l-1.246-1.529  c-0.755,0.529-1.521,1.066-2.298,1.615c-0.775,0.547-1.445,1.162-2.011,1.844C-344.775,172.447-342.92,171.807-340.919,171.428z"
+     id="path225" /><g
+     id="g227"><path
+       fill="#F8F6D8"
+       d="M-229.651,119.637c9.053,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path229" /><path
+       fill="#E49977"
+       d="M-300.354,190.354c-9.05-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.802,0,26.301,5.594,35.349,14.637"
+       id="path231" /></g><path
+     fill="#0D0F0F"
+     d="M-227,178.111c-2.436-2.264-4.054-3.491-4.848-3.682c-0.576-0.138-1.135,0.198-1.672,1.006  s-1.291,1.092-2.268,0.858c-0.396-0.095-1.175-0.435-2.334-1.017c-0.938,0.885-1.441,1.471-1.511,1.758  c-0.095,0.398,0.089,0.938,0.551,1.621c0.46,0.685,0.894,1.072,1.301,1.171c0.257,0.062,0.621,0.091,1.09,0.089  c0.468-0.001,0.777,0.016,0.927,0.051c0.443,0.104,0.469,0.971,0.078,2.598c-0.37,1.552-1.302,3.852-2.793,6.892  c-0.059-3.909-0.61-5.989-1.656-6.239c-0.145-0.035-0.469,0.004-0.972,0.111c-0.505,0.107-0.864,0.137-1.08,0.085  c-1.048-0.251-1.758-1.433-2.131-3.546c-1.723-0.145-2.757,0.506-3.103,1.949c-0.174,0.726,0.023,1.383,0.589,1.976  c0.563,0.592,0.823,0.979,0.782,1.16c-0.233,0.978-2.021,2.133-5.355,3.473c-1.776,0.722-3.007,1.228-3.688,1.522  c0.659-0.528,1.369-1.256,2.127-2.182c0.862-1.057,1.371-1.906,1.528-2.559c0.086-0.359-0.209-0.966-0.884-1.814  c-0.676-0.849-0.926-1.634-0.753-2.355c0.146-0.614,0.543-1.319,1.194-2.12c-0.341-0.653-0.835-1.06-1.485-1.215  c-1.444-0.347-2.279-0.05-2.504,0.891c0.155-0.651,0.038-0.163-0.35,1.462c-0.25,1.2-1.296,1.58-3.138,1.141  c-1.409-0.338-3.696-1.229-6.864-2.674c3.981-0.039,6.118-0.674,6.411-1.901c-0.032,0.146-0.003-0.308,0.097-1.353  c0.122-1.154,1.16-1.977,3.108-2.465c0.072-1.738-0.594-2.777-2.004-3.113c-0.216-0.053-0.705,0.231-1.463,0.853  c-0.761,0.619-1.393,0.87-1.898,0.748c-0.867-0.205-1.763-1.413-2.684-3.62c-0.427-1.095-1.088-2.723-1.983-4.885  c0.727,0.632,1.453,1.266,2.182,1.896c0.963,0.766,1.77,1.226,2.419,1.383c0.506,0.119,1.108-0.205,1.808-0.974  c0.699-0.768,1.446-1.058,2.24-0.866c0.111,0.026,0.78,0.414,2.013,1.168c0.937-0.883,1.466-1.576,1.588-2.082  c0.102-0.435-0.04-0.994-0.431-1.679c-0.39-0.687-0.802-1.079-1.235-1.184c-0.181-0.044-0.473-0.058-0.878-0.039  c-0.405,0.019-0.698,0.005-0.879-0.038c-0.649-0.155-0.781-1.045-0.392-2.671c0.102-0.435,1.11-2.81,3.022-7.123  c-0.166,0.53-0.173,1.601-0.021,3.202c0.181,1.953,0.687,3.027,1.518,3.228c0.144,0.033,0.459-0.005,0.946-0.118  c0.485-0.113,0.852-0.14,1.104-0.078c0.83,0.197,1.404,0.832,1.723,1.9l0.463,1.655c0.758,0.183,1.455,0.063,2.09-0.357  c0.636-0.421,1.046-1.011,1.227-1.769c0.189-0.795,0-1.479-0.568-2.055c-0.569-0.576-0.829-0.972-0.775-1.188  c0.181-0.758,1.68-1.755,4.495-2.99c2.26-0.985,3.709-1.536,4.349-1.651c-2.054,1.725-3.199,3.07-3.432,4.047  c-0.121,0.507,0.055,1.121,0.531,1.848c0.595,0.867,0.912,1.459,0.95,1.771c0.161,0.92-0.146,2.047-0.925,3.39  c0.811,0.92,1.47,1.438,1.977,1.562c1.045,0.25,1.699-0.168,1.958-1.25c0.026-0.109,0.063-0.463,0.112-1.063  c0.046-0.6,0.098-0.932,0.151-0.995c0.266-0.472,1.319-0.487,3.161-0.045c1.156,0.276,3.479,1.175,6.973,2.698  c-0.847,0.027-2.116,0.066-3.809,0.121c-1.55,0.086-2.389,0.401-2.519,0.942c-0.06,0.253-0.074,0.708-0.04,1.364  c0.034,0.656,0.017,1.132-0.053,1.421c-0.12,0.506-0.559,0.896-1.312,1.175l-2.155,0.859c0.245,0.898,0.42,1.438,0.531,1.615  c0.259,0.521,0.692,0.854,1.306,1.002c0.434,0.104,0.922-0.18,1.465-0.854c0.542-0.672,1.212-0.913,2.007-0.722  c0.975,0.232,1.861,1.398,2.657,3.499C-228.651,173.917-227.953,175.708-227,178.111z M-238.274,172.092  c0.552-2.313,0.184-4.52-1.108-6.623s-3.094-3.433-5.404-3.986c-2.348-0.561-4.573-0.205-6.671,1.07  c-2.099,1.27-3.448,3.077-4.046,5.416c-0.59,2.303-0.21,4.504,1.141,6.604c1.35,2.098,3.18,3.425,5.493,3.978  c2.454,0.587,4.697,0.274,6.725-0.94C-240.118,176.396-238.828,174.555-238.274,172.092z M-239.089,171.896  c-0.526,2.203-1.703,3.851-3.53,4.939c-1.826,1.09-3.843,1.373-6.044,0.846c-2.131-0.51-3.777-1.687-4.94-3.531  c-1.163-1.844-1.489-3.83-0.979-5.961c0.503-2.096,1.698-3.709,3.592-4.842c1.896-1.13,3.889-1.445,5.984-0.943  c2.094,0.5,3.727,1.693,4.898,3.576C-238.937,167.867-238.596,169.838-239.089,171.896z"
+     id="path233" /><path
+     fill="#0D0F0F"
+     d="M-263.063,143.077c-1.718,4.099-5.13,6.146-10.24,6.146c-0.937,0-1.952,0.115-3.044,0.35  c-1.639,0.353-2.457,0.841-2.457,1.465c0,0.195,0.136,0.418,0.409,0.674c0.272,0.253,0.508,0.38,0.703,0.38  c-0.977,0-0.313,0.03,1.987,0.086c2.302,0.06,3.746,0.089,4.332,0.089c-3.395,1.988-9.07,2.906-17.029,2.75  c-2.614-0.037-4.857-1.188-6.729-3.451c-1.834-2.146-2.75-4.545-2.75-7.196c0-2.81,0.945-5.199,2.839-7.171  c1.89-1.967,4.242-2.953,7.051-2.953c0.623,0,1.453,0.137,2.486,0.408c1.034,0.273,1.727,0.41,2.077,0.41  c1.444,0,3.238-0.597,5.384-1.785c2.146-1.19,3.161-1.785,3.044-1.785c-0.391,4.096-1.756,6.848-4.097,8.251  c-1.679,0.978-2.516,1.933-2.516,2.866c0,0.586,0.349,1.055,1.052,1.406c0.546,0.271,1.151,0.408,1.815,0.408  c1.014,0,2.008-0.623,2.984-1.871c0.974-1.248,1.403-2.38,1.286-3.396c-0.115-1.171-0.037-2.576,0.235-4.212  c0.077-0.471,0.361-1.045,0.848-1.727c0.488-0.684,0.928-1.104,1.317-1.261c0,0.353-0.128,0.938-0.381,1.755  c-0.254,0.819-0.38,1.428-0.38,1.814c0,0.859,0.233,1.522,0.702,1.99c0.702-0.271,1.325-1.15,1.872-2.634  c0.468-1.131,0.74-2.224,0.82-3.276c-1.64-0.075-3.211-0.818-4.712-2.225c-1.502-1.404-2.252-2.926-2.252-4.563  c0-0.272,0.037-0.547,0.117-0.819c0.232,0.353,0.583,0.899,1.054,1.64c0.661,0.973,1.17,1.461,1.521,1.461  c0.468,0,0.701-0.488,0.701-1.461c0-1.248-0.331-2.379-0.994-3.395c-0.742-1.211-1.698-1.814-2.867-1.814  c-0.548,0-1.366,0.293-2.458,0.879c-1.093,0.584-2.088,0.877-2.982,0.877c-0.274,0-1.484-0.354-3.63-1.055  c3.783-0.624,5.676-1.189,5.676-1.697c0-1.326-2.594-2.224-7.783-2.69c-0.507-0.038-1.442-0.116-2.808-0.235  c0.155-0.193,1.268-0.408,3.336-0.644c1.755-0.192,2.983-0.294,3.685-0.294c9.285,0,15.175,4.508,17.673,13.521  c0.431-0.357,0.646-0.949,0.646-1.779c0-1.069-0.313-2.414-0.937-4.035c-0.235-0.633-0.607-1.584-1.113-2.848  c3.197,4.075,4.8,7.938,4.8,11.584c0,1.92-0.451,3.666-1.348,5.23c-0.583,1.061-1.678,2.412-3.276,4.059  c-1.599,1.646-2.691,2.92-3.277,3.822c2.146-0.586,3.552-1.036,4.215-1.348c1.48-0.663,2.827-1.659,4.036-2.984  C-262.421,141.305-262.636,142.064-263.063,143.077z M-288.578,120.08c0,0.702-0.391,1.15-1.17,1.348l-1.521,0.233  c-0.548,0.271-1.347,1.346-2.398,3.218c-0.118-0.584-0.293-1.404-0.528-2.458c-0.351,0.039-0.936,0.353-1.755,0.937  c-0.351,0.272-0.917,0.684-1.698,1.229c0.235-1.404,1.017-2.826,2.342-4.271c1.404-1.599,2.771-2.396,4.096-2.396  C-289.455,117.917-288.578,118.639-288.578,120.08z M-278.396,125.465c0,0.661-0.36,1.221-1.083,1.668  c-0.722,0.448-1.434,0.674-2.135,0.674c-0.938,0-1.777-0.525-2.517-1.582c-0.898-1.285-1.814-2.125-2.751-2.516  c0.193-0.195,0.429-0.293,0.704-0.293c0.35,0,0.944,0.271,1.783,0.818c0.837,0.549,1.374,0.82,1.609,0.82  c0.195,0,0.517-0.271,0.965-0.82c0.448-0.547,0.945-0.818,1.493-0.818C-279.039,123.416-278.396,124.1-278.396,125.465z"
+     id="path235" /><g
+     id="g237"><path
+       fill="#A3C095"
+       d="M-124.651,119.637c9.053,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path239" /><path
+       fill="#E49977"
+       d="M-195.354,190.354c-9.05-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.802,0,26.301,5.594,35.349,14.637"
+       id="path241" /></g><path
+     fill="#0D0F0F"
+     d="M-158.063,143.077c-1.718,4.099-5.13,6.146-10.24,6.146c-0.937,0-1.952,0.115-3.044,0.35  c-1.639,0.353-2.457,0.841-2.457,1.465c0,0.195,0.136,0.418,0.409,0.674c0.272,0.253,0.508,0.38,0.703,0.38  c-0.977,0-0.313,0.03,1.987,0.086c2.302,0.06,3.746,0.089,4.332,0.089c-3.395,1.988-9.07,2.906-17.029,2.75  c-2.614-0.037-4.857-1.188-6.729-3.451c-1.834-2.146-2.75-4.545-2.75-7.196c0-2.81,0.945-5.199,2.839-7.171  c1.89-1.967,4.242-2.953,7.051-2.953c0.623,0,1.453,0.137,2.486,0.408c1.034,0.273,1.727,0.41,2.077,0.41  c1.444,0,3.238-0.597,5.384-1.785c2.146-1.19,3.161-1.785,3.044-1.785c-0.391,4.096-1.756,6.848-4.097,8.251  c-1.679,0.978-2.516,1.933-2.516,2.866c0,0.586,0.349,1.055,1.052,1.406c0.546,0.271,1.151,0.408,1.815,0.408  c1.014,0,2.008-0.623,2.984-1.871c0.974-1.248,1.403-2.38,1.286-3.396c-0.115-1.171-0.037-2.576,0.235-4.212  c0.077-0.471,0.361-1.045,0.848-1.727c0.488-0.684,0.928-1.104,1.317-1.261c0,0.353-0.128,0.938-0.381,1.755  c-0.254,0.819-0.38,1.428-0.38,1.814c0,0.859,0.233,1.522,0.702,1.99c0.702-0.271,1.325-1.15,1.872-2.634  c0.468-1.131,0.74-2.224,0.82-3.276c-1.64-0.075-3.211-0.818-4.712-2.225c-1.502-1.404-2.252-2.926-2.252-4.563  c0-0.272,0.037-0.547,0.117-0.819c0.232,0.353,0.583,0.899,1.054,1.64c0.661,0.973,1.17,1.461,1.521,1.461  c0.468,0,0.701-0.488,0.701-1.461c0-1.248-0.331-2.379-0.994-3.395c-0.742-1.211-1.698-1.814-2.867-1.814  c-0.548,0-1.366,0.293-2.458,0.879c-1.093,0.584-2.088,0.877-2.982,0.877c-0.274,0-1.484-0.354-3.63-1.055  c3.783-0.624,5.676-1.189,5.676-1.697c0-1.326-2.594-2.224-7.783-2.69c-0.507-0.038-1.442-0.116-2.808-0.235  c0.155-0.193,1.268-0.408,3.336-0.644c1.755-0.192,2.983-0.294,3.685-0.294c9.285,0,15.175,4.508,17.673,13.521  c0.431-0.357,0.646-0.949,0.646-1.779c0-1.069-0.313-2.414-0.937-4.035c-0.235-0.633-0.607-1.584-1.113-2.848  c3.197,4.075,4.8,7.938,4.8,11.584c0,1.92-0.451,3.666-1.348,5.23c-0.583,1.061-1.678,2.412-3.276,4.059  c-1.599,1.646-2.691,2.92-3.277,3.822c2.146-0.586,3.552-1.036,4.215-1.348c1.48-0.663,2.827-1.659,4.036-2.984  C-157.421,141.305-157.636,142.064-158.063,143.077z M-183.578,120.08c0,0.702-0.391,1.15-1.17,1.348l-1.521,0.233  c-0.548,0.271-1.347,1.346-2.398,3.218c-0.118-0.584-0.293-1.404-0.528-2.458c-0.351,0.039-0.936,0.353-1.755,0.937  c-0.351,0.272-0.917,0.684-1.698,1.229c0.235-1.404,1.017-2.826,2.342-4.271c1.404-1.599,2.771-2.396,4.096-2.396  C-184.455,117.917-183.578,118.639-183.578,120.08z M-173.396,125.465c0,0.661-0.36,1.221-1.083,1.668  c-0.722,0.448-1.434,0.674-2.135,0.674c-0.938,0-1.777-0.525-2.517-1.582c-0.898-1.285-1.814-2.125-2.751-2.516  c0.193-0.195,0.429-0.293,0.704-0.293c0.35,0,0.944,0.271,1.783,0.818c0.837,0.549,1.374,0.82,1.609,0.82  c0.195,0,0.517-0.271,0.965-0.82c0.448-0.547,0.945-0.818,1.493-0.818C-174.039,123.416-173.396,124.1-173.396,125.465z"
+     id="path243" /><path
+     fill="#0D0F0F"
+     d="M-120.481,172.618c0,0.758-0.293,1.437-0.879,2.043c-0.586,0.604-1.258,0.905-2.016,0.905  c-1.207,0-2.098-0.566-2.663-1.701l-2.667-0.112c-0.567,0-1.684,0.246-3.345,0.737c-1.777,0.49-2.798,0.888-3.063,1.189  c-0.414,0.454-0.755,1.514-1.021,3.178c-0.228,1.36-0.339,2.363-0.339,3.006c0,1.02,0.16,1.768,0.48,2.24  c0.321,0.473,0.984,0.869,1.984,1.189c1,0.318,1.616,0.502,1.844,0.539c0.151,0,0.396-0.018,0.737-0.057h0.681  c0.491,0,1.001,0.076,1.532,0.227c0.755,0.227,1.077,0.527,0.965,0.907c-0.531-0.074-1.456,0.038-2.778,0.34l1.586,0.795  c0,0.454-0.643,0.679-1.928,0.679c-0.342,0-0.806-0.072-1.39-0.225c-0.588-0.154-0.976-0.229-1.163-0.229h-0.737  c-0.038,0.379-0.15,0.943-0.34,1.701c-0.646-0.037-1.399-0.416-2.27-1.133c-0.87-0.72-1.418-1.079-1.643-1.079  c-0.228,0-0.551,0.359-0.965,1.079c-0.417,0.717-0.624,1.207-0.624,1.475c-0.491-0.268-0.906-0.758-1.249-1.475  c-0.151-0.494-0.321-0.986-0.509-1.479c-0.379,0.039-1.077,0.836-2.099,2.385h-0.284c-0.077-0.113-0.36-0.906-0.852-2.385  c-1.172-0.375-2.268-0.563-3.288-0.563c-0.491,0-1.249,0.112-2.27,0.341l-1.587-0.113c0.226-0.228,0.888-0.662,1.984-1.305  c1.284-0.758,2.269-1.137,2.949-1.137c0.112,0,0.264,0.021,0.454,0.059c0.188,0.039,0.341,0.058,0.454,0.058  c0.262,0,0.689-0.142,1.275-0.427c0.586-0.283,0.927-0.539,1.019-0.766c0.098-0.229,0.145-0.813,0.145-1.759  c0-2.153-0.568-3.763-1.703-4.819c-0.983-0.945-2.608-1.625-4.877-2.043c-0.604,2.154-2.307,3.234-5.103,3.234  c-0.909,0-1.816-0.549-2.723-1.646s-1.361-2.099-1.361-3.007c0-1.399,0.586-2.551,1.758-3.459c-0.944-0.981-1.418-1.983-1.418-3.006  c0-0.944,0.292-1.776,0.879-2.496c0.586-0.716,1.353-1.133,2.297-1.248c-0.074-1.208,0.321-2.042,1.19-2.495  c-0.415-0.414-0.622-1.15-0.622-2.211c0-1.246,0.414-2.287,1.247-3.119c0.83-0.83,1.871-1.248,3.117-1.248  c1.363,0,2.479,0.475,3.348,1.418c1.098-3.742,3.459-5.613,7.089-5.613c1.889,0,3.554,0.756,4.99,2.27  c0.53,0.565,0.793,0.868,0.793,0.905c-0.452,0-0.225-0.086,0.681-0.254c0.909-0.171,1.568-0.257,1.986-0.257  c1.474,0,2.778,0.55,3.915,1.646c0.982,0.984,1.663,2.229,2.042,3.742c0.263,0.039,0.679,0.151,1.245,0.341  c0.832,0.417,1.249,1.135,1.249,2.155c0,0.188-0.152,0.549-0.454,1.079c2.419,1.361,3.63,3.251,3.63,5.67  c0,0.681-0.266,1.627-0.793,2.836C-120.973,170.689-120.481,171.521-120.481,172.618z M-143.849,175.113v-0.736  c0-0.869-0.424-1.664-1.275-2.382c-0.851-0.72-1.71-1.077-2.58-1.077c-1.06,0-2.042,0.246-2.949,0.734  C-148.649,171.542-146.382,172.693-143.849,175.113z M-144.869,168.083c-0.566-0.646-1.058-1.306-1.474-1.985  c-1.589,0.414-2.383,0.889-2.383,1.416c0.453-0.037,1.116,0.047,1.984,0.256C-145.872,167.979-145.246,168.083-144.869,168.083z   M-141.407,166.322v-2.495c-0.909-0.149-1.459-0.226-1.646-0.226v0.851L-141.407,166.322z M-134.035,164.736  c-0.454-0.189-1.305-0.568-2.554-1.135v4.877C-134.811,167.456-133.961,166.21-134.035,164.736z M-130.919,171.428l-1.246-1.529  c-0.755,0.529-1.521,1.066-2.298,1.615c-0.775,0.547-1.445,1.162-2.011,1.844C-134.775,172.447-132.92,171.807-130.919,171.428z"
+     id="path245" /><g
+     id="g247"><path
+       fill="#F8F6D8"
+       d="M-19.651,119.637C-10.599,128.688-5,141.188-5,154.997C-5,182.613-27.387,205-55,205   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path249" /><path
+       fill="#A3C095"
+       d="M-90.354,190.354c-9.05-9.047-14.646-21.549-14.646-35.356C-105,127.384-82.613,105-55,105   c13.802,0,26.301,5.593,35.349,14.637"
+       id="path251" /></g><path
+     fill="#0D0F0F"
+     d="M-17,178.111c-2.436-2.264-4.054-3.491-4.848-3.682c-0.576-0.139-1.135,0.198-1.672,1.004  c-0.537,0.809-1.291,1.094-2.268,0.86c-0.396-0.095-1.175-0.435-2.334-1.019c-0.938,0.886-1.441,1.472-1.511,1.759  c-0.095,0.399,0.089,0.938,0.551,1.622c0.46,0.683,0.894,1.072,1.301,1.171c0.257,0.062,0.621,0.091,1.09,0.089  c0.468-0.001,0.777,0.016,0.927,0.051c0.443,0.104,0.469,0.971,0.078,2.596c-0.37,1.554-1.302,3.854-2.793,6.893  c-0.059-3.909-0.61-5.99-1.656-6.238c-0.145-0.035-0.469,0.004-0.972,0.111c-0.505,0.107-0.864,0.137-1.08,0.084  c-1.048-0.25-1.758-1.434-2.131-3.545c-1.723-0.146-2.757,0.506-3.103,1.949c-0.174,0.726,0.023,1.383,0.589,1.975  c0.563,0.592,0.823,0.98,0.782,1.16c-0.233,0.977-2.021,2.134-5.356,3.474c-1.776,0.722-3.007,1.228-3.688,1.522  c0.659-0.528,1.369-1.256,2.127-2.182c0.862-1.057,1.371-1.906,1.528-2.559c0.086-0.359-0.209-0.967-0.884-1.814  c-0.676-0.849-0.926-1.634-0.753-2.355c0.146-0.614,0.543-1.321,1.194-2.12c-0.341-0.653-0.835-1.06-1.485-1.215  c-1.444-0.349-2.279-0.05-2.504,0.89c0.155-0.65,0.038-0.162-0.35,1.463c-0.25,1.2-1.296,1.579-3.138,1.141  c-1.409-0.338-3.696-1.229-6.864-2.674c3.981-0.039,6.118-0.674,6.411-1.903c-0.032,0.146-0.003-0.306,0.097-1.353  c0.122-1.152,1.16-1.975,3.108-2.463c0.072-1.738-0.594-2.777-2.004-3.113c-0.216-0.053-0.705,0.231-1.463,0.851  c-0.761,0.621-1.393,0.872-1.898,0.75c-0.867-0.205-1.763-1.413-2.684-3.62c-0.427-1.095-1.088-2.723-1.983-4.886  c0.727,0.633,1.453,1.267,2.182,1.896c0.963,0.768,1.77,1.227,2.419,1.383c0.506,0.121,1.108-0.203,1.808-0.972  c0.699-0.769,1.446-1.058,2.24-0.866c0.111,0.026,0.78,0.414,2.013,1.168c0.937-0.883,1.466-1.576,1.588-2.082  c0.102-0.435-0.04-0.994-0.431-1.679c-0.39-0.687-0.802-1.079-1.235-1.185c-0.181-0.045-0.473-0.057-0.878-0.038  c-0.405,0.019-0.698,0.005-0.879-0.038c-0.649-0.157-0.781-1.045-0.392-2.671c0.102-0.435,1.11-2.81,3.022-7.124  c-0.166,0.531-0.173,1.602-0.021,3.203c0.181,1.953,0.687,3.025,1.518,3.228c0.144,0.032,0.459-0.007,0.946-0.118  c0.485-0.113,0.852-0.14,1.104-0.08c0.83,0.199,1.404,0.834,1.723,1.902l0.463,1.655c0.758,0.183,1.455,0.063,2.09-0.357  c0.636-0.422,1.046-1.011,1.227-1.769c0.189-0.795,0-1.479-0.568-2.057c-0.569-0.574-0.829-0.972-0.775-1.188  c0.181-0.758,1.68-1.755,4.495-2.99c2.26-0.986,3.709-1.537,4.349-1.652c-2.054,1.726-3.199,3.071-3.432,4.049  c-0.121,0.506,0.055,1.121,0.531,1.847c0.595,0.867,0.912,1.459,0.95,1.772c0.161,0.916-0.146,2.045-0.925,3.389  c0.811,0.92,1.47,1.438,1.977,1.561c1.045,0.25,1.699-0.166,1.958-1.25c0.026-0.109,0.063-0.462,0.112-1.062  c0.046-0.599,0.098-0.931,0.151-0.995c0.266-0.471,1.319-0.486,3.161-0.045c1.156,0.275,3.479,1.175,6.973,2.699  c-0.847,0.025-2.116,0.064-3.809,0.117c-1.55,0.09-2.389,0.404-2.519,0.945c-0.06,0.254-0.074,0.708-0.04,1.364  c0.034,0.657,0.017,1.132-0.053,1.419c-0.12,0.507-0.559,0.896-1.312,1.175l-2.155,0.861c0.245,0.897,0.42,1.437,0.531,1.616  c0.259,0.518,0.692,0.854,1.306,1c0.434,0.104,0.922-0.182,1.465-0.854c0.542-0.672,1.212-0.913,2.007-0.722  c0.975,0.231,1.861,1.397,2.657,3.498C-18.651,173.917-17.953,175.706-17,178.111z M-28.274,172.092  c0.552-2.313,0.184-4.521-1.108-6.625s-3.094-3.433-5.404-3.984c-2.348-0.561-4.573-0.205-6.671,1.07  c-2.099,1.27-3.448,3.077-4.046,5.415c-0.59,2.302-0.21,4.505,1.141,6.604c1.35,2.097,3.18,3.425,5.493,3.978  c2.454,0.587,4.697,0.272,6.725-0.94C-30.118,176.396-28.828,174.555-28.274,172.092z M-29.089,171.896  c-0.526,2.203-1.703,3.851-3.53,4.939c-1.826,1.09-3.843,1.373-6.044,0.846c-2.131-0.512-3.777-1.687-4.94-3.533  c-1.163-1.842-1.489-3.828-0.979-5.959c0.503-2.096,1.698-3.709,3.592-4.842c1.896-1.131,3.889-1.445,5.984-0.943  c2.094,0.5,3.727,1.691,4.898,3.576C-28.937,167.867-28.596,169.838-29.089,171.896z"
+     id="path253" /><path
+     fill="#0D0F0F"
+     d="M-53.36,139.314c0,0.758-0.293,1.438-0.879,2.043c-0.586,0.604-1.258,0.908-2.016,0.908  c-1.207,0-2.098-0.567-2.663-1.701l-2.666-0.115c-0.568,0-1.685,0.246-3.346,0.738c-1.777,0.49-2.798,0.89-3.064,1.19  c-0.414,0.452-0.755,1.513-1.02,3.175c-0.228,1.361-0.339,2.364-0.339,3.008c0,1.021,0.16,1.769,0.48,2.239  c0.321,0.474,0.984,0.87,1.984,1.191c1.001,0.319,1.616,0.501,1.844,0.536c0.151,0,0.396-0.018,0.737-0.057h0.681  c0.491,0,1.001,0.077,1.532,0.229c0.755,0.229,1.077,0.529,0.965,0.908c-0.531-0.076-1.456,0.037-2.778,0.34l1.586,0.794  c0,0.454-0.643,0.681-1.928,0.681c-0.342,0-0.805-0.076-1.39-0.227c-0.587-0.152-0.975-0.227-1.163-0.227h-0.736  c-0.039,0.377-0.151,0.943-0.341,1.7c-0.645-0.039-1.399-0.416-2.27-1.136c-0.87-0.717-1.418-1.077-1.643-1.077  c-0.228,0-0.551,0.36-0.965,1.077c-0.417,0.72-0.624,1.211-0.624,1.476c-0.491-0.265-0.905-0.756-1.249-1.476  c-0.151-0.491-0.321-0.982-0.509-1.475c-0.379,0.039-1.077,0.832-2.099,2.383h-0.284c-0.076-0.114-0.36-0.908-0.852-2.383  c-1.172-0.377-2.268-0.566-3.288-0.566c-0.491,0-1.249,0.115-2.27,0.34l-1.586-0.111c0.225-0.229,0.888-0.662,1.983-1.305  c1.284-0.756,2.269-1.135,2.949-1.135c0.112,0,0.264,0.02,0.454,0.057c0.188,0.038,0.341,0.057,0.454,0.057  c0.263,0,0.689-0.142,1.275-0.427c0.586-0.28,0.927-0.536,1.019-0.764c0.098-0.228,0.145-0.813,0.145-1.761  c0-2.153-0.568-3.76-1.703-4.819c-0.983-0.944-2.608-1.625-4.877-2.04c-0.604,2.154-2.307,3.232-5.103,3.232  c-0.909,0-1.815-0.549-2.723-1.646c-0.905-1.096-1.361-2.098-1.361-3.005c0-1.399,0.586-2.554,1.758-3.462  c-0.944-0.98-1.418-1.982-1.418-3.004c0-0.947,0.292-1.777,0.879-2.498c0.586-0.717,1.353-1.133,2.297-1.245  c-0.074-1.211,0.321-2.042,1.191-2.496c-0.416-0.416-0.623-1.153-0.623-2.211c0-1.247,0.414-2.288,1.247-3.119  c0.83-0.833,1.872-1.25,3.117-1.25c1.363,0,2.479,0.478,3.348,1.42c1.098-3.743,3.459-5.614,7.089-5.614  c1.89,0,3.554,0.756,4.99,2.269c0.53,0.567,0.793,0.87,0.793,0.907c-0.452,0-0.225-0.086,0.681-0.256  c0.909-0.17,1.568-0.256,1.986-0.256c1.474,0,2.778,0.549,3.915,1.646c0.982,0.982,1.663,2.229,2.042,3.742  c0.263,0.039,0.679,0.152,1.246,0.34c0.831,0.419,1.248,1.135,1.248,2.156c0,0.188-0.152,0.549-0.454,1.076  c2.419,1.361,3.63,3.252,3.63,5.674c0,0.679-0.265,1.625-0.793,2.834C-53.852,137.387-53.36,138.221-53.36,139.314z   M-76.727,141.811v-0.734c0-0.87-0.425-1.665-1.276-2.383c-0.851-0.717-1.71-1.077-2.58-1.077c-1.06,0-2.042,0.243-2.949,0.735  C-81.528,138.238-79.26,139.393-76.727,141.811z M-77.748,134.779c-0.566-0.645-1.058-1.305-1.474-1.985  c-1.589,0.417-2.382,0.89-2.382,1.417c0.452-0.035,1.115,0.048,1.983,0.258C-78.751,134.676-78.125,134.779-77.748,134.779z   M-74.285,133.021v-2.496c-0.91-0.149-1.459-0.228-1.646-0.228v0.851L-74.285,133.021z M-66.914,131.434  c-0.454-0.189-1.305-0.567-2.554-1.135v4.877C-67.689,134.154-66.84,132.906-66.914,131.434z M-63.798,138.126l-1.246-1.532  c-0.755,0.53-1.521,1.067-2.298,1.617c-0.775,0.549-1.445,1.162-2.011,1.842C-67.654,139.145-65.799,138.504-63.798,138.126z"
+     id="path255" /><g
+     id="g257"><path
+       fill="#C1D7E9"
+       d="M85.35,119.637c9.053,9.051,14.65,21.551,14.65,35.36C100,182.613,77.613,205,50,205   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path259" /><path
+       fill="#A3C095"
+       d="M14.646,190.354C5.596,181.307,0,168.805,0,154.997C0,127.384,22.387,105,50,105   c13.803,0,26.301,5.593,35.35,14.637"
+       id="path261" /></g><path
+     fill="#0D0F0F"
+     d="M76.723,188.675c-2.693,2.739-6.008,4.109-9.945,4.109c-4.424,0-7.93-1.515-10.524-4.541  c-2.452-2.884-3.678-6.558-3.678-11.028c0-4.804,2.091-10.281,6.272-16.434c3.41-5.047,7.424-9.467,12.036-13.264  c-0.675,3.076-1.009,5.262-1.009,6.561c0,2.98,0.936,5.886,2.811,8.721c2.307,3.365,4.062,5.864,5.262,7.496  c1.873,2.835,2.813,5.6,2.813,8.289C80.759,182.574,79.412,185.938,76.723,188.675z M76.648,173.287  c-0.719-1.609-1.561-2.68-2.521-3.208c0.146,0.288,0.217,0.698,0.217,1.226c0,1.01-0.287,2.453-0.865,4.324l-0.938,2.885  c0,1.68,0.84,2.522,2.521,2.522c1.777,0,2.668-1.177,2.668-3.532C77.73,176.303,77.37,174.896,76.648,173.287z"
+     id="path263" /><path
+     fill="#0D0F0F"
+     d="M51.641,139.285c0,0.757-0.293,1.438-0.879,2.043c-0.587,0.604-1.259,0.904-2.017,0.904  c-1.207,0-2.098-0.565-2.663-1.7l-2.666-0.112c-0.568,0-1.685,0.245-3.346,0.736c-1.777,0.49-2.798,0.888-3.064,1.191  c-0.414,0.453-0.755,1.514-1.02,3.176c-0.228,1.361-0.339,2.363-0.339,3.008c0,1.018,0.16,1.767,0.48,2.24  c0.321,0.472,0.984,0.867,1.984,1.188c1.001,0.319,1.616,0.502,1.844,0.538c0.151,0,0.396-0.018,0.737-0.057h0.681  c0.491,0,1.001,0.078,1.532,0.228c0.755,0.226,1.077,0.528,0.965,0.906c-0.531-0.073-1.456,0.038-2.778,0.341l1.586,0.795  c0,0.454-0.643,0.68-1.928,0.68c-0.342,0-0.805-0.074-1.39-0.226c-0.587-0.153-0.975-0.229-1.163-0.229h-0.736  c-0.039,0.379-0.151,0.944-0.341,1.703c-0.645-0.039-1.399-0.418-2.27-1.135c-0.87-0.719-1.418-1.078-1.643-1.078  c-0.228,0-0.551,0.359-0.965,1.078c-0.417,0.717-0.624,1.208-0.624,1.475c-0.491-0.267-0.905-0.758-1.249-1.475  c-0.151-0.494-0.321-0.984-0.509-1.477c-0.379,0.037-1.077,0.834-2.099,2.384h-0.284c-0.076-0.114-0.36-0.907-0.852-2.384  c-1.172-0.377-2.268-0.565-3.288-0.565c-0.491,0-1.249,0.112-2.27,0.341l-1.586-0.111c0.225-0.229,0.888-0.664,1.983-1.307  c1.284-0.758,2.269-1.136,2.949-1.136c0.112,0,0.264,0.021,0.454,0.058c0.188,0.041,0.341,0.059,0.454,0.059  c0.263,0,0.689-0.143,1.275-0.428c0.586-0.283,0.927-0.537,1.019-0.765c0.098-0.229,0.146-0.813,0.146-1.759  c0-2.154-0.568-3.762-1.703-4.821c-0.983-0.942-2.608-1.624-4.877-2.042c-0.604,2.154-2.307,3.234-5.103,3.234  c-0.909,0-1.815-0.547-2.723-1.645c-0.905-1.1-1.361-2.1-1.361-3.008c0-1.4,0.586-2.551,1.758-3.46  c-0.944-0.981-1.418-1.983-1.418-3.005c0-0.945,0.292-1.777,0.879-2.496c0.586-0.716,1.353-1.134,2.297-1.249  c-0.074-1.207,0.321-2.042,1.191-2.494c-0.416-0.415-0.623-1.151-0.623-2.211c0-1.247,0.414-2.286,1.247-3.118  c0.83-0.832,1.872-1.25,3.117-1.25c1.363,0,2.479,0.475,3.348,1.418c1.098-3.742,3.459-5.613,7.089-5.613  c1.89,0,3.554,0.757,4.99,2.271c0.53,0.563,0.793,0.868,0.793,0.905c-0.452,0-0.225-0.086,0.681-0.256  c0.909-0.17,1.568-0.256,1.986-0.256c1.474,0,2.778,0.55,3.915,1.646c0.982,0.984,1.663,2.229,2.042,3.742  c0.263,0.038,0.679,0.15,1.246,0.34c0.831,0.418,1.248,1.135,1.248,2.156c0,0.189-0.152,0.549-0.454,1.078  c2.419,1.361,3.63,3.25,3.63,5.67c0,0.681-0.266,1.628-0.793,2.837C51.148,137.355,51.641,138.188,51.641,139.285z M28.273,141.781  v-0.737c0-0.87-0.425-1.664-1.276-2.382c-0.851-0.721-1.71-1.077-2.58-1.077c-1.06,0-2.042,0.245-2.949,0.735  C23.472,138.209,25.74,139.359,28.273,141.781z M27.252,134.75c-0.566-0.646-1.058-1.307-1.474-1.986  c-1.589,0.416-2.382,0.889-2.382,1.416c0.452-0.037,1.115,0.049,1.983,0.256C26.249,134.646,26.875,134.75,27.252,134.75z   M30.715,132.99v-2.496c-0.91-0.15-1.459-0.227-1.646-0.227v0.851L30.715,132.99z M38.086,131.402  c-0.454-0.189-1.305-0.567-2.554-1.135v4.877C37.311,134.122,38.16,132.876,38.086,131.402z M41.202,138.094l-1.246-1.529  c-0.755,0.529-1.521,1.067-2.298,1.615c-0.775,0.547-1.445,1.163-2.011,1.844C37.346,139.113,39.201,138.473,41.202,138.094z"
+     id="path265" /><g
+     id="g267"><path
+       fill="#F8F6D8"
+       d="M-859.651,224.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.386,50.003-50.001,50.003   c-13.806,0-26.305-5.596-35.354-14.646"
+       id="path269" /><path
+       fill="#CAC5C0"
+       d="M-930.354,295.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.386-49.997,49.999-49.997   c13.804,0,26.302,5.593,35.35,14.637"
+       id="path271" /></g><path
+     fill="#0D0F0F"
+     d="M-901.354,251.591l-2.866,9.677h-23.821v-2.068c1.157-1.29,3.692-3.891,7.607-7.805  c2.357-2.359,4.692-4.851,7.005-7.476c1.157-1.288,2.048-2.401,2.667-3.336c1.379-1.999,2.07-4.046,2.07-6.138  c0-2.045-0.633-3.848-1.901-5.402c-1.267-1.561-2.903-2.339-4.905-2.339c-4.313,0-7.694,2.916-10.14,8.743l-2.137-0.803  c2.891-8.183,7.448-12.274,13.678-12.274c3.069,0,5.682,1.044,7.839,3.134c2.159,2.092,3.236,4.67,3.236,7.741  c0,3.915-2.245,7.737-6.738,11.476l-4.668,3.868c-2.981,2.492-5.453,4.827-7.406,7.005c-0.136,0.137-0.402,0.446-0.802,0.936h12.41  c1.912,0,3.359-0.377,4.335-1.133c0.845-0.67,1.67-1.937,2.47-3.806H-901.354L-901.354,251.591z"
+     id="path273" /><path
+     fill="#0D0F0F"
+     d="M-857,283.111c-2.436-2.264-4.054-3.491-4.847-3.682c-0.577-0.138-1.135,0.198-1.672,1.006  s-1.292,1.092-2.269,0.858c-0.396-0.095-1.175-0.435-2.333-1.017c-0.938,0.885-1.441,1.471-1.51,1.758  c-0.095,0.398,0.088,0.938,0.55,1.622c0.46,0.684,0.894,1.071,1.3,1.17c0.258,0.062,0.622,0.091,1.091,0.089  c0.467-0.001,0.777,0.016,0.926,0.051c0.444,0.104,0.469,0.971,0.078,2.598c-0.37,1.552-1.302,3.852-2.793,6.892  c-0.058-3.909-0.609-5.989-1.656-6.239c-0.145-0.035-0.469,0.004-0.972,0.111c-0.504,0.107-0.864,0.137-1.08,0.085  c-1.047-0.251-1.758-1.433-2.13-3.546c-1.723-0.145-2.757,0.506-3.103,1.949c-0.173,0.726,0.024,1.383,0.589,1.976  c0.564,0.592,0.824,0.979,0.783,1.16c-0.233,0.978-2.021,2.133-5.355,3.473c-1.777,0.722-3.006,1.228-3.688,1.522  c0.658-0.528,1.369-1.256,2.126-2.182c0.863-1.057,1.372-1.906,1.529-2.559c0.086-0.359-0.209-0.967-0.883-1.814  c-0.676-0.849-0.926-1.634-0.753-2.355c0.146-0.614,0.543-1.319,1.193-2.12c-0.34-0.653-0.834-1.06-1.486-1.215  c-1.444-0.347-2.278-0.05-2.503,0.891c0.155-0.651,0.039-0.163-0.349,1.462c-0.25,1.2-1.296,1.58-3.138,1.141  c-1.409-0.338-3.696-1.229-6.864-2.674c3.982-0.039,6.118-0.674,6.411-1.901c-0.032,0.146-0.003-0.308,0.096-1.353  c0.123-1.154,1.16-1.977,3.109-2.465c0.072-1.738-0.593-2.777-2.003-3.113c-0.216-0.053-0.706,0.231-1.463,0.853  c-0.761,0.619-1.394,0.87-1.898,0.748c-0.867-0.205-1.762-1.413-2.684-3.62c-0.426-1.096-1.087-2.723-1.983-4.885  c0.727,0.632,1.453,1.266,2.181,1.896c0.963,0.766,1.77,1.225,2.419,1.383c0.506,0.119,1.108-0.205,1.808-0.974  c0.698-0.769,1.445-1.058,2.24-0.866c0.111,0.026,0.78,0.414,2.012,1.168c0.937-0.883,1.466-1.576,1.587-2.082  c0.102-0.435-0.04-0.994-0.43-1.679c-0.389-0.687-0.802-1.079-1.236-1.185c-0.18-0.043-0.472-0.057-0.877-0.039  c-0.405,0.02-0.698,0.006-0.879-0.037c-0.649-0.155-0.781-1.045-0.392-2.672c0.102-0.434,1.111-2.809,3.023-7.122  c-0.166,0.53-0.173,1.6-0.021,3.202c0.18,1.953,0.687,3.027,1.518,3.228c0.144,0.033,0.458-0.005,0.945-0.118  c0.484-0.113,0.853-0.14,1.104-0.078c0.83,0.197,1.404,0.832,1.722,1.9l0.463,1.654c0.757,0.184,1.454,0.064,2.089-0.356  c0.636-0.421,1.046-1.011,1.227-1.769c0.189-0.795,0-1.479-0.568-2.055c-0.57-0.576-0.829-0.972-0.775-1.188  c0.181-0.759,1.679-1.755,4.495-2.99c2.259-0.985,3.709-1.536,4.349-1.651c-2.054,1.725-3.199,3.07-3.431,4.047  c-0.122,0.507,0.055,1.121,0.531,1.848c0.595,0.867,0.911,1.459,0.95,1.771c0.161,0.92-0.146,2.047-0.925,3.39  c0.811,0.92,1.469,1.438,1.977,1.562c1.044,0.25,1.698-0.168,1.958-1.25c0.026-0.109,0.063-0.463,0.112-1.063  c0.046-0.6,0.099-0.932,0.151-0.995c0.267-0.472,1.32-0.487,3.162-0.045c1.156,0.276,3.479,1.175,6.972,2.698  c-0.847,0.027-2.116,0.065-3.809,0.121c-1.549,0.086-2.388,0.401-2.52,0.942c-0.059,0.253-0.074,0.708-0.04,1.364  c0.034,0.656,0.018,1.132-0.053,1.421c-0.12,0.506-0.558,0.896-1.311,1.175l-2.156,0.859c0.246,0.898,0.42,1.438,0.531,1.615  c0.259,0.521,0.692,0.854,1.307,1.002c0.434,0.104,0.922-0.18,1.465-0.854c0.542-0.672,1.212-0.913,2.006-0.722  c0.976,0.232,1.861,1.398,2.657,3.498C-858.651,278.917-857.953,280.708-857,283.111z M-868.275,277.092  c0.552-2.313,0.184-4.52-1.108-6.623s-3.094-3.433-5.404-3.986c-2.348-0.561-4.574-0.205-6.672,1.07  c-2.098,1.271-3.447,3.077-4.045,5.416c-0.59,2.303-0.21,4.504,1.141,6.604c1.349,2.098,3.18,3.425,5.492,3.978  c2.455,0.587,4.698,0.274,6.725-0.94C-870.118,281.396-868.828,279.555-868.275,277.092z M-869.088,276.896  c-0.527,2.203-1.703,3.851-3.531,4.939c-1.826,1.09-3.842,1.373-6.044,0.846c-2.131-0.51-3.778-1.687-4.941-3.531  c-1.163-1.844-1.488-3.83-0.979-5.961c0.503-2.096,1.699-3.709,3.593-4.842c1.896-1.13,3.889-1.445,5.982-0.943  c2.094,0.5,3.729,1.693,4.899,3.576C-868.936,272.867-868.596,274.838-869.088,276.896z"
+     id="path275" /><g
+     id="g277"><path
+       fill="#C1D7E9"
+       d="M-754.651,224.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.386,50.003-50.001,50.003   c-13.806,0-26.305-5.596-35.354-14.646"
+       id="path279" /><path
+       fill="#CAC5C0"
+       d="M-825.354,295.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.386-49.997,49.999-49.997   c13.804,0,26.302,5.593,35.35,14.637"
+       id="path281" /></g><path
+     fill="#0D0F0F"
+     d="M-763.278,293.675c-2.692,2.739-6.008,4.108-9.947,4.108c-4.422,0-7.929-1.514-10.524-4.54  c-2.452-2.884-3.676-6.558-3.676-11.028c0-4.804,2.09-10.281,6.271-16.434c3.41-5.047,7.423-9.467,12.037-13.264  c-0.673,3.076-1.01,5.262-1.01,6.561c0,2.98,0.937,5.886,2.811,8.721c2.307,3.365,4.061,5.864,5.262,7.496  c1.874,2.835,2.811,5.6,2.811,8.289C-759.242,287.574-760.587,290.938-763.278,293.675z M-763.35,278.287  c-0.721-1.609-1.562-2.68-2.523-3.208c0.145,0.288,0.215,0.698,0.215,1.226c0,1.01-0.287,2.453-0.863,4.324l-0.938,2.885  c0,1.68,0.839,2.522,2.522,2.522c1.777,0,2.668-1.177,2.668-3.532C-762.269,281.303-762.629,279.896-763.35,278.287z"
+     id="path283" /><path
+     fill="#0D0F0F"
+     d="M-796.354,251.593l-2.866,9.675h-23.821v-2.068c1.157-1.289,3.692-3.889,7.607-7.805  c2.357-2.357,4.692-4.851,7.005-7.476c1.157-1.287,2.048-2.401,2.667-3.335c1.379-2,2.07-4.045,2.07-6.139  c0-2.045-0.633-3.846-1.901-5.402c-1.267-1.559-2.903-2.338-4.905-2.338c-4.313,0-7.694,2.915-10.14,8.742l-2.137-0.801  c2.891-8.185,7.448-12.276,13.678-12.276c3.069,0,5.682,1.044,7.839,3.135c2.159,2.091,3.236,4.67,3.236,7.74  c0,3.915-2.245,7.739-6.738,11.478l-4.668,3.866c-2.981,2.492-5.453,4.827-7.406,7.007c-0.136,0.135-0.402,0.446-0.802,0.936h12.41  c1.912,0,3.359-0.377,4.335-1.135c0.845-0.668,1.67-1.937,2.47-3.803L-796.354,251.593L-796.354,251.593z"
+     id="path285" /><g
+     id="g287"><path
+       fill="#BAB1AB"
+       d="M-649.651,224.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.386,50.003-50.001,50.003   c-13.806,0-26.305-5.596-35.354-14.646"
+       id="path289" /><path
+       fill="#CAC5C0"
+       d="M-720.354,295.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.386-49.997,49.999-49.997   c13.804,0,26.302,5.593,35.35,14.637"
+       id="path291" /></g><path
+     fill="#0D0F0F"
+     d="M-691.354,251.591l-2.866,9.677h-23.821v-2.068c1.157-1.29,3.692-3.891,7.607-7.805  c2.357-2.359,4.692-4.851,7.005-7.476c1.157-1.288,2.048-2.401,2.667-3.336c1.379-1.999,2.07-4.046,2.07-6.138  c0-2.045-0.633-3.848-1.901-5.402c-1.267-1.561-2.903-2.339-4.905-2.339c-4.313,0-7.694,2.916-10.14,8.743l-2.137-0.803  c2.891-8.183,7.448-12.274,13.678-12.274c3.069,0,5.682,1.044,7.839,3.134c2.159,2.092,3.236,4.67,3.236,7.741  c0,3.915-2.245,7.737-6.738,11.476l-4.668,3.868c-2.981,2.492-5.453,4.827-7.406,7.005c-0.136,0.137-0.402,0.446-0.802,0.936h12.41  c1.912,0,3.359-0.377,4.335-1.133c0.845-0.67,1.67-1.937,2.47-3.806H-691.354L-691.354,251.591z"
+     id="path293" /><path
+     fill="#0D0F0F"
+     d="M-645.38,275.99c0,2.701-0.982,4.544-2.947,5.525c-0.574,0.287-2.374,0.678-5.404,1.166  c-1.963,0.33-2.946,1.086-2.946,2.271v4.973c0,0.209,0.063,0.842,0.184,1.905l0.185,1.966c0,0.613-0.144,1.617-0.431,3.008  c-0.777,0.163-1.678,0.348-2.701,0.555c-0.328-1.23-0.491-2.069-0.491-2.52c0-0.203,0.05-0.512,0.153-0.921  c0.102-0.408,0.154-0.716,0.154-0.922c0-0.284-0.253-1.083-0.762-2.394h-0.953c-0.126,0.205-0.167,0.471-0.127,0.797  c0.164,0.697,0.225,1.289,0.185,1.781c-0.697,0.491-1.657,1.146-2.885,1.965c-0.289-0.082-0.389-0.123-0.308-0.123v-4.359  c-0.081-0.203-0.285-0.285-0.614-0.246h-0.737l-0.737,5.771c-0.573,0.041-1.268,0.041-2.086,0c-0.287-1.351-0.799-3.354-1.535-6.017  h-0.493c-0.45,1.433-0.695,2.211-0.737,2.334c0,0.163,0.052,0.479,0.155,0.951c0.101,0.472,0.153,0.787,0.153,0.951  c0,0.122-0.042,0.43-0.125,0.921l-0.184,1.475c-0.083,0.079-0.183,0.12-0.306,0.12c-1.228,0-2.048-0.307-2.455-0.919  c-0.412-0.615-0.576-1.475-0.493-2.58l0.493-7.365c0-0.123,0.039-0.287,0.121-0.492c0.082-0.203,0.123-0.348,0.123-0.428  c0-0.328-0.348-0.984-1.043-1.968c-0.123-0.04-0.757-0.185-1.904-0.431c-0.695-0.162-2.067-0.449-4.112-0.857  c-2.825-0.531-4.238-2.803-4.238-6.814c0-5.978,2.457-10.949,7.367-14.92c0.204,1.106,0.554,2.578,1.045,4.42  c0.368,0.084,1.167,0.269,2.394,0.554c0.247,0.081,1.494,0.532,3.745,1.351c-1.145-0.695-2.64-1.818-4.48-3.375  c-0.697-0.818-1.046-2.191-1.046-4.113c0-0.453,0.778-0.982,2.335-1.6c1.391-0.572,2.434-0.896,3.131-0.98  c2.209-0.285,3.908-0.43,5.096-0.43c5.115,0,9.25,1.311,12.401,3.932c-1.022,1.188-2.783,2.453-5.279,3.806  c0.982,0.041,2.415-0.347,4.298-1.168c1.882-0.815,2.68-1.228,2.394-1.228c0.327,0,0.983,0.656,1.965,1.965  c0.735,0.982,1.329,1.863,1.78,2.64c1.31,2.333,2.19,4.853,2.641,7.552c0,0.942,0.02,1.617,0.061,2.025L-645.38,275.99  L-645.38,275.99z M-668.896,277.098c0-1.761-0.767-3.429-2.301-5.006c-1.536-1.576-3.185-2.363-4.944-2.363  c-1.555,0-2.925,0.66-4.113,1.978c-1.187,1.319-1.78,2.782-1.78,4.39c0,1.4,0.675,2.309,2.026,2.719  c0.86,0.248,2.066,0.392,3.621,0.434h3.377C-670.267,279.285-668.896,278.568-668.896,277.098z M-662.203,284.71v-1.901  c-0.286-0.533-0.573-1.088-0.858-1.66c-0.246-0.817-0.697-1.963-1.351-3.439l-0.676,7.184c0,0.576-0.122,0.861-0.369,0.861  c-0.163,0-0.287-0.04-0.368-0.123c-0.287-4.338-0.429-6.222-0.429-5.646v-2.148c-0.083-0.126-0.185-0.188-0.308-0.188  c-1.391,1.437-2.086,3.748-2.086,6.938c0,1.761,0.163,2.845,0.49,3.257c0.329-0.083,0.695-0.227,1.107-0.431  c0.163-0.083,0.633-0.123,1.411-0.123c0.775,0,1.72,0.245,2.823,0.735C-662.407,288.023-662.203,286.921-662.203,284.71z   M-648.327,276.154c0-1.646-0.614-3.119-1.842-4.418c-1.228-1.297-2.64-1.945-4.234-1.945c-1.72,0-3.328,0.787-4.821,2.361  c-1.495,1.576-2.242,3.224-2.242,4.945c0,1.432,0.697,2.147,2.088,2.147h7.059C-649.657,279.204-648.327,278.176-648.327,276.154z"
+     id="path295" /><g
+     id="g297"><path
+       fill="#E49977"
+       d="M-544.651,224.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path299" /><path
+       fill="#CAC5C0"
+       d="M-615.354,295.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.802,0,26.301,5.593,35.349,14.637"
+       id="path301" /></g><path
+     fill="#0D0F0F"
+     d="M-541.7,284.439c-1.718,4.099-5.13,6.145-10.24,6.145c-0.937,0-1.952,0.117-3.044,0.354  c-1.639,0.349-2.458,0.838-2.458,1.463c0,0.193,0.136,0.418,0.41,0.674c0.272,0.254,0.508,0.38,0.703,0.38  c-0.977,0-0.314,0.028,1.987,0.087c2.303,0.059,3.747,0.089,4.333,0.089c-3.394,1.987-9.07,2.903-17.029,2.75  c-2.614-0.039-4.857-1.19-6.729-3.454c-1.835-2.146-2.751-4.541-2.751-7.197c0-2.808,0.946-5.196,2.839-7.168  c1.89-1.97,4.242-2.955,7.051-2.955c0.623,0,1.453,0.137,2.486,0.41c1.034,0.273,1.727,0.41,2.077,0.41  c1.444,0,3.239-0.596,5.385-1.787c2.146-1.188,3.16-1.783,3.043-1.783c-0.391,4.098-1.756,6.847-4.097,8.252  c-1.678,0.976-2.516,1.93-2.516,2.867c0,0.582,0.35,1.053,1.052,1.403c0.546,0.274,1.151,0.41,1.815,0.41  c1.014,0,2.008-0.624,2.984-1.873c0.974-1.249,1.403-2.379,1.286-3.396c-0.116-1.17-0.037-2.573,0.235-4.213  c0.077-0.469,0.361-1.043,0.848-1.727c0.488-0.684,0.928-1.102,1.317-1.258c0,0.35-0.127,0.936-0.38,1.755  c-0.254,0.819-0.38,1.427-0.38,1.813c0,0.858,0.234,1.521,0.703,1.99c0.701-0.273,1.324-1.152,1.872-2.634  c0.468-1.131,0.74-2.224,0.82-3.276c-1.64-0.078-3.211-0.818-4.711-2.224c-1.501-1.405-2.252-2.927-2.252-4.563  c0-0.273,0.037-0.547,0.117-0.82c0.232,0.352,0.583,0.898,1.053,1.639c0.662,0.977,1.17,1.462,1.521,1.462  c0.468,0,0.702-0.485,0.702-1.462c0-1.248-0.332-2.38-0.995-3.395c-0.743-1.209-1.699-1.813-2.867-1.813  c-0.548,0-1.366,0.291-2.458,0.877c-1.093,0.583-2.088,0.877-2.983,0.877c-0.273,0-1.484-0.352-3.629-1.054  c3.783-0.622,5.676-1.188,5.676-1.696c0-1.324-2.594-2.224-7.783-2.691c-0.508-0.037-1.443-0.116-2.809-0.234  c0.155-0.193,1.268-0.408,3.336-0.645c1.755-0.192,2.983-0.291,3.685-0.291c9.285,0,15.175,4.508,17.673,13.521  c0.431-0.356,0.645-0.952,0.645-1.78c0-1.07-0.312-2.414-0.937-4.035c-0.235-0.633-0.607-1.582-1.113-2.847  c3.198,4.075,4.8,7.938,4.8,11.584c0,1.921-0.451,3.664-1.348,5.231c-0.583,1.057-1.678,2.408-3.276,4.058  c-1.6,1.646-2.691,2.92-3.277,3.82c2.146-0.583,3.551-1.034,4.214-1.347c1.481-0.662,2.828-1.658,4.037-2.982  C-541.057,282.665-541.272,283.428-541.7,284.439z M-567.214,261.443c0,0.701-0.391,1.148-1.17,1.346l-1.521,0.232  c-0.547,0.272-1.347,1.348-2.398,3.22c-0.119-0.585-0.293-1.402-0.528-2.458c-0.351,0.039-0.935,0.351-1.755,0.938  c-0.351,0.271-0.917,0.684-1.699,1.229c0.235-1.404,1.017-2.826,2.342-4.271c1.404-1.601,2.77-2.398,4.096-2.398  C-568.092,259.277-567.214,260-567.214,261.443z M-557.032,266.827c0,0.663-0.361,1.219-1.083,1.667  c-0.722,0.449-1.434,0.674-2.135,0.674c-0.938,0-1.777-0.527-2.517-1.58c-0.898-1.287-1.814-2.125-2.75-2.518  c0.194-0.193,0.429-0.293,0.704-0.293c0.349,0,0.944,0.273,1.783,0.818c0.837,0.549,1.375,0.819,1.61,0.819  c0.195,0,0.516-0.271,0.964-0.819c0.448-0.545,0.946-0.818,1.493-0.818C-557.675,264.777-557.032,265.463-557.032,266.827z"
+     id="path303" /><path
+     fill="#0D0F0F"
+     d="M-586.354,251.593l-2.866,9.675h-23.821v-2.068c1.157-1.289,3.692-3.889,7.607-7.805  c2.357-2.357,4.692-4.851,7.005-7.476c1.157-1.287,2.048-2.401,2.667-3.335c1.379-2,2.07-4.045,2.07-6.139  c0-2.045-0.633-3.846-1.901-5.402c-1.267-1.559-2.903-2.338-4.905-2.338c-4.313,0-7.694,2.915-10.14,8.742l-2.137-0.801  c2.891-8.185,7.448-12.276,13.678-12.276c3.069,0,5.682,1.044,7.839,3.135c2.159,2.091,3.236,4.67,3.236,7.74  c0,3.915-2.245,7.739-6.738,11.478l-4.668,3.866c-2.981,2.492-5.453,4.827-7.406,7.007c-0.136,0.135-0.402,0.446-0.802,0.936h12.41  c1.912,0,3.359-0.377,4.335-1.135c0.845-0.668,1.67-1.937,2.47-3.803L-586.354,251.593L-586.354,251.593z"
+     id="path305" /><g
+     id="g307"><path
+       fill="#A3C095"
+       d="M-439.651,224.637c9.052,9.051,14.651,21.551,14.651,35.36c0,27.616-22.387,50.003-50,50.003   c-13.807,0-26.305-5.596-35.354-14.646"
+       id="path309" /><path
+       fill="#CAC5C0"
+       d="M-510.354,295.354c-9.049-9.047-14.646-21.549-14.646-35.356c0-27.613,22.387-49.997,50-49.997   c13.804,0,26.301,5.593,35.349,14.637"
+       id="path311" /></g><path
+     fill="#0D0F0F"
+     d="M-481.354,251.591l-2.866,9.677h-23.821v-2.068c1.157-1.29,3.692-3.891,7.607-7.805  c2.357-2.359,4.692-4.851,7.005-7.476c1.157-1.288,2.048-2.401,2.667-3.336c1.379-1.999,2.07-4.046,2.07-6.138  c0-2.045-0.633-3.848-1.901-5.402c-1.267-1.561-2.903-2.339-4.905-2.339c-4.313,0-7.694,2.916-10.14,8.743l-2.137-0.803  c2.891-8.183,7.448-12.274,13.678-12.274c3.069,0,5.682,1.044,7.839,3.134c2.159,2.092,3.236,4.67,3.236,7.741  c0,3.915-2.245,7.737-6.738,11.476l-4.668,3.868c-2.981,2.492-5.453,4.827-7.406,7.005c-0.136,0.137-0.402,0.446-0.802,0.936h12.41  c1.912,0,3.359-0.377,4.335-1.133c0.845-0.67,1.67-1.937,2.47-3.806H-481.354L-481.354,251.591z"
+     id="path313" /><path
+     fill="#0D0F0F"
+     d="M-435.482,277.618c0,0.758-0.293,1.437-0.879,2.043c-0.586,0.604-1.257,0.905-2.015,0.905  c-1.208,0-2.098-0.566-2.663-1.701l-2.667-0.112c-0.568,0-1.684,0.246-3.346,0.737c-1.777,0.49-2.798,0.888-3.063,1.189  c-0.415,0.455-0.755,1.514-1.021,3.178c-0.228,1.361-0.339,2.363-0.339,3.006c0,1.02,0.16,1.768,0.481,2.24  c0.321,0.473,0.984,0.869,1.984,1.189c1,0.318,1.616,0.502,1.844,0.539c0.151,0,0.396-0.018,0.737-0.057h0.681  c0.491,0,1.002,0.076,1.533,0.227c0.755,0.227,1.078,0.527,0.965,0.907c-0.531-0.074-1.456,0.038-2.779,0.34l1.586,0.795  c0,0.454-0.642,0.679-1.928,0.679c-0.342,0-0.805-0.072-1.389-0.225c-0.587-0.154-0.975-0.229-1.163-0.229h-0.737  c-0.039,0.379-0.151,0.943-0.34,1.701c-0.645-0.037-1.4-0.416-2.27-1.133c-0.87-0.72-1.418-1.079-1.643-1.079  c-0.228,0-0.55,0.359-0.965,1.079c-0.417,0.717-0.625,1.207-0.625,1.475c-0.491-0.268-0.905-0.758-1.249-1.475  c-0.151-0.495-0.321-0.986-0.509-1.479c-0.378,0.039-1.077,0.836-2.098,2.385h-0.284c-0.077-0.113-0.361-0.906-0.853-2.385  c-1.172-0.375-2.267-0.563-3.288-0.563c-0.491,0-1.249,0.112-2.271,0.341l-1.586-0.113c0.225-0.228,0.888-0.662,1.984-1.305  c1.285-0.758,2.269-1.137,2.949-1.137c0.112,0,0.263,0.021,0.454,0.059c0.188,0.039,0.34,0.058,0.454,0.058  c0.262,0,0.69-0.142,1.276-0.427c0.586-0.283,0.926-0.539,1.018-0.766c0.098-0.229,0.145-0.813,0.145-1.759  c0-2.153-0.568-3.763-1.703-4.819c-0.984-0.945-2.608-1.625-4.876-2.043c-0.605,2.154-2.307,3.234-5.104,3.234  c-0.909,0-1.815-0.549-2.723-1.646c-0.905-1.098-1.361-2.099-1.361-3.006c0-1.4,0.586-2.552,1.758-3.46  c-0.944-0.981-1.417-1.983-1.417-3.006c0-0.944,0.292-1.776,0.879-2.496c0.586-0.716,1.353-1.133,2.296-1.248  c-0.074-1.208,0.321-2.042,1.191-2.495c-0.416-0.414-0.623-1.15-0.623-2.211c0-1.246,0.415-2.287,1.248-3.119  c0.83-0.83,1.872-1.248,3.117-1.248c1.363,0,2.479,0.475,3.347,1.418c1.098-3.742,3.459-5.613,7.089-5.613  c1.89,0,3.554,0.756,4.991,2.27c0.53,0.565,0.793,0.868,0.793,0.905c-0.453,0-0.225-0.086,0.681-0.254  c0.908-0.171,1.568-0.257,1.985-0.257c1.474,0,2.779,0.55,3.915,1.646c0.983,0.984,1.664,2.229,2.042,3.742  c0.264,0.039,0.679,0.151,1.246,0.341c0.832,0.417,1.249,1.135,1.249,2.155c0,0.188-0.152,0.549-0.454,1.079  c2.419,1.361,3.629,3.251,3.629,5.67c0,0.682-0.265,1.627-0.793,2.836C-435.973,275.689-435.482,276.521-435.482,277.618z   M-458.848,280.113v-0.736c0-0.869-0.425-1.664-1.275-2.382c-0.851-0.72-1.71-1.077-2.581-1.077c-1.06,0-2.042,0.246-2.949,0.734  C-463.65,276.542-461.381,277.693-458.848,280.113z M-459.869,273.083c-0.567-0.646-1.058-1.306-1.474-1.985  c-1.589,0.414-2.382,0.889-2.382,1.416c0.453-0.037,1.116,0.047,1.984,0.256C-460.873,272.979-460.247,273.083-459.869,273.083z   M-456.407,271.322v-2.495c-0.91-0.149-1.459-0.226-1.646-0.226v0.851L-456.407,271.322z M-449.035,269.736  c-0.455-0.189-1.305-0.568-2.554-1.135v4.877C-449.811,272.456-448.961,271.21-449.035,269.736z M-445.919,276.428l-1.246-1.529  c-0.754,0.529-1.521,1.066-2.298,1.615c-0.775,0.547-1.446,1.162-2.011,1.844C-449.775,277.447-447.919,276.807-445.919,276.428z"
+     id="path315" /><g
+     id="g317"><path
+       fill="#A3C095"
+       d="M100,259.998C100,287.613,77.615,310,49.998,310C22.385,310,0,287.613,0,259.998   C0,232.385,22.385,210,49.998,210C77.615,210,100,232.385,100,259.998z"
+       id="path319" /></g><g
+     id="g321"><circle
+       fill="#E49977"
+       cx="-55"
+       cy="260"
+       r="50"
+       id="circle323" /></g><g
+     id="g325"><circle
+       fill="#BAB1AB"
+       cx="-160"
+       cy="259.998"
+       r="50"
+       id="circle327" /></g><g
+     id="g329"><circle
+       fill="#C1D7E9"
+       cx="-265"
+       cy="260"
+       r="50"
+       id="circle331" /></g><g
+     id="g333"><circle
+       fill="#F8F6D8"
+       cx="-370"
+       cy="260"
+       r="50"
+       id="circle335" /></g><g
+     id="g337"><circle
+       fill="#CAC5C0"
+       cx="-895"
+       cy="364.998"
+       r="50"
+       id="circle339" /></g><path
+     fill="#0D0F0F"
+     d="M-859.668,373.918h-36.004l13.185-9.383c-4.898-3.887-10.566-5.828-16.984-5.828  c-3.211,0-5.414,0.613-6.59,1.836c-1.184,1.227-1.777,3.445-1.777,6.654c0,8.873,4.563,18.34,13.691,28.396l-10.391,10.521  c-12.09-14.705-18.129-27.844-18.129-39.424c0-6.928,2.086-12.447,6.27-16.545c4.18-4.098,9.746-6.148,16.668-6.148  c8.453,0,17.664,3.215,27.641,9.635l7.728-13.182L-859.668,373.918z"
+     id="path341" /><g
+     id="g343"><circle
+       fill="#0D0F0F"
+       cx="-790"
+       cy="364.998"
+       r="50"
+       id="circle345" /></g><path
+     fill="#FFFFFF"
+     d="M-761.055,339.277l-12.648,7.418c6.16,9.566,9.238,18.406,9.238,26.512c0,6.648-1.969,11.977-5.895,15.988  c-3.938,4.018-9.219,6.023-15.871,6.023c-11.113,0-23.719-5.797-37.824-17.391l10.094-9.977c9.656,8.76,18.73,13.135,27.246,13.135  c3.078,0,5.207-0.564,6.379-1.699c1.18-1.137,1.766-3.244,1.766-6.322c0-6.162-1.867-11.596-5.594-16.295l-8.996,12.643v-34.531  L-761.055,339.277z"
+     id="path347" /><g
+     id="g349"><circle
+       fill="#CAC5C0"
+       cx="-685"
+       cy="364.998"
+       r="50"
+       id="circle351" /></g><g
+     id="g353"><path
+       fill="#0D0F0F"
+       d="M-685.064,360.258c7.189-10.043,15.201-15.068,24.029-15.068c5.887,0,10.594,1.803,14.092,5.393   c3.508,3.594,5.264,8.334,5.264,14.225c0,5.895-1.756,10.697-5.264,14.42c-3.498,3.725-8.164,5.586-13.965,5.586   c-8.658,0-16.715-5.021-24.156-15.068c-7.621,10.047-15.592,15.068-23.902,15.068c-5.889,0-10.592-1.838-14.092-5.518   c-3.51-3.686-5.264-8.471-5.264-14.355c0-5.891,1.754-10.652,5.264-14.289c3.5-3.635,8.203-5.459,14.092-5.459   C-700.477,345.189-692.516,350.215-685.064,360.258z M-688.828,365.07c-6.756-9.266-13.563-13.902-20.402-13.902   c-4.07,0-7.316,1.279-9.738,3.832c-2.43,2.553-3.635,5.867-3.635,9.938c0,4.068,1.205,7.426,3.635,10.068   c2.422,2.643,5.668,3.959,9.738,3.959C-702.729,378.965-695.932,374.334-688.828,365.07z M-681.428,365.07   c7.021,9.264,13.9,13.895,20.658,13.895c3.973,0,7.164-1.273,9.543-3.832c2.379-2.553,3.574-5.867,3.574-9.938   c0-4.238-1.195-7.643-3.574-10.195s-5.654-3.832-9.809-3.832c-4.156,0-8.057,1.475-11.691,4.418   C-674.979,357.404-677.875,360.566-681.428,365.07z"
+       id="path355" /></g><g
+     id="g357"><circle
+       fill="#CAC5C0"
+       cx="-580"
+       cy="364.998"
+       r="50"
+       id="circle359" /></g><path
+     fill="#0D0F0F"
+     d="M-577.693,321.25v27.246c0,3.26,1.371,4.889,4.117,4.889h0.715v1.865h-14.496v-1.865h0.91  c2.656,0,3.98-1.629,3.98-4.889v-17.873c0-3.297-1.145-4.947-3.434-4.947h-1.457v-1.805h0.523c2.832,0,5.395-0.875,7.688-2.621  H-577.693L-577.693,321.25z"
+     id="path361" /><path
+     fill="#0D0F0F"
+     d="M-568.447,395.504l-2.504,8.455h-20.82v-1.809c1.012-1.127,3.227-3.4,6.648-6.822  c2.063-2.063,4.102-4.238,6.121-6.531c1.012-1.129,1.789-2.102,2.332-2.918c1.207-1.746,1.809-3.535,1.809-5.363  c0-1.789-0.555-3.363-1.66-4.723c-1.105-1.363-2.531-2.045-4.285-2.045c-3.773,0-6.727,2.551-8.863,7.643l-1.867-0.701  c2.527-7.15,6.508-10.729,11.953-10.729c2.684,0,4.965,0.912,6.855,2.738c1.887,1.828,2.828,4.082,2.828,6.768  c0,3.422-1.965,6.766-5.891,10.029l-4.082,3.379c-2.605,2.184-4.766,4.225-6.473,6.129c-0.117,0.113-0.352,0.391-0.699,0.814h10.848  c1.668,0,2.934-0.33,3.789-0.992c0.734-0.582,1.457-1.689,2.156-3.32h1.805V395.504z"
+     id="path363" /><g
+     id="g365"><path
+       fill="#0D0F0F"
+       d="M-609.268,364.455v-2.91h58.328v2.91H-609.268z"
+       id="path367" /></g><g
+     id="g369"><path
+       fill="#F8F6D8"
+       d="M-114,420c0,33.023,0,67.188,0,100c27.613,0,50-22.387,50-50.002C-64,442.385-86.387,420-114,420z"
+       id="path371" /></g><path
+     fill="#0D0F0F"
+     d="M-96.002,469.746c0-4.793-1.789-8.957-5.363-12.488c-3.514-3.473-7.658-5.229-12.428-5.289  c0,11.848,0,23.732,0,35.557c5.016-0.055,9.225-1.729,12.617-5.037C-97.727,479.129-96.002,474.877-96.002,469.746z"
+     id="path373" /><path
+     fill="#0D0F0F"
+     d="M-73.545,466.342c-2.859-4.207-5.428-6.311-7.697-6.311c-1.85,0-3.197,0.883-4.037,2.652  c-0.842,1.766-1.766,2.646-2.775,2.646c-1.432,0-2.566-0.508-3.406-1.516c-0.338-0.334-1.01-1.428-2.02-3.279l4.291-3.027  c1.514-1.012,2.271-2.104,2.271-3.277c0-0.676-0.213-1.727-0.633-3.156c-0.422-1.43-0.631-2.438-0.631-3.027  c0-1.262,1.684-2.398,5.049-3.406c3.699-1.012,6.475-1.766,8.326-2.271c-8.498-1.514-14.09-2.27-16.781-2.27  c-4.289,0-6.604,0.59-6.939,1.766c-0.082,0.172-0.021,0.93,0.191,2.273c0.209,1.344,0.314,2.143,0.314,2.395  c0,2.523-1.223,3.785-3.658,3.785c-1.18,0-2.902-0.797-5.174-2.396c1.008-3.361,1.092-6.012,0.252-7.947  c-0.252-0.672-1.262-1.809-3.027-3.406c-1.432-1.346-2.145-2.607-2.145-3.785c0-2.271,1.809-5.846,5.426-10.725  c-1.215,0.531-3.705,2.201-7.445,4.986c0,7.555,0,15.152,0,22.781c5.275,0.063,9.861,2.027,13.752,5.918  c3.953,3.953,5.932,8.623,5.932,14.004c0.082,5.721-1.789,10.453-5.617,14.193c-3.77,3.689-8.461,5.551-14.066,5.605  c0,7.588,0,15.143,0,22.639c6.203-4.473,9.338-7.816,9.338-10.012c0-0.42-0.781-1.139-2.334-2.146  c-1.559-1.01-2.336-2.354-2.336-4.037c0-3.363,1.936-5.342,5.805-5.932c1.936,4.461,4.121,6.688,6.561,6.688  c0.504,0,1.281-0.254,2.334-0.756c1.051-0.506,1.744-0.76,2.082-0.76c2.438,0,4.75,4.293,6.938,12.871  c1.684-7.484,2.523-13.037,2.523-16.652c0-3.785-0.514-5.68-1.547-5.68c-0.344,0-1.033,0.129-2.064,0.379  c-1.033,0.252-1.848,0.379-2.449,0.379c-0.947,0-2.107-0.629-3.482-1.893s-2.064-2.355-2.064-3.281c0-0.672,0.801-2.225,2.398-4.668  c2.859,0.674,4.752,1.01,5.678,1.01c2.271,0,3.783-1.025,4.541-3.092c0.76-2.059,1.811-3.092,3.154-3.092  c1.85,0,6.057,1.852,12.617,5.551C-69.467,472.27-71.949,468.695-73.545,466.342z"
+     id="path375" /><g
+     id="g377"><path
+       fill="#E49977"
+       d="M-59,420c0,33.334,0,66.666,0,100c27.613,0,50-22.387,50-50C-9,442.385-31.387,420-59,420z"
+       id="path379" /></g><path
+     fill="#0D0F0F"
+     d="M-24.313,488.145c-1.445,0.68-4.5,1.656-9.168,2.928c1.273-1.961,3.648-4.73,7.129-8.313  c3.477-3.582,5.859-6.523,7.129-8.826c1.949-3.408,2.93-7.203,2.93-11.381c0-7.93-3.484-16.332-10.441-25.199  c1.102,2.752,1.91,4.818,2.422,6.193c1.355,3.527,2.035,6.453,2.035,8.777c0,1.805-0.469,3.098-1.402,3.871  c-5.133-18.535-16.879-28.299-35.215-29.309c0,1.523,0,3.053,0,4.578c3.016,0.992,4.539,2.23,4.539,3.725  c0,0.668-1.531,1.383-4.539,2.143c0,1.277,0,2.555,0,3.832c0.023,0.002,0.066,0.01,0.086,0.01c1.949,0,4.113-0.639,6.492-1.91  c2.371-1.273,4.152-1.91,5.344-1.91c2.543,0,4.625,1.316,6.238,3.947c1.441,2.207,2.164,4.668,2.164,7.383  c0,2.121-0.512,3.182-1.527,3.182c-0.766,0-1.867-1.061-3.313-3.182c-1.02-1.611-1.781-2.801-2.289-3.564  c-0.172,0.598-0.254,1.189-0.254,1.783c0,3.564,1.633,6.871,4.898,9.928c3.265,3.059,6.684,4.668,10.25,4.84  c-0.172,2.291-0.766,4.668-1.781,7.127c-1.191,3.227-2.551,5.137-4.074,5.729c-1.02-1.018-1.527-2.459-1.527-4.326  c0-0.848,0.273-2.166,0.824-3.947c0.555-1.781,0.828-3.057,0.828-3.818c-0.848,0.34-1.805,1.252-2.863,2.738  c-1.063,1.484-1.676,2.734-1.844,3.754c-0.594,3.563-0.766,6.619-0.512,9.164c0.254,2.209-0.68,4.668-2.801,7.385  c-2.121,2.715-4.285,4.072-6.492,4.072c-1.445,0-2.758-0.297-3.945-0.891c-1.527-0.764-2.293-1.783-2.293-3.057  c0-2.035,1.824-4.113,5.473-6.236c5.094-3.055,8.066-9.037,8.914-17.949c0.254,0-1.953,1.295-6.621,3.883  c-3.574,1.984-6.695,3.199-9.375,3.664c0,14.457,0,28.912,0,43.369c10.566-0.686,18.539-2.59,23.887-5.725  c-1.273,0-4.414-0.064-9.422-0.191c-5.004-0.127-6.449-0.191-4.324-0.191c-0.426,0-0.938-0.273-1.527-0.826  c-0.598-0.553-0.891-1.039-0.891-1.463c0-1.357,1.781-2.422,5.344-3.186c2.375-0.508,4.586-0.762,6.621-0.762  c11.117,0,18.539-4.455,22.277-13.367c0.934-2.205,1.398-3.861,1.398-4.965C-18.164,484.537-21.09,486.703-24.313,488.145z"
+     id="path381" /><path
+     fill="#0D0F0F"
+     d="M-52.637,451.93c1.57-0.975,2.355-2.186,2.355-3.629c0-2.969-1.402-4.455-4.203-4.455  c-1.188,0-2.27,0.594-3.246,1.781c-0.449,0.547-0.832,0.953-1.164,1.25c0,2.082,0,4.164,0,6.246c0.523,0.17,1.059,0.271,1.609,0.271  C-55.758,453.395-54.207,452.906-52.637,451.93z"
+     id="path383" /><path
+     fill="#CAC5C0"
+     d="M-294,420h-88l0,0c-27.613,0-50,22.385-50,49.998c0,27.615,22.387,50.002,50,50.002l0,0h88  c27.613,0,50-22.387,50-50.002C-244,442.385-266.387,420-294,420z"
+     id="path385" /><path
+     fill="#0D0F0F"
+     d="M-388.421,433v59.301c0,7.096,2.98,10.639,8.957,10.639h1.559V507h-31.551v-4.061h1.979  c5.779,0,8.666-3.545,8.666-10.641V453.4c0-7.178-2.494-10.77-7.475-10.77h-3.17v-3.93h1.143c6.162,0,11.74-1.902,16.725-5.703  h3.167V433z"
+     id="path387" /><path
+     fill="#0D0F0F"
+     d="M-368.874,472.244c0-9.051,1.908-17.4,5.729-25.041c4.732-9.469,11.213-14.203,19.436-14.203  c8.137,0,14.49,4.029,19.059,12.082c3.818,6.646,5.729,14.373,5.729,23.174c0,9.141-1.91,17.402-5.729,24.795  c-4.652,9.301-11.131,13.949-19.436,13.949c-7.891,0-14.156-3.984-18.809-11.957C-366.882,488.232-368.874,480.635-368.874,472.244z   M-358.413,468.135c0,11.957,1.785,21.262,5.361,27.906c2.488,4.648,5.684,6.975,9.588,6.975c9.385,0,14.08-9.717,14.08-29.152  c0-8.553-0.748-15.781-2.24-21.676c-2.576-9.719-6.936-14.578-13.084-14.578c-9.139,0-13.705,9.387-13.705,28.158V468.135z"
+     id="path389" /><path
+     fill="#0D0F0F"
+     d="M-307.54,472.244c0-9.051,1.908-17.4,5.729-25.041c4.732-9.469,11.213-14.203,19.436-14.203  c8.137,0,14.49,4.029,19.059,12.082c3.818,6.646,5.729,14.373,5.729,23.174c0,9.141-1.91,17.402-5.729,24.795  c-4.652,9.301-11.131,13.949-19.436,13.949c-7.891,0-14.156-3.984-18.809-11.957C-305.548,488.232-307.54,480.635-307.54,472.244z   M-297.079,468.135c0,11.957,1.785,21.262,5.361,27.906c2.488,4.648,5.684,6.975,9.588,6.975c9.385,0,14.08-9.717,14.08-29.152  c0-8.553-0.748-15.781-2.24-21.676c-2.576-9.719-6.936-14.578-13.084-14.578c-9.139,0-13.705,9.387-13.705,28.158V468.135z"
+     id="path391" /><path
+     fill="#CAC5C0"
+     d="M-487,420h-408h-0.002C-922.615,420-945,442.385-945,469.998c0,27.615,22.385,50.002,49.998,50.002H-895h408  c27.613,0,50-22.387,50-50.002C-437,442.385-459.387,420-487,420z"
+     id="path393" /><g
+     id="g395"><path
+       fill="#0D0F0F"
+       d="M-860.859,505.529v-2.619c6.889-0.75,10.33-3.271,10.33-7.564c0-2.543-0.973-3.889-2.918-4.041   l-0.973-0.074c-2.797-0.197-4.195-1.572-4.195-4.117c0-1.445,0.438-2.584,1.311-3.406c0.875-0.82,2.035-1.234,3.482-1.234   c2.445,0,4.367,1.225,5.766,3.67c1.197,2.047,1.795,4.393,1.795,7.037c0,4.143-1.447,7.287-4.342,9.432   C-853.15,504.455-856.568,505.43-860.859,505.529z"
+       id="path397" /></g><g
+     id="g399"><path
+       fill="#0D0F0F"
+       d="M-658.385,505.529v-2.619c6.887-0.75,10.33-3.271,10.33-7.564c0-2.543-0.971-3.889-2.92-4.041l-0.971-0.074   c-2.795-0.197-4.193-1.572-4.193-4.117c0-1.445,0.438-2.584,1.309-3.406c0.875-0.82,2.035-1.234,3.482-1.234   c2.447,0,4.369,1.225,5.768,3.67c1.195,2.047,1.793,4.393,1.793,7.037c0,4.143-1.447,7.287-4.34,9.432   C-650.674,504.455-654.092,505.43-658.385,505.529z"
+       id="path401" /></g><path
+     fill="#0D0F0F"
+     d="M-514.471,470.367c0-9.543,2.025-18.344,6.08-26.396c5.021-9.98,11.9-14.971,20.625-14.971  c8.633,0,15.377,4.246,20.225,12.734c4.051,7.006,6.08,15.15,6.08,24.426c0,9.637-2.029,18.344-6.08,26.137  C-472.479,502.1-479.354,507-488.166,507c-8.373,0-15.023-4.199-19.961-12.604C-512.355,487.219-514.471,479.211-514.471,470.367z   M-503.369,466.033c0,12.604,1.895,22.41,5.689,29.414c2.641,4.9,6.033,7.354,10.176,7.354c9.959,0,14.939-10.244,14.939-30.729  c0-9.016-0.791-16.635-2.375-22.85c-2.734-10.242-7.361-15.365-13.887-15.365c-9.697,0-14.543,9.896-14.543,29.68L-503.369,466.033  L-503.369,466.033z"
+     id="path403" /><path
+     fill="#0D0F0F"
+     d="M-575.471,470.367c0-9.543,2.023-18.344,6.078-26.396c5.023-9.98,11.902-14.971,20.625-14.971  c8.633,0,15.379,4.246,20.227,12.734c4.051,7.006,6.078,15.15,6.078,24.426c0,9.637-2.027,18.344-6.078,26.137  C-533.479,502.1-540.354,507-549.166,507c-8.375,0-15.023-4.199-19.961-12.604C-573.357,487.219-575.471,479.211-575.471,470.367z   M-564.369,466.033c0,12.604,1.895,22.41,5.688,29.414c2.641,4.9,6.035,7.354,10.176,7.354c9.961,0,14.941-10.244,14.941-30.729  c0-9.016-0.793-16.635-2.375-22.85c-2.734-10.242-7.363-15.365-13.887-15.365c-9.699,0-14.543,9.896-14.543,29.68V466.033  L-564.369,466.033z"
+     id="path405" /><path
+     fill="#0D0F0F"
+     d="M-636.787,470.367c0-9.543,2.027-18.344,6.082-26.396c5.02-9.98,11.898-14.971,20.625-14.971  c8.633,0,15.375,4.246,20.223,12.734c4.051,7.006,6.082,15.15,6.082,24.426c0,9.637-2.031,18.344-6.082,26.137  C-594.795,502.1-601.67,507-610.482,507c-8.371,0-15.023-4.199-19.961-12.604C-634.67,487.219-636.787,479.211-636.787,470.367z   M-625.686,466.033c0,12.604,1.895,22.41,5.691,29.414c2.641,4.9,6.031,7.354,10.176,7.354c9.957,0,14.938-10.244,14.938-30.729  c0-9.016-0.789-16.635-2.375-22.85c-2.734-10.242-7.359-15.365-13.887-15.365c-9.695,0-14.543,9.896-14.543,29.68V466.033  L-625.686,466.033z"
+     id="path407" /><path
+     fill="#0D0F0F"
+     d="M-718.139,470.367c0-9.543,2.027-18.344,6.082-26.396c5.02-9.98,11.898-14.971,20.625-14.971  c8.633,0,15.375,4.246,20.223,12.734c4.051,7.006,6.082,15.15,6.082,24.426c0,9.637-2.031,18.344-6.082,26.137  C-676.146,502.1-683.021,507-691.834,507c-8.371,0-15.023-4.199-19.961-12.604C-716.021,487.219-718.139,479.211-718.139,470.367z   M-707.037,466.033c0,12.604,1.895,22.41,5.691,29.414c2.641,4.9,6.031,7.354,10.176,7.354c9.957,0,14.938-10.244,14.938-30.729  c0-9.016-0.789-16.635-2.375-22.85c-2.734-10.242-7.359-15.365-13.887-15.365c-9.695,0-14.543,9.896-14.543,29.68V466.033  L-707.037,466.033z"
+     id="path409" /><path
+     fill="#0D0F0F"
+     d="M-779.139,470.367c0-9.543,2.025-18.344,6.08-26.396c5.021-9.98,11.9-14.971,20.625-14.971  c8.633,0,15.377,4.246,20.225,12.734c4.051,7.006,6.078,15.15,6.078,24.426c0,9.637-2.027,18.344-6.078,26.137  C-737.146,502.1-744.021,507-752.834,507c-8.373,0-15.023-4.199-19.961-12.604C-777.023,487.219-779.139,479.211-779.139,470.367z   M-768.037,466.033c0,12.604,1.895,22.41,5.689,29.414c2.641,4.9,6.033,7.354,10.176,7.354c9.959,0,14.939-10.244,14.939-30.729  c0-9.016-0.791-16.635-2.375-22.85c-2.734-10.242-7.361-15.365-13.887-15.365c-9.697,0-14.543,9.896-14.543,29.68L-768.037,466.033  L-768.037,466.033z"
+     id="path411" /><path
+     fill="#0D0F0F"
+     d="M-840.453,470.367c0-9.543,2.025-18.344,6.08-26.396c5.021-9.98,11.9-14.971,20.625-14.971  c8.633,0,15.377,4.246,20.225,12.734c4.051,7.006,6.08,15.15,6.08,24.426c0,9.637-2.029,18.344-6.08,26.137  C-798.461,502.1-805.336,507-814.148,507c-8.373,0-15.023-4.199-19.961-12.604C-838.338,487.219-840.453,479.211-840.453,470.367z   M-829.352,466.033c0,12.604,1.895,22.41,5.689,29.414c2.641,4.9,6.033,7.354,10.176,7.354c9.959,0,14.939-10.244,14.939-30.729  c0-9.016-0.791-16.635-2.375-22.85c-2.734-10.242-7.361-15.365-13.887-15.365c-9.697,0-14.543,9.896-14.543,29.68L-829.352,466.033  L-829.352,466.033z"
+     id="path413" /><path
+     fill="#0D0F0F"
+     d="M-883.207,429.002v62.506c0,7.479,3.225,11.215,9.686,11.215h1.684v4.279h-34.109v-4.279h2.141  c6.246,0,9.367-3.736,9.367-11.215v-41.004c0-7.563-2.695-11.352-8.08-11.352h-3.428v-4.141h1.236c6.66,0,12.691-2.006,18.08-6.012  h3.423V429.002z"
+     id="path415" /><path
+     d="M-162.858,420c-36.768,1.68,4.253,32.994-16.484,49.5c0,0.002-0.003,0.004-0.005,0.004c-0.001-0.004-0.004-0.008-0.007-0.01  c-0.102,0.041-0.192,0.088-0.293,0.129c-14.524,5.879-30.695-17.715-31.166,7.076c7.67-11.506,11.167-0.273,23.775-0.977  c-6.123,8.09-3.121,21.664-13.33,23.873c-18.65,4.033-32.297-18.639-31.16-32.869c2.525-31.602,27.29-45.969,51.881-44.488  c-32.55-6.518-60.143,20.309-59.335,48.137c0.928,31.91,17.857,47.527,43.841,49.625c36.768-1.678-4.253-32.996,16.484-49.5  c0.002-0.002,0.003-0.004,0.005-0.004c0.003,0.004,0.004,0.008,0.007,0.01c0.102-0.041,0.192-0.088,0.294-0.129  c14.523-5.879,30.696,17.715,31.165-7.076c-7.669,11.506-11.167,0.273-23.775,0.977c6.123-8.09,3.123-21.664,13.331-23.871  c18.651-4.033,32.296,18.637,31.159,32.867c-2.523,31.604-27.289,45.969-51.88,44.488c32.55,6.518,60.143-20.309,59.334-48.139  C-119.944,437.715-136.875,422.1-162.858,420z"
+     id="path417" /><path
+     fill="#111212"
+     d="M-342.437,259.925c0.058-5.344-1.64-10.739-4.967-14.928c-1.608-1.771-2.93-3.787-4.633-5.461  c-3.754-3.726-9.375-3.974-13.897-6.321c-0.263-2.357-1.125-4.715-0.603-7.093c0.159-0.791,0.392-1.593-0.029-2.349  c-1.186-2.732-0.167-5.698-0.378-8.547c-0.158-1.488-0.057-3.309-1.474-4.228c-0.33,3.097-1.469,5.979-2.392,8.918  c-0.426,2.29-0.426,4.676-1.413,6.836c0.626,2.188-0.614,4.03-1.956,5.646c-2.966,1.52-6.496,1.881-9.077,4.11  c-1.841,1.562-3.828,2.931-5.888,4.202c-1.545,1.934-3.256,3.797-3.944,6.24c-2.762,3.335-3.088,7.811-4.654,11.717  c-0.029,5.799,1.146,12.043,4.85,16.691c2.65,2.188,4.502,5.131,7.148,7.32c2.54,1.516,5.251,2.762,7.874,4.127  c1.71,0.398,3.475,0.594,5.176,1.059c1.38,7.109,2.322,14.391,5.092,21.133c0.919-2.768,0.808-5.734,1.601-8.531  c1.118-4.136-1.176-8.441,0.117-12.501c1.938-1.733,5.17-0.608,7.32-2.095c4.092-2.523,8.422-4.98,11.39-8.84  c1.105-2.219,3.426-3.877,3.426-6.539C-343.729,266.906-341.638,263.549-342.437,259.925z M-372.81,281.855  c-2.965-0.721-5.727-2.139-8.214-3.871c-2.676-1.783-3.674-5.11-6.314-6.934c-2.472-2.951-1.937-6.982-2.95-10.476  c0.406-2.438,0.885-4.856,1.138-7.325c1.206-1.956,3.067-3.516,3.583-5.87c1.767-2.532,4.458-4.284,6.619-6.479  c1.572-1.813,4.074-1.049,6.139-1.119c-0.205,2-0.368,4.068,0.133,6.041c0.244,1.212,0.791,2.406,0.604,3.676  c-0.414,2.699,0.599,5.406-0.117,8.074c-1.443,5.578,0.131,11.209,0.268,16.832C-372.127,276.895-372.243,279.404-372.81,281.855z   M-350.333,271.285c-1.964,1.396-3.637,3.111-5.351,4.785c-2.979,2.06-5.923,4.24-9.469,5.27c0.32-2.529,0.632-5.131-0.174-7.607  c-1.978-5.594,0.446-11.445,0.855-17.102c-0.361-3.363-0.016-6.951-1.558-10.049c-0.202-2.327,0.804-4.574,1.486-6.764  c2.342,0.935,4.547,2.197,6.496,3.82c2.354,1.764,5.96,2.908,6.487,6.198c0.269,2.161,2.634,3.468,2.565,5.679  C-349.144,260.771-348.419,266.268-350.333,271.285z"
+     id="path419" /><path
+     fill="#111212"
+     d="M-237.438,259.925c0.058-5.344-1.64-10.739-4.967-14.928c-1.608-1.771-2.93-3.787-4.633-5.461  c-3.754-3.726-9.375-3.974-13.897-6.321c-0.263-2.357-1.125-4.715-0.603-7.093c0.159-0.791,0.392-1.593-0.029-2.349  c-1.186-2.732-0.167-5.698-0.378-8.547c-0.158-1.488-0.057-3.309-1.474-4.228c-0.33,3.097-1.469,5.979-2.392,8.918  c-0.426,2.29-0.426,4.676-1.413,6.836c0.626,2.188-0.614,4.03-1.956,5.646c-2.966,1.52-6.496,1.881-9.077,4.11  c-1.841,1.562-3.828,2.931-5.888,4.202c-1.545,1.934-3.256,3.797-3.944,6.24c-2.762,3.335-3.088,7.811-4.654,11.717  c-0.029,5.799,1.146,12.043,4.85,16.691c2.65,2.188,4.502,5.131,7.148,7.32c2.54,1.516,5.251,2.762,7.874,4.127  c1.71,0.398,3.475,0.594,5.176,1.059c1.38,7.109,2.322,14.391,5.092,21.133c0.919-2.768,0.808-5.734,1.601-8.531  c1.118-4.136-1.176-8.441,0.117-12.501c1.938-1.733,5.17-0.608,7.32-2.095c4.092-2.523,8.422-4.98,11.39-8.84  c1.105-2.219,3.426-3.877,3.426-6.539C-238.73,266.906-236.64,263.549-237.438,259.925z M-267.812,281.855  c-2.965-0.721-5.727-2.139-8.214-3.871c-2.676-1.783-3.674-5.11-6.314-6.934c-2.472-2.951-1.937-6.982-2.95-10.476  c0.406-2.438,0.885-4.856,1.138-7.325c1.206-1.956,3.067-3.516,3.583-5.87c1.767-2.532,4.458-4.284,6.619-6.479  c1.572-1.813,4.074-1.049,6.139-1.119c-0.205,2-0.368,4.068,0.133,6.041c0.244,1.212,0.791,2.406,0.603,3.676  c-0.414,2.699,0.599,5.406-0.117,8.074c-1.443,5.578,0.131,11.209,0.268,16.832C-267.129,276.895-267.245,279.404-267.812,281.855z   M-245.335,271.285c-1.964,1.396-3.637,3.111-5.351,4.785c-2.979,2.06-5.923,4.24-9.469,5.27c0.32-2.529,0.632-5.131-0.174-7.607  c-1.978-5.594,0.446-11.445,0.855-17.102c-0.361-3.363-0.016-6.951-1.558-10.049c-0.202-2.327,0.804-4.574,1.486-6.764  c2.342,0.935,4.547,2.197,6.496,3.82c2.354,1.764,5.96,2.908,6.487,6.198c0.269,2.161,2.634,3.468,2.565,5.679  C-244.146,260.771-243.421,266.268-245.335,271.285z"
+     id="path421" /><path
+     fill="#111212"
+     d="M-132.438,259.925c0.058-5.344-1.64-10.739-4.967-14.928c-1.608-1.771-2.93-3.787-4.633-5.461  c-3.754-3.726-9.375-3.974-13.897-6.321c-0.263-2.357-1.125-4.715-0.603-7.093c0.159-0.791,0.392-1.593-0.029-2.349  c-1.186-2.732-0.167-5.698-0.378-8.547c-0.158-1.488-0.057-3.309-1.474-4.228c-0.33,3.097-1.469,5.979-2.392,8.918  c-0.426,2.29-0.426,4.676-1.413,6.836c0.626,2.188-0.614,4.03-1.956,5.646c-2.966,1.52-6.496,1.881-9.077,4.11  c-1.841,1.562-3.828,2.931-5.888,4.202c-1.545,1.934-3.256,3.797-3.944,6.24c-2.762,3.335-3.088,7.811-4.654,11.717  c-0.029,5.799,1.146,12.043,4.85,16.691c2.65,2.188,4.502,5.131,7.148,7.32c2.54,1.516,5.251,2.762,7.874,4.127  c1.71,0.398,3.475,0.594,5.176,1.059c1.38,7.109,2.322,14.391,5.092,21.133c0.919-2.768,0.808-5.734,1.601-8.531  c1.118-4.136-1.176-8.441,0.117-12.501c1.938-1.733,5.17-0.608,7.32-2.095c4.092-2.523,8.422-4.98,11.39-8.84  c1.105-2.219,3.426-3.877,3.426-6.539C-133.73,266.906-131.64,263.549-132.438,259.925z M-162.812,281.855  c-2.965-0.721-5.727-2.139-8.214-3.871c-2.676-1.783-3.674-5.11-6.314-6.934c-2.472-2.951-1.937-6.982-2.95-10.476  c0.406-2.438,0.885-4.856,1.138-7.325c1.206-1.956,3.067-3.516,3.583-5.87c1.767-2.532,4.458-4.284,6.619-6.479  c1.572-1.813,4.074-1.049,6.139-1.119c-0.205,2-0.368,4.068,0.133,6.041c0.244,1.212,0.791,2.406,0.603,3.676  c-0.414,2.699,0.599,5.406-0.117,8.074c-1.443,5.578,0.131,11.209,0.268,16.832C-162.129,276.895-162.245,279.404-162.812,281.855z   M-140.335,271.285c-1.964,1.396-3.637,3.111-5.351,4.785c-2.979,2.06-5.923,4.24-9.469,5.27c0.32-2.529,0.632-5.131-0.174-7.607  c-1.978-5.594,0.446-11.445,0.855-17.102c-0.361-3.363-0.016-6.951-1.558-10.049c-0.202-2.327,0.804-4.574,1.486-6.764  c2.342,0.935,4.547,2.197,6.496,3.82c2.354,1.764,5.96,2.908,6.487,6.198c0.269,2.161,2.634,3.468,2.565,5.679  C-139.146,260.771-138.421,266.268-140.335,271.285z"
+     id="path423" /><path
+     fill="#111212"
+     d="M-27.438,259.925c0.058-5.344-1.64-10.739-4.967-14.928c-1.608-1.771-2.93-3.787-4.633-5.461  c-3.754-3.726-9.375-3.974-13.897-6.321c-0.263-2.357-1.125-4.715-0.603-7.093c0.159-0.791,0.392-1.593-0.029-2.349  c-1.186-2.732-0.167-5.698-0.378-8.547c-0.158-1.488-0.057-3.309-1.474-4.228c-0.33,3.097-1.469,5.979-2.392,8.918  c-0.426,2.29-0.426,4.676-1.413,6.836c0.626,2.188-0.614,4.03-1.956,5.646c-2.966,1.52-6.496,1.881-9.077,4.11  c-1.841,1.562-3.828,2.931-5.888,4.202c-1.545,1.934-3.256,3.797-3.944,6.24c-2.762,3.335-3.088,7.811-4.654,11.717  c-0.029,5.799,1.146,12.043,4.85,16.691c2.65,2.188,4.502,5.131,7.148,7.32c2.54,1.516,5.251,2.762,7.874,4.127  c1.71,0.398,3.475,0.594,5.176,1.059c1.38,7.109,2.322,14.391,5.092,21.133c0.919-2.768,0.808-5.734,1.601-8.531  c1.118-4.136-1.176-8.441,0.117-12.501c1.938-1.733,5.17-0.608,7.32-2.095c4.092-2.523,8.422-4.98,11.39-8.84  c1.105-2.219,3.426-3.877,3.426-6.539C-28.73,266.906-26.64,263.549-27.438,259.925z M-57.812,281.855  c-2.965-0.721-5.727-2.139-8.214-3.871c-2.676-1.783-3.674-5.11-6.314-6.934c-2.472-2.951-1.937-6.982-2.95-10.476  c0.406-2.438,0.885-4.856,1.138-7.325c1.206-1.956,3.067-3.516,3.583-5.87c1.767-2.532,4.458-4.284,6.619-6.479  c1.572-1.813,4.074-1.049,6.139-1.119c-0.205,2-0.368,4.068,0.133,6.041c0.244,1.212,0.791,2.406,0.603,3.676  c-0.414,2.699,0.599,5.406-0.117,8.074c-1.443,5.578,0.131,11.209,0.268,16.832C-57.129,276.895-57.245,279.404-57.812,281.855z   M-35.335,271.285c-1.964,1.396-3.637,3.111-5.351,4.785c-2.979,2.06-5.923,4.24-9.469,5.27c0.32-2.529,0.632-5.131-0.174-7.607  c-1.978-5.594,0.446-11.445,0.855-17.102c-0.361-3.363-0.016-6.951-1.558-10.049c-0.202-2.327,0.804-4.574,1.486-6.764  c2.342,0.935,4.547,2.197,6.496,3.82c2.354,1.764,5.96,2.908,6.487,6.198c0.269,2.161,2.634,3.468,2.565,5.679  C-34.146,260.771-33.421,266.268-35.335,271.285z"
+     id="path425" /><path
+     fill="#111212"
+     d="M77.563,259.925c0.058-5.344-1.641-10.739-4.967-14.928c-1.609-1.771-2.931-3.787-4.634-5.461  c-3.754-3.726-9.375-3.974-13.897-6.321c-0.262-2.357-1.125-4.715-0.603-7.093c0.159-0.791,0.392-1.593-0.028-2.349  c-1.187-2.732-0.168-5.698-0.379-8.547c-0.158-1.488-0.057-3.309-1.474-4.228c-0.33,3.097-1.469,5.979-2.392,8.918  c-0.426,2.29-0.426,4.676-1.413,6.836c0.626,2.188-0.614,4.03-1.956,5.646c-2.966,1.52-6.496,1.881-9.077,4.11  c-1.841,1.562-3.828,2.931-5.888,4.202c-1.545,1.934-3.256,3.797-3.944,6.24c-2.762,3.335-3.088,7.811-4.654,11.717  c-0.029,5.799,1.146,12.043,4.85,16.691c2.65,2.188,4.502,5.131,7.148,7.32c2.54,1.516,5.251,2.762,7.874,4.127  c1.71,0.398,3.475,0.594,5.176,1.059c1.38,7.109,2.322,14.391,5.091,21.133c0.92-2.768,0.809-5.734,1.602-8.531  c1.118-4.136-1.176-8.441,0.117-12.501c1.938-1.733,5.17-0.608,7.32-2.095c4.092-2.523,8.422-4.98,11.39-8.84  c1.104-2.219,3.426-3.877,3.426-6.539C76.27,266.906,78.359,263.549,77.563,259.925z M47.188,281.855  c-2.965-0.721-5.727-2.139-8.214-3.871c-2.676-1.783-3.674-5.11-6.314-6.934c-2.472-2.951-1.937-6.982-2.95-10.476  c0.406-2.438,0.885-4.856,1.138-7.325c1.206-1.956,3.067-3.516,3.583-5.87c1.767-2.532,4.458-4.284,6.619-6.479  c1.572-1.813,4.074-1.049,6.139-1.119c-0.205,2-0.368,4.068,0.133,6.041c0.244,1.212,0.791,2.406,0.603,3.676  c-0.414,2.699,0.599,5.406-0.117,8.074c-1.443,5.578,0.131,11.209,0.268,16.832C47.871,276.895,47.755,279.404,47.188,281.855z   M69.665,271.285c-1.964,1.396-3.638,3.111-5.351,4.785c-2.979,2.06-5.924,4.24-9.469,5.27c0.319-2.529,0.631-5.131-0.175-7.607  c-1.978-5.594,0.446-11.445,0.854-17.102c-0.36-3.363-0.016-6.951-1.557-10.049c-0.203-2.327,0.803-4.574,1.485-6.764  c2.342,0.935,4.547,2.197,6.496,3.82c2.354,1.764,5.96,2.908,6.487,6.198c0.269,2.161,2.633,3.468,2.564,5.679  C70.854,260.771,71.579,266.268,69.665,271.285z"
+     id="path427" /><g
+     id="g429"><path
+       d="M34,420L5.678,520H-4l28.322-100H34z"
+       id="path431" /></g><path
+     fill="#111212"
+     d="M94.32,470.242c0.059-5.344-1.639-10.738-4.967-14.928c-1.607-1.77-2.931-3.787-4.633-5.461  c-3.755-3.725-9.375-3.973-13.896-6.32c-0.264-2.357-1.125-4.715-0.604-7.094c0.159-0.791,0.393-1.592-0.029-2.348  c-1.187-2.732-0.166-5.699-0.377-8.547c-0.158-1.488-0.058-3.309-1.476-4.229c-0.33,3.098-1.469,5.98-2.392,8.918  c-0.426,2.291-0.426,4.676-1.413,6.836c0.627,2.189-0.613,4.031-1.955,5.646c-2.968,1.52-6.496,1.881-9.078,4.109  c-1.84,1.563-3.828,2.932-5.887,4.203c-1.545,1.934-3.256,3.797-3.945,6.24c-2.762,3.334-3.088,7.811-4.654,11.717  c-0.029,5.799,1.146,12.043,4.85,16.691c2.65,2.188,4.502,5.131,7.149,7.318c2.541,1.518,5.252,2.764,7.875,4.127  c1.709,0.4,3.475,0.596,5.176,1.061c1.379,7.109,2.322,14.389,5.092,21.133c0.918-2.768,0.807-5.736,1.6-8.533  c1.119-4.135-1.176-8.439,0.117-12.5c1.938-1.732,5.17-0.607,7.32-2.094c4.092-2.523,8.422-4.98,11.391-8.84  c1.105-2.219,3.426-3.877,3.426-6.539C93.029,477.225,95.119,473.867,94.32,470.242z M63.947,492.174  c-2.965-0.721-5.727-2.139-8.213-3.871c-2.676-1.783-3.674-5.109-6.314-6.934c-2.473-2.949-1.938-6.98-2.951-10.475  c0.406-2.439,0.885-4.857,1.139-7.326c1.205-1.955,3.066-3.514,3.582-5.869c1.769-2.533,4.459-4.285,6.619-6.48  c1.572-1.813,4.074-1.047,6.139-1.119c-0.204,2-0.366,4.07,0.134,6.041c0.244,1.213,0.791,2.408,0.604,3.676  c-0.414,2.699,0.598,5.408-0.117,8.076c-1.443,5.576,0.131,11.209,0.268,16.832C64.631,487.213,64.514,489.723,63.947,492.174z   M86.424,481.604c-1.963,1.398-3.637,3.111-5.35,4.785c-2.979,2.061-5.924,4.24-9.469,5.27c0.319-2.529,0.631-5.131-0.174-7.607  c-1.979-5.594,0.444-11.445,0.854-17.102c-0.361-3.363-0.017-6.951-1.56-10.049c-0.201-2.326,0.806-4.574,1.486-6.764  c2.342,0.936,4.547,2.197,6.496,3.82c2.354,1.766,5.961,2.908,6.488,6.199c0.268,2.16,2.633,3.467,2.564,5.678  C87.613,471.09,88.338,476.586,86.424,481.604z"
+     id="path433" /><g
+     id="g435"><circle
+       fill="#F7F4D8"
+       cx="-265"
+       cy="365.068"
+       r="50"
+       id="circle437" /><path
+       fill="#0D0F0F"
+       d="M-280.436,392.881c1.674-1.963,6.073-1.816,6.656,2.139c0.354,2.41,1,10.109,1.808,13.346   c0.427,1.713,1.257,3.156,2.339,3.227c1.922,0.123,6.614-3.75,7.614-5.566c1.773-3.229,3.058-6.877,4.27-10.785   c0.475-1.523,2.1-1.598,2.994-0.123c1.665,2.754,4.891,7.43,7.625,10.795c0.722,0.887,1.591,0.787,1.793-0.629   c0.731-5.123,1.84-11.178,3.859-16.652c0.668-1.809,2.553-2.012,4.031-1.111c0.836,0.508,3.529,1.854,4.547,2.168   c1.747,0.541,3.232,0.658,5.476-1.01c1.722-1.283,1.854-2.533,0.954-3.906c-1.847-2.82-4.365-4.994-6.375-7.91   c-1.108-1.605-0.998-2.752,0.407-3.584c3.611-2.139,6.763-4.584,9.646-6.955c1.06-0.871,1.827-2.168,2.07-4.379   c0.351-3.174,0.56-4.756-0.833-5.148c-1.367-0.391-2.198,0.59-7.983,2.088c-1.374,0.354-2.971,0.57-3.511-0.168   c-0.554-0.758-0.187-2.205,0.998-3.512c1.775-1.957,4.089-4.277,5.896-6.984c0.866-1.297,1.938-3.41,1.088-4.678   c-0.929-1.385-3.298-0.619-4.414-0.127c-1.554,0.684-4.609,1.338-6.469,1.607c-2.421,0.352-4.232,0.258-4.971-0.518   c-0.658-0.691-0.862-2.344-0.148-4.158c1.054-2.68,2.957-5.137,4.527-6.449c1.396-1.166,1.275-1.848,0.204-2.754   c-0.858-0.725-3.479-1.217-5.473-0.613c-2.937,0.891-5.728,2.352-8.333,4.311c-1.47,1.104-3.445,1.654-5.008,1.385   c-1.283-0.221-2.67-1.268-3.031-3.363c-0.801-4.66-1.85-9.357-3.03-11.992c-0.721-1.607-1.27-2.191-2.254-2.182   c-0.961,0.012-1.571,0.777-2.403,2.365c-1.322,2.527-2.68,7.619-3.695,11.809c-0.592,2.439-1.679,3.404-3.604,4.564   c-1.072,0.646-2.088,0.223-2.643-1.146c-0.553-1.361-2.465-5.932-3.086-7.799c-0.407-1.219-0.906-1.293-1.701-0.129   c-1.811,2.654-4.822,7.707-6.135,10.479c-0.775,1.637-0.941,3.164,0.073,4.195c1.356,1.377,1.884,2.063,1.109,2.863   c-0.536,0.555-2.913,0.186-5.519-0.406c-1.726-0.391-4.664-0.85-7.344,0c-2.212,0.703-3.629,1.834-3.844,3.277   c-0.172,1.158,2.106,4.43,3.443,5.557c0.989,0.834,1.446,1.512,1.547,2.236c0.203,1.479,0,3.383-0.832,4.619   c-0.438,0.65-1.83,0.666-4.62,0.832c-6.253,0.373-8.985,1.563-9.296,6.006c-0.223,3.189,2.099,5.09,5.618,4.25   c1.565-0.373,2.976-0.518,4.731-0.148c1.719,0.363,4.822,1.275,4.842,2.939c0.022,2.068-3.217,2.551-6.344,3.713   c-1.248,0.463-0.92,1.666,0.135,1.85c1.035,0.182,12.755,3.258,14.945,5.949c1.213,1.49-0.172,4.783-0.976,6.691   c-0.788,1.873-0.388,7.355,0.333,7.539c0.752,0.193,2.458-1.533,3.63-2.762C-283.607,396.469-281.977,394.686-280.436,392.881z"
+       id="path439" /><path
+       fill="none"
+       stroke="#F7F4D8"
+       stroke-width="2.5"
+       stroke-miterlimit="10"
+       d="M-245.112,365.068   c0,10.982-8.903,19.885-19.884,19.885c-10.988,0-19.891-8.9-19.891-19.885c0-10.98,8.902-19.883,19.891-19.883   C-254.016,345.186-245.112,354.088-245.112,365.068z"
+       id="path441" /></g><g
+     id="g443"><g
+       id="g445"><circle
+         fill="#C9C4BE"
+         cx="-475.125"
+         cy="365.068"
+         r="50"
+         id="circle447" /></g><g
+       id="g449"><path
+         fill="#0D0F0F"
+         d="M-430.349,370.916l-10.57,12.729l-2.59-2.588c1.007-2.541,1.645-4.879,1.907-7.014    c0.262-2.133,0.154-4.109-0.324-5.934c-0.048-0.238-0.106-0.467-0.18-0.682c-0.071-0.219-0.155-0.422-0.252-0.613    c-0.383-1.148-0.959-2.229-1.727-3.234c-0.767-1.01-1.868-2.23-3.306-3.668l-7.552-7.695l-35.094,35.096    c-3.069,3.066-4.724,5.729-4.963,7.979c-0.241,2.256,0.863,4.605,3.309,7.051l1.007,0.861l-2.733,2.732l-23.012-23.012    l2.732-2.732l1.15,1.148c2.397,2.494,4.722,3.623,6.976,3.381c2.253-0.238,4.891-1.871,7.911-4.891l35.165-35.166l-7.838-7.838    c-2.205-2.109-4.087-3.584-5.645-4.422c-1.559-0.84-3.37-1.188-5.429-1.043c-0.289,0-0.59,0.012-0.9,0.035    c-0.312,0.025-0.636,0.061-0.971,0.107c-0.624,0.049-1.175,0.119-1.653,0.217c-0.48,0.096-0.936,0.166-1.367,0.215    c-0.145,0.049-0.276,0.084-0.395,0.107c-0.12,0.023-0.276,0.037-0.468,0.035c-0.528,0.145-1.128,0.313-1.798,0.504    c-0.673,0.189-1.511,0.408-2.518,0.646l-2.373-2.518l12.44-10.857L-430.349,370.916z"
+         id="path451" /></g></g><g
+     id="g453"><g
+       id="g455"><circle
+         fill="#C9C4BE"
+         cx="-369.999"
+         cy="365.139"
+         r="50"
+         id="circle457" /></g><path
+       fill="#0D0F0F"
+       d="M-370.61,409.533c-3.242,3.24-8.498,3.24-11.741,0l-32.043-32.043c-3.239-3.242-3.239-8.5,0-11.742   l45.007-45.006c3.243-3.24,8.5-3.24,11.741,0l32.043,32.043c3.241,3.242,3.241,8.498,0,11.74L-370.61,409.533z"
+       id="path459" /><path
+       fill="#FFFFFF"
+       d="M-335.734,373.012h-36.005l13.183-9.385c-4.896-3.887-10.564-5.828-16.984-5.828   c-3.209,0-5.412,0.611-6.588,1.836c-1.186,1.227-1.776,3.443-1.776,6.654c0,8.873,4.562,18.34,13.688,28.396l-10.389,10.523   c-12.09-14.705-18.129-27.848-18.129-39.428c0-6.926,2.084-12.445,6.269-16.545c4.181-4.098,9.747-6.146,16.667-6.146   c8.453,0,17.665,3.213,27.643,9.633l7.726-13.18L-335.734,373.012z"
+       id="path461" /></g><g
+     id="g463"><g
+       id="g465"><path
+         fill="#C9C4BE"
+         d="M-635,49.998C-635,77.611-657.383,100-685,100c-27.613,0-50-22.387-50-50.001C-735,22.384-712.613,0-685,0    C-657.383,0-635,22.384-635,49.998z"
+         id="path467" /></g><g
+       id="g469"><path
+         fill="#0D0F0F"
+         d="M-680.09,65.695c0,3.988,0.654,6.793,1.963,8.414s3.521,2.431,6.639,2.431l0.748-0.095V80h-28.796v-3.553    h0.934c3.117,0.063,5.33-0.717,6.639-2.338c1.309-1.619,1.963-4.394,1.963-8.319V53.26l-18.325-26.833    c-0.748-0.997-1.402-1.87-1.964-2.618c-0.561-0.748-1.091-1.339-1.589-1.776c-0.811-0.686-1.668-1.169-2.571-1.45    c-0.904-0.281-2.073-0.514-3.506-0.701v-3.647H-690v3.553c-2.805,0.25-4.708,0.64-5.703,1.168    c-0.998,0.53-1.496,1.512-1.496,2.945c0,0.624,0.124,1.248,0.373,1.87c0.249,0.624,0.592,1.278,1.029,1.963l14.212,20.569    l10.378-15.24c0.996-1.371,1.713-2.555,2.15-3.553c0.435-0.996,0.715-1.931,0.841-2.804c0-0.125,0-0.249,0-0.374s0-0.249,0-0.375    c0-1.931-0.53-3.366-1.589-4.3c-1.06-0.936-2.899-1.527-5.516-1.776v-3.647h23.093v3.553c-0.748,0.125-1.435,0.296-2.056,0.514    c-0.624,0.219-1.216,0.515-1.777,0.889c-0.998,0.561-2.026,1.449-3.085,2.665c-1.061,1.215-2.337,2.915-3.833,5.096l-17.11,24.309    v12.436H-680.09z"
+         id="path471" /></g></g><g
+     id="g473"><g
+       id="g475"><path
+         fill="#C9C4BE"
+         d="M-530,49.998C-530,77.613-552.384,100-580,100c-27.613,0-50-22.387-50-50.002C-630,22.385-607.613,0-580,0    C-552.384,0-530,22.385-530,49.998z"
+         id="path477" /></g><g
+       id="g479"><path
+         fill="#0D0F0F"
+         d="M-555.645,79.999h-53.76v-2.711l42.635-57.22h-18.979c-3.118,0.063-5.517,0.391-7.2,0.981    c-1.683,0.594-3.242,1.73-4.675,3.413c-0.125,0.126-0.233,0.25-0.327,0.374c-0.093,0.126-0.203,0.25-0.327,0.373    c-0.25,0.375-0.483,0.702-0.702,0.982c-0.219,0.28-0.42,0.577-0.607,0.889c-0.063,0.188-0.156,0.374-0.28,0.561    c-0.125,0.188-0.25,0.375-0.374,0.562c-0.126,0.374-0.281,0.765-0.467,1.168c-0.188,0.406-0.407,0.889-0.654,1.449l-3.367-0.094    V16.235h51.049v2.524l-43.007,57.406h18.605c2.805,0.063,5.033,0,6.685-0.188c1.65-0.187,3.193-0.59,4.628-1.213    c0.187-0.063,0.358-0.125,0.514-0.188c0.156-0.063,0.295-0.124,0.421-0.188c0.873-0.436,1.714-0.935,2.524-1.496    c0.809-0.561,1.62-1.215,2.431-1.963c0.561-0.562,1.122-1.168,1.683-1.822c0.561-0.655,1.153-1.388,1.777-2.197l2.431-3.461h3.552    L-555.645,79.999z"
+         id="path481" /></g></g><g
+     id="g483"><circle
+       fill="#C9C4BE"
+       cx="50.001"
+       cy="50"
+       r="50"
+       id="circle485" /><g
+       id="g487"><polygon
+         fill="#0D0F0F"
+         points="37.843,89.157 40.198,85.077 50.001,98.881 59.803,85.077 62.158,89.157 66.496,89.208     75.001,93.303 75.708,83.891 77.833,80.105 75.479,76.027 92.334,74.439 85.279,59.05 89.99,59.05 92.203,55.318 100,50     92.203,44.681 89.99,40.95 85.279,40.95 92.333,25.559 75.479,23.973 77.833,19.893 75.707,16.111 75,6.699 66.496,10.792     62.158,10.843 59.803,14.922 50,1.118 40.198,14.922 37.843,10.843 33.505,10.792 25,6.699 24.293,16.111 22.168,19.893     24.523,23.973 7.667,25.56 14.722,40.95 10.011,40.95 7.798,44.682 0,50 7.797,55.318 10.011,59.05 14.722,59.05 7.668,74.441     24.523,76.027 22.168,80.105 24.293,83.889 25.001,93.303 33.505,89.209   "
+         id="polygon489" /><polygon
+         fill="#FFFFFF"
+         points="34.895,80.211 50,55.875 65.105,80.211 65.105,84.259 68.609,86.282 72.116,84.258 72.116,80.212     68.609,78.188 55.088,52.938 83.717,52.023 87.223,54.048 90.727,52.025 90.727,47.976 87.223,45.953 83.717,47.976     55.088,47.063 68.611,21.813 72.117,19.789 72.117,15.743 68.611,13.719 65.107,15.742 65.105,19.789 50.001,44.125     34.896,19.789 34.895,15.741 31.392,13.718 27.885,15.743 27.885,19.789 31.391,21.813 44.913,47.063 16.285,47.976     12.778,45.953 9.275,47.975 9.275,52.023 12.778,54.047 16.285,52.023 44.913,52.938 31.39,78.188 27.885,80.211 27.884,84.258     31.39,86.281 34.895,84.258   "
+         id="polygon491" /></g><polygon
+       fill="#FFFFFF"
+       points="57.051,22.393 50.001,34.681 42.951,22.393 50.001,10.104  "
+       id="polygon493" /><polygon
+       fill="#FFFFFF"
+       points="29.617,30.09 36.734,42.34 22.567,42.301 15.45,30.052  "
+       id="polygon495" /><polygon
+       fill="#FFFFFF"
+       points="22.566,57.697 36.733,57.659 29.616,69.908 15.449,69.947  "
+       id="polygon497" /><polygon
+       fill="#FFFFFF"
+       points="42.949,77.607 50,65.318 57.05,77.607 50,89.896  "
+       id="polygon499" /><polygon
+       fill="#FFFFFF"
+       points="70.384,69.91 63.268,57.66 77.434,57.699 84.551,69.947  "
+       id="polygon501" /><polygon
+       fill="#FFFFFF"
+       points="77.436,42.303 63.268,42.341 70.385,30.092 84.551,30.053  "
+       id="polygon503" /></g></svg>
\ No newline at end of file
diff --git a/Tests/image/blank-file.svg b/Tests/image/blank-file.svg
new file mode 100644 (file)
index 0000000..8136979
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generated by IcoMoon.io -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16" viewBox="0 0 16 16">
+<path fill="#FFFFFF" d="M10 0h-8v16h12v-12l-4-4zM9 5h4v10h-10v-14h6v4zM10 4v-3l3 3h-3z"></path>
+</svg>
diff --git a/Tests/image/crow0.svg b/Tests/image/crow0.svg
new file mode 100644 (file)
index 0000000..c621130
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   height="35.987217"
+   width="51.116982"
+   version="1.1"
+   id="svg2">
+  <metadata
+     id="metadata8">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs6" />
+  <path
+     id="path2818"
+     d="m 36.232985,35.977162 c -0.02345,-0.0094 -0.04263,-0.04436 -0.04263,-0.07772 0,-0.03337 -0.04543,-0.117846 -0.100965,-0.187724 -0.05553,-0.06987 -0.10986,-0.152552 -0.120738,-0.183728 -0.04888,-0.140096 -0.547064,-0.441575 -0.740404,-0.448061 -0.01333,-6.73e-4 -0.0417,0.06441 -0.06301,0.144127 -0.0213,0.07971 -0.05448,0.164118 -0.0737,0.187567 -0.06807,0.08303 -0.2351,0.04596 -0.448164,-0.09947 -0.114492,-0.07815 -0.231452,-0.140793 -0.259915,-0.139198 -0.103032,0.0057 -0.22753,-0.0647 -0.284401,-0.160973 -0.105659,-0.178872 -0.451937,-0.41031 -0.613884,-0.41031 -0.11287,0 -0.378547,-0.121442 -0.488394,-0.223239 -0.06283,-0.05824 -0.129597,-0.08369 -0.219515,-0.08369 -0.191898,0 -0.291236,-0.05025 -0.332315,-0.168082 -0.02007,-0.05761 -0.05795,-0.104746 -0.08415,-0.104746 -0.02621,0 -0.07371,-0.02879 -0.105549,-0.06398 -0.03185,-0.03519 -0.108169,-0.07213 -0.169604,-0.08211 -0.219849,-0.03568 -0.937873,-0.414299 -0.993727,-0.524009 -0.01875,-0.03685 -0.103161,-0.143806 -0.187567,-0.237705 -0.189643,-0.210956 -0.537045,-0.371869 -0.741262,-0.343338 -0.710425,0.09925 -0.737631,0.100685 -1.030367,0.05449 -0.337983,-0.05334 -0.630446,-0.05889 -1.115893,-0.02117 -0.331487,0.02576 -0.347801,0.02387 -0.368967,-0.04283 -0.01219,-0.03838 0.0026,-0.154623 0.03266,-0.258318 0.03015,-0.103694 0.04455,-0.205124 0.03202,-0.225402 -0.04471,-0.07234 -0.314032,-0.0065 -0.532991,0.130268 -0.165667,0.103489 -0.230973,0.169125 -0.288563,0.290041 -0.07126,0.149603 -0.19268,0.232754 -0.339892,0.232754 -0.09327,0 -0.01149,-0.448641 0.108895,-0.597398 0.0301,-0.03719 0.045,-0.04843 0.03312,-0.02499 -0.01262,0.02492 3.4e-5,0.04263 0.03051,0.04263 0.03229,0 0.04463,-0.01945 0.03247,-0.05115 -0.0108,-0.02813 -0.0027,-0.05115 0.01813,-0.05115 0.02077,0 0.03776,-0.02034 0.03776,-0.04521 0,-0.05853 0.151433,-0.201223 0.181571,-0.171088 0.01268,0.01268 0.02305,0.003 0.02305,-0.02158 0,-0.05501 0.190827,-0.241992 0.218611,-0.214209 0.01107,0.01107 0.02012,0.0013 0.02012,-0.02169 0,-0.02299 0.01358,-0.03341 0.03018,-0.02314 0.0166,0.01026 0.07415,0.0046 0.127887,-0.01261 0.05374,-0.01721 0.185946,-0.03746 0.293797,-0.04502 0.154262,-0.01082 0.196092,-0.0032 0.196092,0.03533 0,0.03062 0.02017,0.04134 0.05362,0.02851 0.02949,-0.01132 0.08321,-0.0048 0.119365,0.01461 0.04469,0.02391 0.06573,0.02399 0.06573,0 0,-0.0546 0.166343,-0.02716 0.19016,0.03136 0.01696,0.04168 0.02726,0.03685 0.05065,-0.02383 0.03017,-0.0782 0.05209,-0.07969 0.33327,-0.02256 0.04625,0.0094 0.07104,0.0023 0.05918,-0.01685 -0.01918,-0.03103 0.105189,-0.09308 0.158609,-0.07913 0.01351,0.0035 0.0409,-0.02412 0.06088,-0.06145 0.01998,-0.03733 0.06279,-0.06787 0.09513,-0.06787 0.03235,0 0.07872,-0.0319 0.103074,-0.07089 0.03874,-0.06204 0.03597,-0.07306 -0.02225,-0.08828 -0.04068,-0.01065 -0.07465,-0.05808 -0.08746,-0.122132 -0.01151,-0.0576 -0.03098,-0.0947 -0.04325,-0.08243 -0.02243,0.02243 -0.09396,-0.07925 -0.134223,-0.190818 -0.01192,-0.03303 -0.05709,-0.06895 -0.100386,-0.07981 -0.0433,-0.01087 -0.08702,-0.04139 -0.09717,-0.06783 -0.01015,-0.02644 -0.03811,-0.04866 -0.06215,-0.04937 -0.02403,-6.72e-4 -0.09734,-0.06977 -0.162897,-0.153463 -0.06556,-0.08369 -0.141017,-0.152171 -0.167679,-0.152171 -0.02665,0 -0.03909,-0.0094 -0.02762,-0.02084 0.02949,-0.02949 -0.161533,-0.183774 -0.227545,-0.183774 -0.03567,0 -0.05475,-0.02971 -0.05475,-0.08526 0,-0.04689 -0.01667,-0.08526 -0.03705,-0.08526 -0.02039,0 -0.132932,-0.09206 -0.250118,-0.204591 -0.117184,-0.112527 -0.225744,-0.193097 -0.241239,-0.179042 -0.0155,0.01404 -0.01813,0.008 -0.0059,-0.01351 0.02148,-0.0376 -0.06692,-0.09775 -0.12476,-0.08487 -0.01546,0.0034 -0.01943,-0.0078 -0.0088,-0.02496 0.01062,-0.01717 -0.02277,-0.05853 -0.0742,-0.09191 -0.05142,-0.03337 -0.113546,-0.08877 -0.138053,-0.123093 -0.02451,-0.03432 -0.06672,-0.0624 -0.09378,-0.0624 -0.02707,0 -0.04922,-0.01355 -0.04922,-0.03012 0,-0.0438 -0.778285,-0.624964 -0.930964,-0.695162 -0.0729,-0.03352 -0.164401,-0.05081 -0.209278,-0.03955 -0.05655,0.01418 -0.102151,-0.0031 -0.15683,-0.05944 -0.0424,-0.0437 -0.06447,-0.05739 -0.04905,-0.03043 0.01542,0.02698 -0.03574,-0.0023 -0.113694,-0.06486 -0.140423,-0.112848 -0.199258,-0.210672 -0.162485,-0.270173 0.01048,-0.01696 -0.0034,-0.03946 -0.03092,-0.05001 -0.03157,-0.0121 -0.04839,-0.06147 -0.04566,-0.133995 0.0046,-0.123415 -0.115972,-0.333547 -0.242202,-0.421962 -0.03969,-0.0278 -0.06324,-0.06494 -0.05237,-0.08255 0.01089,-0.01761 -0.0042,-0.04121 -0.03354,-0.05247 -0.02932,-0.01125 -0.05331,-0.04833 -0.05331,-0.0824 0,-0.03407 -0.03837,-0.107533 -0.08526,-0.163263 -0.07704,-0.09156 -0.08519,-0.130424 -0.08459,-0.403332 0.0011,-0.467434 0.102818,-0.951299 0.346875,-1.649081 0.133708,-0.382291 0.234679,-0.776483 0.280602,-1.095504 0.01999,-0.138863 0.01188,-0.170521 -0.06808,-0.265547 -0.09126,-0.108463 -0.277674,-0.207699 -0.390138,-0.207699 -0.03326,0 -0.167911,-0.04572 -0.299229,-0.101598 -0.334854,-0.142493 -0.698295,-0.199641 -1.524701,-0.239741 -0.393891,-0.01911 -0.856189,-0.05756 -1.027322,-0.08543 -0.171134,-0.02796 -0.404168,-0.05076 -0.517855,-0.05076 -0.113686,0 -0.249901,-0.01718 -0.302703,-0.03821 -0.0528,-0.02101 -0.22913,-0.0397 -0.391836,-0.04152 -0.16271,-0.0018 -0.288412,-0.01532 -0.27934,-0.03 0.0091,-0.01468 -0.01127,-0.02647 -0.0452,-0.02621 -0.03393,2.24e-4 -0.315468,-0.0481 -0.625641,-0.107494 l -0.563945,-0.107977 -0.33979,0.10758 c -0.186882,0.05917 -0.349511,0.107539 -0.361388,0.107494 -0.04086,-1.36e-4 -0.05638,-0.13324 -0.01741,-0.149221 0.02145,-0.0088 -0.0023,-0.01721 -0.05276,-0.01869 -0.05047,-0.0015 -0.100161,0.01089 -0.110412,0.02747 -0.03208,0.05191 -0.458126,0.118498 -0.505769,0.07904 -0.02811,-0.02328 -0.09385,-0.0242 -0.195783,-0.0028 -0.08441,0.01777 -0.280073,0.0495 -0.434816,0.07054 -0.154743,0.02104 -0.281352,0.05283 -0.281352,0.07068 0,0.01786 -0.02302,0.02362 -0.05115,0.01281 -0.02814,-0.0108 -0.05123,-0.0086 -0.05131,0.0049 0,0.01348 -0.05615,0.02741 -0.124603,0.03097 -0.06845,0.0036 -0.1336,0.01891 -0.144786,0.0341 -0.02606,0.03542 -0.139983,0.04146 -0.796184,0.04221 -0.297591,4.49e-4 -0.537126,0.01439 -0.537126,0.0315 0,0.01698 -0.134282,0.03143 -0.298403,0.0321 -0.369505,0.0015 -0.539084,0.01992 -0.844055,0.09164 -0.131298,0.03088 -0.373004,0.06513 -0.537126,0.0761 -0.164122,0.01097 -0.298404,0.03207 -0.298404,0.04687 0,0.01481 -0.05371,0.0182 -0.119361,0.0076 -0.08039,-0.01304 -0.119361,-0.0061 -0.119361,0.02122 0,0.02232 -0.01443,0.03166 -0.03208,0.02075 -0.03408,-0.02106 -0.587009,0.111706 -0.615884,0.147893 -0.0094,0.01176 -0.04775,0.02527 -0.08526,0.03003 -0.319552,0.04061 -0.388045,0.05571 -0.371812,0.08197 0.01026,0.01661 -0.02466,0.02725 -0.07759,0.02367 -0.107275,-0.0073 -0.331986,0.114563 -0.292219,0.15843 0.014,0.01544 0.0067,0.01729 -0.01626,0.0041 -0.03986,-0.0229 -0.410541,0.170723 -0.776766,0.405746 -0.09378,0.06018 -0.400713,0.229852 -0.682064,0.377042 -0.8431486,0.441091 -1.5106691,0.786933 -1.9438848,1.00712 -0.331279,0.168378 -0.7656083,0.411685 -1.2106655,0.678201 -0.1208071,0.07234 -0.7235464,0.348753 -1.0060453,0.461358 -0.1688108,0.06729 -0.3529682,0.143067 -0.4092389,0.168389 -0.3782305,0.170213 -0.4488005,0.204855 -0.4944967,0.24276 -0.1118065,0.09275 -0.7795227,0.48269 -0.974639,0.569184 -0.1140235,0.05055 -0.3212008,0.108223 -0.4603938,0.12817 -0.2794774,0.04005 -0.6793677,0.03386 -0.6793677,-0.01051 0,-0.01562 -0.014897,-0.01916 -0.033103,-0.0079 -0.018206,0.01125 -0.04289,-0.01852 -0.054852,-0.0662 -0.011962,-0.04766 -0.028767,-0.08665 -0.037344,-0.08665 -0.027842,0 -0.1640932,0.0777 -0.1816285,0.103583 -0.024028,0.03546 -0.2704515,0.135139 -0.3340901,0.135139 -0.040327,0 -0.033244,-0.02142 0.029742,-0.08996 l 0.082677,-0.08996 -0.1534646,0.02493 c -0.084405,0.01371 -0.2762361,0.02752 -0.4262904,0.0307 -0.1617809,0.0034 -0.3133657,0.02625 -0.3724277,0.0561 -0.076685,0.03876 -0.1028397,0.04063 -0.113677,0.0081 -0.00774,-0.02322 -0.050258,-0.04223 -0.09448,-0.04223 -0.044221,0 -0.090781,-0.0168 -0.1034652,-0.03732 -0.012684,-0.02052 -0.05963,-0.03032 -0.1043224,-0.02178 -0.044694,0.0085 -0.0812605,0.0028 -0.0812605,-0.01277 0,-0.01557 -0.0226251,-0.01963 -0.0502787,-0.009 -0.0276536,0.01062 -0.0747891,-0.0052 -0.10474605,-0.03517 -0.0299569,-0.02996 -0.0836695,-0.05446 -0.11936206,-0.05446 -0.0755134,0 -0.16300798,-0.155442 -0.14396948,-0.255775 0.0216458,-0.114071 0.0858903,-0.269677 0.13551736,-0.328235 0.0258287,-0.03048 0.0424846,-0.07582 0.0370134,-0.100762 -0.005471,-0.02494 0.0126179,-0.04604 0.0401989,-0.04689 0.0275816,-8.75e-4 0.0695576,-0.03992 0.0932812,-0.08681 0.0237239,-0.04689 0.0433594,-0.07187 0.0436366,-0.05551 2.7333e-4,0.01638 0.0233532,0.0108 0.0512819,-0.01239 0.0279281,-0.02318 0.0409047,-0.05812 0.0288344,-0.07765 -0.0120695,-0.01954 -0.00597,-0.02563 0.013563,-0.01355 0.03826,0.02364 0.1334119,-0.06902 0.102556,-0.09987 -0.010234,-0.01023 -0.081291,0.01337 -0.15790503,0.05246 -0.19132318,0.0976 -0.53029094,0.131726 -0.60948002,0.06135 -0.040574,-0.03605 -0.10602968,-0.04828 -0.20760549,-0.03876 L 0,26.723956 0.13129745,26.603285 c 0.20194096,-0.185598 1.15569925,-0.834706 1.22646285,-0.834706 0.017944,0 1.0011722,-0.593762 1.1596288,-0.700289 l 0.1062908,-0.07146 -0.097498,-0.04316 c -0.075194,-0.03329 -0.09082,-0.05618 -0.068306,-0.100101 0.016056,-0.03132 0.038207,-0.148677 0.049225,-0.2608 0.013936,-0.141813 0.038705,-0.216631 0.081377,-0.245814 0.1348325,-0.09221 0.317117,-0.268214 0.317117,-0.306188 0,-0.04333 -0.2144179,0.01817 -0.8473768,0.243035 -0.1940842,0.06895 -0.3609084,0.117337 -0.3707213,0.107524 -0.030038,-0.03004 0.1889381,-0.28351 0.3932649,-0.455219 0.1064018,-0.08942 0.2148835,-0.182797 0.2410706,-0.207519 0.134978,-0.127412 0.6824316,-0.46318 1.0116807,-0.620491 0.2054297,-0.09815 0.4118743,-0.205241 0.4587663,-0.237974 0.046892,-0.03274 0.2270451,-0.133333 0.40034,-0.223546 0.1732947,-0.09022 0.3093674,-0.169742 0.3023838,-0.176726 -0.00698,-0.007 -0.1087422,0.01965 -0.226129,0.0592 -0.1501313,0.05057 -0.2241353,0.06119 -0.249524,0.0358 -0.025388,-0.02539 -0.024637,-0.03609 0.00253,-0.03609 0.021244,0 0.048451,-0.03096 0.060459,-0.06879 0.019185,-0.06045 0.1680893,-0.221549 0.4635947,-0.501568 0.048755,-0.0462 0.1428871,-0.117089 0.2091823,-0.157532 0.2161395,-0.131856 0.3951126,-0.257621 0.4169899,-0.29302 0.022754,-0.03682 1.0610754,-0.562441 1.1881729,-0.601483 0.04125,-0.01267 0.1911105,-0.08059 0.3330257,-0.150923 0.1419153,-0.07034 0.2933966,-0.139111 0.3366242,-0.152832 0.043226,-0.01372 0.1463559,-0.07271 0.2291753,-0.131083 0.1199707,-0.08456 0.1625792,-0.09864 0.2096072,-0.06927 0.047284,0.02953 0.1538875,-0.0087 0.5358933,-0.192258 0.2622766,-0.126017 0.5689448,-0.264972 0.6814862,-0.308789 0.1125401,-0.04382 0.2249981,-0.09985 0.2499076,-0.124513 0.081951,-0.08115 0.1773194,-0.116582 0.3449729,-0.128175 0.1131113,-0.0078 0.1886589,-0.03475 0.2391522,-0.08524 0.040595,-0.0406 0.1438461,-0.118225 0.2294472,-0.172512 0.1733184,-0.109916 0.2284002,-0.176259 0.2623733,-0.316014 0.01334,-0.05486 0.06939,-0.123095 0.132975,-0.161862 0.06158,-0.03755 0.08742,-0.0685 0.05876,-0.07038 -0.08661,-0.0057 0.555593,-0.16351 0.673539,-0.16552 0.06836,-0.0011 0.110835,-0.01922 0.110835,-0.0471 0,-0.02486 0.03789,-0.08081 0.08421,-0.124319 0.09656,-0.09071 0.08465,-0.1374 -0.03506,-0.1374 -0.139172,0 -0.09502,-0.04884 0.164003,-0.181411 0.306614,-0.156928 0.449342,-0.161093 0.841624,-0.02456 0.28366,0.09873 0.288206,0.09917 0.345032,0.03364 0.03167,-0.03652 0.06838,-0.06639 0.08158,-0.06639 0.02544,0 0.444123,-0.288445 0.530711,-0.36562 0.02814,-0.02508 0.1816,-0.14031 0.341033,-0.256071 0.159432,-0.115763 0.427996,-0.311618 0.596806,-0.435234 0.324997,-0.237988 0.519973,-0.363211 0.852581,-0.547569 0.112541,-0.06238 0.272663,-0.181743 0.355823,-0.265252 l 0.151204,-0.151834 -0.279091,0.01616 c -0.295876,0.01713 -0.322422,0.0016 -0.24494,-0.143172 0.05332,-0.09963 0.736112,-0.634181 1.100461,-0.86154 0.05926,-0.03698 0.08714,-0.07645 0.07227,-0.102311 -0.01332,-0.02315 -0.01159,-0.03067 0.0038,-0.01669 0.01542,0.01398 0.07543,-0.01065 0.133354,-0.05471 0.219267,-0.166827 1.171023,-0.727058 1.367134,-0.804733 0.258942,-0.102562 0.861798,-0.404573 0.886111,-0.443911 0.0101,-0.01634 0.121786,-0.06366 0.248193,-0.105146 0.287589,-0.09439 0.30873,-0.106826 0.229061,-0.134772 -0.06732,-0.02362 -0.07326,-0.02127 0.880461,-0.347551 0.239998,-0.08211 0.429331,-0.156371 0.420748,-0.165033 -0.0086,-0.0087 0.03161,-0.01751 0.08933,-0.01966 0.05771,-0.0022 0.121598,-0.02517 0.141958,-0.05115 0.02171,-0.0277 0.120634,-0.05234 0.239187,-0.05957 0.210669,-0.01285 0.602989,-0.173276 0.928324,-0.379597 0.08567,-0.05433 0.264945,-0.123611 0.398397,-0.153965 0.133453,-0.03035 0.2584,-0.06637 0.277662,-0.08004 0.01927,-0.01367 0.09641,-0.04558 0.171433,-0.07092 0.07503,-0.02534 0.173013,-0.07458 0.217746,-0.109424 0.04473,-0.03484 0.09298,-0.06335 0.107228,-0.06335 0.01425,0 0.07348,-0.04445 0.131636,-0.09877 0.113963,-0.106457 0.351444,-0.240935 0.463279,-0.26234 0.038,-0.0073 0.08445,-0.03321 0.10321,-0.05764 0.01875,-0.02443 0.09498,-0.08983 0.169391,-0.145337 0.194156,-0.144837 0.214536,-0.162058 0.478569,-0.404414 0.251516,-0.230862 0.606848,-0.516232 1.227718,-0.98599 0.344093,-0.2603468 0.589539,-0.4332454 1.258562,-0.886573 0.133088,-0.09018 0.449157,-0.2640469 0.702374,-0.3863728 0.253216,-0.1223245 0.529451,-0.2557186 0.613857,-0.2964302 0.08441,-0.04071 0.158614,-0.085626 0.16491,-0.099811 0.0063,-0.014184 0.02548,-0.017112 0.04263,-0.00653 0.01716,0.010605 0.0312,0.00558 0.0312,-0.011156 0,-0.016741 0.02005,-0.030435 0.04455,-0.030435 0.0245,0 0.158784,-0.058252 0.298402,-0.129445 0.139619,-0.071195 0.430335,-0.1978034 0.646038,-0.2813523 0.215704,-0.083549 0.491939,-0.1954213 0.613858,-0.2486049 0.121921,-0.053185 0.306077,-0.1321049 0.40924,-0.1753788 0.103162,-0.043273 0.29828,-0.1359289 0.433601,-0.2058975 0.135324,-0.069969 0.361685,-0.1753594 0.503025,-0.2342005 0.141344,-0.058844 0.256987,-0.118339 0.256987,-0.1322199 0,-0.013882 0.01945,-0.02524 0.04319,-0.02524 0.02377,0 0.303834,-0.1227275 0.622385,-0.2727296 0.318551,-0.1500017 0.675102,-0.3078947 0.792333,-0.3508747 0.117228,-0.042978 0.213145,-0.092292 0.213145,-0.1095837 0,-0.017291 0.01918,-0.027759 0.04263,-0.02326 0.06969,0.013374 0.594379,-0.1884232 0.639435,-0.2459351 0.0094,-0.011971 0.04007,-0.021527 0.06821,-0.021238 0.121558,0.00127 0.660662,-0.1945862 0.918837,-0.3337747 0.241294,-0.1300895 0.587545,-0.3830342 0.701059,-0.5121391 0.01875,-0.021333 0.06131,-0.048999 0.09456,-0.061479 0.03325,-0.012481 0.07001,-0.047591 0.08169,-0.078024 0.02692,-0.070138 0.174568,-0.219039 0.217202,-0.219039 0.01774,0 0.05143,-0.030691 0.07486,-0.068207 0.02342,-0.037513 0.06448,-0.068206 0.09123,-0.068206 0.02675,0 0.03887,-0.00976 0.02696,-0.021682 -0.01192,-0.011924 0.05783,-0.09633 0.155007,-0.1875678 0.09718,-0.091238 0.161929,-0.1668596 0.143886,-0.168049 -0.01803,-0.00118 0.0028,-0.016405 0.04612,-0.033815 0.04747,-0.019039 0.06915,-0.047456 0.05441,-0.071314 -0.01348,-0.021822 -0.0098,-0.030553 0.0083,-0.019409 0.01801,0.011138 0.09144,-0.040204 0.163151,-0.1140923 0.0717,-0.073888 0.117738,-0.1343421 0.10229,-0.1343421 -0.01546,0 0.02072,-0.036015 0.08038,-0.080032 0.05967,-0.044017 0.09718,-0.091336 0.08336,-0.105152 -0.01383,-0.013815 -0.0095,-0.020006 0.0097,-0.013752 0.04939,0.01615 0.223702,-0.1274928 0.194271,-0.1600887 -0.01342,-0.014875 -0.0072,-0.017247 0.01376,-0.00527 0.06096,0.034779 0.607999,-0.4589859 0.563584,-0.5087016 -0.0121,-0.013544 -0.0039,-0.014234 0.01831,-0.00155 0.02248,0.012885 0.06394,-0.010665 0.09378,-0.053276 0.02942,-0.042001 0.05349,-0.064232 0.05349,-0.049403 0,0.035425 0.155483,-0.078134 0.314002,-0.2293306 0.06954,-0.066327 0.191209,-0.1634486 0.270384,-0.2158258 l 0.143933,-0.095226 -0.09461,-0.017052 c -0.09208,-0.016595 -0.08962,-0.020213 0.09234,-0.1351948 0.102836,-0.064979 0.180276,-0.1355869 0.172099,-0.1569075 -0.0082,-0.021322 0.03576,-0.063723 0.09766,-0.094226 l 0.112534,-0.055461 -0.110835,-7.738e-4 c -0.121681,-8.545e-4 -0.148951,-0.052289 -0.04518,-0.085223 0.03611,-0.011461 0.177308,-0.1287936 0.313783,-0.260741 0.136473,-0.1319475 0.294923,-0.2638643 0.352116,-0.2931487 0.05718,-0.029285 0.112307,-0.066044 0.122484,-0.081687 0.01017,-0.015643 0.08691,-0.0653452 0.170517,-0.1104495 0.08361,-0.0451035 0.148684,-0.0976873 0.144617,-0.11685267 -0.0041,-0.0191645 0.0331,-0.0450046 0.08257,-0.0574227 0.04948,-0.0124174 0.127764,-0.0523182 0.173974,-0.0886698 0.04622,-0.0363507 0.110775,-0.0660921 0.143466,-0.0660921 0.08441,0 0.311151,-0.09789 0.391757,-0.16912543 0.07224,-0.0638419 0.511584,-0.24011339 0.598463,-0.24011339 0.02826,0 0.08528,-0.0237481 0.126716,-0.0527741 0.137291,-0.09616158 0.661132,-0.14352007 1.525634,-0.1379271367 0.792642,0.005129127 0.827085,0.008206607 1.091305,0.0975625367 0.150053,0.050747 0.291903,0.09246343 0.315215,0.09270283 0.09396,9.6895e-4 0.976611,0.42511458 1.100071,0.52862744 0.02811,0.02359 0.159498,0.0947176 0.291932,0.15806233 0.235834,0.11281152 0.25372,0.12719829 0.25372,0.20412699 0,0.023291 0.03271,0.029587 0.08526,0.016402 0.05003,-0.012556 0.08526,-0.00673 0.08526,0.014086 0,0.019516 0.04219,0.054229 0.09378,0.077137 0.05158,0.022909 0.123537,0.06862 0.159895,0.1015785 0.03637,0.032959 0.08624,0.059926 0.110835,0.059926 0.02459,0 0.04471,0.012883 0.04471,0.028629 0,0.037801 0.156041,0.1077839 0.240323,0.1077839 0.03664,0 0.0666,0.015347 0.0666,0.034103 0,0.050098 0.102113,0.041678 0.103394,-0.00853 4.52e-4,-0.025512 0.01972,-0.01804 0.04753,0.018611 0.03352,0.044207 0.07116,0.055035 0.135327,0.038932 0.05776,-0.014496 0.08889,-0.00837 0.08889,0.017504 0,0.021897 0.01498,0.030556 0.0333,0.019242 0.0461,-0.028494 0.444224,0.057046 0.423279,0.090944 -0.0093,0.015101 0.01841,0.027008 0.06163,0.02646 0.09589,-0.00121 0.512136,0.096881 0.42817,0.100902 -0.03285,0.00157 -0.05968,0.016565 -0.05968,0.033318 0,0.03259 0.410853,0.1157062 0.437957,0.0886 0.0089,-0.00889 0.03294,-0.00257 0.0534,0.014024 0.06789,0.055028 0.736829,0.2457834 0.776319,0.2213777 0.02148,-0.013281 0.02951,-0.00894 0.01796,0.00974 -0.01146,0.018537 0.130919,0.1054296 0.316393,0.1930939 0.185473,0.087664 0.472547,0.2615323 0.637942,0.3863739 0.1654,0.1248417 0.319902,0.2270363 0.343352,0.2270984 0.02346,6.81e-5 0.03547,0.00725 0.02675,0.015975 -0.0087,0.00872 0.03686,0.077444 0.101278,0.1527108 0.06442,0.075267 0.110018,0.148369 0.101315,0.162449 -0.0087,0.014079 0.0071,0.034399 0.03515,0.045154 0.02802,0.010755 0.0512,8.546e-4 0.05148,-0.022004 4.51e-4,-0.032265 0.0064,-0.032371 0.02662,-4.693e-4 0.01435,0.022595 0.02243,0.1068802 0.01796,0.1872996 -0.0057,0.1024476 0.0013,0.1309839 0.024,0.09533 0.02653,-0.041988 0.03272,-0.038959 0.03537,0.017319 0.0018,0.037513 0.01096,0.049024 0.0204,0.025578 0.0094,-0.023446 0.02802,-0.042629 0.04119,-0.042629 0.03781,0 0.03799,0.1327189 0,0.1560674 -0.02003,0.012395 -0.01119,0.037667 0.0217,0.061689 0.03979,0.029097 0.04904,0.067036 0.03244,0.1331389 -0.01277,0.050846 -0.03781,0.092447 -0.05563,0.092447 -0.01783,0 -0.02058,-0.019183 -0.0061,-0.042629 0.01444,-0.023446 -0.01394,-0.016324 -0.06312,0.015829 -0.08648,0.056549 -0.219373,0.09752 -0.342779,0.1056776 -0.0328,0.00217 -0.05968,0.015832 -0.05968,0.030358 0,0.014528 -0.03452,0.026195 -0.07673,0.025926 -0.04219,-2.688e-4 -0.12277,0.00591 -0.17904,0.013737 -0.971882,0.1351175 -1.779858,0.2316536 -2.0803,0.2485518 -0.206324,0.011606 -0.393648,0.035672 -0.416267,0.053482 -0.02261,0.017814 -0.05578,0.023341 -0.07366,0.012286 -0.05845,-0.036117 -0.137867,0.016695 -0.115393,0.076729 0.01854,0.049502 0.01385,0.050803 -0.03628,0.010053 -0.03979,-0.032383 -0.05754,-0.034549 -0.05754,-0.00703 0,0.021875 -0.01918,0.037283 -0.04264,0.034238 -0.113695,-0.014764 -0.168405,0.00487 -0.149657,0.0537 0.02179,0.056803 -0.03027,0.070789 -0.06349,0.017051 -0.01159,-0.018757 -0.0547,-0.032889 -0.0958,-0.031409 -0.04111,0.00149 -0.0564,0.010143 -0.03402,0.019253 0.02238,0.00911 0.03199,0.039256 0.02134,0.066986 -0.01674,0.043659 -0.02757,0.043 -0.0805,-0.00493 -0.04614,-0.041755 -0.07725,-0.046733 -0.126687,-0.020273 -0.03605,0.019289 -0.100448,0.02594 -0.143132,0.014777 -0.06857,-0.017931 -0.07496,-0.010784 -0.05491,0.061432 0.02026,0.072941 0.01773,0.075587 -0.02355,0.024614 -0.043,-0.053101 -0.05392,-0.052267 -0.155229,0.011876 -0.05993,0.037942 -0.108954,0.096734 -0.108954,0.1306499 0,0.044877 -0.01859,0.056808 -0.0682,0.04383 -0.0459,-0.012002 -0.06821,-0.00104 -0.06821,0.033502 0,0.031463 -0.04526,0.059826 -0.11689,0.073265 -0.0945,0.017728 -0.121158,0.041367 -0.139184,0.1234405 -0.02175,0.099065 -0.131379,0.1912377 -0.208964,0.1757021 -0.0213,-0.00429 -0.04769,0.015535 -0.05861,0.044002 -0.01092,0.028466 -0.0342,0.051758 -0.05175,0.051758 -0.03502,0 -0.139325,0.089285 -0.496709,0.4251098 -0.130107,0.1222664 -0.264395,0.2311337 -0.298403,0.241927 -0.03401,0.010793 -0.0623,0.045447 -0.06289,0.077007 -6.73e-4,0.031562 -0.0658,0.1065697 -0.144939,0.1666874 -0.270923,0.2058155 -0.531097,0.4853767 -0.510157,0.5481845 0.0076,0.022891 -0.0026,0.041625 -0.02258,0.041625 -0.02005,0 -0.05384,0.069059 -0.0751,0.1534642 -0.02126,0.084405 -0.05168,0.153465 -0.06763,0.153465 -0.01593,0 -0.02014,0.023019 -0.0093,0.051153 0.0108,0.028133 0.0056,0.051153 -0.01149,0.051153 -0.01712,0 -0.03115,0.034533 -0.03119,0.076733 0,0.1328989 -0.05393,0.4006339 -0.07758,0.3860182 -0.02005,-0.012388 -0.02725,0.1344432 -0.04256,0.8672752 -0.002,0.1031621 -0.01694,0.1959073 -0.03288,0.2061001 -0.03087,0.019749 -0.0581,0.1355871 -0.06226,0.2648322 -0.0013,0.043314 -0.0177,0.069369 -0.03625,0.057909 -0.01933,-0.011951 -0.02505,0.00175 -0.0134,0.03209 0.01118,0.029109 0.0038,0.052929 -0.01638,0.052929 -0.02017,0 -0.02725,0.024567 -0.01573,0.054598 0.01151,0.030024 0.004,0.065088 -0.01676,0.077907 -0.02074,0.012818 -0.04479,0.099111 -0.05345,0.1917602 -0.0087,0.092648 -0.03066,0.1734248 -0.0489,0.1795037 -0.01824,0.00606 -0.02536,0.040824 -0.01584,0.077209 0.01077,0.041208 -0.0034,0.074092 -0.03753,0.087197 -0.03015,0.01157 -0.04634,0.03478 -0.03596,0.05157 0.01038,0.0168 0.005,0.03053 -0.01205,0.03053 -0.017,0 -0.03228,0.04742 -0.03393,0.105393 -0.0051,0.179718 -0.117438,0.644115 -0.15081,0.623489 -0.01741,-0.01076 -0.02813,0.0011 -0.02381,0.02649 0.0043,0.02533 -0.0024,0.08442 -0.01478,0.131309 -0.01244,0.04689 -0.02923,0.154317 -0.03733,0.238722 -0.03648,0.380211 -0.166541,0.813049 -0.262056,0.87208 -0.01658,0.01025 -0.03014,0.06376 -0.03014,0.118927 0,0.05516 -0.01494,0.100297 -0.03323,0.100297 -0.04322,0 -0.145532,0.197792 -0.122006,0.23586 0.01,0.01608 -0.0048,0.04821 -0.0327,0.07138 -0.02793,0.02318 -0.05078,0.06201 -0.05078,0.08628 0,0.02428 -0.01521,0.04926 -0.03381,0.05551 -0.01859,0.0063 -0.03965,0.06171 -0.0468,0.123232 -0.0071,0.06153 -0.03801,0.139504 -0.06858,0.173284 -0.03057,0.03378 -0.04532,0.07168 -0.03278,0.08423 0.01255,0.01254 0.0024,0.02281 -0.02266,0.02281 -0.02501,0 -0.03585,0.0096 -0.0241,0.02137 0.0306,0.0306 -0.07344,0.220798 -0.170284,0.311282 -0.04526,0.04228 -0.07383,0.09055 -0.06351,0.107262 0.01033,0.01671 -0.0042,0.03918 -0.03219,0.04993 -0.02803,0.01075 -0.05096,0.05164 -0.05096,0.09084 0,0.03921 -0.01459,0.06228 -0.03239,0.05127 -0.03561,-0.022 -0.113081,0.09788 -0.08282,0.128147 0.01035,0.01034 -0.02074,0.04474 -0.06911,0.07642 -0.04835,0.03169 -0.08004,0.07036 -0.0704,0.08595 0.01898,0.03069 -0.114371,0.168819 -0.162961,0.168819 -0.01633,0 -0.02025,0.01524 -0.0088,0.03387 0.01151,0.01863 -0.03329,0.0897 -0.09956,0.157928 -0.06627,0.06823 -0.110938,0.139503 -0.09927,0.158378 0.01168,0.01887 -0.01552,0.06424 -0.06042,0.100806 -0.0449,0.03656 -0.05862,0.05631 -0.03048,0.04387 0.02814,-0.01243 0.01662,0.0079 -0.02558,0.04514 -0.0422,0.03726 -0.07673,0.08078 -0.07673,0.09671 0,0.01593 -0.03129,0.0485 -0.06953,0.07238 -0.03825,0.02388 -0.06135,0.05666 -0.05135,0.07284 0.01,0.01618 -0.0057,0.03859 -0.03494,0.0498 -0.02921,0.01121 -0.04333,0.03622 -0.03137,0.05557 0.01196,0.01935 0.0028,0.03097 -0.02039,0.02582 -0.02317,-0.0052 -0.05348,0.02899 -0.06734,0.07589 -0.01387,0.04689 -0.02673,0.07265 -0.0286,0.05724 -0.0047,-0.0388 -0.105707,0.06596 -0.105707,0.109636 0,0.01944 -0.03113,0.05199 -0.06916,0.07235 -0.03805,0.02035 -0.06111,0.05004 -0.05127,0.06597 0.0099,0.01593 -0.03193,0.07271 -0.09283,0.126176 -0.0609,0.05347 -0.118399,0.112566 -0.127777,0.131323 -0.0094,0.01876 -0.0255,0.03129 -0.03584,0.02784 -0.01033,-0.0034 -0.03831,0.02502 -0.0622,0.06325 -0.03566,0.0571 -0.03535,0.06485 0.0018,0.0434 0.05754,-0.03329 -0.100394,0.1488 -0.202424,0.233387 -0.04238,0.03514 -0.06834,0.078 -0.05767,0.09525 0.01067,0.01725 -0.0028,0.03137 -0.02973,0.03137 -0.05121,0 -0.198718,0.175689 -0.238939,0.28459 -0.01279,0.0346 -0.05386,0.07092 -0.09128,0.08071 -0.03742,0.0098 -0.06803,0.03258 -0.06803,0.05064 0,0.01807 -0.09548,0.127541 -0.212171,0.243271 -0.116693,0.115729 -0.208771,0.221926 -0.204617,0.235994 0.0042,0.01407 -0.0136,0.02558 -0.03946,0.02558 -0.0419,0 -0.36223,0.342153 -0.36223,0.386912 0,0.01812 -0.168333,0.207786 -0.434598,0.489667 -0.0797,0.08438 -0.134927,0.169585 -0.122716,0.189342 0.01221,0.01976 0.0063,0.02606 -0.01324,0.01401 -0.01949,-0.01205 -0.148957,0.09803 -0.287676,0.244627 -0.138717,0.146595 -0.276317,0.280693 -0.305775,0.297993 -0.113761,0.06682 -0.575254,0.510672 -0.575254,0.553274 0,0.0247 -0.01457,0.0359 -0.03239,0.0249 -0.01781,-0.01102 -0.04944,0.01184 -0.07028,0.05078 -0.02084,0.03893 -0.07624,0.08538 -0.123127,0.103201 -0.04688,0.01782 -0.07681,0.04604 -0.06651,0.06271 0.01031,0.01667 0,0.04609 -0.02352,0.06537 -0.04179,0.03468 -0.06108,0.04086 -0.127513,0.04086 -0.01875,0 -0.03027,0.01782 -0.02558,0.03961 0.0047,0.02178 -0.02216,0.04864 -0.05968,0.05968 -0.09596,0.02823 -0.460392,0.278998 -0.460392,0.316789 0,0.01721 -0.01255,0.02353 -0.02789,0.01405 -0.01535,-0.0095 -0.06906,0.02093 -0.119362,0.06757 -0.05031,0.04665 -0.09193,0.07268 -0.09251,0.05785 -6.72e-4,-0.01482 -0.01667,-6.8e-5 -0.0358,0.03272 -0.01911,0.03282 -0.06469,0.05968 -0.101275,0.05968 -0.03659,0 -0.09465,0.02686 -0.129032,0.05968 -0.03439,0.03282 -0.08427,0.06436 -0.110835,0.07008 -0.02657,0.0057 -0.06461,0.03156 -0.08453,0.05742 -0.01992,0.02586 -0.07746,0.05738 -0.127885,0.07003 -0.05042,0.01265 -0.09168,0.03925 -0.09168,0.0591 0,0.01985 -0.0097,0.02636 -0.02162,0.01447 -0.04327,-0.04327 -0.532043,0.244878 -0.72163,0.425432 -0.107024,0.101924 -0.294339,0.269485 -0.416257,0.372357 -0.351072,0.296226 -0.477445,0.419441 -0.477445,0.465526 0,0.02358 -0.01248,0.03903 -0.02774,0.03434 -0.03696,-0.01136 -0.401163,0.357536 -0.389174,0.394188 0.0052,0.01575 -0.0044,0.02012 -0.0213,0.0097 -0.01687,-0.01042 -0.120842,0.08723 -0.231043,0.217028 -0.110194,0.129794 -0.21571,0.237324 -0.234468,0.238955 -0.01875,0.0015 -0.139775,0.102333 -0.268924,0.223779 -0.129156,0.121446 -0.242179,0.220809 -0.251161,0.220809 -0.02537,0 -0.405851,0.275683 -0.572008,0.414454 -0.08205,0.06852 -0.314931,0.239897 -0.51753,0.380842 -0.387603,0.269655 -0.569368,0.44102 -0.766137,0.7223 -0.153643,0.219636 -0.36955,0.618807 -0.36955,0.683236 0,0.02749 -0.01176,0.04998 -0.02616,0.04998 -0.03167,0 -0.156417,0.321733 -0.224782,0.579755 -0.02733,0.103161 -0.05974,0.38707 -0.07201,0.63091 -0.01228,0.243838 -0.0367,0.457921 -0.0543,0.47574 -0.01759,0.01781 -0.03199,0.148686 -0.03199,0.290814 0,0.176685 -0.01649,0.281962 -0.05214,0.332861 -0.06265,0.08945 -0.03628,0.229636 0.05526,0.293757 0.03494,0.02447 0.273134,0.242804 0.529317,0.485172 0.256175,0.242373 0.479046,0.445791 0.495268,0.452042 0.01622,0.0063 0.02949,0.03311 0.02949,0.05968 0,0.02657 0.01297,0.04831 0.02881,0.04831 0.01584,0 0.103231,0.07579 0.194197,0.168432 0.09096,0.09264 0.17544,0.16222 0.187725,0.154627 0.01228,-0.0076 0.05524,0.02404 0.09546,0.07029 0.04022,0.04625 0.08856,0.0841 0.107445,0.0841 0.01889,0 0.03433,0.02302 0.03433,0.05115 0,0.02814 0.02393,0.05115 0.05316,0.05115 0.02924,0 0.04403,0.01481 0.03285,0.03288 -0.01118,0.01808 0.0378,0.07056 0.108823,0.116611 0.146636,0.09507 0.410528,0.327953 0.371622,0.327953 -0.01411,0 -0.0027,0.02302 0.02548,0.05115 0.02813,0.02814 0.07527,0.05115 0.104743,0.05115 0.02948,0 0.04976,0.01918 0.04506,0.04263 -0.0047,0.02344 0.01067,0.03879 0.0341,0.0341 0.02345,-0.0047 0.03879,0.01066 0.0341,0.0341 -0.0047,0.02344 0.01067,0.03879 0.03411,0.0341 0.02345,-0.0047 0.04263,0.0068 0.04263,0.02558 0,0.01875 0.01151,0.03167 0.02558,0.02869 0.01407,-0.003 0.05372,0.0068 0.08812,0.0218 0.04921,0.02142 0.05285,0.03336 0.01705,0.05605 -0.03107,0.0197 -0.01515,0.029 0.05031,0.02936 0.05269,4.48e-4 0.08814,0.01291 0.07878,0.02806 -0.0094,0.01515 0.01658,0.05262 0.05767,0.08326 0.211981,0.158129 0.321478,0.232868 0.398667,0.272128 0.115603,0.05878 0.204537,0.136366 0.205017,0.178823 6.73e-4,0.01926 0.06544,0.06496 0.144938,0.101519 0.141447,0.06505 0.340091,0.238163 0.308982,0.269278 -0.02718,0.02718 0.06833,0.153699 0.127777,0.169241 0.06948,0.01817 0.188265,0.276674 0.320871,0.69827 0.08404,0.267179 0.118475,0.330863 0.220688,0.408197 0.06662,0.0504 0.147197,0.124217 0.17907,0.164057 0.09286,0.116054 0.407185,0.314295 0.561941,0.354407 0.212211,0.05501 0.317944,0.197997 0.317944,0.42998 0,0.177064 0.0046,0.186422 0.114315,0.232258 0.06286,0.02626 0.181802,0.05857 0.2643,0.07179 0.08249,0.01322 0.264143,0.05332 0.403658,0.08911 0.139516,0.0358 0.327111,0.06508 0.416878,0.06508 0.191088,0 0.623427,0.160645 0.804959,0.299105 0.06647,0.0507 0.148841,0.153773 0.183033,0.229045 0.08345,0.183693 0.08156,0.232392 -0.0079,0.203999 -0.0628,-0.01994 -0.06843,-0.01289 -0.04589,0.05738 0.06069,0.189278 0.08178,0.333911 0.08254,0.566071 l 8.75e-4,0.247251 -0.10231,0 c -0.141004,0 -0.224605,-0.0965 -0.270173,-0.311862 -0.02207,-0.104268 -0.09225,-0.260923 -0.163567,-0.365089 -0.119313,-0.174261 -0.130354,-0.181565 -0.24619,-0.162767 -0.149842,0.02432 -0.206755,0.09784 -0.206755,0.267096 l 0,0.130514 -0.144938,-0.0091 c -0.128781,-0.0081 -0.143506,-0.0015 -0.132061,0.05907 0.02757,0.146015 0.01951,0.403542 -0.01289,0.41185 -0.01875,0.0048 -0.05329,0.0011 -0.07673,-0.0083 z m -4.19369,-3.988246 c 0.03255,-0.03255 -0.11857,-0.219098 -0.220265,-0.271924 -0.05026,-0.0261 -0.100619,-0.07448 -0.111934,-0.107508 -0.01132,-0.03303 -0.08846,-0.113161 -0.171444,-0.178065 -0.08298,-0.06491 -0.144604,-0.124279 -0.136937,-0.131946 0.01826,-0.01826 -0.252842,-0.244541 -0.292968,-0.244541 -0.01698,0 -0.03088,-0.02302 -0.03088,-0.05116 0,-0.02813 -0.01918,-0.04732 -0.04263,-0.04263 -0.02345,0.0047 -0.03879,-0.01067 -0.03411,-0.0341 0.0047,-0.02344 -0.0145,-0.04263 -0.04263,-0.04263 -0.02814,0 -0.05115,-0.02165 -0.05115,-0.04811 0,-0.02646 -0.09552,-0.13005 -0.212251,-0.230198 -0.116736,-0.100146 -0.253339,-0.224289 -0.30356,-0.27587 -0.05022,-0.05158 -0.09883,-0.09379 -0.108026,-0.09379 -0.0092,0 -0.09926,-0.08057 -0.200152,-0.17904 -0.186476,-0.182007 -0.359788,-0.332507 -0.382912,-0.332507 -0.007,0 -0.08682,-0.06799 -0.177335,-0.151102 -0.09051,-0.08311 -0.17673,-0.143589 -0.191592,-0.1344 -0.01486,0.0092 -0.02702,0.0024 -0.02702,-0.01528 0,-0.04201 -0.511787,-0.42675 -0.567681,-0.42675 -0.02375,0 -0.03553,-0.01237 -0.02619,-0.02747 0.02194,-0.03549 -0.281469,-0.225376 -0.403641,-0.252609 -0.05158,-0.01149 -0.09378,-0.03557 -0.09378,-0.05349 0,-0.019 -0.02956,-0.01678 -0.07091,0.0054 -0.06793,0.03636 -0.064,0.04498 0.09378,0.205769 0.09058,0.0923 0.183871,0.167842 0.207322,0.167869 0.02344,2.7e-5 0.04263,0.01302 0.04263,0.02885 0,0.01584 0.117144,0.14245 0.26033,0.281352 0.143178,0.138902 0.292804,0.289504 0.332507,0.334665 0.125042,0.142265 0.487691,0.495555 0.560957,0.546484 0.03864,0.02686 0.06096,0.06523 0.04957,0.08526 -0.01138,0.02003 -0.0087,0.02557 0.0061,0.0123 0.0147,-0.01326 0.07471,0.01169 0.133356,0.05543 0.05864,0.04375 0.165259,0.106726 0.236917,0.139967 0.0936,0.04341 0.117608,0.06848 0.08526,0.08899 -0.03381,0.02144 -0.02966,0.02869 0.01667,0.02908 0.03393,4.48e-4 0.05331,0.01409 0.04306,0.03066 -0.01667,0.02698 0.14951,0.115529 0.236282,0.125904 0.01875,0.0023 0.05419,0.0064 0.07875,0.0093 0.02455,0.0029 0.03515,0.02054 0.02356,0.0393 -0.01161,0.01875 0.0036,0.0341 0.0339,0.0341 0.03023,0 0.111436,0.03837 0.180445,0.08526 0.06901,0.04689 0.10272,0.08549 0.07492,0.08578 -0.04424,6.72e-4 -0.04417,0.0046 6.73e-4,0.03333 0.02814,0.01803 0.0764,0.02496 0.107242,0.01537 0.05882,-0.01828 0.141637,0.04693 0.20138,0.15856 0.01945,0.03632 0.09688,0.104889 0.17209,0.152367 0.10982,0.06933 0.132322,0.100292 0.114247,0.157236 -0.01432,0.04508 -0.0096,0.06294 0.01288,0.04903 0.01947,-0.01203 0.04436,-0.0074 0.05532,0.01035 0.01095,0.01772 -0.01483,0.0389 -0.05733,0.04706 -0.06684,0.01286 -0.06461,0.01548 0.01656,0.01949 0.07775,0.0038 0.09378,0.02023 0.09378,0.09574 0,0.149781 0.08859,0.215831 0.289483,0.215831 0.09713,0 0.186006,-0.0094 0.197504,-0.02091 z m -3.916702,-3.351519 c 0.01031,-0.01667 -0.03866,-0.07277 -0.108823,-0.124668 -0.162544,-0.12024 -0.245198,-0.220673 -0.246159,-0.299097 -0.0011,-0.08664 -0.139045,-0.398508 -0.176318,-0.398508 -0.01692,0 -0.04534,-0.03837 -0.06316,-0.08526 -0.01784,-0.04689 -0.04766,-0.08526 -0.06629,-0.08526 -0.01864,0 -0.02504,-0.02302 -0.01425,-0.05115 0.0108,-0.02813 0.0057,-0.05115 -0.01129,-0.05115 -0.04968,0 -0.120395,0.399496 -0.08306,0.469258 0.01779,0.03321 0.143661,0.159902 0.279747,0.281536 0.13608,0.121632 0.279425,0.254059 0.318537,0.294281 0.07702,0.0792 0.141411,0.09803 0.17108,0.05003 z m -0.771004,-2.50443 c -0.0043,-0.02202 0.0183,-0.08917 0.05025,-0.149197 0.03194,-0.06003 0.05808,-0.149179 0.05808,-0.198109 0,-0.05436 0.01416,-0.08021 0.0364,-0.06647 0.03025,0.01869 0.09496,-0.116002 0.0709,-0.147575 -0.004,-0.0054 0.01613,-0.03331 0.04495,-0.06211 0.02881,-0.02881 0.05237,-0.08874 0.05237,-0.133183 0,-0.04445 0.01414,-0.08955 0.03142,-0.100225 0.01728,-0.01069 0.05839,-0.09215 0.09136,-0.181054 0.03297,-0.08891 0.08744,-0.201739 0.12104,-0.250748 0.0336,-0.04901 0.05132,-0.09889 0.03937,-0.110837 -0.01194,-0.01194 -0.0038,-0.02173 0.01806,-0.02173 0.02189,0 0.03955,-0.02686 0.03927,-0.05968 -6.73e-4,-0.05155 -0.0055,-0.05271 -0.03706,-0.0085 -0.03005,0.04207 -0.03367,0.03904 -0.02039,-0.01705 0.0089,-0.03751 0.02822,-0.09773 0.04298,-0.13381 0.02151,-0.05253 0.01548,-0.06124 -0.03023,-0.0437 -0.07092,0.02721 -0.07416,-0.02222 -0.0059,-0.09045 0.02814,-0.02813 0.05065,-0.07911 0.05002,-0.113272 -8.75e-4,-0.05383 -0.01019,-0.05124 -0.06906,0.01945 -0.03736,0.04486 -0.07781,0.07168 -0.08988,0.0596 -0.01208,-0.01207 -0.05363,0.0049 -0.09234,0.0378 -0.06688,0.05679 -0.06809,0.05679 -0.02417,0 0.02827,-0.0365 0.03201,-0.05968 0.0096,-0.05968 -0.02012,0 -0.04886,0.01918 -0.06386,0.04263 -0.01501,0.02344 -0.057,0.06565 -0.09334,0.09379 -0.06006,0.0465 -0.06403,0.04573 -0.0437,-0.0085 0.0123,-0.03282 0.0081,-0.05969 -0.0093,-0.05969 -0.01746,0 -0.04841,0.06522 -0.06882,0.144939 -0.02042,0.07972 -0.04562,0.167959 -0.05602,0.196096 -0.04849,0.131129 -0.111834,0.499144 -0.09503,0.552109 0.01033,0.03255 0.0018,0.09092 -0.01898,0.129723 -0.04485,0.08379 -0.0079,0.827525 0.03967,0.798134 0.01662,-0.01026 0.02669,-0.0367 0.02239,-0.05873 z m 0.415265,-1.487433 c 0,-0.01986 0.01535,-0.03611 0.0341,-0.03611 0.01875,0 0.03411,0.0068 0.03411,0.01503 0,0.0083 -0.01535,0.02453 -0.03411,0.03611 -0.01875,0.01158 -0.0341,0.0048 -0.0341,-0.01503 z m 0.06821,-0.102309 c 0,-0.01985 0.01535,-0.03611 0.0341,-0.03611 0.01875,0 0.0341,0.0068 0.0341,0.01503 0,0.0083 -0.01535,0.02452 -0.0341,0.03611 -0.01875,0.01158 -0.0341,0.0048 -0.0341,-0.01503 z M 50.350048,2.911456 c -0.04024,-0.04024 -0.0851,-0.060404 -0.09969,-0.044811 -0.01458,0.015594 -0.0073,0.035235 0.01633,0.043647 0.02355,0.00841 0.03614,0.026146 0.02793,0.039407 -0.0082,0.013261 0.01737,0.026543 0.05685,0.029515 l 0.07175,0.0054 -0.07316,-0.073163 z M 28.551232,31.653751 c 0,-0.0083 0.01534,-0.02453 0.0341,-0.03611 0.01875,-0.01158 0.0341,-0.0048 0.0341,0.01503 0,0.01987 -0.01534,0.03611 -0.0341,0.03611 -0.01875,0 -0.0341,-0.0067 -0.0341,-0.01503 z M 47.469354,1.6014697 c 0.0231,-0.00934 0.06912,-0.00991 0.102307,-0.00127 0.03317,0.00865 0.01431,0.016289 -0.04196,0.016985 -0.05627,6.93e-4 -0.08342,-0.00638 -0.06032,-0.015721 z"
+     style="fill:#000000" />
+</svg>
diff --git a/Tests/image/folder0.svg b/Tests/image/folder0.svg
new file mode 100644 (file)
index 0000000..005f66f
--- /dev/null
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg
+    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:cc="http://web.resource.org/cc/"
+    xmlns:xlink="http://www.w3.org/1999/xlink"
+    xmlns:dc="http://purl.org/dc/elements/1.1/"
+    xmlns:svg="http://www.w3.org/2000/svg"
+    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+    xmlns:ns1="http://sozi.baierouge.fr"
+    id="Layer_1"
+    enable-background="new 0 0 256 256"
+    xml:space="preserve"
+    viewBox="0 0 256 256"
+    version="1.1"
+    y="0px"
+    x="0px"
+  >
+<radialGradient
+      id="SVGID_1_"
+      gradientUnits="userSpaceOnUse"
+      cy="62.334"
+      cx="181"
+      r="208.44"
+    >
+       <stop
+        style="stop-color:#FFE0A2"
+        offset="0"
+    />
+       <stop
+        style="stop-color:#FCB447"
+        offset="1"
+    />
+</radialGradient
+  >
+<path
+      d="m86.089 63.528c2.655-0.805 5.306 1.066 5.896 4.161l0.58 3.044c0.588 3.085 3.239 4.956 5.885 4.153l88.174-26.738c2.654-0.805 5.307 1.066 5.896 4.161l21.189 111.14c0.588 3.085-1.098 6.271-3.754 7.076l-150.06 45.5c-2.654 0.805-5.306-1.065-5.894-4.15l-21.187-111.14c-0.59-3.094 1.097-6.281 3.751-7.085l3.071-0.931c2.646-0.803 4.332-3.989 3.744-7.074l-0.58-3.044c-0.59-3.095 1.097-6.281 3.751-7.086l39.533-11.992z"
+      fill="url(#SVGID_1_)"
+  />
+<defs
+    >
+       <filter
+        id="Adobe_OpacityMaskFilter"
+        height="132.64"
+        width="154.43"
+        y="83.58"
+        x="51.455"
+        filterUnits="userSpaceOnUse"
+      >
+               <feFlood
+          style="flood-color:white"
+          result="back"
+      />
+               <feBlend
+          mode="normal"
+          in2="back"
+          in="SourceGraphic"
+      />
+       </filter
+    >
+</defs
+  >
+<mask
+      id="SVGID_2_"
+      height="132.641"
+      width="154.43"
+      y="83.58"
+      x="51.455"
+      maskUnits="userSpaceOnUse"
+    >
+</mask
+  >
+<g
+      mask="url(#SVGID_2_)"
+    >
+       <path
+        d="m205.88 122.4l-7.402-38.824c-26.574 7.254-111.94 30.851-119.82 36.753-7.483 5.612-21.821 57.716-27.212 78.155l2.554 13.396c0.588 3.085 3.24 4.955 5.894 4.15l145.44-44.104 0.54-49.53z"
+    />
+</g
+  >
+<linearGradient
+      id="SVGID_3_"
+      y2="166.41"
+      gradientUnits="userSpaceOnUse"
+      x2="212.43"
+      y1="132.96"
+      x1="77.764"
+    >
+       <stop
+        style="stop-color:#FEE58A"
+        offset="0"
+    />
+       <stop
+        style="stop-color:#FCB461"
+        offset="1"
+    />
+</linearGradient
+  >
+<path
+      d="m233.7 82.767c2.654-0.805 4.299 0.371 3.658 2.609l-23.072 80.614c-0.643 2.244-3.336 4.736-5.99 5.542l-150.07 45.51c-2.646 0.803-4.29-0.373-3.647-2.618l23.072-80.613c0.64-2.237 3.334-4.729 5.98-5.532l150.06-45.513z"
+      fill="url(#SVGID_3_)"
+  />
+<metadata
+    ><rdf:RDF
+      ><cc:Work
+        ><dc:format
+          >image/svg+xml</dc:format
+        ><dc:type
+            rdf:resource="http://purl.org/dc/dcmitype/StillImage"
+        /><cc:license
+            rdf:resource="http://creativecommons.org/licenses/publicdomain/"
+        /><dc:publisher
+          ><cc:Agent
+              rdf:about="http://openclipart.org/"
+            ><dc:title
+              >Openclipart</dc:title
+            ></cc:Agent
+          ></dc:publisher
+        ><dc:title
+          >Folder icon</dc:title
+        ><dc:date
+          >2011-05-08T02:14:09</dc:date
+        ><dc:description
+          >A (somewhat) realistic folder icon.</dc:description
+        ><dc:source
+          >https://openclipart.org/detail/137155/folder-icon-by-jhnri4-137155</dc:source
+        ><dc:creator
+          ><cc:Agent
+            ><dc:title
+              >jhnri4</dc:title
+            ></cc:Agent
+          ></dc:creator
+        ><dc:subject
+          ><rdf:Bag
+            ><rdf:li
+              >folder</rdf:li
+            ><rdf:li
+              >how i did it</rdf:li
+            ><rdf:li
+              >icon</rdf:li
+            ></rdf:Bag
+          ></dc:subject
+        ></cc:Work
+      ><cc:License
+          rdf:about="http://creativecommons.org/licenses/publicdomain/"
+        ><cc:permits
+            rdf:resource="http://creativecommons.org/ns#Reproduction"
+        /><cc:permits
+            rdf:resource="http://creativecommons.org/ns#Distribution"
+        /><cc:permits
+            rdf:resource="http://creativecommons.org/ns#DerivativeWorks"
+        /></cc:License
+      ></rdf:RDF
+    ></metadata
+  ></svg
+>
diff --git a/Tests/image/folder1.svg b/Tests/image/folder1.svg
new file mode 100644 (file)
index 0000000..4831747
--- /dev/null
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--part of the rodentia icon theme by sixsixfive released under CC0 (https://creativecommons.org/publicdomain/zero/1.0/) on openclipart-->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   viewBox="0 0 48 48"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.91 r13725"
+   sodipodi:docname="folder1.svg">
+  <metadata
+     id="metadata46">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1237"
+     inkscape:window-height="922"
+     id="namedview44"
+     showgrid="false"
+     inkscape:zoom="9.8333333"
+     inkscape:cx="24.730721"
+     inkscape:cy="17.391797"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0"
+     inkscape:current-layer="svg2" />
+  <defs
+     id="0">
+    <linearGradient
+       id="2">
+      <stop
+         id="J"
+         stop-color="#2e3436" />
+      <stop
+         id="K"
+         offset="1"
+         stop-color="#2e3436"
+         stop-opacity="0" />
+    </linearGradient>
+    <linearGradient
+       id="3">
+      <stop
+         id="L"
+         stop-color="#fff"
+         stop-opacity="0.4" />
+      <stop
+         id="M"
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0" />
+    </linearGradient>
+    <linearGradient
+       id="4">
+      <stop
+         id="N"
+         stop-color="#8f5902" />
+      <stop
+         id="O"
+         offset="1"
+         stop-color="#683f00" />
+    </linearGradient>
+    <linearGradient
+       id="5">
+      <stop
+         id="P"
+         stop-color="#fff" />
+      <stop
+         id="Q"
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0" />
+    </linearGradient>
+    <linearGradient
+       id="6">
+      <stop
+         id="R"
+         stop-color="#fff"
+         stop-opacity="0.8" />
+      <stop
+         id="S"
+         offset="1"
+         stop-color="#fff"
+         stop-opacity="0" />
+    </linearGradient>
+    <linearGradient
+       id="7">
+      <stop
+         id="T"
+         stop-color="#e9b96e" />
+      <stop
+         id="U"
+         offset="1"
+         stop-color="#c17d11" />
+    </linearGradient>
+    <linearGradient
+       id="8">
+      <stop
+         id="V"
+         stop-color="#2e3436" />
+      <stop
+         id="W"
+         offset="1"
+         stop-color="#555753" />
+    </linearGradient>
+    <filter
+       color-interpolation-filters="sRGB"
+       id="9">
+      <feGaussianBlur
+         stdDeviation="0.755"
+         id="X" />
+    </filter>
+    <radialGradient
+       cx="35.488"
+       cy="26.2"
+       r="23"
+       id="A"
+       xlink:href="#8"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.0434444,-1.4643692,1.4020098,0.9990096,-62.776231,34.470805)" />
+    <linearGradient
+       y1="1.781"
+       x2="0"
+       y2="41.75"
+       id="B"
+       xlink:href="#3"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y1="10.144"
+       x2="0"
+       y2="42.775"
+       id="C"
+       xlink:href="#7"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y1="10.144"
+       x2="0"
+       y2="42.775"
+       id="D"
+       xlink:href="#4"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       y1="11.188"
+       x2="0"
+       y2="41.75"
+       id="E"
+       xlink:href="#6"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       x1="7.935"
+       y1="-28.25"
+       x2="20.05"
+       y2="36.1"
+       id="F"
+       xlink:href="#5"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       cx="24.919"
+       cy="48.2"
+       r="25.941"
+       id="G"
+       xlink:href="#2"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1,0,0,0.1062992,0,43.080183)" />
+    <linearGradient
+       inkscape:collect="always"
+       x1="105"
+       y1="123"
+       gradientTransform="translate(2,922.36)"
+       x2="-80"
+       gradientUnits="userSpaceOnUse"
+       y2="-112"
+       id="linearGradient3606">
+      <stop
+         offset="0"
+         style="stop-color:#e6e6e6"
+         id="stop3602" />
+      <stop
+         offset="1"
+         style="stop-color:#f9f9f9"
+         id="stop3604" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       x1="93"
+       y1="944.36"
+       gradientTransform="translate(2,-2)"
+       x2="80"
+       gradientUnits="userSpaceOnUse"
+       y2="957.36"
+       id="linearGradient3614">
+      <stop
+         offset="0"
+         style="stop-color:#cccccc"
+         id="stop3610" />
+      <stop
+         offset=".22008"
+         style="stop-color:#e6e6e6"
+         id="stop3616" />
+      <stop
+         offset=".46933"
+         style="stop-color:#ffffff"
+         id="stop3618" />
+      <stop
+         offset="1"
+         style="stop-color:#e6e6e6"
+         id="stop3612" />
+    </linearGradient>
+  </defs>
+  <g
+     id="Directory"
+     transform="matrix(1.0511923,0,0,1.0511923,-1.1274166,-1.2155515)"
+     style="opacity:0.6">
+    <path
+       d="m 50.860289,48.204258 a 25.94079,2.7574856 0 1 1 -51.8815807,0 25.94079,2.7574856 0 1 1 51.8815807,0 z"
+       transform="matrix(0.9652959,0,0,0.8148148,-0.05468968,4.2286171)"
+       id="H"
+       style="fill:url(#G)"
+       inkscape:connector-curvature="0" />
+    <g
+       transform="matrix(0.9574469,0,0,0.9574469,1.0212744,3.1660267)"
+       id="I">
+      <path
+         d="m 1.5,1.2452202 0,41.0294108 45,0 0,-34.5135739 -18.834842,0 -5.497737,-6.5158369 -20.667421,0 z"
+         id="Y"
+         style="fill:url(#A);stroke:#2e3436;stroke-linecap:square;stroke-linejoin:round"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 2.53125,2.28125 0,38.96875 42.9375,0 0,-32.46875 -17.8125,0 A 1.0266953,1.0266953 0 0 1 26.875,8.40625 l -5.1875,-6.125 -19.15625,0 z"
+         id="Z"
+         style="opacity:0.8;fill:none;stroke:url(#B);stroke-linecap:square;stroke-linejoin:round"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 18.65625,11.1875 -2.875,6.34375 a 0.54138149,0.54138149 0 0 1 -0.5,0.3125 l -13.75,0 0.5,23.90625 43.9375,0 0.5,-30.5625 -27.8125,0 z"
+         transform="translate(0,-1.7)"
+         id="a"
+         inkscape:connector-curvature="0"
+         style="filter:url(#9)" />
+      <path
+         d="m 18.310273,10.643608 -3.037735,6.654088 -14.272535,0 0.4999972,24.976935 44.9999998,0 0.499997,-31.631023 -28.689724,0 z"
+         id="b"
+         style="fill:url(#C);stroke:url(#D);stroke-linecap:square;stroke-linejoin:round"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 18.96875,11.6875 -2.75,6.0625 a 1.0266953,1.0266953 0 0 1 -0.9375,0.59375 l -13.21875,0 L 2.5,41.25 l 43,0 0.4375,-29.5625 -26.96875,0 z"
+         id="c"
+         style="opacity:0.8;fill:none;stroke:url(#E);stroke-linecap:square;stroke-linejoin:round"
+         inkscape:connector-curvature="0" />
+      <path
+         d="m 18.65625,11.15625 -2.90625,6.375 c -0.08919,0.176066 -0.271425,0.285406 -0.46875,0.28125 l -13.78125,0 0.3125,15.34375 c 12.189878,-5.184653 30.416986,-10.313955 44.53125,-12.75 l 0.15625,-9.25 -27.84375,0 z"
+         id="d"
+         style="opacity:0.8;fill:url(#F)"
+         inkscape:connector-curvature="0" />
+    </g>
+  </g>
+  <g
+     transform="matrix(0.39982059,0,0,0.39982059,-1.5622442,-371.2009)"
+     inkscape:label="Layer 1"
+     id="Normal">
+    <path
+       d="m 82,930.36 -60,0 0,115 85,0 0,-90 -25,-25 z"
+       style="fill:url(#linearGradient3606);fill-rule:evenodd;stroke:#808080;stroke-width:1px;stroke-linejoin:round"
+       sodipodi:nodetypes="cccccc"
+       id="path2826"
+       inkscape:connector-curvature="0" />
+    <path
+       d="m 107,955.36 -25,-25 c 1.8633,8.3333 2.1329,16.667 0,25 9.9055,-1.935 17.128,-0.56751 25,0 z"
+       style="fill:url(#linearGradient3614);fill-rule:evenodd;stroke:#808080;stroke-width:1px;stroke-linejoin:round"
+       sodipodi:nodetypes="cccc"
+       id="rect2822"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/Tests/image/tetra.png b/Tests/image/tetra.png
new file mode 100755 (executable)
index 0000000..be7edbe
Binary files /dev/null and b/Tests/image/tetra.png differ
diff --git a/Tests/image/textest.png b/Tests/image/textest.png
new file mode 100755 (executable)
index 0000000..678e6d4
Binary files /dev/null and b/Tests/image/textest.png differ
diff --git a/Tests/image/u.svg b/Tests/image/u.svg
new file mode 100644 (file)
index 0000000..5dfe5d8
--- /dev/null
@@ -0,0 +1,249 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="300"
+   height="300"
+   id="svg2"
+   sodipodi:version="0.32"
+   inkscape:version="0.48.0 r9654"
+   version="1.0"
+   sodipodi:docname="blue.svg"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+  <defs
+     id="defs4">
+    <inkscape:perspective
+       sodipodi:type="inkscape:persp3d"
+       inkscape:vp_x="0 : 150 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_z="300 : 150 : 1"
+       inkscape:persp3d-origin="150 : 100 : 1"
+       id="perspective31" />
+    <linearGradient
+       id="linearGradient3841">
+      <stop
+         style="stop-color:white;stop-opacity:1;"
+         offset="0"
+         id="stop3843" />
+      <stop
+         style="stop-color:#fefce9;stop-opacity:0;"
+         offset="1"
+         id="stop3845" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3813">
+      <stop
+         id="stop3815"
+         offset="0"
+         style="stop-color:#0060c8;stop-opacity:0;" />
+      <stop
+         style="stop-color:#0062a2;stop-opacity:0.40000001;"
+         offset="0.5"
+         id="stop4577" />
+      <stop
+         id="stop4579"
+         offset="0.75"
+         style="stop-color:#005994;stop-opacity:0.60000002;" />
+      <stop
+         id="stop3817"
+         offset="1"
+         style="stop-color:black;stop-opacity:0.80000001;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3779">
+      <stop
+         style="stop-color:#0077ec;stop-opacity:1;"
+         offset="0"
+         id="stop3781" />
+      <stop
+         style="stop-color:#78afff;stop-opacity:1;"
+         offset="1"
+         id="stop3783" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3779"
+       id="linearGradient3785"
+       x1="1.0101526"
+       y1="2.0049992"
+       x2="300"
+       y2="300"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3813"
+       id="radialGradient3819"
+       cx="150"
+       cy="150"
+       fx="150"
+       fy="150"
+       r="150"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3841"
+       id="linearGradient3847"
+       x1="149.99989"
+       y1="0.45544016"
+       x2="149.99989"
+       y2="299.54449"
+       gradientUnits="userSpaceOnUse" />
+    <inkscape:perspective
+       id="perspective2461"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2511"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2578"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2650"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2467"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2519"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2571"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective2621"
+       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+       inkscape:vp_z="744.09448 : 526.18109 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 526.18109 : 1"
+       sodipodi:type="inkscape:persp3d" />
+  </defs>
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.4"
+     inkscape:cx="128.66366"
+     inkscape:cy="229.83929"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer2"
+     width="765px"
+     height="1260px"
+     inkscape:window-width="1280"
+     inkscape:window-height="949"
+     inkscape:window-x="0"
+     inkscape:window-y="25"
+     showgrid="false"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Button"
+     inkscape:groupmode="layer"
+     id="layer1"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       d="m 300,150 a 150,150 0 1 1 -300,0 150,150 0 1 1 300,0 z"
+       sodipodi:ry="150"
+       sodipodi:rx="150"
+       sodipodi:cy="150"
+       sodipodi:cx="150"
+       id="path2760"
+       style="fill:url(#linearGradient3785);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#linearGradient3785);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path3788"
+       sodipodi:cx="150"
+       sodipodi:cy="150"
+       sodipodi:rx="150"
+       sodipodi:ry="150"
+       d="m 300,150 a 150,150 0 1 1 -300,0 150,150 0 1 1 300,0 z" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Schatten"
+     style="display:inline">
+    <path
+       sodipodi:type="arc"
+       style="fill:url(#radialGradient3819);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       id="path3790"
+       sodipodi:cx="150"
+       sodipodi:cy="150"
+       sodipodi:rx="150"
+       sodipodi:ry="150"
+       d="m 300,150 a 150,150 0 1 1 -300,0 150,150 0 1 1 300,0 z" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="Icon" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Glanz"
+     style="display:inline"
+     sodipodi:insensitive="true">
+    <path
+       d="m 300,150 a 150,150 0 1 1 -300,0 150,150 0 1 1 300,0 z"
+       sodipodi:ry="150"
+       sodipodi:rx="150"
+       sodipodi:cy="150"
+       sodipodi:cx="150"
+       id="path3821"
+       style="fill:url(#linearGradient3847);fill-opacity:1;fill-rule:evenodd;stroke:none"
+       sodipodi:type="arc"
+       transform="matrix(0.649475,0,0,0.476763,52.5787,2)" />
+  </g>
+</svg>
diff --git a/Tests/test.style b/Tests/test.style
new file mode 100644 (file)
index 0000000..14971b8
--- /dev/null
@@ -0,0 +1,43 @@
+FpsLabel {
+       Width = "50%";
+       Font = "droid, 10";
+       Margin = "0";
+       TextAlignment = "Center";
+       Background = "DimGrey";
+}
+FpsDisp {
+       Font = "droid bold, 10";
+       Width = "50%";
+       Margin = "0";
+       TextAlignment = "Center";
+       Background = "MediumSeaGreen";
+}
+CheckBox2 {
+       Template= "Interfaces/CheckBox2.imlt";
+       Background = "Jet";
+       Checked="{Background=MediumSeaGreen}";
+       Unchecked = "{Background=Jet}";
+}
+RadioButton2 {
+       Template="Interfaces/CheckBox2.imlt";
+       Background = "Jet";
+       Checked = "{Background=MediumSeaGreen}";
+       Unchecked = "{Background=Jet}";
+}
+labPerf {
+       Font = "droid, 8";
+       Width = "50%";
+}
+labPerfVal{
+       Font = "droid, 8";
+       Width = "50%";
+}
+DbgLogViewer{
+       Background = "Onyx";
+       Font = "mono, 8";
+       Foreground = "LightGrey";
+       Focusable = "true";
+}
+DockWindow{
+       Background = "0.1,0.1,0.1,0.5";
+}
\ No newline at end of file
diff --git a/Tests/testClass.cs b/Tests/testClass.cs
new file mode 100644 (file)
index 0000000..70d19b7
--- /dev/null
@@ -0,0 +1,25 @@
+
+using System;
+
+/* this is a block comment
+ * on several lines
+ */
+
+namespace testRoslyn {
+    public class testClass {
+               public testClass self;
+               int a = 0;
+               int b;
+               public string str = "this is a test string"
+
+               [XmlIgnore]
+               public string Str {
+                       get { return str; }
+                       set { str = value; }
+               }
+               [SecuritySafeCritical]
+        public testClass (int _a, int _b) {
+                       a = _a;
+        }
+    }
+}
diff --git a/Tests/ui/LabelButton.style b/Tests/ui/LabelButton.style
new file mode 100644 (file)
index 0000000..4e61c38
--- /dev/null
@@ -0,0 +1,8 @@
+MouseEnter = "{Background = Grey;Foreground = White;}";
+Fit = "true";
+MouseLeave = "{Background=Transparent;Foreground=Grey;}";
+MouseDown = "{Background=Red;Foreground=White;}";
+MouseUp = "{Background=Grey;Foreground=White;}";
+Foreground="Grey";
+Margin="5";
+CornerRadius="5";
diff --git a/Tests/ui/MenuItem.style b/Tests/ui/MenuItem.style
new file mode 100644 (file)
index 0000000..2c0ada7
--- /dev/null
@@ -0,0 +1,11 @@
+Height = "Fit";
+Width = "Stretched";
+MinimumSize="60;10";
+Margin="2";
+CornerRadius="0";
+TextAlignment="Left";
+Foreground="Grey";
+//MouseEnter = "{Background=SeaGreen;Foreground=White;}";
+//MouseLeave = "{Background=Transparent;Foreground=Grey;}";
+MouseDown = "{Background=White;Foreground=DimGrey;}";
+MouseUp = "{Background=SeaGreen;Foreground=White;}";
diff --git a/Tests/ui/MenuItem.template b/Tests/ui/MenuItem.template
new file mode 100644 (file)
index 0000000..e959b7d
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<Popper Font="{./Font}" Caption="{./Caption}"  Background="{./Background}" PopDirection="{./PopDirection}"
+       Foreground = "{./Foreground}" CanPop="{./HasChildren}" MouseClick="./onMI_Click"
+       IsPopped="{²./IsOpened}" PopWidth="{./PopWidth}" PopHeight="{./PopHeight}" IsEnabled="{./IsEnabled}">
+       <Template>
+               <CheckBox IsChecked="{²./IsPopped}" Caption="{./Caption}" Background="{./Background}" Foreground="{./Foreground}">
+                       <Template>
+                               <Border Name="border1"
+                                               MinimumSize = "40,0"
+                                               Foreground="Transparent"
+                                               Background="{./Background}">
+                                               <HorizontalStack HorizontalAlignment="Left" Margin="1">
+                                                       <Image Width="10" Height="10" Picture="{../../../../../Icon}"/>
+                                                       <Label Text="{./Caption}"
+                                                               Foreground="{./Foreground}"
+                                                               Font="{./Font}" />
+                                               </HorizontalStack>
+                               </Border>
+                       </Template>
+               </CheckBox>
+       </Template>
+       <Border Foreground="DimGrey" Width="{../PopWidth}" Height="{../PopHeight}" Background="Jet">
+               <VerticalStack Name="ItemsContainer"/>
+       </Border>
+</Popper>
diff --git a/Tests/ui/Popper.template b/Tests/ui/Popper.template
new file mode 100755 (executable)
index 0000000..ae8c63c
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<Label Text="{../Caption}" Style="#Tests.ui.LabelButton.style"
+       Height="Fit"/>
diff --git a/Tests/ui/TreeExpandable.template b/Tests/ui/TreeExpandable.template
new file mode 100644 (file)
index 0000000..87fe8d4
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<VerticalStack>
+       <Border Style="TreeItemBorder" >                
+               <HorizontalStack Spacing="5" Focusable="true" MouseDoubleClick="./onClickForExpand">
+                       <Image Margin="1" Width="9" Height="9" Focusable="true" MouseDown="./onClickForExpand"
+                               Path="{./Image}"
+                               Visible="{./IsExpandable}"
+                               SvgSub="{./IsExpanded}"
+                               MouseEnter="{Background=LightGrey}"
+                               MouseLeave="{Background=Transparent}"/>
+            <Label Text="{Kind}" Width="Fit" Margin="2" Background="Onyx"/>
+            <Label Multiline="true" Text="{ToFullString}" Foreground="White" Background="Blue" Margin="2"/>            
+                       <ListBox Data="{GetToks}" Height="Fit" Width="Fit" DataTest="GetKind">
+                <Template>
+                    <HorizontalStack Name="ItemsContainer"/>
+                </Template>                
+                <ItemTemplate DataType="OpenBraceToken">
+                    <Label Text="{ToFullString}" Foreground="White" Background="Red"/>
+                </ItemTemplate>
+                <ItemTemplate DataType="OpenParenToken">
+                    <Label Text="{ToFullString}" Foreground="Red" />
+                </ItemTemplate>
+                <ItemTemplate>
+                    <Label Text="{ToFullString}" Foreground="Black"/>
+                </ItemTemplate>
+            </ListBox>            
+               </HorizontalStack>
+       </Border>
+       <Container Name="Content" Visible="false"/>
+</VerticalStack>
diff --git a/Tests/ui/dbgLog.crow b/Tests/ui/dbgLog.crow
new file mode 100755 (executable)
index 0000000..cf7e2ae
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<Window Width="Stretched" Height="Stretched">
+       <VerticalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Text="Scale X:"/>
+                       <Label Text="{../../view.XScale}"/>
+                       <Label Text="Scroll X:"/>
+                       <Label Text="{../../view.ScrollX}"/>
+                       <Label Text="Max Scroll X:"/>
+                       <Label Text="{../../view.MaxScrollX}"/>
+                       <Label Text="Scroll Y:"/>
+                       <Label Text="{../../view.ScrollY}"/>
+                       <Label Text="Visible Lines:"/>
+                       <Label Text="{../../view.VisibleLines}"/>
+                       <Label Text="Visible Ticks:"/>
+                       <Label Text="{../../view.VisibleTicks}"/>
+                       <Label Text="CurrentLine:"/>
+                       <Label Text="{../../view.CurrentLine}"/>
+               </HorizontalStack>
+               <HorizontalStack>
+                       <DbgLogViewer Margin="0" Name="view" LogFile="debug.log" MouseWheelSpeed="10"/>
+                       <ScrollBar Name="scrollbar1" Orientation="Vertical"
+                               Value="{²../view.ScrollY}"     Maximum="{../view.MaxScrollY}" 
+                               CursorSize="{../view.ChildHeightRatio}"
+                               LargeIncrement="{../view.PageHeight}" SmallIncrement="30"
+                               Width="12" />
+               </HorizontalStack>
+               <ScrollBar Style="HScrollBar" Name="scrollbarX" Orientation="Horizontal"
+                               Value="{²../view.ScrollX}" Maximum="{../view.MaxScrollX}" 
+                               CursorSize="{../view.ChildWidthRatio}" 
+                               LargeIncrement="{../view.PageWidth}" SmallIncrement="30"
+                               Height="12" />
+       </VerticalStack>
+</Window>
\ No newline at end of file
diff --git a/Tests/ui/dbgLogColors.crow b/Tests/ui/dbgLogColors.crow
new file mode 100755 (executable)
index 0000000..e1915e6
--- /dev/null
@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+<Window Template="#Crow.ToolWindow.template" AlwaysOnTop="true" Width="400" Height="300"
+       HorizontalAlignment="Right" VerticalAlignment="Bottom">
+       <VerticalStack>
+               <Button Caption="update" MouseClick="onColorUpdate"/>
+               <HorizontalStack Height="Fit" DataSource="{../kvpList.SelectedItem}" Margin="10">                       
+                       <Label Text="{Key}" Margin="0" Width="Stretched" Font="mono, 8"/>
+                       <ComboBox Data="{TestList}" ItemTemplate="#Tests.Interfaces.colorItem2.crow" Name="combo"
+                               SelectedItem="{Value}">
+                               <Template>
+                                       <Popper Caption="{./SelectedItem}" Name="popper" PopDirection="Bottom" Foreground="{./Foreground}" Background="{./Background}">
+                                               <Template>
+                                                       <CheckBox Caption="{./Caption}" IsChecked="{²./IsPopped}" Foreground="{./Foreground}" Background="{./Background}">
+                                                               <Template>
+                                                                       <Border CornerRadius="0" Foreground="LightGrey">
+                                                                               <HorizontalStack Margin="0" Spacing="1">
+                                                                                       <!---<Widget Height="8" Width="14" Background="{./Caption}" Margin="0" CornerRadius="2"/>-->
+                                                                                       <Label MinimumSize="80,10" Text="{./Caption}" Margin="0" Width="Stretched" Font="mono, 8"/>
+                                                                                       <Button Width="14" Height="14" Focusable="false"
+                                                                                               Template="#Crow.Templates.ArrowBut.template">
+                                                                                               <Image Margin="0"  Path="#Crow.Images.Icons.updown.svg" SvgSub="down"/>
+                                                                                       </Button>
+                                                                               </HorizontalStack>
+                                                                       </Border>
+                                                               </Template>
+                                                       </CheckBox>
+                                               </Template>
+                                               <Border Background="DimGrey" BorderWidth="1" Margin="1"
+                                                       MinimumSize="{../../MinimumPopupSize}" Fit="true">
+                                                       <Scroller Name="scroller1" Margin="2" 
+                                                               MaximumSize="0,200"
+                                                               HorizontalAlignment="Left">
+                                                               <VerticalStack
+                                                                       Height="Fit" Name="ItemsContainer" Margin="0"
+                                                                       HorizontalAlignment="Left"
+                                                                       VerticalAlignment="Top"/>
+                                                       </Scroller>
+                                               </Border>
+                                       </Popper>
+                               </Template>
+                       </ComboBox>
+                       <Widget Height="8" Width="14" Background="{Value}" Margin="0" CornerRadius="2"/>
+               </HorizontalStack>
+               <HorizontalStack>                       
+                       <ListBox Name="kvpList" Data="{ColorsKVPList}" Margin="0"                
+                                Template="#Crow.Templates.ScrollingListBox.template">
+                                <ItemTemplate>
+                                       <Border Foreground="Transparent" Focusable="true" HorizontalAlignment="Left" Height="Fit">
+                                               <HorizontalStack Margin="0"
+                                                                       MouseEnter="{Background=CornflowerBlue}"
+                                                                       MouseLeave="{Background=Transparent}">
+                                                       <Widget Height="8" Width="14" Background="{Value}" Margin="0" CornerRadius="2"/>
+                                                       <Label Text="{Key}" Margin="0" Width="Stretched" Font="mono, 8"/>
+                                               </HorizontalStack>
+                                       </Border>
+                                </ItemTemplate>
+                       </ListBox>       
+               </HorizontalStack>
+       </VerticalStack>
+</Window>
\ No newline at end of file
diff --git a/Tests/ui/showcase.crow b/Tests/ui/showcase.crow
new file mode 100755 (executable)
index 0000000..f14e965
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<HorizontalStack Background="Jet" Margin="5">
+       <DirectoryView Name="dv" CurrentDirectory="Interfaces" Width="25%" SelectedItemChanged="Dv_SelectedItemChanged"/>
+       <Splitter Width="6"/>
+       <VerticalStack>
+               <Container Name="CrowContainer" Height="60%" Background="DimGrey"/>
+               <Splitter/>
+               <HorizontalStack>
+                       <Scroller Name="scroller1" Background="White"
+                                       Margin="2" ScrollY="{../scrollbar1.Value}"
+                                       ValueChanged="./_scroller_ValueChanged">
+                               <TextBox VerticalAlignment="Top" TextChanged="Tb_TextChanged"
+                                       Text="{source}" Multiline="true" TextAlignment="TopLeft"
+                                       Font="Courriernew 10"/>
+                       </Scroller>
+                       <ScrollBar Name="scrollbar1" Value="{../scroller1.ScrollY}"
+                               LargeIncrement="{../scroller1.PageHeight}" SmallIncrement="30"
+                               CursorSize="{../scroller1.ChildHeightRatio}"
+                               Maximum="{../scroller1.MaxScrollY}" Orientation="Vertical"
+                               Width="14" />
+               </HorizontalStack>
+               <Label Visible="{ShowError}" Text="{ErrorMessage}" Background="Red" Foreground="White" Width="Stretched" Margin="2"
+                       Multiline="true"/>
+       </VerticalStack>
+</HorizontalStack>
diff --git a/Tests/ui/test.crow b/Tests/ui/test.crow
new file mode 100755 (executable)
index 0000000..663fd93
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<Window Font="droid bold, 10" Caption="Open GL" HorizontalAlignment="Left" Width="30%" Height="90%">
+       <VerticalStack>
+               <HorizontalStack Background="DimGrey" Height="Fit" Width="Stretched"  Margin="2">
+                       <Popper Caption="File" Template="#Tests.ui.Popper.template" Width="Fit">
+                               <Border Fit="True" Foreground="Grey" Background="DimGrey">
+                                       <VerticalStack Height="Fit" Width="Fit" Margin="2">
+                                               <Label Text="New File" Style="#Tests.ui.MenuItem.style" />
+                                               <Label Text="Open..." Style="#Tests.ui.MenuItem.style"/>
+                                               <Label Text="Save..." Style="#Tests.ui.MenuItem.style"/>
+                                               <Label Text="Exit" Style="#Tests.ui.MenuItem.style"/>
+                                       </VerticalStack>
+                               </Border>
+                       </Popper>
+                       <Label Text="Edit" Style="#Tests.ui.LabelButton.style"/>
+                       <Label Text="Project" Style="#Tests.ui.LabelButton.style"/>
+                       <Label Text="Help" Style="#Tests.ui.LabelButton.style"/>
+               </HorizontalStack>
+               <GroupBox Caption="Object Rotation" Margin="10" Width="70%" Height="Fit" >
+                       <VerticalStack Spacing="10">
+                               <Spinner Width="50%" Maximum="1,0" SmallIncrement="0.01" Value="{²RotationSpeed}"/>
+                               <Slider Height="10" Width="50%" Maximum="1,0" SmallIncrement="0.01" Value="{²RotationSpeed}"/>
+                               <CheckBox IsChecked="{²ClockWiseRotation}" Caption="Clockwise Rotation"/>
+                               <GroupBox Caption="Rotation Axis" Height="Fit" >
+                                       <VerticalStack>
+                                               <RadioButton Caption="x"/>
+                                               <RadioButton Caption="y"/>
+                                               <RadioButton Caption="z"/>
+                                       </VerticalStack>
+                               </GroupBox>
+                       </VerticalStack>
+               </GroupBox>
+
+               <Image Width="100" Height="100"
+               Path="#Crow.Images.Icons.exit2.svg"     />
+       </VerticalStack>
+</Window>
\ No newline at end of file
diff --git a/Tests/ui/test.style b/Tests/ui/test.style
new file mode 100644 (file)
index 0000000..932fb6b
--- /dev/null
@@ -0,0 +1,3 @@
+BlueLabel {
+       Background = "Blue";
+}
diff --git a/Tests/ui/tmpWindow.crow b/Tests/ui/tmpWindow.crow
new file mode 100755 (executable)
index 0000000..8af356b
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<Border BorderWidth="1" Foreground="White" CornerRadius="15"
+       MouseEnter="../onBorderMouseEnter"
+       MouseLeave="../onBorderMouseLeave"
+       Background="vgradient|0:0.6,0.6,0.6,0.9|1:0.4,0.4,0.4,0.6">
+       <VerticalStack>
+               <HorizontalStack Height="Fit">
+                       <Label Margin="2" Font="{../../../../Font}" Text="{../../../../Caption}" Width="Stretched"/>
+                       <Border HorizontalAlignment="Right" Margin="0" VerticalAlignment="Top"
+                               CornerRadius="6" BorderWidth="1" Foreground="Transparent"
+                               Height="12" Width="12"
+                               MouseEnter="{Foreground=White}" MouseLeave="{Foreground=Transparent}">
+                               <Image Focusable="true" Name="Image" Path="#Crow.Images.Icons.exit2.svg"
+                                        MouseClick="../../../../../butQuitPress"/>
+                       </Border>
+               </HorizontalStack>
+               <Container Name="Content"/>
+       </VerticalStack>
+</Border>
\ No newline at end of file
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644 (file)
index 0000000..42519fa
--- /dev/null
@@ -0,0 +1,22 @@
+version: 0.4.{build}
+
+branches:
+  only:
+  - master 
+
+clone_depth: 1
+
+before_build:
+- cmd: nuget restore Crow.sln
+
+build_script:
+    - set path=%path%;C:\Program Files (x86)\Mono\bin
+    - xbuild /p:Configuration=Release Crow.sln 
+
+#build: off
+
+build:
+
+#  project: Crow.sln
+
+  verbosity: normal
diff --git a/netfx.props b/netfx.props
new file mode 100644 (file)
index 0000000..25fdbe0
--- /dev/null
@@ -0,0 +1,27 @@
+<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <!-- When compiling .NET SDK 2.0 projects targeting .NET 4.x on Mono using 'dotnet build' you -->
+    <!-- have to teach MSBuild where the Mono copy of the reference asssemblies is -->
+    <TargetIsMono Condition="$(TargetFramework.StartsWith('net4')) and '$(OS)' == 'Unix'">true</TargetIsMono>
+
+    <!-- Look in the standard install locations -->
+    <BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/Library/Frameworks/Mono.framework/Versions/Current/lib/mono')">/Library/Frameworks/Mono.framework/Versions/Current/lib/mono</BaseFrameworkPathOverrideForMono>
+    <BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/lib/mono')">/usr/lib/mono</BaseFrameworkPathOverrideForMono>
+    <BaseFrameworkPathOverrideForMono Condition="'$(BaseFrameworkPathOverrideForMono)' == '' AND '$(TargetIsMono)' == 'true' AND EXISTS('/usr/local/lib/mono')">/usr/local/lib/mono</BaseFrameworkPathOverrideForMono>
+
+    <!-- If we found Mono reference assemblies, then use them -->
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net45'">$(BaseFrameworkPathOverrideForMono)/4.5-api</FrameworkPathOverride>
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net451'">$(BaseFrameworkPathOverrideForMono)/4.5.1-api</FrameworkPathOverride>
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net452'">$(BaseFrameworkPathOverrideForMono)/4.5.2-api</FrameworkPathOverride>
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net46'">$(BaseFrameworkPathOverrideForMono)/4.6-api</FrameworkPathOverride>
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net461'">$(BaseFrameworkPathOverrideForMono)/4.6.1-api</FrameworkPathOverride>
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net462'">$(BaseFrameworkPathOverrideForMono)/4.6.2-api</FrameworkPathOverride>
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net47'">$(BaseFrameworkPathOverrideForMono)/4.7-api</FrameworkPathOverride>
+    <FrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != '' AND '$(TargetFramework)' == 'net471'">$(BaseFrameworkPathOverrideForMono)/4.7.1-api</FrameworkPathOverride>
+    <EnableFrameworkPathOverride Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">true</EnableFrameworkPathOverride>
+
+    <!-- Add the Facades directory.  Not sure how else to do this. Necessary at least for .NET 4.5 -->
+    <AssemblySearchPaths Condition="'$(BaseFrameworkPathOverrideForMono)' != ''">$(FrameworkPathOverride)/Facades;$(AssemblySearchPaths)</AssemblySearchPaths>
+  </PropertyGroup>
+</Project>
+