redis-rpc 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/CHANGELOG.markdown +79 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +34 -0
- data/LICENSE +674 -0
- data/README.markdown +161 -0
- data/Rakefile +7 -0
- data/VERSION +1 -0
- data/docs/github-flavored-markdown.rb +65 -0
- data/docs/redisrpc_example.ai +1075 -1
- data/docs/redisrpc_example.png +0 -0
- data/docs/redisrpc_example.svg +329 -0
- data/examples/calc.rb +32 -0
- data/examples/client.rb +39 -0
- data/examples/server.rb +12 -0
- data/lib/redis-rpc.rb +137 -0
- data/lib/redis-rpc/version.rb +3 -0
- data/redis-rpc.gemspec +45 -0
- data/spec/calculator_spec.rb +41 -0
- data/spec/redis-test.conf +3 -0
- data/spec/spec_helper.rb +56 -0
- metadata +156 -0
Binary file
|
@@ -0,0 +1,329 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
4
|
+
<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"
|
5
|
+
width="438px" height="236.632px" viewBox="0 0 438 236.632" enable-background="new 0 0 438 236.632" xml:space="preserve">
|
6
|
+
<path fill="#CCCCCC" stroke="#000000" stroke-miterlimit="10" d="M299.5,146.566c0,6.627-5.373,12-12,12h-138
|
7
|
+
c-6.627,0-12-5.373-12-12v-111c0-6.627,5.373-12,12-12h138c6.627,0,12,5.373,12,12V146.566z"/>
|
8
|
+
<g>
|
9
|
+
<path d="M199.735,3.092c0.792-0.144,1.945-0.252,3.007-0.252c1.674,0,2.772,0.324,3.511,0.99c0.594,0.54,0.955,1.368,0.955,2.323
|
10
|
+
c0,1.584-1.008,2.647-2.269,3.079v0.054c0.918,0.324,1.477,1.188,1.765,2.449c0.396,1.692,0.684,2.863,0.937,3.331h-1.621
|
11
|
+
c-0.198-0.36-0.468-1.386-0.792-2.899c-0.36-1.674-1.026-2.305-2.449-2.359h-1.476v5.258h-1.567V3.092z M201.302,8.62h1.602
|
12
|
+
c1.675,0,2.737-0.918,2.737-2.305c0-1.566-1.135-2.251-2.791-2.251c-0.756,0-1.278,0.054-1.548,0.126V8.62z"/>
|
13
|
+
<path d="M210.32,10.997c0.036,2.143,1.386,3.025,2.989,3.025c1.134,0,1.836-0.198,2.413-0.45l0.288,1.134
|
14
|
+
c-0.558,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.286-1.783-4.286-4.412c0-2.628,1.548-4.681,4.087-4.681
|
15
|
+
c2.863,0,3.601,2.484,3.601,4.087c0,0.324-0.018,0.559-0.054,0.738H210.32z M214.965,9.862c0.018-0.99-0.414-2.557-2.196-2.557
|
16
|
+
c-1.621,0-2.305,1.458-2.431,2.557H214.965z"/>
|
17
|
+
<path d="M225.964,2.282v10.533c0,0.774,0.036,1.656,0.071,2.25h-1.404l-0.071-1.513h-0.054c-0.469,0.973-1.514,1.711-2.936,1.711
|
18
|
+
c-2.106,0-3.745-1.783-3.745-4.43c-0.018-2.898,1.801-4.663,3.907-4.663c1.351,0,2.232,0.63,2.629,1.314h0.036V2.282H225.964z
|
19
|
+
M224.397,9.898c0-0.198-0.019-0.468-0.072-0.667c-0.233-0.99-1.099-1.818-2.286-1.818c-1.639,0-2.611,1.44-2.611,3.349
|
20
|
+
c0,1.765,0.883,3.223,2.574,3.223c1.062,0,2.035-0.721,2.323-1.891c0.054-0.216,0.072-0.432,0.072-0.685V9.898z"/>
|
21
|
+
<path d="M230.372,3.903c0,0.54-0.378,0.972-1.009,0.972c-0.576,0-0.954-0.432-0.954-0.972c0-0.541,0.396-0.991,0.99-0.991
|
22
|
+
C229.976,2.912,230.372,3.344,230.372,3.903z M228.607,15.066V6.351h1.584v8.715H228.607z"/>
|
23
|
+
<path d="M232.604,13.463c0.486,0.288,1.314,0.612,2.106,0.612c1.134,0,1.675-0.558,1.675-1.296c0-0.756-0.451-1.152-1.604-1.584
|
24
|
+
c-1.584-0.576-2.322-1.422-2.322-2.467c0-1.404,1.152-2.557,3.007-2.557c0.882,0,1.657,0.234,2.125,0.54l-0.378,1.152
|
25
|
+
c-0.342-0.216-0.973-0.522-1.783-0.522c-0.936,0-1.439,0.54-1.439,1.188c0,0.72,0.504,1.044,1.638,1.495
|
26
|
+
c1.495,0.558,2.287,1.314,2.287,2.611c0,1.548-1.206,2.629-3.241,2.629c-0.954,0-1.836-0.252-2.449-0.612L232.604,13.463z"/>
|
27
|
+
</g>
|
28
|
+
<g>
|
29
|
+
<path d="M5.929,24.592c0.792-0.144,1.945-0.252,3.007-0.252c1.674,0,2.772,0.324,3.511,0.99c0.594,0.54,0.955,1.368,0.955,2.323
|
30
|
+
c0,1.584-1.008,2.647-2.269,3.079v0.054c0.918,0.324,1.477,1.188,1.765,2.449c0.396,1.692,0.684,2.863,0.937,3.331h-1.621
|
31
|
+
c-0.198-0.36-0.468-1.386-0.792-2.899c-0.36-1.674-1.026-2.305-2.449-2.359H7.496v5.258H5.929V24.592z M7.496,30.12h1.602
|
32
|
+
c1.675,0,2.737-0.918,2.737-2.305c0-1.566-1.135-2.251-2.791-2.251c-0.756,0-1.278,0.054-1.548,0.126V30.12z"/>
|
33
|
+
<path d="M15.613,24.574c0.756-0.126,1.746-0.234,3.007-0.234c1.548,0,2.683,0.36,3.403,1.008c0.648,0.576,1.062,1.458,1.062,2.539
|
34
|
+
c0,1.099-0.324,1.963-0.937,2.593c-0.846,0.882-2.179,1.333-3.709,1.333c-0.468,0-0.9-0.018-1.26-0.108v4.861h-1.566V24.574z
|
35
|
+
M17.18,30.426c0.342,0.09,0.774,0.126,1.296,0.126c1.89,0,3.042-0.937,3.042-2.575c0-1.621-1.152-2.395-2.863-2.395
|
36
|
+
c-0.684,0-1.206,0.054-1.476,0.126V30.426z"/>
|
37
|
+
<path d="M33.651,36.188c-0.558,0.288-1.729,0.576-3.205,0.576c-3.421,0-5.978-2.161-5.978-6.158c0-3.817,2.575-6.374,6.338-6.374
|
38
|
+
c1.494,0,2.466,0.324,2.881,0.54l-0.396,1.278c-0.576-0.288-1.422-0.504-2.431-0.504c-2.845,0-4.735,1.819-4.735,5.006
|
39
|
+
c0,2.989,1.71,4.879,4.646,4.879c0.972,0,1.944-0.198,2.575-0.504L33.651,36.188z"/>
|
40
|
+
<path d="M39.174,34.963c0.486,0.288,1.314,0.612,2.107,0.612c1.134,0,1.674-0.558,1.674-1.296c0-0.756-0.45-1.152-1.603-1.584
|
41
|
+
c-1.584-0.576-2.323-1.422-2.323-2.467c0-1.404,1.152-2.557,3.007-2.557c0.882,0,1.657,0.234,2.125,0.54l-0.378,1.152
|
42
|
+
c-0.342-0.216-0.972-0.522-1.782-0.522c-0.937,0-1.44,0.54-1.44,1.188c0,0.72,0.504,1.044,1.638,1.495
|
43
|
+
c1.495,0.558,2.287,1.314,2.287,2.611c0,1.548-1.207,2.629-3.241,2.629c-0.954,0-1.836-0.252-2.449-0.612L39.174,34.963z"/>
|
44
|
+
<path d="M47.401,32.497c0.036,2.143,1.386,3.025,2.989,3.025c1.134,0,1.836-0.198,2.413-0.45l0.288,1.134
|
45
|
+
c-0.558,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.286-1.783-4.286-4.412c0-2.628,1.548-4.681,4.087-4.681
|
46
|
+
c2.863,0,3.601,2.484,3.601,4.087c0,0.324-0.018,0.559-0.054,0.738H47.401z M52.046,31.362c0.018-0.99-0.414-2.557-2.196-2.557
|
47
|
+
c-1.621,0-2.305,1.458-2.431,2.557H52.046z"/>
|
48
|
+
<path d="M55.536,30.57c0-1.026-0.018-1.909-0.072-2.719h1.387l0.072,1.729h0.054c0.396-1.17,1.368-1.908,2.431-1.908
|
49
|
+
c0.162,0,0.288,0.018,0.432,0.036v1.494c-0.162-0.036-0.324-0.036-0.54-0.036c-1.117,0-1.909,0.829-2.125,2.017
|
50
|
+
c-0.036,0.216-0.054,0.486-0.054,0.738v4.646h-1.584V30.57z"/>
|
51
|
+
<path d="M62.484,27.851l1.71,4.88c0.288,0.81,0.522,1.53,0.702,2.25h0.054c0.198-0.72,0.45-1.44,0.738-2.25l1.693-4.88h1.656
|
52
|
+
l-3.421,8.715h-1.513l-3.313-8.715H62.484z"/>
|
53
|
+
<path d="M71.232,32.497c0.036,2.143,1.386,3.025,2.989,3.025c1.134,0,1.836-0.198,2.413-0.45l0.288,1.134
|
54
|
+
c-0.558,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.285-1.783-4.285-4.412c0-2.628,1.549-4.681,4.087-4.681
|
55
|
+
c2.863,0,3.601,2.484,3.601,4.087c0,0.324-0.018,0.559-0.054,0.738H71.232z M75.878,31.362c0.018-0.99-0.415-2.557-2.197-2.557
|
56
|
+
c-1.621,0-2.305,1.458-2.431,2.557H75.878z"/>
|
57
|
+
<path d="M79.368,30.57c0-1.026-0.018-1.909-0.072-2.719h1.387l0.072,1.729h0.054c0.396-1.17,1.368-1.908,2.431-1.908
|
58
|
+
c0.162,0,0.288,0.018,0.432,0.036v1.494c-0.162-0.036-0.324-0.036-0.54-0.036c-1.116,0-1.909,0.829-2.125,2.017
|
59
|
+
c-0.036,0.216-0.054,0.486-0.054,0.738v4.646h-1.584V30.57z"/>
|
60
|
+
</g>
|
61
|
+
<g>
|
62
|
+
<path d="M16.236,231.754c-0.558,0.288-1.729,0.576-3.205,0.576c-3.421,0-5.978-2.161-5.978-6.158c0-3.817,2.575-6.374,6.338-6.374
|
63
|
+
c1.494,0,2.466,0.324,2.881,0.54l-0.396,1.278c-0.576-0.288-1.422-0.504-2.431-0.504c-2.845,0-4.735,1.819-4.735,5.006
|
64
|
+
c0,2.989,1.71,4.879,4.646,4.879c0.972,0,1.944-0.198,2.575-0.504L16.236,231.754z"/>
|
65
|
+
<path d="M24.155,230.043c0,0.756,0.036,1.495,0.126,2.089h-1.422l-0.126-1.098h-0.054c-0.486,0.684-1.422,1.296-2.665,1.296
|
66
|
+
c-1.765,0-2.665-1.243-2.665-2.503c0-2.106,1.873-3.259,5.239-3.241v-0.18c0-0.702-0.198-2.017-1.98-1.999
|
67
|
+
c-0.828,0-1.674,0.234-2.287,0.648l-0.36-1.062c0.72-0.45,1.783-0.756,2.881-0.756c2.665,0,3.313,1.818,3.313,3.547V230.043z
|
68
|
+
M22.625,227.685c-1.729-0.036-3.691,0.27-3.691,1.962c0,1.044,0.684,1.513,1.476,1.513c1.152,0,1.891-0.72,2.143-1.458
|
69
|
+
c0.054-0.18,0.072-0.36,0.072-0.504V227.685z"/>
|
70
|
+
<path d="M26.709,219.349h1.584v12.784h-1.584V219.349z"/>
|
71
|
+
<path d="M37.169,231.826c-0.414,0.198-1.333,0.504-2.503,0.504c-2.629,0-4.339-1.783-4.339-4.447c0-2.683,1.837-4.646,4.682-4.646
|
72
|
+
c0.936,0,1.765,0.234,2.196,0.468l-0.36,1.207c-0.378-0.198-0.972-0.414-1.836-0.414c-1.999,0-3.079,1.495-3.079,3.295
|
73
|
+
c0,2.017,1.296,3.259,3.025,3.259c0.9,0,1.495-0.216,1.945-0.415L37.169,231.826z"/>
|
74
|
+
<path d="M46.313,229.738c0,0.918,0.018,1.71,0.072,2.395h-1.404l-0.09-1.422h-0.036c-0.396,0.702-1.332,1.621-2.881,1.621
|
75
|
+
c-1.368,0-3.007-0.774-3.007-3.817v-5.096h1.584v4.808c0,1.657,0.522,2.791,1.945,2.791c1.062,0,1.8-0.738,2.088-1.458
|
76
|
+
c0.09-0.216,0.144-0.504,0.144-0.81v-5.33h1.584V229.738z"/>
|
77
|
+
<path d="M48.939,219.349h1.584v12.784h-1.584V219.349z"/>
|
78
|
+
<path d="M59.309,230.043c0,0.756,0.036,1.495,0.126,2.089h-1.422l-0.126-1.098h-0.054c-0.486,0.684-1.422,1.296-2.665,1.296
|
79
|
+
c-1.765,0-2.665-1.243-2.665-2.503c0-2.106,1.873-3.259,5.239-3.241v-0.18c0-0.702-0.198-2.017-1.98-1.999
|
80
|
+
c-0.828,0-1.674,0.234-2.287,0.648l-0.36-1.062c0.72-0.45,1.783-0.756,2.881-0.756c2.665,0,3.313,1.818,3.313,3.547V230.043z
|
81
|
+
M57.778,227.685c-1.729-0.036-3.691,0.27-3.691,1.962c0,1.044,0.684,1.513,1.476,1.513c1.152,0,1.891-0.72,2.143-1.458
|
82
|
+
c0.054-0.18,0.072-0.36,0.072-0.504V227.685z"/>
|
83
|
+
<path d="M63.7,221.329v2.088h2.269v1.207H63.7v4.7c0,1.08,0.306,1.692,1.188,1.692c0.432,0,0.685-0.036,0.918-0.108l0.072,1.207
|
84
|
+
c-0.306,0.108-0.792,0.216-1.404,0.216c-0.738,0-1.332-0.252-1.71-0.667c-0.432-0.486-0.612-1.26-0.612-2.287v-4.753h-1.35v-1.207
|
85
|
+
h1.35v-1.62L63.7,221.329z"/>
|
86
|
+
<path d="M75.527,227.703c0,3.223-2.25,4.627-4.339,4.627c-2.34,0-4.177-1.729-4.177-4.483c0-2.899,1.927-4.609,4.321-4.609
|
87
|
+
C73.835,223.238,75.527,225.056,75.527,227.703z M68.631,227.793c0,1.909,1.081,3.349,2.629,3.349c1.512,0,2.646-1.422,2.646-3.385
|
88
|
+
c0-1.476-0.738-3.331-2.611-3.331C69.441,224.426,68.631,226.155,68.631,227.793z"/>
|
89
|
+
<path d="M77.523,226.137c0-1.026-0.018-1.909-0.072-2.719h1.387l0.072,1.729h0.054c0.396-1.17,1.368-1.908,2.431-1.908
|
90
|
+
c0.162,0,0.288,0.018,0.432,0.036v1.494c-0.162-0.036-0.324-0.036-0.54-0.036c-1.116,0-1.909,0.829-2.125,2.017
|
91
|
+
c-0.036,0.216-0.054,0.486-0.054,0.738v4.646h-1.584V226.137z"/>
|
92
|
+
</g>
|
93
|
+
<g>
|
94
|
+
<path d="M357.652,24.592c0.792-0.144,1.944-0.252,3.007-0.252c1.675,0,2.772,0.324,3.511,0.99c0.594,0.54,0.955,1.368,0.955,2.323
|
95
|
+
c0,1.584-1.009,2.647-2.27,3.079v0.054c0.918,0.324,1.477,1.188,1.765,2.449c0.396,1.692,0.685,2.863,0.937,3.331h-1.621
|
96
|
+
c-0.197-0.36-0.468-1.386-0.792-2.899c-0.36-1.674-1.026-2.305-2.448-2.359h-1.477v5.258h-1.566V24.592z M359.219,30.12h1.603
|
97
|
+
c1.675,0,2.736-0.918,2.736-2.305c0-1.566-1.134-2.251-2.79-2.251c-0.757,0-1.279,0.054-1.549,0.126V30.12z"/>
|
98
|
+
<path d="M367.336,24.574c0.756-0.126,1.746-0.234,3.008-0.234c1.548,0,2.682,0.36,3.402,1.008c0.648,0.576,1.062,1.458,1.062,2.539
|
99
|
+
c0,1.099-0.324,1.963-0.937,2.593c-0.847,0.882-2.179,1.333-3.709,1.333c-0.468,0-0.9-0.018-1.261-0.108v4.861h-1.566V24.574z
|
100
|
+
M368.902,30.426c0.342,0.09,0.774,0.126,1.297,0.126c1.891,0,3.043-0.937,3.043-2.575c0-1.621-1.152-2.395-2.863-2.395
|
101
|
+
c-0.684,0-1.206,0.054-1.477,0.126V30.426z"/>
|
102
|
+
<path d="M385.375,36.188c-0.559,0.288-1.729,0.576-3.205,0.576c-3.422,0-5.979-2.161-5.979-6.158c0-3.817,2.575-6.374,6.338-6.374
|
103
|
+
c1.494,0,2.467,0.324,2.881,0.54l-0.396,1.278c-0.576-0.288-1.422-0.504-2.43-0.504c-2.846,0-4.736,1.819-4.736,5.006
|
104
|
+
c0,2.989,1.711,4.879,4.646,4.879c0.972,0,1.943-0.198,2.574-0.504L385.375,36.188z"/>
|
105
|
+
<path d="M397.326,36.26c-0.414,0.198-1.333,0.504-2.504,0.504c-2.629,0-4.339-1.783-4.339-4.447c0-2.683,1.837-4.646,4.682-4.646
|
106
|
+
c0.937,0,1.765,0.234,2.196,0.468l-0.359,1.207c-0.379-0.198-0.973-0.414-1.837-0.414c-1.999,0-3.079,1.495-3.079,3.295
|
107
|
+
c0,2.017,1.297,3.259,3.025,3.259c0.9,0,1.494-0.216,1.944-0.415L397.326,36.26z"/>
|
108
|
+
<path d="M399.178,23.782h1.584v12.784h-1.584V23.782z"/>
|
109
|
+
<path d="M405.189,25.403c0,0.54-0.378,0.972-1.008,0.972c-0.576,0-0.955-0.432-0.955-0.972c0-0.541,0.396-0.991,0.99-0.991
|
110
|
+
C404.793,24.412,405.189,24.844,405.189,25.403z M403.426,36.566v-8.715h1.584v8.715H403.426z"/>
|
111
|
+
<path d="M408.52,32.497c0.036,2.143,1.387,3.025,2.988,3.025c1.135,0,1.837-0.198,2.413-0.45l0.288,1.134
|
112
|
+
c-0.559,0.252-1.53,0.559-2.917,0.559c-2.683,0-4.285-1.783-4.285-4.412c0-2.628,1.549-4.681,4.087-4.681
|
113
|
+
c2.863,0,3.602,2.484,3.602,4.087c0,0.324-0.018,0.559-0.055,0.738H408.52z M413.165,31.362c0.018-0.99-0.415-2.557-2.196-2.557
|
114
|
+
c-1.621,0-2.305,1.458-2.432,2.557H413.165z"/>
|
115
|
+
<path d="M416.655,30.21c0-0.918-0.019-1.638-0.072-2.359h1.405l0.09,1.44h0.035c0.433-0.81,1.441-1.62,2.881-1.62
|
116
|
+
c1.207,0,3.079,0.72,3.079,3.709v5.186h-1.585v-5.023c0-1.404-0.521-2.575-2.016-2.575c-1.026,0-1.837,0.738-2.125,1.621
|
117
|
+
c-0.072,0.198-0.107,0.468-0.107,0.738v5.24h-1.585V30.21z"/>
|
118
|
+
<path d="M428.482,25.763v2.088h2.268v1.207h-2.268v4.7c0,1.08,0.306,1.692,1.188,1.692c0.432,0,0.685-0.036,0.918-0.108
|
119
|
+
l0.072,1.207c-0.306,0.108-0.792,0.216-1.404,0.216c-0.738,0-1.332-0.252-1.711-0.667c-0.432-0.486-0.611-1.26-0.611-2.287v-4.753
|
120
|
+
h-1.351v-1.207h1.351v-1.62L428.482,25.763z"/>
|
121
|
+
</g>
|
122
|
+
<g>
|
123
|
+
<path d="M160.963,102.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
|
124
|
+
c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
|
125
|
+
c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
|
126
|
+
s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V102.83z"/>
|
127
|
+
<path d="M166.623,102.267c-0.699,0.586-1.396,0.879-2.092,0.879c-0.582,0-1.062-0.166-1.438-0.498s-0.565-0.752-0.565-1.26
|
128
|
+
c0-0.66,0.293-1.191,0.879-1.594s1.359-0.604,2.32-0.604h0.715v-0.545c0-0.449-0.1-0.77-0.299-0.961s-0.529-0.287-0.99-0.287
|
129
|
+
c-0.668,0-1.359,0.188-2.074,0.562v-0.99c0.819-0.293,1.588-0.439,2.306-0.439c0.808,0,1.378,0.16,1.711,0.48s0.5,0.873,0.5,1.658
|
130
|
+
v2.666c0,0.383,0.041,0.644,0.123,0.782s0.236,0.208,0.463,0.208c0.074,0,0.195-0.02,0.363-0.059l0.105,0.691
|
131
|
+
c-0.386,0.125-0.678,0.188-0.876,0.188C167.205,103.146,166.822,102.853,166.623,102.267z M166.441,101.517v-1.605h-0.346
|
132
|
+
c-1.582,0-2.373,0.428-2.373,1.283c0,0.309,0.102,0.557,0.305,0.744s0.473,0.281,0.809,0.281
|
133
|
+
C165.34,102.22,165.875,101.986,166.441,101.517z"/>
|
134
|
+
<path d="M172.43,103.035V94.65h-2.455v-0.867h3.609v9.252H172.43z"/>
|
135
|
+
<path d="M182.654,102.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
|
136
|
+
c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
|
137
|
+
c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
|
138
|
+
s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V102.83z"/>
|
139
|
+
<path d="M186.17,98.406v-1.734h1.734v1.734H186.17z M186.17,103.035V101.3h1.734v1.734H186.17z"/>
|
140
|
+
<path d="M192.457,103.035v-6.363h1.154v1.195c0.586-0.891,1.373-1.336,2.361-1.336c0.348,0,0.742,0.049,1.184,0.146v1.805h-0.867
|
141
|
+
v-0.885c-0.172-0.039-0.328-0.059-0.469-0.059c-0.441,0-0.829,0.103-1.163,0.308s-0.683,0.554-1.046,1.046v4.143H192.457z"/>
|
142
|
+
<path d="M198.932,105.349v-8.678h1.154v1.195c0.559-0.891,1.252-1.336,2.08-1.336c0.723,0,1.292,0.278,1.708,0.835
|
143
|
+
s0.624,1.315,0.624,2.276c0,1.055-0.246,1.908-0.738,2.561s-1.137,0.979-1.934,0.979c-0.684,0-1.264-0.289-1.74-0.867v3.035
|
144
|
+
H198.932z M200.086,101.447c0.535,0.578,1.062,0.867,1.582,0.867c0.508,0,0.901-0.224,1.181-0.671s0.419-1.073,0.419-1.878
|
145
|
+
c0-1.5-0.447-2.25-1.342-2.25c-0.652,0-1.266,0.406-1.84,1.219V101.447z"/>
|
146
|
+
<path d="M211.576,102.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
|
147
|
+
c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
|
148
|
+
c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
|
149
|
+
s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V102.83z"/>
|
150
|
+
<path d="M215.092,98.406v-1.734h1.734v1.734H215.092z M215.092,103.035V101.3h1.734v1.734H215.092z"/>
|
151
|
+
<path d="M219.639,103.035l2.939-3.816l-2.688-3.702h1.368l2.025,2.79l2.155-2.79h1.125l-2.738,3.537l2.891,3.98h-1.369
|
152
|
+
l-2.221-3.061l-2.363,3.061H219.639z"/>
|
153
|
+
<path d="M228.451,103.035c0.07-0.625,0.209-1.184,0.416-1.676s0.686-1.4,1.436-2.725l1.811-3.188h-4.131v-1.084h5.227v0.973
|
154
|
+
l-0.281,0.469c-1.863,3.141-2.896,5.551-3.1,7.23H228.451z"/>
|
155
|
+
<path d="M237.076,103.035v-3.076l-2.854-4.441h1.33l2.186,3.469l2.391-3.469h1.096l-2.994,4.441v3.076H237.076z"/>
|
156
|
+
<path d="M242.25,103.035v-1.014c0.477-0.922,1.188-1.852,2.133-2.789l0.521-0.521c0.719-0.715,1.078-1.436,1.078-2.162
|
157
|
+
c0-0.465-0.138-0.837-0.413-1.116s-0.644-0.419-1.104-0.419c-0.559,0-1.225,0.203-1.998,0.609v-1.02
|
158
|
+
c0.719-0.305,1.422-0.457,2.109-0.457c0.793,0,1.431,0.216,1.913,0.647s0.724,1.001,0.724,1.708c0,0.457-0.111,0.887-0.334,1.289
|
159
|
+
s-0.6,0.852-1.131,1.348l-0.492,0.463c-0.906,0.844-1.451,1.65-1.635,2.42h3.545v1.014H242.25z"/>
|
160
|
+
<path d="M249.393,95.517h1.154v4.564c0,0.797,0.126,1.374,0.378,1.731s0.659,0.536,1.222,0.536c0.594,0,1.021-0.179,1.283-0.536
|
161
|
+
s0.393-0.944,0.393-1.761v-4.535h1.008v4.365c0,0.941-0.111,1.617-0.334,2.027c-0.473,0.871-1.252,1.307-2.338,1.307
|
162
|
+
c-0.941,0-1.638-0.258-2.089-0.773s-0.677-1.309-0.677-2.379V95.517z"/>
|
163
|
+
<path d="M261.645,95.693v1.002c-0.848-0.328-1.602-0.492-2.262-0.492c-1.043,0-1.564,0.352-1.564,1.055
|
164
|
+
c0,0.285,0.098,0.515,0.293,0.688s0.557,0.353,1.084,0.536l0.738,0.258l0.703,0.24c1.09,0.383,1.635,1.031,1.635,1.945
|
165
|
+
c0,0.695-0.278,1.251-0.835,1.667s-1.302,0.624-2.235,0.624c-0.648,0-1.486-0.139-2.514-0.416v-1.143
|
166
|
+
c1.023,0.461,1.873,0.691,2.549,0.691c0.57,0,1.025-0.112,1.365-0.337s0.51-0.526,0.51-0.905c0-0.289-0.101-0.518-0.302-0.686
|
167
|
+
s-0.616-0.367-1.245-0.598l-0.773-0.281c-0.77-0.285-1.304-0.578-1.603-0.879s-0.448-0.701-0.448-1.201
|
168
|
+
c0-0.676,0.229-1.199,0.688-1.57s1.104-0.557,1.937-0.557C260.041,95.335,260.801,95.455,261.645,95.693z"/>
|
169
|
+
</g>
|
170
|
+
<rect x="153.5" y="109.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
|
171
|
+
<g>
|
172
|
+
<path d="M160.963,41.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
|
173
|
+
c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
|
174
|
+
c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
|
175
|
+
s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V41.83z"/>
|
176
|
+
<path d="M166.623,41.267c-0.699,0.586-1.396,0.879-2.092,0.879c-0.582,0-1.062-0.166-1.438-0.498s-0.565-0.752-0.565-1.26
|
177
|
+
c0-0.66,0.293-1.191,0.879-1.594s1.359-0.604,2.32-0.604h0.715v-0.545c0-0.449-0.1-0.77-0.299-0.961s-0.529-0.287-0.99-0.287
|
178
|
+
c-0.668,0-1.359,0.188-2.074,0.562v-0.99c0.819-0.293,1.588-0.439,2.306-0.439c0.808,0,1.378,0.16,1.711,0.48s0.5,0.873,0.5,1.658
|
179
|
+
v2.666c0,0.383,0.041,0.644,0.123,0.782s0.236,0.208,0.463,0.208c0.074,0,0.195-0.02,0.363-0.059l0.105,0.691
|
180
|
+
c-0.386,0.125-0.678,0.188-0.876,0.188C167.205,42.146,166.822,41.853,166.623,41.267z M166.441,40.517v-1.605h-0.346
|
181
|
+
c-1.582,0-2.373,0.428-2.373,1.283c0,0.309,0.102,0.557,0.305,0.744s0.473,0.281,0.809,0.281
|
182
|
+
C165.34,41.22,165.875,40.986,166.441,40.517z"/>
|
183
|
+
<path d="M172.43,42.035V33.65h-2.455v-0.867h3.609v9.252H172.43z"/>
|
184
|
+
<path d="M182.654,41.83c-0.684,0.234-1.365,0.352-2.045,0.352c-1.109,0-1.964-0.289-2.563-0.867s-0.899-1.398-0.899-2.461
|
185
|
+
c0-1.043,0.296-1.857,0.888-2.443s1.415-0.879,2.47-0.879c0.672,0,1.35,0.102,2.033,0.305v0.967
|
186
|
+
c-0.754-0.27-1.396-0.404-1.928-0.404c-0.695,0-1.241,0.219-1.638,0.656s-0.595,1.037-0.595,1.799c0,0.77,0.212,1.372,0.636,1.808
|
187
|
+
s1.009,0.653,1.755,0.653c0.559,0,1.188-0.131,1.887-0.393V41.83z"/>
|
188
|
+
</g>
|
189
|
+
<rect x="153.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
|
190
|
+
<rect x="178.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
|
191
|
+
<rect x="203.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
|
192
|
+
<rect x="228.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
|
193
|
+
<rect x="253.5" y="48.566" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" width="25" height="25"/>
|
194
|
+
<g>
|
195
|
+
<g>
|
196
|
+
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M353.588,74.419c0-7.02-30.376-12.765-69.053-13.311"/>
|
197
|
+
<g>
|
198
|
+
<path d="M278.5,61.066c2.858-1.003,6.413-2.737,8.631-4.602l-1.805,4.724l1.635,4.785C284.812,64.03,281.32,62.169,278.5,61.066z
|
199
|
+
"/>
|
200
|
+
</g>
|
201
|
+
</g>
|
202
|
+
</g>
|
203
|
+
<circle fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="393.75" cy="90.816" r="43.75"/>
|
204
|
+
<circle fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="44.25" cy="90.816" r="43.75"/>
|
205
|
+
<g>
|
206
|
+
<g>
|
207
|
+
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M153.55,61.915c-0.314-2.674-29.853-1.425-67.189,2.743"/>
|
208
|
+
<g>
|
209
|
+
<path d="M80.364,65.345c2.717-1.339,6.037-3.489,8.015-5.607l-1.224,4.907l2.199,4.553
|
210
|
+
C86.986,67.528,83.296,66.101,80.364,65.345z"/>
|
211
|
+
</g>
|
212
|
+
</g>
|
213
|
+
</g>
|
214
|
+
<circle fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="44.25" cy="198.316" r="13.75"/>
|
215
|
+
<g>
|
216
|
+
<g>
|
217
|
+
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M9.744,117.695c0,37.331,6.515,68.695,15.375,77.89"/>
|
218
|
+
<g>
|
219
|
+
<path d="M30.5,198.316c-2.996-0.444-6.95-0.565-9.781,0.052l3.798-3.34l0.783-4.996C26.296,192.753,28.518,196.026,30.5,198.316z
|
220
|
+
"/>
|
221
|
+
</g>
|
222
|
+
</g>
|
223
|
+
</g>
|
224
|
+
<g>
|
225
|
+
<g>
|
226
|
+
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M78.699,123.73C77.905,165.468,68.95,198.316,58,198.316"/>
|
227
|
+
<g>
|
228
|
+
<path d="M78.756,117.695c-1.127,2.812-3.016,6.287-4.976,8.421l4.799-1.597l4.708,1.843
|
229
|
+
C81.44,124.13,79.735,120.562,78.756,117.695z"/>
|
230
|
+
</g>
|
231
|
+
</g>
|
232
|
+
</g>
|
233
|
+
<g>
|
234
|
+
<g>
|
235
|
+
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M83.784,109.566c0,6.544,27.977,11.906,63.68,12.454"/>
|
236
|
+
<g>
|
237
|
+
<path d="M153.5,122.066c-2.858,1.002-6.414,2.736-8.632,4.601l1.806-4.724l-1.634-4.785
|
238
|
+
C147.189,119.101,150.68,120.962,153.5,122.066z"/>
|
239
|
+
</g>
|
240
|
+
</g>
|
241
|
+
</g>
|
242
|
+
<g>
|
243
|
+
<g>
|
244
|
+
<path fill="none" stroke="#000000" stroke-miterlimit="10" d="M178.45,121.602c2.182,10.063,76.521,2.517,167.441-16.836"/>
|
245
|
+
<g>
|
246
|
+
<path d="M351.792,103.499c-2.57,1.603-5.66,4.073-7.417,6.377l0.729-5.004l-2.642-4.312
|
247
|
+
C344.985,101.985,348.799,103.038,351.792,103.499z"/>
|
248
|
+
</g>
|
249
|
+
</g>
|
250
|
+
</g>
|
251
|
+
<g>
|
252
|
+
<path d="M332.59,40.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
|
253
|
+
s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
|
254
|
+
s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
|
255
|
+
s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
|
256
|
+
S332.59,39.109,332.59,40.257z M327.715,46.281v-0.785c-0.703-0.047-1.242-0.199-1.617-0.457s-0.602-0.633-0.68-1.125V34h-0.844
|
257
|
+
c-0.539,0.633-1.15,1.113-1.834,1.441s-1.439,0.504-2.268,0.527v0.785l1.582-0.094h0.094c0.312,0,0.531,0.09,0.656,0.27
|
258
|
+
s0.188,0.5,0.188,0.961v6.023c0,0.672-0.129,1.104-0.387,1.295s-0.898,0.287-1.922,0.287v0.785H327.715z"/>
|
259
|
+
</g>
|
260
|
+
<g>
|
261
|
+
<path d="M125.547,40.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
|
262
|
+
s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
|
263
|
+
s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
|
264
|
+
s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
|
265
|
+
S125.547,39.109,125.547,40.257z M121.422,41.746l-0.797,0.012c-0.023,0.93-0.139,1.541-0.346,1.834s-0.619,0.439-1.236,0.439
|
266
|
+
h-4.969c0.156-0.508,0.463-0.959,0.92-1.354s1.295-0.873,2.514-1.436c1.438-0.672,2.4-1.297,2.889-1.875s0.732-1.297,0.732-2.156
|
267
|
+
c0-0.953-0.402-1.727-1.207-2.32S118.055,34,116.734,34c-1.094,0-1.975,0.238-2.643,0.715s-1.002,1.102-1.002,1.875
|
268
|
+
c0,0.422,0.117,0.756,0.352,1.002s0.551,0.369,0.949,0.369c0.328,0,0.621-0.121,0.879-0.363s0.387-0.516,0.387-0.82
|
269
|
+
c0-0.086-0.035-0.234-0.105-0.445s-0.105-0.379-0.105-0.504c0-0.242,0.129-0.459,0.387-0.65s0.551-0.287,0.879-0.287
|
270
|
+
c0.492,0,0.904,0.201,1.236,0.604s0.498,0.912,0.498,1.529c0,0.656-0.162,1.24-0.486,1.752s-1.033,1.182-2.127,2.01
|
271
|
+
c-1.328,1.008-2.205,1.867-2.631,2.578s-0.639,1.535-0.639,2.473v0.445h8.766L121.422,41.746z"/>
|
272
|
+
</g>
|
273
|
+
<g>
|
274
|
+
<path d="M34.547,158.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
|
275
|
+
s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
|
276
|
+
s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
|
277
|
+
s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
|
278
|
+
S34.547,157.109,34.547,158.257z M25.43,158.093c0.742,0,1.32,0.219,1.734,0.656s0.621,1.051,0.621,1.84
|
279
|
+
c0,0.836-0.23,1.521-0.691,2.057s-1.047,0.803-1.758,0.803c-0.383,0-0.699-0.09-0.949-0.27s-0.375-0.402-0.375-0.668
|
280
|
+
c0-0.094,0.027-0.23,0.082-0.41s0.082-0.324,0.082-0.434c0-0.375-0.123-0.684-0.369-0.926s-0.561-0.363-0.943-0.363
|
281
|
+
c-0.438,0-0.783,0.125-1.037,0.375s-0.381,0.586-0.381,1.008c0,0.781,0.381,1.422,1.143,1.922s1.748,0.75,2.959,0.75
|
282
|
+
c1.492,0,2.709-0.348,3.65-1.043s1.412-1.59,1.412-2.684c0-0.922-0.346-1.67-1.037-2.244s-1.623-0.881-2.795-0.92v-0.07
|
283
|
+
c0.984-0.195,1.734-0.52,2.25-0.973s0.773-1.02,0.773-1.699c0-0.852-0.359-1.531-1.078-2.039S27.035,152,25.816,152
|
284
|
+
c-1.117,0-2.021,0.219-2.713,0.656s-1.037,1.004-1.037,1.699c0,0.367,0.113,0.666,0.34,0.896s0.523,0.346,0.891,0.346
|
285
|
+
c0.328,0,0.605-0.119,0.832-0.357s0.34-0.533,0.34-0.885c0-0.102-0.025-0.219-0.076-0.352s-0.08-0.223-0.088-0.27
|
286
|
+
c0.023-0.234,0.146-0.426,0.369-0.574s0.498-0.223,0.826-0.223c0.555,0,0.998,0.186,1.33,0.557s0.498,0.873,0.498,1.506
|
287
|
+
c0,0.734-0.229,1.301-0.686,1.699s-1.111,0.598-1.963,0.598h-0.598v0.797H25.43z"/>
|
288
|
+
</g>
|
289
|
+
<g>
|
290
|
+
<path d="M71.547,158.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
|
291
|
+
s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
|
292
|
+
s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
|
293
|
+
s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
|
294
|
+
S71.547,157.109,71.547,158.257z M67.445,161.093v-1.219h-2.93V152h-1.652l-5.672,8.332l0.152,0.762h4.887v0.82
|
295
|
+
c0,0.664-0.123,1.09-0.369,1.277s-0.881,0.289-1.904,0.305v0.785h6.457l-0.012-0.785c-0.836-0.016-1.359-0.105-1.57-0.27
|
296
|
+
s-0.316-0.602-0.316-1.312v-0.82H67.445z M62.359,154.378l-0.07,5.613h-3.633L62.359,154.378z"/>
|
297
|
+
</g>
|
298
|
+
<g>
|
299
|
+
<path d="M125.547,138.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
|
300
|
+
s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
|
301
|
+
s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
|
302
|
+
s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
|
303
|
+
S125.547,137.109,125.547,138.257z M114.051,139.242c0.328-0.469,0.664-0.816,1.008-1.043s0.703-0.34,1.078-0.34
|
304
|
+
c0.617,0,1.129,0.254,1.535,0.762s0.609,1.164,0.609,1.969c0,0.93-0.197,1.654-0.592,2.174s-0.943,0.779-1.646,0.779
|
305
|
+
c-0.398,0-0.738-0.084-1.02-0.252s-0.422-0.365-0.422-0.592c0-0.062,0.045-0.199,0.135-0.41s0.135-0.395,0.135-0.551
|
306
|
+
c0-0.359-0.131-0.66-0.393-0.902s-0.588-0.363-0.979-0.363c-0.398,0-0.73,0.139-0.996,0.416s-0.398,0.627-0.398,1.049
|
307
|
+
c0,0.727,0.373,1.324,1.119,1.793s1.717,0.703,2.912,0.703c1.555,0,2.797-0.357,3.727-1.072s1.395-1.662,1.395-2.842
|
308
|
+
c0-1.117-0.377-2.018-1.131-2.701s-1.748-1.025-2.982-1.025c-0.523,0-1.041,0.088-1.553,0.264s-1.033,0.443-1.564,0.803
|
309
|
+
l0.293-3.176c0.367,0.031,0.76,0.055,1.178,0.07s0.881,0.023,1.389,0.023c1.43,0,2.414-0.193,2.953-0.58s0.945-1.119,1.219-2.197
|
310
|
+
c-0.391,0.117-0.824,0.203-1.301,0.258s-1.148,0.082-2.016,0.082c-1.078,0-1.92-0.027-2.525-0.082s-1.154-0.141-1.646-0.258
|
311
|
+
c-0.023,1.117-0.08,2.246-0.17,3.387s-0.217,2.293-0.381,3.457c0.164,0.031,0.334,0.082,0.51,0.152
|
312
|
+
S113.879,139.148,114.051,139.242z"/>
|
313
|
+
</g>
|
314
|
+
<g>
|
315
|
+
<path d="M332.59,138.257c0,1.156-0.215,2.252-0.645,3.287s-1.055,1.967-1.875,2.795c-0.82,0.82-1.748,1.445-2.783,1.875
|
316
|
+
s-2.131,0.645-3.287,0.645c-1.148,0-2.244-0.217-3.287-0.65s-1.971-1.057-2.783-1.869c-0.82-0.828-1.445-1.76-1.875-2.795
|
317
|
+
s-0.645-2.131-0.645-3.287c0-1.148,0.215-2.242,0.645-3.281s1.055-1.969,1.875-2.789c0.812-0.812,1.74-1.436,2.783-1.869
|
318
|
+
s2.139-0.65,3.287-0.65c1.156,0,2.252,0.215,3.287,0.645s1.963,1.055,2.783,1.875s1.445,1.75,1.875,2.789
|
319
|
+
S332.59,137.109,332.59,138.257z M321.574,138.621v-0.281c0-1.836,0.229-3.211,0.686-4.125s1.143-1.371,2.057-1.371
|
320
|
+
c0.352,0,0.654,0.088,0.908,0.264s0.381,0.381,0.381,0.615c0,0.078-0.031,0.213-0.094,0.404s-0.094,0.346-0.094,0.463
|
321
|
+
c0,0.375,0.115,0.678,0.346,0.908s0.529,0.346,0.896,0.346c0.391,0,0.701-0.125,0.932-0.375s0.346-0.582,0.346-0.996
|
322
|
+
c0-0.711-0.348-1.301-1.043-1.77s-1.582-0.703-2.66-0.703c-1.562,0-2.844,0.592-3.844,1.775s-1.5,2.713-1.5,4.588
|
323
|
+
c0,1.891,0.455,3.375,1.365,4.453s2.158,1.617,3.744,1.617c1.352,0,2.465-0.387,3.34-1.16s1.312-1.746,1.312-2.918
|
324
|
+
c0-1.016-0.354-1.871-1.061-2.566s-1.576-1.043-2.607-1.043c-0.695,0-1.318,0.15-1.869,0.451S322.051,137.972,321.574,138.621z
|
325
|
+
M326.203,140.66c0,0.891-0.205,1.605-0.615,2.145s-0.947,0.809-1.611,0.809c-0.656,0-1.201-0.258-1.635-0.773
|
326
|
+
s-0.65-1.176-0.65-1.98c0-0.852,0.223-1.541,0.668-2.068s1.023-0.791,1.734-0.791c0.625,0,1.133,0.244,1.523,0.732
|
327
|
+
S326.203,139.863,326.203,140.66z"/>
|
328
|
+
</g>
|
329
|
+
</svg>
|
data/examples/calc.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
class Calculator
|
2
|
+
# A simple, mutable calculator used for testing.
|
3
|
+
# referenced explicitly in ../spec/calculator.spec.rb
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@acc = 0.0
|
7
|
+
end
|
8
|
+
|
9
|
+
def clr
|
10
|
+
@acc = 0.0
|
11
|
+
end
|
12
|
+
|
13
|
+
def add(number)
|
14
|
+
@acc += number
|
15
|
+
end
|
16
|
+
|
17
|
+
def div(number)
|
18
|
+
@acc /= number
|
19
|
+
end
|
20
|
+
|
21
|
+
def mul(number)
|
22
|
+
@acc *= number
|
23
|
+
end
|
24
|
+
|
25
|
+
def sub(number)
|
26
|
+
@acc -= number
|
27
|
+
end
|
28
|
+
|
29
|
+
def val
|
30
|
+
return @acc
|
31
|
+
end
|
32
|
+
end
|
data/examples/client.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'redis'
|
4
|
+
|
5
|
+
require File.expand_path('../../lib/redisrpc', __FILE__)
|
6
|
+
require File.expand_path('../calc', __FILE__)
|
7
|
+
|
8
|
+
def assert(cond)
|
9
|
+
if not cond
|
10
|
+
fail 'assertion failed'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def do_calculations(calculator)
|
15
|
+
calculator.clr
|
16
|
+
calculator.add 5
|
17
|
+
calculator.sub 3
|
18
|
+
calculator.mul 4
|
19
|
+
calculator.div 2
|
20
|
+
assert calculator.val == 4
|
21
|
+
begin
|
22
|
+
calculator.missing_method
|
23
|
+
assert false
|
24
|
+
rescue NoMethodError
|
25
|
+
rescue RedisRpc::RemoteException
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# 1. Local object
|
30
|
+
calculator = Calculator.new
|
31
|
+
do_calculations calculator
|
32
|
+
|
33
|
+
# 2. Remote object, should act like local object
|
34
|
+
redis_server = Redis.new
|
35
|
+
message_queue = 'calc'
|
36
|
+
timeout = 1
|
37
|
+
calculator = RedisRpc::Client.new redis_server, message_queue, timeout
|
38
|
+
do_calculations calculator
|
39
|
+
puts 'success!'
|
data/examples/server.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'redis'
|
4
|
+
|
5
|
+
require File.expand_path('../../lib/redisrpc', __FILE__)
|
6
|
+
require File.expand_path('../calc', __FILE__)
|
7
|
+
|
8
|
+
redis_server = Redis.new
|
9
|
+
message_queue = 'calc'
|
10
|
+
local_object = Calculator.new
|
11
|
+
server = RedisRpc::Server.new redis_server, message_queue, local_object
|
12
|
+
server.run
|
data/lib/redis-rpc.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
# Copyright (C) 2012. Nathan Farrington <nfarring@gmail.com>
|
2
|
+
#
|
3
|
+
# This program is free software: you can redistribute it and/or modify
|
4
|
+
# it under the terms of the GNU General Public License as published by
|
5
|
+
# the Free Software Foundation, either version 3 of the License, or
|
6
|
+
# (at your option) any later version.
|
7
|
+
#
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
11
|
+
# GNU General Public License for more details.
|
12
|
+
#
|
13
|
+
# You should have received a copy of the GNU General Public License
|
14
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
15
|
+
|
16
|
+
require File.expand_path('../redis-rpc/version',__FILE__)
|
17
|
+
require 'multi_json'
|
18
|
+
|
19
|
+
require 'redis'
|
20
|
+
|
21
|
+
module RedisRpc
|
22
|
+
|
23
|
+
class RemoteException < Exception; end
|
24
|
+
class TimeoutException < Exception; end
|
25
|
+
class MalformedResponseException < RemoteException
|
26
|
+
def initialize(response)
|
27
|
+
super "Malformed RPC Response message: #{response.inspect}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
class MalformedRequestException < ArgumentError
|
31
|
+
def initialize(reason)
|
32
|
+
super "Malformed RPC Request: #{reason.inspect}"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
class Client
|
37
|
+
def initialize( redis_server, message_queue, timeout=0 )
|
38
|
+
@redis_server = redis_server
|
39
|
+
@message_queue = message_queue
|
40
|
+
@timeout = timeout
|
41
|
+
end
|
42
|
+
|
43
|
+
alias :send! :send
|
44
|
+
def send( method_name, *args)
|
45
|
+
raise MalformedRequestException, 'block not allowed over RPC' if block_given?
|
46
|
+
|
47
|
+
# request setup
|
48
|
+
function_call = {'name' => method_name.to_s, 'args' => args}
|
49
|
+
response_queue = @message_queue + ':rpc:' + rand_string
|
50
|
+
rpc_request = {'function_call' => function_call, 'response_queue' => response_queue}
|
51
|
+
rpc_raw_request = MultiJson.dump rpc_request
|
52
|
+
|
53
|
+
# transport
|
54
|
+
@redis_server.rpush @message_queue, rpc_raw_request
|
55
|
+
message_queue, rpc_raw_response = @redis_server.blpop response_queue, @timeout
|
56
|
+
raise TimeoutException if rpc_raw_response.nil?
|
57
|
+
|
58
|
+
# response handling
|
59
|
+
rpc_response = MultiJson.load rpc_raw_response
|
60
|
+
raise RemoteException, rpc_response['exception'] if rpc_response.has_key? 'exception'
|
61
|
+
raise MalformedResponseException, rpc_response unless rpc_response.has_key? 'return_value'
|
62
|
+
return rpc_response['return_value']
|
63
|
+
|
64
|
+
rescue TimeoutException
|
65
|
+
# stale request cleanup
|
66
|
+
@redis_server.lrem @message_queue, 0, rpc_raw_request
|
67
|
+
raise $!
|
68
|
+
end
|
69
|
+
|
70
|
+
alias :method_missing :send
|
71
|
+
|
72
|
+
def respond_to?( method_name )
|
73
|
+
send( :respond_to?, method_name )
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def rand_string(size=8)
|
79
|
+
return rand(36**size).to_s(36).upcase.rjust(size,'0')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class Server
|
84
|
+
def initialize( redis_server, message_queue, local_object, timeout=nil )
|
85
|
+
@redis_server = redis_server
|
86
|
+
@message_queue = message_queue
|
87
|
+
@local_object = local_object
|
88
|
+
@timeout = timeout
|
89
|
+
end
|
90
|
+
|
91
|
+
def run
|
92
|
+
loop{ run_one }
|
93
|
+
end
|
94
|
+
|
95
|
+
def run!
|
96
|
+
flush_queue!
|
97
|
+
run
|
98
|
+
end
|
99
|
+
|
100
|
+
def flush_queue!
|
101
|
+
@redis_server.del @message_queue
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def run_one
|
107
|
+
# request setup
|
108
|
+
message_queue, rpc_raw_request = @redis_server.blpop @message_queue, timeout
|
109
|
+
return nil if rpc_raw_request.nil?
|
110
|
+
rpc_request = MultiJson.load rpc_raw_request
|
111
|
+
response_queue = rpc_request['response_queue']
|
112
|
+
function_call = rpc_request['function_call']
|
113
|
+
|
114
|
+
# request execution
|
115
|
+
begin
|
116
|
+
return_value = @local_object.send( function_call['name'].to_sym, *function_call['args'] )
|
117
|
+
rpc_response = {'return_value' => return_value}
|
118
|
+
rescue Object => err
|
119
|
+
rpc_response = {'exception' => err.to_s, 'backtrace' => err.backtrace}
|
120
|
+
end
|
121
|
+
|
122
|
+
# response tansport
|
123
|
+
rpc_raw_response = MultiJson.dump rpc_response
|
124
|
+
@redis_server.multi do
|
125
|
+
@redis_server.rpush response_queue, rpc_raw_response
|
126
|
+
@redis_server.expire response_queue, 1
|
127
|
+
end
|
128
|
+
true
|
129
|
+
end
|
130
|
+
|
131
|
+
def timeout
|
132
|
+
@timeout or
|
133
|
+
$REDISRPC_SERVER_TIMEOUT or
|
134
|
+
0
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|