ruber 0.0.9 → 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. data/CHANGES +42 -1
  2. data/lib/ruber/application/application.rb +25 -5
  3. data/lib/ruber/application/plugin.yaml +2 -10
  4. data/lib/ruber/component_manager.rb +2 -2
  5. data/lib/ruber/document_project.rb +5 -3
  6. data/lib/ruber/editor/document.rb +5 -4
  7. data/lib/ruber/editor/ktexteditor_wrapper.rb +1 -1
  8. data/lib/ruber/exception_widgets.rb +1 -1
  9. data/lib/ruber/main_window/main_window.rb +4 -3
  10. data/lib/ruber/main_window/main_window_actions.rb +2 -2
  11. data/lib/ruber/main_window/main_window_internal.rb +1 -1
  12. data/lib/ruber/output_widget.rb +17 -5
  13. data/lib/ruber/project.rb +34 -3
  14. data/lib/ruber/project_dir_scanner.rb +171 -0
  15. data/lib/ruber/settings_container.rb +7 -7
  16. data/lib/ruber/settings_dialog.rb +24 -24
  17. data/lib/ruber/version.rb +1 -1
  18. data/lib/ruber/world/environment.rb +1 -0
  19. data/lib/ruber/world/plugin.yaml +7 -2
  20. data/lib/ruber/{application → world}/project_files_widget.rb +0 -0
  21. data/lib/ruber/{application → world}/ui/project_files_rule_chooser_widget.rb +2 -2
  22. data/lib/ruber/{application → world}/ui/project_files_rule_chooser_widget.ui +0 -0
  23. data/lib/ruber/{application → world}/ui/project_files_widget.rb +2 -2
  24. data/lib/ruber/{application → world}/ui/project_files_widget.ui +0 -0
  25. data/plugins/auto_end/auto_end.rb +21 -18
  26. data/plugins/autosave/autosave.rb +1 -1
  27. data/plugins/find_in_files/find_in_files.rb +1 -1
  28. data/plugins/irb/irb.png +0 -0
  29. data/plugins/irb/irb.rb +142 -0
  30. data/plugins/irb/irb.svg +240 -0
  31. data/plugins/irb/irb_controller.rb +541 -0
  32. data/plugins/irb/irbrc.rb +21 -0
  33. data/plugins/irb/plugin.yaml +19 -0
  34. data/plugins/irb/ui/irb_config_widget.rb +151 -0
  35. data/plugins/irb/ui/irb_config_widget.ui +123 -0
  36. data/plugins/irb/ui/irb_tool_widget.rb +97 -0
  37. data/plugins/irb/ui/irb_tool_widget.ui +86 -0
  38. data/plugins/project_browser/project_browser.rb +1 -1
  39. data/plugins/rspec/plugin.yaml +6 -3
  40. data/plugins/rspec/rspec.rb +172 -473
  41. data/plugins/rspec/tool_widget.rb +462 -0
  42. data/plugins/rspec/ui/rspec_project_widget.rb +58 -38
  43. data/plugins/rspec/ui/rspec_project_widget.ui +68 -64
  44. data/plugins/ruberri/class_formatter.rb +126 -0
  45. data/plugins/ruberri/method_formatter.rb +90 -0
  46. data/plugins/ruberri/plugin.yaml +13 -0
  47. data/plugins/ruberri/ruberri.rb +226 -0
  48. data/plugins/ruberri/search.rb +111 -0
  49. data/plugins/ruberri/ui/tool_widget.rb +73 -0
  50. data/plugins/ruberri/ui/tool_widget.ui +49 -0
  51. data/plugins/ruby_runner/ruby_runner.rb +2 -2
  52. data/plugins/ruby_syntax_checker/plugin.yaml +11 -0
  53. data/plugins/ruby_syntax_checker/ruby_syntax_checker.rb +147 -0
  54. data/plugins/syntax_checker/plugin.yaml +10 -6
  55. data/plugins/syntax_checker/syntax_checker.rb +216 -520
  56. data/plugins/syntax_checker/ui/config_widget.rb +61 -0
  57. data/plugins/syntax_checker/ui/config_widget.ui +44 -0
  58. data/plugins/yaml_syntax_checker/plugin.yaml +11 -0
  59. data/plugins/yaml_syntax_checker/yaml_syntax_checker.rb +62 -0
  60. data/ruber.desktop +0 -0
  61. data/spec/auto_end_spec.rb +224 -186
  62. data/spec/document_project_spec.rb +9 -1
  63. data/spec/document_spec.rb +9 -0
  64. data/spec/environment_spec.rb +12 -0
  65. data/spec/output_widget_spec.rb +69 -2
  66. data/spec/project_dir_scanner_spec.rb +195 -0
  67. data/spec/project_spec.rb +43 -73
  68. data/spec/ruby_syntax_checker_spec.rb +361 -0
  69. data/spec/syntax_checker_spec.rb +1132 -0
  70. data/spec/yaml_syntax_checker_spec.rb +130 -0
  71. metadata +232 -225
  72. data/lib/ruber/application/project_files_list.rb +0 -320
  73. data/spec/project_files_list_spec.rb +0 -411
@@ -367,15 +367,15 @@ This method resets the dialog.
367
367
  @param [Object] w the object describing the widget. It must have the methods documented
368
368
  below
369
369
  @option w [String] caption the name of the page the widget should be put into. If
370
- the page doesn't exist in the dialog, it will be added. Otherwise, the widget will
371
- be added to the one already existing in the page
370
+ the page doesn't exist in the dialog, it will be added. Otherwise, the widget will
371
+ be added to the one already existing in the page
372
372
  @option w [Class] class_obj (nil) the class of the widget to create. The class's
373
- @initialize@ method must take no parameters. Either this method or the @code@
374
- method must not be *nil*
373
+ @initialize@ method must take no parameters. Either this method or the @code@
374
+ method must not be *nil*
375
375
  @option w [String] code (nil) a piece of ruby code which, when executed in the
376
- @TOPLEVEL_BINDING@, will return the widget to add to the dialog. Either this
377
- method or the @class_obje@ method must not be *nil*. If both are not *nil*, this
378
- method will have the precedence
376
+ @TOPLEVEL_BINDING@, will return the widget to add to the dialog. Either this
377
+ method or the @class_obje@ method must not be *nil*. If both are not *nil*, this
378
+ method will have the precedence
379
379
  @option w [String] pixmap ('') the path of the pixmap to associate to the page
380
380
  @return [nil]
381
381
  @see SettingsDialog#initialize
@@ -51,34 +51,34 @@ that each option corresponds to a single widget, you can't use it. So, you defin
51
51
  a <tt>read_settings</tt>, a <tt>store_settings</tt> and a <tt>read_default_settings</tt>
52
52
  method in your widget class like this:
53
53
 
54
- class MyWidget < Qt::Widget
54
+ bc.. class MyWidget < Qt::Widget
55
55
 
56
- def initialize parent = nil
57
- super
58
- @default_dir_widget = KDE::LineEdit.new self
59
- @default_file_widget = KDE::LineEdit.new self
60
- end
61
-
62
- def read_settings
63
- path = @settings_dialog.settings_container[:general, :default_path]
64
- @default_dir_widget.text = File.dirname(path)
65
- @default_file_widget.text = File.basename(path)
66
- end
67
-
68
- def store_settings
69
- path = File.join @default_dir_widget.text, @default_file_widget.text
70
- @settings_dialog.settings_container[:general, :default_path] = path
71
- end
72
-
73
- def read_default_settings
74
- path = @settings_dialog.settings_container.default(:general, :default_path)
75
- @default_dir_widget.text = File.dirname(path)
76
- @default_file_widget.text = File.basename(path)
77
- end
56
+ def initialize parent = nil
57
+ super
58
+ @default_dir_widget = KDE::LineEdit.new self
59
+ @default_file_widget = KDE::LineEdit.new self
60
+ end
78
61
 
62
+ def read_settings
63
+ path = @settings_dialog.settings_container[:general, :default_path]
64
+ @default_dir_widget.text = File.dirname(path)
65
+ @default_file_widget.text = File.basename(path)
66
+ end
67
+
68
+ def store_settings
69
+ path = File.join @default_dir_widget.text, @default_file_widget.text
70
+ @settings_dialog.settings_container[:general, :default_path] = path
71
+ end
72
+
73
+ def read_default_settings
74
+ path = @settings_dialog.settings_container.default(:general, :default_path)
75
+ @default_dir_widget.text = File.dirname(path)
76
+ @default_file_widget.text = File.basename(path)
79
77
  end
80
78
 
81
- Note that the <tt>@settings_dialog</tt> instance variable has been automatically
79
+ end
80
+
81
+ p. Note that the <tt>@settings_dialog</tt> instance variable has been automatically
82
82
  created by the dialog when the widget has been created and contains a reference
83
83
  to the dialog itself.
84
84
 
@@ -1,5 +1,5 @@
1
1
  module Ruber
2
2
 
3
- VERSION = '0.0.9'
3
+ VERSION = '0.0.10'
4
4
 
5
5
  end
@@ -110,6 +110,7 @@ The default hints used by methods like {#editor_for} and {#editor_for!}
110
110
  super parent
111
111
  @project = prj
112
112
  @tab_widget = KDE::TabWidget.new{self.document_mode = true}
113
+ @tab_widget.tabs_closable = true if Ruber[:config][:workspace, :close_buttons]
113
114
  connect @tab_widget, SIGNAL('currentChanged(int)'), self, SLOT('current_tab_changed(int)')
114
115
  connect @tab_widget, SIGNAL('tabCloseRequested(int)'), self, SLOT('close_tab(int)')
115
116
  @views = ViewList.new
@@ -1,6 +1,6 @@
1
1
  name: world
2
2
  description: Container for all the environments
3
- require: [world, environment]
3
+ require: [world, environment, project_files_widget]
4
4
  class: Ruber::World::World
5
5
  config_options:
6
6
  workspace:
@@ -8,4 +8,9 @@ config_options:
8
8
  config_widgets:
9
9
  - {caption: Workspace, pixmap: workspace.png, class: Ruber::World::WorkspaceSettingsWidget}
10
10
  extensions:
11
- environment: {class: Ruber::World::Environment, scope: global}
11
+ environment: {class: Ruber::World::Environment, scope: global}
12
+ project_options:
13
+ general:
14
+ project_files: {default: {:include: [], :exclude: [], :extensions: ["*.rb"]}}
15
+ project_widgets:
16
+ - {caption: Files, pixmap: configure, class: Ruber::ProjectFilesWidget}
@@ -1,8 +1,8 @@
1
1
  =begin
2
2
  ** Form generated from reading ui file 'project_files_rule_chooser_widget.ui'
3
3
  **
4
- ** Created: gio apr 21 20:42:42 2011
5
- ** by: Qt User Interface Compiler version 4.7.2
4
+ ** Created: dom lug 31 08:50:39 2011
5
+ ** by: Qt User Interface Compiler version 4.7.3
6
6
  **
7
7
  ** WARNING! All changes made in this file will be lost when recompiling ui file!
8
8
  =end
@@ -1,8 +1,8 @@
1
1
  =begin
2
2
  ** Form generated from reading ui file 'project_files_widget.ui'
3
3
  **
4
- ** Created: gio apr 21 20:42:42 2011
5
- ** by: Qt User Interface Compiler version 4.7.2
4
+ ** Created: dom lug 31 08:50:39 2011
5
+ ** by: Qt User Interface Compiler version 4.7.3
6
6
  **
7
7
  ** WARNING! All changes made in this file will be lost when recompiling ui file!
8
8
  =end
@@ -87,13 +87,7 @@ character class is used from ruby 1.9.2 onward, while @\w@ is used for previous
87
87
  versions
88
88
  =end
89
89
  IDENTIFIER_PATTERN = RUBY_VERSION >= '1.9.2' ? '\p{Word}+' : '\w+'
90
-
91
- =begin rdoc
92
- The regexp fragment which matches a multiple identifier (that is, an identifier
93
- maybe followed by several other identifiers separated by @::@)
94
- =end
95
- MULTI_ID_PATTERN = "#{IDENTIFIER_PATTERN}(?:::#{IDENTIFIER_PATTERN})*"
96
-
90
+
97
91
  =begin rdoc
98
92
  The patterns used to find out whether an @end@ keyword should be inserted after
99
93
  a line.
@@ -112,18 +106,19 @@ Each entry is itself an array with three elements:
112
106
  [/\bdo\s*$/, "\nend", [0, -1]],
113
107
  [/\bdo\s+\|/, "\nend", [0, -1]],
114
108
  [/^\s*def\s/, "\nend", [0, -1]],
115
- [/^class\s+#{IDENTIFIER_PATTERN}\s*$/, "\nend", [0, -1]],
116
- [/^class\s+#{MULTI_ID_PATTERN}\s*<{1,2}\s*#{MULTI_ID_PATTERN}\s*$/, "\nend", [0, -1]],
117
- [/^\s*module\s+#{MULTI_ID_PATTERN}\s*$/, "\nend", [0,-1]],
109
+ [/\bclass\b/, "\nend", [0, -1]],
110
+ [/\bmodule\b/, "\nend", [0, -1]],
111
+ [/^\s*case\b/, "\nend", [0, -1]],
112
+ [/=\s*case\b/, "\nend", [0, -1]],
118
113
  [/^\s*while\s/, "\nend", [0,-1]],
119
114
  [/^\s*until\s/, "\nend", [0,-1]],
120
- # [/^=begin(\s|$)/, "\n=end", [0, -1]],
115
+ [/^=begin(\s|$)/, "\n=end", [0, -1]],
121
116
  [/^\s*begin\s/, "\nend", [0, -1]],
122
117
  [/(^=\s+|.=\s*)begin\s/, "\nend", [0, -1]],
123
- [/^\s*for\s+#{IDENTIFIER_PATTERN}\s+in.+$/, "\nend", [0,-1]],
124
- [/=\s*for\s+#{IDENTIFIER_PATTERN}\s+in.+$/, "\nend", [0,-1]]
118
+ [/^\s*for\s/, "\nend", [0,-1]],
119
+ [/=\s*for\s/, "\nend", [0,-1]]
125
120
  ]
126
-
121
+
127
122
  =begin rdoc
128
123
  @param [DocumentProject] prj the project associated with the document
129
124
  =end
@@ -149,15 +144,22 @@ position (if any) is forgotten
149
144
  @param [KTextEditor::Range] the range corresponding to the inserted text
150
145
  =end
151
146
  def text_inserted range
147
+ return unless @doc.active?
152
148
  text = @doc.text range
153
149
  return unless text.end_with? "\n"
154
150
  @insertion = nil
155
151
  line = @doc.line( range.end.line - 1)
156
152
  pattern = PATTERNS.find{|pat| pat[0].match line}
157
153
  if pattern and !line.start_with? '#'
158
- indentation = line.match(/^\s*/)[0].size
159
- next_indentation = @doc.line(range.end.line + 1).match(/^\s*/)[0].size
160
- unless next_indentation > indentation
154
+ check_res = @doc.extension(:syntax_checker).check_syntax(:format => false,
155
+ :update => false)
156
+ return unless check_res
157
+ errors = check_res[:errors]
158
+ # Usually, missing end errors are the last ones to be reported
159
+ if errors && !errors.empty? && errors[-1].error_type == :missing_end
160
+ # indentation = line.match(/^\s*/)[0].size
161
+ # next_indentation = @doc.line(range.end.line + 1).match(/^\s*/)[0].size
162
+ # unless next_indentation > indentation
161
163
  @insertion = Insertion.new range.end.line, pattern[1], pattern[2]
162
164
  end
163
165
  end
@@ -245,4 +247,5 @@ is called. After the text has been inserted {#connect_slots} is called.
245
247
 
246
248
  end
247
249
 
248
- end
250
+ end
251
+
@@ -237,7 +237,7 @@ into account the enabled option and always attempt to save the documents.
237
237
  =end
238
238
  def save_project_files opts, blk
239
239
  docs = Ruber[:world].active_environment.documents.documents_with_file
240
- prj_files = Ruber[:world].active_project.project_files.abs
240
+ prj_files = Ruber[:world].active_project.project_files
241
241
  docs = docs.select{|d| prj_files.include? d.path}
242
242
  save_files docs, opts, blk
243
243
  end
@@ -280,7 +280,7 @@ the following entries:
280
280
  places = case @dlg.places
281
281
  when :custom_dir then @dlg.directory
282
282
  when :project_dir then Ruber[:world].active_project.project_directory
283
- when :project_files then Ruber[:world].active_project.project_files.abs.to_a
283
+ when :project_files then Ruber[:world].active_project.project_files.to_a
284
284
  when :open_files then Ruber[:world].documents.documents_with_file.map{|d| d.path}
285
285
  end
286
286
  opts[:places] = Array(places)
Binary file
@@ -0,0 +1,142 @@
1
+ =begin
2
+ Copyright (C) 2011 by Stefano Crocco
3
+ stefano.crocco@alice.it
4
+
5
+ This program is free software; you can redistribute it andor modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the
17
+ Free Software Foundation, Inc.,
18
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ =end
20
+
21
+ require 'irb/irb_controller'
22
+ require_relative 'ui/irb_tool_widget'
23
+ require_relative 'ui/irb_config_widget'
24
+
25
+ module Ruber
26
+
27
+ module IRB
28
+
29
+ class Plugin < Ruber::Plugin
30
+
31
+ def shutdown
32
+ @widget.stop
33
+ super
34
+ end
35
+
36
+ end
37
+
38
+ class IRBWidget < Qt::Widget
39
+
40
+ PROMPTS = {
41
+ :PROMPT_I=>"%N(%m):%03n:%i> ",
42
+ :PROMPT_N=>"%N(%m):%03n:%i> ",
43
+ :PROMPT_S=>"%N(%m):%03n:%i%l ",
44
+ :PROMPT_C=>"%N(%m):%03n:%i* ",
45
+ :RETURN=>"=> "
46
+ }
47
+
48
+ def initialize parent = nil
49
+ super
50
+ @ui = Ui::ToolWidget.new
51
+ @ui.setup_ui self
52
+ @view = @ui.view
53
+ @input = @ui.input
54
+ self.focus_proxy = @input
55
+ @controller = IRBController.new Ruber[:config][:irb, :irb], [], self
56
+ @controller.connect(SIGNAL(:output_ready)){ display_output @controller.output}
57
+ @display_output = true
58
+ @controller.prompts = Ruber[:config][:irb, :prompts]
59
+ @controller.start_irb
60
+ @input.connect(SIGNAL('returnPressed(QString)')){|s| send_to_irb s}
61
+ @input.completion_mode = KDE::GlobalSettings::CompletionAuto
62
+ @controller.connect SIGNAL(:ready) do
63
+ @input.enabled = true
64
+ @input.set_focus if is_active_window
65
+ end
66
+ @ui.restart_irb.connect(SIGNAL(:clicked)){ @controller.restart_irb}
67
+ @ui.send_abort.connect(SIGNAL(:clicked)){ @controller.interrupt}
68
+ @controller.connect(SIGNAL(:interrupting_evaluation)){ @display_output = false}
69
+ @controller.connect(SIGNAL(:evaluation_interrupted)){ @display_output = true}
70
+ @cursor = @view.text_cursor
71
+ @formats = {
72
+ :input => Qt::TextCharFormat.new{|c| c.foreground = Qt::Brush.new Ruber[:config][:output_colors, :message]},
73
+ :output => Qt::TextCharFormat.new{|c| c.foreground = Qt::Brush.new Ruber[:config][:output_colors, :output]}
74
+ }
75
+ end
76
+
77
+ def stop
78
+ @controller.stop_irb
79
+ end
80
+
81
+ def load_settings
82
+ @controller.prompts = Ruber[:config][:irb, :prompts]
83
+ end
84
+ slots :load_settings
85
+
86
+ private
87
+
88
+ def display_output lines
89
+ return unless @display_output
90
+ @cursor.move_position Qt::TextCursor::End
91
+ lines.each do |l|
92
+ Ruber[:app].process_events
93
+ @cursor.char_format = @formats[l.category]
94
+ @cursor.insert_text l.full_text+"\n"
95
+ end
96
+ @cursor.move_position Qt::TextCursor::End
97
+ @view.text_cursor = @cursor
98
+ @view.ensure_cursor_visible
99
+ end
100
+
101
+ def send_to_irb line
102
+ @input.completion_object.add_item line
103
+ @input.insert_item 0, line
104
+ @input.edit_text = ''
105
+ @input.enabled = false
106
+ @controller.send_to_irb [line]
107
+ end
108
+
109
+ end
110
+
111
+ class ConfigWidget < Qt::Widget
112
+
113
+ def initialize parent = nil
114
+ super
115
+ @ui = Ui::ConfigWidget.new
116
+ @ui.setup_ui self
117
+ end
118
+
119
+ def read_settings
120
+ prompts = @settings_dialog.container[:irb, :prompts]
121
+ @ui.prompt_i.text = prompts[:PROMPT_I]
122
+ @ui.prompt_n.text = prompts[:PROMPT_N]
123
+ @ui.prompt_s.text = prompts[:PROMPT_S]
124
+ @ui.prompt_c.text = prompts[:PROMPT_C]
125
+ @ui.prompt_return.text = prompts[:RETURN]
126
+ end
127
+
128
+ def store_settings
129
+ prompts = {}
130
+ prompts[:PROMPT_I] = @ui.prompt_i.text
131
+ prompts[:PROMPT_N] = @ui.prompt_n.text
132
+ prompts[:PROMPT_S] = @ui.prompt_s.text
133
+ prompts[:PROMPT_C] = @ui.prompt_c.text
134
+ prompts[:RETURN] = @ui.prompt_return.text
135
+ @settings_dialog.container[:irb, :prompts] = prompts
136
+ end
137
+
138
+ end
139
+
140
+ end
141
+
142
+ end
@@ -0,0 +1,240 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns:svg="http://www.w3.org/2000/svg"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ xmlns:xlink="http://www.w3.org/1999/xlink"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ width="64"
14
+ height="64"
15
+ id="svg2"
16
+ version="1.1"
17
+ inkscape:version="0.48.2 r9819"
18
+ sodipodi:docname="irbsvg.svg"
19
+ inkscape:export-filename="/home/stefano/documenti/programmi/ruber/ruber/plugins/irb/irb.png"
20
+ inkscape:export-xdpi="90"
21
+ inkscape:export-ydpi="90">
22
+ <defs
23
+ id="defs4">
24
+ <linearGradient
25
+ id="linearGradient3899">
26
+ <stop
27
+ style="stop-color:#777777;stop-opacity:1;"
28
+ offset="0"
29
+ id="stop3901" />
30
+ <stop
31
+ style="stop-color:#d4d4d4;stop-opacity:1;"
32
+ offset="1"
33
+ id="stop3903" />
34
+ </linearGradient>
35
+ <linearGradient
36
+ id="linearGradient3765">
37
+ <stop
38
+ id="stop3773"
39
+ offset="0"
40
+ style="stop-color:#888888;stop-opacity:1;" />
41
+ <stop
42
+ style="stop-color:#c7c7c7;stop-opacity:0.51485151;"
43
+ offset="1"
44
+ id="stop3769" />
45
+ </linearGradient>
46
+ <linearGradient
47
+ inkscape:collect="always"
48
+ xlink:href="#linearGradient3765"
49
+ id="linearGradient3802"
50
+ gradientUnits="userSpaceOnUse"
51
+ gradientTransform="translate(-63.904188,988.26635)"
52
+ x1="-0.095808387"
53
+ y1="32.095808"
54
+ x2="8.9101797"
55
+ y2="32.095808" />
56
+ <linearGradient
57
+ inkscape:collect="always"
58
+ xlink:href="#linearGradient3765"
59
+ id="linearGradient3805"
60
+ gradientUnits="userSpaceOnUse"
61
+ gradientTransform="translate(-1052.2664,-64.095813)"
62
+ x1="-0.095808387"
63
+ y1="32.095808"
64
+ x2="8.9101797"
65
+ y2="32.095808" />
66
+ <linearGradient
67
+ inkscape:collect="always"
68
+ xlink:href="#linearGradient3765"
69
+ id="linearGradient3808"
70
+ gradientUnits="userSpaceOnUse"
71
+ gradientTransform="translate(988.45799,-64.095813)"
72
+ x1="-0.095808387"
73
+ y1="32.095808"
74
+ x2="8.9101797"
75
+ y2="32.095808" />
76
+ <linearGradient
77
+ inkscape:collect="always"
78
+ xlink:href="#linearGradient3765"
79
+ id="linearGradient3811"
80
+ gradientUnits="userSpaceOnUse"
81
+ x1="-0.095808387"
82
+ y1="32.095808"
83
+ x2="8.9101797"
84
+ y2="32.095808"
85
+ gradientTransform="translate(0.09580839,988.26635)" />
86
+ <linearGradient
87
+ inkscape:collect="always"
88
+ xlink:href="#linearGradient3765"
89
+ id="linearGradient3861"
90
+ gradientUnits="userSpaceOnUse"
91
+ gradientTransform="translate(-63.904188,988.26635)"
92
+ x1="-0.095808387"
93
+ y1="32.095808"
94
+ x2="8.9101797"
95
+ y2="32.095808" />
96
+ <linearGradient
97
+ inkscape:collect="always"
98
+ xlink:href="#linearGradient3765"
99
+ id="linearGradient3864"
100
+ gradientUnits="userSpaceOnUse"
101
+ gradientTransform="translate(-1052.2664,-64.095813)"
102
+ x1="-0.095808387"
103
+ y1="32.095808"
104
+ x2="8.9101797"
105
+ y2="32.095808" />
106
+ <linearGradient
107
+ inkscape:collect="always"
108
+ xlink:href="#linearGradient3765"
109
+ id="linearGradient3867"
110
+ gradientUnits="userSpaceOnUse"
111
+ gradientTransform="translate(988.45799,-64.095813)"
112
+ x1="-0.095808387"
113
+ y1="32.095808"
114
+ x2="8.9101797"
115
+ y2="32.095808" />
116
+ <linearGradient
117
+ inkscape:collect="always"
118
+ xlink:href="#linearGradient3765"
119
+ id="linearGradient3870"
120
+ gradientUnits="userSpaceOnUse"
121
+ gradientTransform="translate(0.09580839,988.26635)"
122
+ x1="-0.095808387"
123
+ y1="32.095808"
124
+ x2="8.9101797"
125
+ y2="32.095808" />
126
+ <linearGradient
127
+ inkscape:collect="always"
128
+ xlink:href="#linearGradient3765"
129
+ id="linearGradient3880"
130
+ gradientUnits="userSpaceOnUse"
131
+ gradientTransform="matrix(0,1,-1,0,64.095813,0.09581)"
132
+ x1="-0.095808387"
133
+ y1="32.095808"
134
+ x2="8.9101797"
135
+ y2="32.095808" />
136
+ <linearGradient
137
+ inkscape:collect="always"
138
+ xlink:href="#linearGradient3765"
139
+ id="linearGradient3883"
140
+ gradientUnits="userSpaceOnUse"
141
+ gradientTransform="translate(0.09580839,-0.09583)"
142
+ x1="-0.095808387"
143
+ y1="32.095808"
144
+ x2="8.9101797"
145
+ y2="32.095808" />
146
+ <linearGradient
147
+ inkscape:collect="always"
148
+ xlink:href="#linearGradient3765"
149
+ id="linearGradient3886"
150
+ gradientUnits="userSpaceOnUse"
151
+ gradientTransform="translate(0.09580839,-0.09583)"
152
+ x1="-0.095808387"
153
+ y1="32.095808"
154
+ x2="8.9101797"
155
+ y2="32.095808" />
156
+ </defs>
157
+ <sodipodi:namedview
158
+ id="base"
159
+ pagecolor="#ffffff"
160
+ bordercolor="#666666"
161
+ borderopacity="1.0"
162
+ inkscape:pageopacity="0.0"
163
+ inkscape:pageshadow="2"
164
+ inkscape:zoom="10.4375"
165
+ inkscape:cx="32"
166
+ inkscape:cy="32"
167
+ inkscape:document-units="px"
168
+ inkscape:current-layer="layer1"
169
+ showgrid="false"
170
+ inkscape:window-width="1440"
171
+ inkscape:window-height="847"
172
+ inkscape:window-x="-9"
173
+ inkscape:window-y="0"
174
+ inkscape:window-maximized="1" />
175
+ <metadata
176
+ id="metadata7">
177
+ <rdf:RDF>
178
+ <cc:Work
179
+ rdf:about="">
180
+ <dc:format>image/svg+xml</dc:format>
181
+ <dc:type
182
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
183
+ <dc:title></dc:title>
184
+ </cc:Work>
185
+ </rdf:RDF>
186
+ </metadata>
187
+ <g
188
+ inkscape:label="Layer 1"
189
+ inkscape:groupmode="layer"
190
+ id="layer1"
191
+ transform="translate(0,-988.36218)">
192
+ <path
193
+ style="fill:#999999;fill-opacity:1"
194
+ d="M 0 0 L 0 9 L 0 55 L 0 64 L 9 64 L 55 64 L 64 64 L 64 55 L 64 9 L 64 0 L 55 0 L 9 0 L 0 0 z M 9 9 L 55 9 L 55 55 L 9 55 L 9 9 z "
195
+ transform="translate(0,988.36218)"
196
+ id="rect2985" />
197
+ <rect
198
+ style="fill:#aa0044;fill-opacity:1"
199
+ id="rect3819"
200
+ width="51.725464"
201
+ height="51.832333"
202
+ x="6.1372685"
203
+ y="994.44604" />
204
+ <rect
205
+ style="fill:#ffffff;fill-opacity:1"
206
+ id="rect3829"
207
+ width="38.514973"
208
+ height="2.1077843"
209
+ x="9.8682632"
210
+ y="1001.2964" />
211
+ <rect
212
+ y="1033.1049"
213
+ x="9.8682632"
214
+ height="2.1077843"
215
+ width="35.065868"
216
+ id="rect3831"
217
+ style="fill:#ffffff;fill-opacity:1" />
218
+ <rect
219
+ style="fill:#ffffff;fill-opacity:1"
220
+ id="rect3833"
221
+ width="26.730541"
222
+ height="2.1077843"
223
+ x="9.8682632"
224
+ y="1024.2904" />
225
+ <rect
226
+ y="1016.7216"
227
+ x="9.8682632"
228
+ height="2.1077843"
229
+ width="42.059879"
230
+ id="rect3835"
231
+ style="fill:#ffffff;fill-opacity:1" />
232
+ <rect
233
+ style="fill:#ffffff;fill-opacity:1"
234
+ id="rect3837"
235
+ width="31.52096"
236
+ height="2.1077843"
237
+ x="9.8682632"
238
+ y="1009.2485" />
239
+ </g>
240
+ </svg>