ruber 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
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>