rack 1.4.0 → 1.4.5

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 (88) hide show
  1. data/COPYING +1 -1
  2. data/KNOWN-ISSUES +9 -0
  3. data/README.rdoc +118 -4
  4. data/Rakefile +18 -11
  5. data/SPEC +3 -1
  6. data/contrib/rack.png +0 -0
  7. data/contrib/rack.svg +150 -0
  8. data/contrib/rdoc.css +412 -0
  9. data/lib/rack/auth/abstract/request.rb +5 -1
  10. data/lib/rack/auth/basic.rb +1 -1
  11. data/lib/rack/auth/digest/nonce.rb +1 -1
  12. data/lib/rack/backports/uri/common_18.rb +14 -28
  13. data/lib/rack/backports/uri/common_192.rb +14 -17
  14. data/lib/rack/backports/uri/common_193.rb +29 -0
  15. data/lib/rack/body_proxy.rb +15 -2
  16. data/lib/rack/builder.rb +1 -1
  17. data/lib/rack/cascade.rb +12 -1
  18. data/lib/rack/commonlogger.rb +18 -5
  19. data/lib/rack/deflater.rb +5 -1
  20. data/lib/rack/directory.rb +1 -1
  21. data/lib/rack/etag.rb +6 -3
  22. data/lib/rack/file.rb +20 -16
  23. data/lib/rack/head.rb +1 -0
  24. data/lib/rack/lint.rb +3 -1
  25. data/lib/rack/lock.rb +3 -4
  26. data/lib/rack/mime.rb +1 -1
  27. data/lib/rack/mock.rb +3 -2
  28. data/lib/rack/multipart/parser.rb +22 -20
  29. data/lib/rack/multipart.rb +2 -2
  30. data/lib/rack/reloader.rb +1 -1
  31. data/lib/rack/request.rb +4 -6
  32. data/lib/rack/response.rb +19 -17
  33. data/lib/rack/server.rb +28 -2
  34. data/lib/rack/session/abstract/id.rb +8 -3
  35. data/lib/rack/session/cookie.rb +20 -7
  36. data/lib/rack/showstatus.rb +2 -2
  37. data/lib/rack/static.rb +91 -9
  38. data/lib/rack/utils.rb +74 -36
  39. data/lib/rack.rb +13 -1
  40. data/rack.gemspec +3 -3
  41. data/test/builder/line.ru +1 -0
  42. data/test/cgi/assets/folder/test.js +1 -0
  43. data/test/cgi/assets/fonts/font.eot +1 -0
  44. data/test/cgi/assets/images/image.png +1 -0
  45. data/test/cgi/assets/index.html +1 -0
  46. data/test/cgi/assets/javascripts/app.js +1 -0
  47. data/test/cgi/assets/stylesheets/app.css +1 -0
  48. data/test/multipart/filename_with_unescaped_percentages +6 -0
  49. data/test/multipart/filename_with_unescaped_percentages2 +6 -0
  50. data/test/multipart/filename_with_unescaped_percentages3 +6 -0
  51. data/test/spec_auth.rb +57 -0
  52. data/test/spec_auth_basic.rb +8 -0
  53. data/test/spec_auth_digest.rb +14 -0
  54. data/test/spec_body_proxy.rb +21 -0
  55. data/test/spec_builder.rb +7 -1
  56. data/test/spec_cascade.rb +14 -3
  57. data/test/spec_chunked.rb +6 -6
  58. data/test/spec_config.rb +0 -1
  59. data/test/spec_content_length.rb +26 -13
  60. data/test/spec_content_type.rb +15 -5
  61. data/test/spec_deflater.rb +35 -17
  62. data/test/spec_directory.rb +20 -1
  63. data/test/spec_etag.rb +29 -13
  64. data/test/spec_file.rb +58 -30
  65. data/test/spec_head.rb +25 -7
  66. data/test/spec_lobster.rb +20 -5
  67. data/test/spec_lock.rb +46 -21
  68. data/test/spec_logger.rb +2 -7
  69. data/test/spec_methodoverride.rb +21 -22
  70. data/test/spec_mock.rb +12 -7
  71. data/test/spec_multipart.rb +129 -2
  72. data/test/spec_nulllogger.rb +13 -2
  73. data/test/spec_recursive.rb +12 -9
  74. data/test/spec_request.rb +15 -2
  75. data/test/spec_response.rb +41 -3
  76. data/test/spec_runtime.rb +15 -5
  77. data/test/spec_sendfile.rb +13 -9
  78. data/test/spec_server.rb +47 -0
  79. data/test/spec_session_cookie.rb +93 -3
  80. data/test/spec_session_memcache.rb +10 -8
  81. data/test/spec_session_pool.rb +13 -10
  82. data/test/spec_showexceptions.rb +9 -4
  83. data/test/spec_showstatus.rb +10 -5
  84. data/test/spec_static.rb +89 -8
  85. data/test/spec_urlmap.rb +10 -10
  86. data/test/spec_utils.rb +34 -7
  87. data/test/static/another/index.html +1 -0
  88. metadata +26 -8
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007, 2008, 2009, 2010 Christian Neukirchen <purl.org/net/chneukirchen>
1
+ Copyright (c) 2007, 2008, 2009, 2010, 2011, 2012 Christian Neukirchen <purl.org/net/chneukirchen>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to
data/KNOWN-ISSUES CHANGED
@@ -1,3 +1,12 @@
1
+ = Known issues with Rack and ECMA-262
2
+
3
+ * Many users expect the escape() function defined in ECMA-262 to be compatible
4
+ with URI. Confusion is especially strong because the documentation for the
5
+ escape function includes a reference to the URI specifications. ECMA-262
6
+ escape is not however a URI escape function, it is a javascript escape
7
+ function, and is not fully compatible. Most notably, for characters outside of
8
+ the BMP. Users should use the more correct encodeURI functions.
9
+
1
10
  = Known issues with Rack and Web servers
2
11
 
3
12
  * Lighttpd sets wrong SCRIPT_NAME and PATH_INFO if you mount your
data/README.rdoc CHANGED
@@ -1,4 +1,4 @@
1
- = Rack, a modular Ruby webserver interface
1
+ = Rack, a modular Ruby webserver interface {<img src="https://secure.travis-ci.org/rack/rack.png" alt="Build Status" />}[http://travis-ci.org/rack/rack] {<img src="https://gemnasium.com/rack/rack.png" alt="Dependency Status" />}[https://gemnasium.com/rack/rack]
2
2
 
3
3
  Rack provides a minimal, modular and adaptable interface for developing
4
4
  web applications in Ruby. By wrapping HTTP requests and responses in
@@ -27,8 +27,11 @@ These web servers include Rack handlers in their distributions:
27
27
  * Fuzed
28
28
  * Glassfish v3
29
29
  * Phusion Passenger (which is mod_rack for Apache and for nginx)
30
+ * Puma
30
31
  * Rainbows!
31
32
  * Unicorn
33
+ * unixrack
34
+ * uWSGI
32
35
  * Zbatery
33
36
 
34
37
  Any valid Rack app will run the same on all these handlers, without
@@ -132,7 +135,11 @@ at my site:
132
135
 
133
136
  Testing Rack requires the bacon testing framework:
134
137
 
135
- gem install bacon
138
+ bundle install --without extra # to be able to run the fast tests
139
+
140
+ Or:
141
+
142
+ bundle install # this assumes that you have installed native extensions!
136
143
 
137
144
  There are two rake-based test tasks:
138
145
 
@@ -355,7 +362,7 @@ run on port 11211) and memcache-client installed.
355
362
  * July 16, 2011: Sixteenth public release 1.3.2
356
363
  * Fix for Rails and rack-test, Rack::Utils#escape calls to_s
357
364
 
358
- * Not Yet Released: Seventeenth public release 1.3.3
365
+ * September 16, 2011: Seventeenth public release 1.3.3
359
366
  * Fix bug with broken query parameters in Rack::ShowExceptions
360
367
  * Rack::Request#cookies no longer swallows exceptions on broken input
361
368
  * Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine
@@ -373,6 +380,10 @@ run on port 11211) and memcache-client installed.
373
380
  * October 17, 2011: Twentieth public release 1.3.5
374
381
  * Fix annoying warnings caused by the backport in 1.3.4
375
382
 
383
+ * December 28th, 2011: Twenty first public release: 1.1.3.
384
+ * Security fix. http://www.ocert.org/advisories/ocert-2011-003.html
385
+ Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1
386
+
376
387
  * December 28th, 2011: Twenty fourth public release 1.4.0
377
388
  * Ruby 1.8.6 support has officially been dropped. Not all tests pass.
378
389
  * Raise sane error messages for broken config.ru
@@ -392,11 +403,114 @@ run on port 11211) and memcache-client installed.
392
403
  * Support added for HTTP_X_FORWARDED_SCHEME
393
404
  * Numerous bug fixes, including many fixes for new and alternate rubies
394
405
 
406
+ * January 22nd, 2012: Twenty fifth public release 1.4.1
407
+ * Alter the keyspace limit calculations to reduce issues with nested params
408
+ * Add a workaround for multipart parsing where files contain unescaped "%"
409
+ * Added Rack::Response::Helpers#method_not_allowed? (code 405)
410
+ * Rack::File now returns 404 for illegal directory traversals
411
+ * Rack::File now returns 405 for illegal methods (non HEAD/GET)
412
+ * Rack::Cascade now catches 405 by default, as well as 404
413
+ * Cookies missing '--' no longer cause an exception to be raised
414
+ * Various style changes and documentation spelling errors
415
+ * Rack::BodyProxy always ensures to execute its block
416
+ * Additional test coverage around cookies and secrets
417
+ * Rack::Session::Cookie can now be supplied either secret or old_secret
418
+ * Tests are no longer dependent on set order
419
+ * Rack::Static no longer defaults to serving index files
420
+ * Rack.release was fixed
421
+
422
+ * January 6th, 2013: Twenty sixth public release 1.1.4
423
+ * Add warnings when users do not provide a session secret
424
+
425
+ * January 6th, 2013: Twenty seventh public release 1.2.6
426
+ * Add warnings when users do not provide a session secret
427
+ * Fix parsing performance for unquoted filenames
428
+
429
+ * January 6th, 2013: Twenty eighth public release 1.3.7
430
+ * Add warnings when users do not provide a session secret
431
+ * Fix parsing performance for unquoted filenames
432
+ * Updated URI backports
433
+ * Fix URI backport version matching, and silence constant warnings
434
+ * Correct parameter parsing with empty values
435
+ * Correct rackup '-I' flag, to allow multiple uses
436
+ * Correct rackup pidfile handling
437
+ * Report rackup line numbers correctly
438
+ * Fix request loops caused by non-stale nonces with time limits
439
+ * Fix reloader on Windows
440
+ * Prevent infinite recursions from Response#to_ary
441
+ * Various middleware better conforms to the body close specification
442
+ * Updated language for the body close specification
443
+ * Additional notes regarding ECMA escape compatibility issues
444
+ * Fix the parsing of multiple ranges in range headers
445
+
446
+ * January 6th, 2013: Twenty ninth public release 1.4.2
447
+ * Add warnings when users do not provide a session secret
448
+ * Fix parsing performance for unquoted filenames
449
+ * Updated URI backports
450
+ * Fix URI backport version matching, and silence constant warnings
451
+ * Correct parameter parsing with empty values
452
+ * Correct rackup '-I' flag, to allow multiple uses
453
+ * Correct rackup pidfile handling
454
+ * Report rackup line numbers correctly
455
+ * Fix request loops caused by non-stale nonces with time limits
456
+ * Fix reloader on Windows
457
+ * Prevent infinite recursions from Response#to_ary
458
+ * Various middleware better conforms to the body close specification
459
+ * Updated language for the body close specification
460
+ * Additional notes regarding ECMA escape compatibility issues
461
+ * Fix the parsing of multiple ranges in range headers
462
+ * Prevent errors from empty parameter keys
463
+ * Added PATCH verb to Rack::Request
464
+ * Various documentation updates
465
+ * Fix session merge semantics (fixes rack-test)
466
+ * Rack::Static :index can now handle multiple directories
467
+ * All tests now utilize Rack::Lint (special thanks to Lars Gierth)
468
+ * Rack::File cache_control parameter is now deprecated, and removed by 1.5
469
+ * Correct Rack::Directory script name escaping
470
+ * Rack::Static supports header rules for sophisticated configurations
471
+ * Multipart parsing now works without a Content-Length header
472
+ * New logos courtesy of Zachary Scott!
473
+ * Rack::BodyProxy now explicitly defines #each, useful for C extensions
474
+ * Cookies that are not URI escaped no longer cause exceptions
475
+
476
+ * January 7th, 2013: Thirtieth public release 1.3.8
477
+ * Security: Prevent unbounded reads in large multipart boundaries
478
+
479
+ * January 7th, 2013: Thirty first public release 1.4.3
480
+ * Security: Prevent unbounded reads in large multipart boundaries
481
+
482
+ * January 13th, 2013: Thirty second public release 1.4.4, 1.3.9, 1.2.7, 1.1.5
483
+ * [SEC] Rack::Auth::AbstractRequest no longer symbolizes arbitrary strings
484
+ * Fixed erroneous test case in the 1.3.x series
485
+
486
+ * February 7th, Thirty fifth public release 1.1.6, 1.2.8, 1.3.10
487
+ * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
488
+
489
+ * February 7th, Thirty fifth public release 1.4.5
490
+ * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
491
+ * Fix CVE-2013-0262, symlink path traversal in Rack::File
492
+
493
+ * February 7th, Thirty fifth public release 1.5.2
494
+ * Fix CVE-2013-0263, timing attack against Rack::Session::Cookie
495
+ * Fix CVE-2013-0262, symlink path traversal in Rack::File
496
+ * Add various methods to Session for enhanced Rails compatibility
497
+ * Request#trusted_proxy? now only matches whole stirngs
498
+ * Add JSON cookie coder, to be default in Rack 1.6+ due to security concerns
499
+ * URLMap host matching in environments that don't set the Host header fixed
500
+ * Fix a race condition that could result in overwritten pidfiles
501
+ * Various documentation additions
502
+
395
503
  == Contact
396
504
 
397
505
  Please post bugs, suggestions and patches to
398
506
  the bug tracker at <http://github.com/rack/rack/issues>.
399
507
 
508
+ Please post security related bugs and suggestions to the core team at
509
+ <https://groups.google.com/group/rack-core> or rack-core@googlegroups.com. Due
510
+ to wide usage of the library, it is strongly preferred that we manage timing in
511
+ order to provide viable patches at the time of disclosure. Your assistance in
512
+ this matter is greatly appreciated.
513
+
400
514
  Mailing list archives are available at
401
515
  <http://groups.google.com/group/rack-devel>.
402
516
 
@@ -472,7 +586,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
472
586
 
473
587
  == Links
474
588
 
475
- Rack:: <http://rack.rubyforge.org/>
589
+ Rack:: <http://rack.github.com/>
476
590
  Official Rack repositories:: <http://github.com/rack>
477
591
  Rack Bug Tracking:: <http://github.com/rack/rack/issues>
478
592
  rack-devel mailing list:: <http://groups.google.com/group/rack-devel>
data/Rakefile CHANGED
@@ -11,12 +11,12 @@ task :deps do
11
11
  reqs = dep.requirements_list
12
12
  reqs = (["-v"] * reqs.size).zip(reqs).flatten
13
13
  # Use system over sh, because we want to ignore errors!
14
- system "gem", "install", '--conservative', dep.name, *reqs
14
+ system Gem.ruby, "-S", "gem", "install", '--conservative', dep.name, *reqs
15
15
  end
16
16
  end
17
17
 
18
18
  desc "Make an archive as .tar.gz"
19
- task :dist => [:chmod, :changelog, :rdoc, "SPEC"] do
19
+ task :dist => %w[chmod ChangeLog SPEC rdoc] do
20
20
  sh "git archive --format=tar --prefix=#{release}/ HEAD^{tree} >#{release}.tar"
21
21
  sh "pax -waf #{release}.tar -s ':^:#{release}/:' SPEC ChangeLog doc rack.gemspec"
22
22
  sh "gzip -f -9 #{release}.tar"
@@ -31,7 +31,7 @@ task :officialrelease do
31
31
  sh "mv stage/#{release}.tar.gz stage/#{release}.gem ."
32
32
  end
33
33
 
34
- task :officialrelease_really => ["SPEC", :dist, :gem] do
34
+ task :officialrelease_really => %w[SPEC dist gem] do
35
35
  sh "sha1sum #{release}.tar.gz #{release}.gem"
36
36
  end
37
37
 
@@ -46,7 +46,10 @@ task :chmod do
46
46
  end
47
47
 
48
48
  desc "Generate a ChangeLog"
49
- task :changelog do
49
+ task :changelog => %w[ChangeLog]
50
+
51
+ file '.git/index'
52
+ file "ChangeLog" => '.git/index' do
50
53
  File.open("ChangeLog", "w") { |out|
51
54
  `git log -z`.split("\0").map { |chunk|
52
55
  author = chunk[/Author: (.*)/, 1].strip
@@ -63,7 +66,6 @@ task :changelog do
63
66
  }
64
67
  end
65
68
 
66
-
67
69
  file 'lib/rack/lint.rb'
68
70
  desc "Generate Rack Specification"
69
71
  file "SPEC" => 'lib/rack/lint.rb' do
@@ -99,17 +101,22 @@ task :gem => ["SPEC"] do
99
101
  sh "gem build rack.gemspec"
100
102
  end
101
103
 
104
+ task :doc => :rdoc
102
105
  desc "Generate RDoc documentation"
103
- task :rdoc => ["SPEC"] do
106
+ task :rdoc => %w[ChangeLog SPEC] do
104
107
  sh(*%w{rdoc --line-numbers --main README.rdoc
105
108
  --title 'Rack\ Documentation' --charset utf-8 -U -o doc} +
106
- %w{README.rdoc KNOWN-ISSUES SPEC} +
107
- Dir["lib/**/*.rb"])
109
+ %w{README.rdoc KNOWN-ISSUES SPEC ChangeLog} +
110
+ `git ls-files lib/\*\*/\*.rb`.strip.split)
111
+ cp "contrib/rdoc.css", "doc/rdoc.css"
112
+ end
113
+
114
+ task :pushdoc => %w[rdoc] do
115
+ sh "rsync -avz doc/ rack.rubyforge.org:/var/www/gforge-projects/rack/doc/"
108
116
  end
109
117
 
110
- task :pushsite => [:rdoc] do
118
+ task :pushsite => %w[pushdoc] do
111
119
  sh "cd site && git gc"
112
- sh "rsync -avz doc/ chneukirchen@rack.rubyforge.org:/var/www/gforge-projects/rack/doc/"
113
- sh "rsync -avz site/ chneukirchen@rack.rubyforge.org:/var/www/gforge-projects/rack/"
120
+ sh "rsync -avz site/ rack.rubyforge.org:/var/www/gforge-projects/rack/"
114
121
  sh "cd site && git push"
115
122
  end
data/SPEC CHANGED
@@ -156,7 +156,9 @@ The Body must respond to +each+
156
156
  and must only yield String values.
157
157
  The Body itself should not be an instance of String, as this will
158
158
  break in Ruby 1.9.
159
- If the Body responds to +close+, it will be called after iteration.
159
+ If the Body responds to +close+, it will be called after iteration. If
160
+ the body is replaced by a middleware after action, the original body
161
+ must be closed first, if it repsonds to close.
160
162
  If the Body responds to +to_path+, it must return a String
161
163
  identifying the location of a file whose contents are identical
162
164
  to that produced by calling +each+; this may be used by the
data/contrib/rack.png ADDED
Binary file
data/contrib/rack.svg ADDED
@@ -0,0 +1,150 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
6
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
7
+ xmlns:cc="http://creativecommons.org/ns#"
8
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
9
+ xmlns:svg="http://www.w3.org/2000/svg"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
13
+ width="744.09448819"
14
+ height="1052.3622047"
15
+ id="svg2"
16
+ version="1.1"
17
+ inkscape:version="0.48.3.1 r9886"
18
+ sodipodi:docname="rack.svg">
19
+ <defs
20
+ id="defs4">
21
+ <linearGradient
22
+ id="linearGradient3837"
23
+ osb:paint="solid">
24
+ <stop
25
+ style="stop-color:#000000;stop-opacity:1;"
26
+ offset="0"
27
+ id="stop3839" />
28
+ </linearGradient>
29
+ </defs>
30
+ <sodipodi:namedview
31
+ id="base"
32
+ pagecolor="#ffffff"
33
+ bordercolor="#666666"
34
+ borderopacity="1.0"
35
+ inkscape:pageopacity="0.0"
36
+ inkscape:pageshadow="2"
37
+ inkscape:zoom="0.98994949"
38
+ inkscape:cx="230.49849"
39
+ inkscape:cy="656.46253"
40
+ inkscape:document-units="px"
41
+ inkscape:current-layer="layer1"
42
+ showgrid="false"
43
+ showguides="false"
44
+ inkscape:guide-bbox="true"
45
+ inkscape:window-width="1920"
46
+ inkscape:window-height="1056"
47
+ inkscape:window-x="1920"
48
+ inkscape:window-y="24"
49
+ inkscape:window-maximized="1">
50
+ <sodipodi:guide
51
+ orientation="1,0"
52
+ position="645.99255,757.10933"
53
+ id="guide2995" />
54
+ <sodipodi:guide
55
+ orientation="1,0"
56
+ position="488.40876,686.90373"
57
+ id="guide2997" />
58
+ <sodipodi:guide
59
+ orientation="1,0"
60
+ position="176.7767,748.52304"
61
+ id="guide2999" />
62
+ <sodipodi:guide
63
+ orientation="1,0"
64
+ position="355.71429,782.85714"
65
+ id="guide3005" />
66
+ <sodipodi:guide
67
+ orientation="0,1"
68
+ position="527.14286,642.85714"
69
+ id="guide3007" />
70
+ <sodipodi:guide
71
+ orientation="0,1"
72
+ position="431.42857,507.85714"
73
+ id="guide3009" />
74
+ <sodipodi:guide
75
+ orientation="0,1"
76
+ position="488.40876,783.57143"
77
+ id="guide3011" />
78
+ <sodipodi:guide
79
+ orientation="0,1"
80
+ position="505,372.85714"
81
+ id="guide3013" />
82
+ </sodipodi:namedview>
83
+ <metadata
84
+ id="metadata7">
85
+ <rdf:RDF>
86
+ <cc:Work
87
+ rdf:about="">
88
+ <dc:format>image/svg+xml</dc:format>
89
+ <dc:type
90
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
91
+ <dc:title></dc:title>
92
+ </cc:Work>
93
+ </rdf:RDF>
94
+ </metadata>
95
+ <g
96
+ inkscape:label="Layer 1"
97
+ inkscape:groupmode="layer"
98
+ id="layer1">
99
+ <path
100
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
101
+ d="m 176.28125,201.03125 0,0.625 0,395.125 0,0.375 0.34375,0.0937 312.34375,91.6875 0.625,0.1875 0,-0.65625 0.125,-419.09375 0,-0.40625 -0.40625,-0.0937 -312.4375,-67.71875 -0.59375,-0.125 z m 1,1.21875 311.4375,67.5 -0.125,418.0625 -311.3125,-91.375 0,-394.1875 z"
102
+ id="path2985"
103
+ inkscape:connector-curvature="0" />
104
+ <path
105
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
106
+ d="m 647.21875,206.59375 -0.6875,0.28125 -157.59375,62.21875 -0.3125,0.125 0,0.34375 0.1875,419.125 0,0.75 0.6875,-0.28125 156.0625,-63.1875 0.3125,-0.125 0,-0.34375 1.34375,-418.15625 0,-0.75 z m -1,1.4375 -1.34375,417.125 -155.0625,62.78125 -0.1875,-418.03125 156.59375,-61.875 z"
107
+ id="path2993"
108
+ inkscape:connector-curvature="0" />
109
+ <path
110
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
111
+ d="m 355.6875,137.40625 -0.15625,0.0625 L 176.96875,201.0625 177.3125,202 355.75,138.4375 646.78125,207.53125 647,206.5625 l -291.15625,-69.125 -0.15625,-0.0312 z"
112
+ id="path3003"
113
+ inkscape:connector-curvature="0" />
114
+ <path
115
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
116
+ d="m 355.71875,277.53125 -0.125,0.0312 -178.9375,47.96875 -1.8125,0.46875 1.8125,0.5 311.625,83.5 0.15625,0.0312 0.125,-0.0625 157.59375,-53.65625 1.5625,-0.53125 -1.59375,-0.4375 -290.28125,-77.78125 -0.125,-0.0312 z m 0,1.03125 L 644.3125,355.90625 488.375,409 178.71875,326 l 177,-47.4375 z"
117
+ id="path3015"
118
+ inkscape:connector-curvature="0" />
119
+ <path
120
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
121
+ d="m 355.21875,240.9375 0,37.125 1,0 0,-37.125 -1,0 z"
122
+ id="path3017"
123
+ inkscape:connector-curvature="0" />
124
+ <path
125
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
126
+ d="m 176.28125,202.65625 0,393.28125 1,0 0,-393.28125 -1,0 z"
127
+ id="path3019"
128
+ inkscape:connector-curvature="0" />
129
+ <path
130
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
131
+ d="m 355.71875,409 -0.125,0.0312 L 177,455.8125 l -1.78125,0.46875 1.78125,0.5 L 488.28125,545 l 0.15625,0.0312 0.125,-0.0625 156.71875,-56.25 1.46875,-0.53125 -1.53125,-0.40625 -289.375,-78.75 -0.125,-0.0312 z m 0,1.03125 287.6875,78.28125 L 488.375,544 179.03125,456.3125 355.71875,410.03125 z"
132
+ id="path3021"
133
+ inkscape:connector-curvature="0" />
134
+ <path
135
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
136
+ d="m 355.71875,544 -0.15625,0.0312 -178.5625,52.3125 0.28125,0.96875 178.4375,-52.28125 289.59375,80.25 0.28125,-0.96875 -289.75,-80.28125 -0.125,-0.0312 z"
137
+ id="path3023"
138
+ inkscape:connector-curvature="0" />
139
+ <path
140
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
141
+ d="m 355.21875,374.34375 0,35.15625 1,0 0,-35.15625 -1,0 z"
142
+ id="path3025"
143
+ inkscape:connector-curvature="0" />
144
+ <path
145
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;stroke-opacity:1;stroke-miterlimit:30;stroke-dasharray:none;stroke-linecap:round;stroke-linejoin:round"
146
+ d="m 355.1875,507.03125 0,37.4375 1.03125,0 0,-37.4375 -1.03125,0 z"
147
+ id="path3027"
148
+ inkscape:connector-curvature="0" />
149
+ </g>
150
+ </svg>