Code

Update to 2Geom rev. 1113
[inkscape.git] / src / 2geom / svg-path-parser.cpp
1 #line 1 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
2 /*
3  * parse SVG path specifications
4  *
5  * Copyright 2007 MenTaLguY <mental@rydia.net>
6  * Copyright 2007 Aaron Spike <aaron@ekips.org>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it either under the terms of the GNU Lesser General Public
10  * License version 2.1 as published by the Free Software Foundation
11  * (the "LGPL") or, at your option, under the terms of the Mozilla
12  * Public License Version 1.1 (the "MPL"). If you do not alter this
13  * notice, a recipient may use your version of this file under either
14  * the MPL or the LGPL.
15  *
16  * You should have received a copy of the LGPL along with this library
17  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  * You should have received a copy of the MPL along with this library
20  * in the file COPYING-MPL-1.1
21  *
22  * The contents of this file are subject to the Mozilla Public License
23  * Version 1.1 (the "License"); you may not use this file except in
24  * compliance with the License. You may obtain a copy of the License at
25  * http://www.mozilla.org/MPL/
26  *
27  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
28  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
29  * the specific language governing rights and limitations.
30  *
31  */
34 #include <cmath>
35 #include <vector>
36 #include <glib.h>
38 #include "point.h"
40 #include "svg-path-parser.h"
42 namespace Geom {
44 namespace {
46 class Parser {
47 public:
48     Parser(SVGPathSink &sink) : _sink(sink) {}
50     void parse(char const *str) throw(SVGPathParseError);
52 private:
53     bool _absolute;
54     Point _current;
55     Point _initial;
56     Point _cubic_tangent;
57     Point _quad_tangent;
58     std::vector<double> _params;
59     SVGPathSink &_sink;
61     void _reset() {
62         _absolute = false;
63         _current = _initial = Point(0, 0);
64         _quad_tangent = _cubic_tangent = Point(0, 0);
65         _params.clear();
66     }
68     void _push(double value) {
69         _params.push_back(value);
70     }
72     double _pop() {
73         double value = _params.back();
74         _params.pop_back();
75         return value;
76     }
78     bool _pop_flag() {
79         return _pop() != 0.0;
80     }
82     double _pop_coord(Geom::Dim2 axis) {
83         if (_absolute) {
84             return _pop();
85         } else {
86             return _pop() + _current[axis];
87         }
88     }
90     Point _pop_point() {
91         double y = _pop_coord(Geom::Y);
92         double x = _pop_coord(Geom::X);
93         return Point(x, y);
94     }
96     void _moveTo(Point p) {
97         _quad_tangent = _cubic_tangent = _current = _initial = p;
98         _sink.moveTo(p);
99     }
101     void _lineTo(Point p) {
102         _quad_tangent = _cubic_tangent = _current = p;
103         _sink.lineTo(p);
104     }
106     void _curveTo(Point c0, Point c1, Point p) {
107         _quad_tangent = _current = p;
108         _cubic_tangent = p + ( p - c1 );
109         _sink.curveTo(c0, c1, p);
110     }
112     void _quadTo(Point c, Point p) {
113         _cubic_tangent = _current = p;
114         _quad_tangent = p + ( p - c );
115         _sink.quadTo(c, p);
116     }
118     void _arcTo(double rx, double ry, double angle,
119                 bool large_arc, bool sweep, Point p)
120     {
121         _quad_tangent = _cubic_tangent = _current = p;
122         _sink.arcTo(rx, ry, angle, large_arc, sweep, p);
123     }
125     void _closePath() {
126         _quad_tangent = _cubic_tangent = _current = _initial;
127         _sink.closePath();
128     }
129 };
132 #line 133 "/home/njh/svn/lib2geom/src/svg-path-parser.cpp"
133 static const char _svg_path_actions[] = {
134         0, 1, 0, 1, 1, 1, 2, 1, 
135         3, 1, 4, 1, 5, 1, 15, 1, 
136         16, 2, 1, 0, 2, 1, 2, 2, 
137         1, 3, 2, 1, 6, 2, 1, 7, 
138         2, 1, 8, 2, 1, 9, 2, 1, 
139         10, 2, 1, 11, 2, 1, 12, 2, 
140         1, 13, 2, 1, 14, 2, 2, 1, 
141         2, 3, 1, 2, 4, 0, 2, 5, 
142         0, 2, 15, 16, 3, 1, 6, 0, 
143         3, 1, 6, 16, 3, 1, 7, 0, 
144         3, 1, 7, 16, 3, 1, 8, 0, 
145         3, 1, 8, 16, 3, 1, 9, 0, 
146         3, 1, 9, 16, 3, 1, 10, 0, 
147         3, 1, 10, 16, 3, 1, 11, 0, 
148         3, 1, 11, 16, 3, 1, 12, 0, 
149         3, 1, 12, 16, 3, 1, 13, 0, 
150         3, 1, 13, 16, 3, 1, 14, 0, 
151         3, 1, 14, 16
152 };
154 static const short _svg_path_key_offsets[] = {
155         0, 7, 7, 16, 25, 28, 30, 42, 
156         52, 55, 57, 90, 121, 124, 126, 138, 
157         148, 151, 153, 186, 195, 207, 216, 249, 
158         256, 263, 265, 275, 283, 290, 292, 304, 
159         314, 317, 319, 328, 335, 341, 346, 353, 
160         359, 364, 374, 377, 379, 391, 401, 404, 
161         406, 437, 466, 476, 488, 498, 507, 509, 
162         521, 533, 544, 554, 561, 567, 572, 584, 
163         595, 607, 617, 620, 622, 655, 664, 695, 
164         704, 713, 716, 718, 730, 740, 743, 745, 
165         757, 767, 770, 772, 784, 794, 797, 799, 
166         811, 821, 824, 826, 838, 848, 851, 853, 
167         886, 917, 929, 938, 950, 959, 971, 980, 
168         992, 1001, 1013, 1022, 1055, 1059, 1061, 1092, 
169         1101, 1110, 1113, 1115, 1148, 1179, 1182, 1184, 
170         1217, 1226, 1259, 1263, 1265, 1296, 1305, 1314, 
171         1323, 1326, 1328, 1340, 1350, 1353, 1355, 1367, 
172         1377, 1380, 1382, 1394, 1404, 1407, 1409, 1442, 
173         1473, 1485, 1494, 1506, 1515, 1527, 1536, 1569, 
174         1573, 1575, 1606, 1615, 1624, 1627, 1629, 1641, 
175         1651, 1654, 1656, 1668, 1678, 1681, 1683, 1695, 
176         1705, 1708, 1710, 1743, 1774, 1786, 1795, 1807, 
177         1816, 1828, 1837, 1870, 1874, 1876, 1907, 1916, 
178         1925, 1928, 1930, 1942, 1952, 1955, 1957, 1990, 
179         2021, 2033, 2042, 2075, 2079, 2081, 2112, 2121, 
180         2130, 2133, 2135, 2168, 2199, 2202, 2204, 2237, 
181         2246, 2279, 2283, 2285, 2316, 2341, 2366, 2373, 
182         2382, 2391, 2424, 2428, 2430, 2461, 2494, 2503, 
183         2512, 2524, 2533, 2566, 2570, 2572, 2603, 2612, 
184         2621, 2630, 2639, 2672, 2676, 2678, 2709, 2742, 
185         2746, 2748, 2758, 2791, 2795, 2797, 2807, 2811, 
186         2813, 2823, 2827, 2829, 2839, 2843, 2845, 2855, 
187         2859, 2861, 2871, 2875, 2877, 2887, 2891, 2893, 
188         2903, 2936, 2940, 2942, 2952, 2956, 2958, 2968, 
189         2972, 2974, 2984, 2988, 2990, 3000, 3004, 3006, 
190         3016, 3020, 3022, 3051, 3055, 3057, 3088, 3121, 
191         3130, 3142, 3146, 3148, 3158, 3170, 3175, 3185, 
192         3189, 3191, 3198, 3208, 3212, 3214, 3224, 3236, 
193         3248, 3260, 3264, 3266, 3276, 3288, 3292, 3294, 
194         3304, 3313, 3317, 3319, 3327, 3336, 3341, 3346, 
195         3358, 3362, 3364, 3395, 3399, 3401, 3411
196 };
198 static const char _svg_path_trans_keys[] = {
199         0, 13, 32, 77, 109, 9, 10, 13, 
200         32, 43, 45, 46, 9, 10, 48, 57, 
201         13, 32, 43, 45, 46, 9, 10, 48, 
202         57, 46, 48, 57, 48, 57, 13, 32, 
203         44, 46, 69, 101, 9, 10, 43, 45, 
204         48, 57, 13, 32, 44, 46, 9, 10, 
205         43, 45, 48, 57, 46, 48, 57, 48, 
206         57, 0, 13, 32, 44, 46, 65, 67, 
207         69, 72, 76, 77, 81, 83, 84, 86, 
208         90, 97, 99, 101, 104, 108, 109, 113, 
209         115, 116, 118, 122, 9, 10, 43, 45, 
210         48, 57, 0, 13, 32, 44, 46, 65, 
211         67, 72, 76, 77, 81, 83, 84, 86, 
212         90, 97, 99, 104, 108, 109, 113, 115, 
213         116, 118, 122, 9, 10, 43, 45, 48, 
214         57, 46, 48, 57, 48, 57, 13, 32, 
215         44, 46, 69, 101, 9, 10, 43, 45, 
216         48, 57, 13, 32, 44, 46, 9, 10, 
217         43, 45, 48, 57, 46, 48, 57, 48, 
218         57, 0, 13, 32, 44, 46, 65, 67, 
219         69, 72, 76, 77, 81, 83, 84, 86, 
220         90, 97, 99, 101, 104, 108, 109, 113, 
221         115, 116, 118, 122, 9, 10, 43, 45, 
222         48, 57, 13, 32, 43, 45, 46, 9, 
223         10, 48, 57, 13, 32, 44, 46, 69, 
224         101, 9, 10, 43, 45, 48, 57, 13, 
225         32, 43, 45, 46, 9, 10, 48, 57, 
226         0, 13, 32, 44, 46, 65, 67, 69, 
227         72, 76, 77, 81, 83, 84, 86, 90, 
228         97, 99, 101, 104, 108, 109, 113, 115, 
229         116, 118, 122, 9, 10, 43, 45, 48, 
230         57, 13, 32, 46, 9, 10, 48, 57, 
231         13, 32, 46, 9, 10, 48, 57, 48, 
232         57, 13, 32, 44, 46, 69, 101, 9, 
233         10, 48, 57, 13, 32, 44, 46, 9, 
234         10, 48, 57, 13, 32, 46, 9, 10, 
235         48, 57, 48, 57, 13, 32, 44, 46, 
236         69, 101, 9, 10, 43, 45, 48, 57, 
237         13, 32, 44, 46, 9, 10, 43, 45, 
238         48, 57, 46, 48, 57, 48, 57, 13, 
239         32, 44, 69, 101, 9, 10, 48, 57, 
240         13, 32, 44, 48, 49, 9, 10, 13, 
241         32, 48, 49, 9, 10, 13, 32, 44, 
242         9, 10, 13, 32, 44, 48, 49, 9, 
243         10, 13, 32, 48, 49, 9, 10, 13, 
244         32, 44, 9, 10, 13, 32, 44, 46, 
245         9, 10, 43, 45, 48, 57, 46, 48, 
246         57, 48, 57, 13, 32, 44, 46, 69, 
247         101, 9, 10, 43, 45, 48, 57, 13, 
248         32, 44, 46, 9, 10, 43, 45, 48, 
249         57, 46, 48, 57, 48, 57, 0, 13, 
250         32, 44, 46, 65, 67, 69, 72, 76, 
251         77, 81, 83, 84, 86, 90, 97, 99, 
252         101, 104, 108, 109, 113, 115, 116, 118, 
253         122, 9, 10, 48, 57, 0, 13, 32, 
254         44, 46, 65, 67, 72, 76, 77, 81, 
255         83, 84, 86, 90, 97, 99, 104, 108, 
256         109, 113, 115, 116, 118, 122, 9, 10, 
257         48, 57, 13, 32, 44, 46, 69, 101, 
258         9, 10, 48, 57, 13, 32, 44, 46, 
259         69, 101, 9, 10, 43, 45, 48, 57, 
260         13, 32, 44, 46, 9, 10, 43, 45, 
261         48, 57, 13, 32, 43, 45, 46, 9, 
262         10, 48, 57, 48, 57, 13, 32, 44, 
263         46, 69, 101, 9, 10, 43, 45, 48, 
264         57, 13, 32, 44, 46, 48, 49, 9, 
265         10, 43, 45, 50, 57, 13, 32, 43, 
266         45, 46, 48, 49, 9, 10, 50, 57, 
267         13, 32, 44, 46, 69, 101, 9, 10, 
268         48, 57, 13, 32, 44, 48, 49, 9, 
269         10, 13, 32, 48, 49, 9, 10, 13, 
270         32, 44, 9, 10, 13, 32, 44, 46, 
271         48, 49, 9, 10, 43, 45, 50, 57, 
272         13, 32, 43, 45, 46, 48, 49, 9, 
273         10, 50, 57, 13, 32, 44, 46, 69, 
274         101, 9, 10, 43, 45, 48, 57, 13, 
275         32, 44, 46, 9, 10, 43, 45, 48, 
276         57, 46, 48, 57, 48, 57, 0, 13, 
277         32, 44, 46, 65, 67, 69, 72, 76, 
278         77, 81, 83, 84, 86, 90, 97, 99, 
279         101, 104, 108, 109, 113, 115, 116, 118, 
280         122, 9, 10, 43, 45, 48, 57, 13, 
281         32, 43, 45, 46, 9, 10, 48, 57, 
282         0, 13, 32, 44, 46, 65, 67, 69, 
283         72, 76, 77, 81, 83, 84, 86, 90, 
284         97, 99, 101, 104, 108, 109, 113, 115, 
285         116, 118, 122, 9, 10, 48, 57, 13, 
286         32, 43, 45, 46, 9, 10, 48, 57, 
287         13, 32, 43, 45, 46, 9, 10, 48, 
288         57, 46, 48, 57, 48, 57, 13, 32, 
289         44, 46, 69, 101, 9, 10, 43, 45, 
290         48, 57, 13, 32, 44, 46, 9, 10, 
291         43, 45, 48, 57, 46, 48, 57, 48, 
292         57, 13, 32, 44, 46, 69, 101, 9, 
293         10, 43, 45, 48, 57, 13, 32, 44, 
294         46, 9, 10, 43, 45, 48, 57, 46, 
295         48, 57, 48, 57, 13, 32, 44, 46, 
296         69, 101, 9, 10, 43, 45, 48, 57, 
297         13, 32, 44, 46, 9, 10, 43, 45, 
298         48, 57, 46, 48, 57, 48, 57, 13, 
299         32, 44, 46, 69, 101, 9, 10, 43, 
300         45, 48, 57, 13, 32, 44, 46, 9, 
301         10, 43, 45, 48, 57, 46, 48, 57, 
302         48, 57, 13, 32, 44, 46, 69, 101, 
303         9, 10, 43, 45, 48, 57, 13, 32, 
304         44, 46, 9, 10, 43, 45, 48, 57, 
305         46, 48, 57, 48, 57, 0, 13, 32, 
306         44, 46, 65, 67, 69, 72, 76, 77, 
307         81, 83, 84, 86, 90, 97, 99, 101, 
308         104, 108, 109, 113, 115, 116, 118, 122, 
309         9, 10, 43, 45, 48, 57, 0, 13, 
310         32, 44, 46, 65, 67, 72, 76, 77, 
311         81, 83, 84, 86, 90, 97, 99, 104, 
312         108, 109, 113, 115, 116, 118, 122, 9, 
313         10, 43, 45, 48, 57, 13, 32, 44, 
314         46, 69, 101, 9, 10, 43, 45, 48, 
315         57, 13, 32, 43, 45, 46, 9, 10, 
316         48, 57, 13, 32, 44, 46, 69, 101, 
317         9, 10, 43, 45, 48, 57, 13, 32, 
318         43, 45, 46, 9, 10, 48, 57, 13, 
319         32, 44, 46, 69, 101, 9, 10, 43, 
320         45, 48, 57, 13, 32, 43, 45, 46, 
321         9, 10, 48, 57, 13, 32, 44, 46, 
322         69, 101, 9, 10, 43, 45, 48, 57, 
323         13, 32, 43, 45, 46, 9, 10, 48, 
324         57, 13, 32, 44, 46, 69, 101, 9, 
325         10, 43, 45, 48, 57, 13, 32, 43, 
326         45, 46, 9, 10, 48, 57, 0, 13, 
327         32, 44, 46, 65, 67, 69, 72, 76, 
328         77, 81, 83, 84, 86, 90, 97, 99, 
329         101, 104, 108, 109, 113, 115, 116, 118, 
330         122, 9, 10, 43, 45, 48, 57, 43, 
331         45, 48, 57, 48, 57, 0, 13, 32, 
332         44, 46, 65, 67, 72, 76, 77, 81, 
333         83, 84, 86, 90, 97, 99, 104, 108, 
334         109, 113, 115, 116, 118, 122, 9, 10, 
335         43, 45, 48, 57, 13, 32, 43, 45, 
336         46, 9, 10, 48, 57, 13, 32, 43, 
337         45, 46, 9, 10, 48, 57, 46, 48, 
338         57, 48, 57, 0, 13, 32, 44, 46, 
339         65, 67, 69, 72, 76, 77, 81, 83, 
340         84, 86, 90, 97, 99, 101, 104, 108, 
341         109, 113, 115, 116, 118, 122, 9, 10, 
342         43, 45, 48, 57, 0, 13, 32, 44, 
343         46, 65, 67, 72, 76, 77, 81, 83, 
344         84, 86, 90, 97, 99, 104, 108, 109, 
345         113, 115, 116, 118, 122, 9, 10, 43, 
346         45, 48, 57, 46, 48, 57, 48, 57, 
347         0, 13, 32, 44, 46, 65, 67, 69, 
348         72, 76, 77, 81, 83, 84, 86, 90, 
349         97, 99, 101, 104, 108, 109, 113, 115, 
350         116, 118, 122, 9, 10, 43, 45, 48, 
351         57, 13, 32, 43, 45, 46, 9, 10, 
352         48, 57, 0, 13, 32, 44, 46, 65, 
353         67, 69, 72, 76, 77, 81, 83, 84, 
354         86, 90, 97, 99, 101, 104, 108, 109, 
355         113, 115, 116, 118, 122, 9, 10, 43, 
356         45, 48, 57, 43, 45, 48, 57, 48, 
357         57, 0, 13, 32, 44, 46, 65, 67, 
358         72, 76, 77, 81, 83, 84, 86, 90, 
359         97, 99, 104, 108, 109, 113, 115, 116, 
360         118, 122, 9, 10, 43, 45, 48, 57, 
361         13, 32, 43, 45, 46, 9, 10, 48, 
362         57, 13, 32, 43, 45, 46, 9, 10, 
363         48, 57, 13, 32, 43, 45, 46, 9, 
364         10, 48, 57, 46, 48, 57, 48, 57, 
365         13, 32, 44, 46, 69, 101, 9, 10, 
366         43, 45, 48, 57, 13, 32, 44, 46, 
367         9, 10, 43, 45, 48, 57, 46, 48, 
368         57, 48, 57, 13, 32, 44, 46, 69, 
369         101, 9, 10, 43, 45, 48, 57, 13, 
370         32, 44, 46, 9, 10, 43, 45, 48, 
371         57, 46, 48, 57, 48, 57, 13, 32, 
372         44, 46, 69, 101, 9, 10, 43, 45, 
373         48, 57, 13, 32, 44, 46, 9, 10, 
374         43, 45, 48, 57, 46, 48, 57, 48, 
375         57, 0, 13, 32, 44, 46, 65, 67, 
376         69, 72, 76, 77, 81, 83, 84, 86, 
377         90, 97, 99, 101, 104, 108, 109, 113, 
378         115, 116, 118, 122, 9, 10, 43, 45, 
379         48, 57, 0, 13, 32, 44, 46, 65, 
380         67, 72, 76, 77, 81, 83, 84, 86, 
381         90, 97, 99, 104, 108, 109, 113, 115, 
382         116, 118, 122, 9, 10, 43, 45, 48, 
383         57, 13, 32, 44, 46, 69, 101, 9, 
384         10, 43, 45, 48, 57, 13, 32, 43, 
385         45, 46, 9, 10, 48, 57, 13, 32, 
386         44, 46, 69, 101, 9, 10, 43, 45, 
387         48, 57, 13, 32, 43, 45, 46, 9, 
388         10, 48, 57, 13, 32, 44, 46, 69, 
389         101, 9, 10, 43, 45, 48, 57, 13, 
390         32, 43, 45, 46, 9, 10, 48, 57, 
391         0, 13, 32, 44, 46, 65, 67, 69, 
392         72, 76, 77, 81, 83, 84, 86, 90, 
393         97, 99, 101, 104, 108, 109, 113, 115, 
394         116, 118, 122, 9, 10, 43, 45, 48, 
395         57, 43, 45, 48, 57, 48, 57, 0, 
396         13, 32, 44, 46, 65, 67, 72, 76, 
397         77, 81, 83, 84, 86, 90, 97, 99, 
398         104, 108, 109, 113, 115, 116, 118, 122, 
399         9, 10, 43, 45, 48, 57, 13, 32, 
400         43, 45, 46, 9, 10, 48, 57, 13, 
401         32, 43, 45, 46, 9, 10, 48, 57, 
402         46, 48, 57, 48, 57, 13, 32, 44, 
403         46, 69, 101, 9, 10, 43, 45, 48, 
404         57, 13, 32, 44, 46, 9, 10, 43, 
405         45, 48, 57, 46, 48, 57, 48, 57, 
406         13, 32, 44, 46, 69, 101, 9, 10, 
407         43, 45, 48, 57, 13, 32, 44, 46, 
408         9, 10, 43, 45, 48, 57, 46, 48, 
409         57, 48, 57, 13, 32, 44, 46, 69, 
410         101, 9, 10, 43, 45, 48, 57, 13, 
411         32, 44, 46, 9, 10, 43, 45, 48, 
412         57, 46, 48, 57, 48, 57, 0, 13, 
413         32, 44, 46, 65, 67, 69, 72, 76, 
414         77, 81, 83, 84, 86, 90, 97, 99, 
415         101, 104, 108, 109, 113, 115, 116, 118, 
416         122, 9, 10, 43, 45, 48, 57, 0, 
417         13, 32, 44, 46, 65, 67, 72, 76, 
418         77, 81, 83, 84, 86, 90, 97, 99, 
419         104, 108, 109, 113, 115, 116, 118, 122, 
420         9, 10, 43, 45, 48, 57, 13, 32, 
421         44, 46, 69, 101, 9, 10, 43, 45, 
422         48, 57, 13, 32, 43, 45, 46, 9, 
423         10, 48, 57, 13, 32, 44, 46, 69, 
424         101, 9, 10, 43, 45, 48, 57, 13, 
425         32, 43, 45, 46, 9, 10, 48, 57, 
426         13, 32, 44, 46, 69, 101, 9, 10, 
427         43, 45, 48, 57, 13, 32, 43, 45, 
428         46, 9, 10, 48, 57, 0, 13, 32, 
429         44, 46, 65, 67, 69, 72, 76, 77, 
430         81, 83, 84, 86, 90, 97, 99, 101, 
431         104, 108, 109, 113, 115, 116, 118, 122, 
432         9, 10, 43, 45, 48, 57, 43, 45, 
433         48, 57, 48, 57, 0, 13, 32, 44, 
434         46, 65, 67, 72, 76, 77, 81, 83, 
435         84, 86, 90, 97, 99, 104, 108, 109, 
436         113, 115, 116, 118, 122, 9, 10, 43, 
437         45, 48, 57, 13, 32, 43, 45, 46, 
438         9, 10, 48, 57, 13, 32, 43, 45, 
439         46, 9, 10, 48, 57, 46, 48, 57, 
440         48, 57, 13, 32, 44, 46, 69, 101, 
441         9, 10, 43, 45, 48, 57, 13, 32, 
442         44, 46, 9, 10, 43, 45, 48, 57, 
443         46, 48, 57, 48, 57, 0, 13, 32, 
444         44, 46, 65, 67, 69, 72, 76, 77, 
445         81, 83, 84, 86, 90, 97, 99, 101, 
446         104, 108, 109, 113, 115, 116, 118, 122, 
447         9, 10, 43, 45, 48, 57, 0, 13, 
448         32, 44, 46, 65, 67, 72, 76, 77, 
449         81, 83, 84, 86, 90, 97, 99, 104, 
450         108, 109, 113, 115, 116, 118, 122, 9, 
451         10, 43, 45, 48, 57, 13, 32, 44, 
452         46, 69, 101, 9, 10, 43, 45, 48, 
453         57, 13, 32, 43, 45, 46, 9, 10, 
454         48, 57, 0, 13, 32, 44, 46, 65, 
455         67, 69, 72, 76, 77, 81, 83, 84, 
456         86, 90, 97, 99, 101, 104, 108, 109, 
457         113, 115, 116, 118, 122, 9, 10, 43, 
458         45, 48, 57, 43, 45, 48, 57, 48, 
459         57, 0, 13, 32, 44, 46, 65, 67, 
460         72, 76, 77, 81, 83, 84, 86, 90, 
461         97, 99, 104, 108, 109, 113, 115, 116, 
462         118, 122, 9, 10, 43, 45, 48, 57, 
463         13, 32, 43, 45, 46, 9, 10, 48, 
464         57, 13, 32, 43, 45, 46, 9, 10, 
465         48, 57, 46, 48, 57, 48, 57, 0, 
466         13, 32, 44, 46, 65, 67, 69, 72, 
467         76, 77, 81, 83, 84, 86, 90, 97, 
468         99, 101, 104, 108, 109, 113, 115, 116, 
469         118, 122, 9, 10, 43, 45, 48, 57, 
470         0, 13, 32, 44, 46, 65, 67, 72, 
471         76, 77, 81, 83, 84, 86, 90, 97, 
472         99, 104, 108, 109, 113, 115, 116, 118, 
473         122, 9, 10, 43, 45, 48, 57, 46, 
474         48, 57, 48, 57, 0, 13, 32, 44, 
475         46, 65, 67, 69, 72, 76, 77, 81, 
476         83, 84, 86, 90, 97, 99, 101, 104, 
477         108, 109, 113, 115, 116, 118, 122, 9, 
478         10, 43, 45, 48, 57, 13, 32, 43, 
479         45, 46, 9, 10, 48, 57, 0, 13, 
480         32, 44, 46, 65, 67, 69, 72, 76, 
481         77, 81, 83, 84, 86, 90, 97, 99, 
482         101, 104, 108, 109, 113, 115, 116, 118, 
483         122, 9, 10, 43, 45, 48, 57, 43, 
484         45, 48, 57, 48, 57, 0, 13, 32, 
485         44, 46, 65, 67, 72, 76, 77, 81, 
486         83, 84, 86, 90, 97, 99, 104, 108, 
487         109, 113, 115, 116, 118, 122, 9, 10, 
488         43, 45, 48, 57, 0, 13, 32, 65, 
489         67, 72, 76, 77, 81, 83, 84, 86, 
490         90, 97, 99, 104, 108, 109, 113, 115, 
491         116, 118, 122, 9, 10, 0, 13, 32, 
492         65, 67, 72, 76, 77, 81, 83, 84, 
493         86, 90, 97, 99, 104, 108, 109, 113, 
494         115, 116, 118, 122, 9, 10, 13, 32, 
495         46, 9, 10, 48, 57, 13, 32, 43, 
496         45, 46, 9, 10, 48, 57, 13, 32, 
497         43, 45, 46, 9, 10, 48, 57, 0, 
498         13, 32, 44, 46, 65, 67, 69, 72, 
499         76, 77, 81, 83, 84, 86, 90, 97, 
500         99, 101, 104, 108, 109, 113, 115, 116, 
501         118, 122, 9, 10, 43, 45, 48, 57, 
502         43, 45, 48, 57, 48, 57, 0, 13, 
503         32, 44, 46, 65, 67, 72, 76, 77, 
504         81, 83, 84, 86, 90, 97, 99, 104, 
505         108, 109, 113, 115, 116, 118, 122, 9, 
506         10, 43, 45, 48, 57, 0, 13, 32, 
507         44, 46, 65, 67, 69, 72, 76, 77, 
508         81, 83, 84, 86, 90, 97, 99, 101, 
509         104, 108, 109, 113, 115, 116, 118, 122, 
510         9, 10, 43, 45, 48, 57, 13, 32, 
511         43, 45, 46, 9, 10, 48, 57, 13, 
512         32, 43, 45, 46, 9, 10, 48, 57, 
513         13, 32, 44, 46, 69, 101, 9, 10, 
514         43, 45, 48, 57, 13, 32, 43, 45, 
515         46, 9, 10, 48, 57, 0, 13, 32, 
516         44, 46, 65, 67, 69, 72, 76, 77, 
517         81, 83, 84, 86, 90, 97, 99, 101, 
518         104, 108, 109, 113, 115, 116, 118, 122, 
519         9, 10, 43, 45, 48, 57, 43, 45, 
520         48, 57, 48, 57, 0, 13, 32, 44, 
521         46, 65, 67, 72, 76, 77, 81, 83, 
522         84, 86, 90, 97, 99, 104, 108, 109, 
523         113, 115, 116, 118, 122, 9, 10, 43, 
524         45, 48, 57, 13, 32, 43, 45, 46, 
525         9, 10, 48, 57, 13, 32, 43, 45, 
526         46, 9, 10, 48, 57, 13, 32, 43, 
527         45, 46, 9, 10, 48, 57, 13, 32, 
528         43, 45, 46, 9, 10, 48, 57, 0, 
529         13, 32, 44, 46, 65, 67, 69, 72, 
530         76, 77, 81, 83, 84, 86, 90, 97, 
531         99, 101, 104, 108, 109, 113, 115, 116, 
532         118, 122, 9, 10, 43, 45, 48, 57, 
533         43, 45, 48, 57, 48, 57, 0, 13, 
534         32, 44, 46, 65, 67, 72, 76, 77, 
535         81, 83, 84, 86, 90, 97, 99, 104, 
536         108, 109, 113, 115, 116, 118, 122, 9, 
537         10, 43, 45, 48, 57, 0, 13, 32, 
538         44, 46, 65, 67, 69, 72, 76, 77, 
539         81, 83, 84, 86, 90, 97, 99, 101, 
540         104, 108, 109, 113, 115, 116, 118, 122, 
541         9, 10, 43, 45, 48, 57, 43, 45, 
542         48, 57, 48, 57, 13, 32, 44, 46, 
543         9, 10, 43, 45, 48, 57, 0, 13, 
544         32, 44, 46, 65, 67, 69, 72, 76, 
545         77, 81, 83, 84, 86, 90, 97, 99, 
546         101, 104, 108, 109, 113, 115, 116, 118, 
547         122, 9, 10, 43, 45, 48, 57, 43, 
548         45, 48, 57, 48, 57, 13, 32, 44, 
549         46, 9, 10, 43, 45, 48, 57, 43, 
550         45, 48, 57, 48, 57, 13, 32, 44, 
551         46, 9, 10, 43, 45, 48, 57, 43, 
552         45, 48, 57, 48, 57, 13, 32, 44, 
553         46, 9, 10, 43, 45, 48, 57, 43, 
554         45, 48, 57, 48, 57, 13, 32, 44, 
555         46, 9, 10, 43, 45, 48, 57, 43, 
556         45, 48, 57, 48, 57, 13, 32, 44, 
557         46, 9, 10, 43, 45, 48, 57, 43, 
558         45, 48, 57, 48, 57, 13, 32, 44, 
559         46, 9, 10, 43, 45, 48, 57, 43, 
560         45, 48, 57, 48, 57, 13, 32, 44, 
561         46, 9, 10, 43, 45, 48, 57, 0, 
562         13, 32, 44, 46, 65, 67, 69, 72, 
563         76, 77, 81, 83, 84, 86, 90, 97, 
564         99, 101, 104, 108, 109, 113, 115, 116, 
565         118, 122, 9, 10, 43, 45, 48, 57, 
566         43, 45, 48, 57, 48, 57, 13, 32, 
567         44, 46, 9, 10, 43, 45, 48, 57, 
568         43, 45, 48, 57, 48, 57, 13, 32, 
569         44, 46, 9, 10, 43, 45, 48, 57, 
570         43, 45, 48, 57, 48, 57, 13, 32, 
571         44, 46, 9, 10, 43, 45, 48, 57, 
572         43, 45, 48, 57, 48, 57, 13, 32, 
573         44, 46, 9, 10, 43, 45, 48, 57, 
574         43, 45, 48, 57, 48, 57, 13, 32, 
575         44, 46, 9, 10, 43, 45, 48, 57, 
576         43, 45, 48, 57, 48, 57, 0, 13, 
577         32, 44, 46, 65, 67, 72, 76, 77, 
578         81, 83, 84, 86, 90, 97, 99, 104, 
579         108, 109, 113, 115, 116, 118, 122, 9, 
580         10, 48, 57, 43, 45, 48, 57, 48, 
581         57, 0, 13, 32, 44, 46, 65, 67, 
582         72, 76, 77, 81, 83, 84, 86, 90, 
583         97, 99, 104, 108, 109, 113, 115, 116, 
584         118, 122, 9, 10, 43, 45, 48, 57, 
585         0, 13, 32, 44, 46, 65, 67, 69, 
586         72, 76, 77, 81, 83, 84, 86, 90, 
587         97, 99, 101, 104, 108, 109, 113, 115, 
588         116, 118, 122, 9, 10, 43, 45, 48, 
589         57, 13, 32, 43, 45, 46, 9, 10, 
590         48, 57, 13, 32, 44, 46, 69, 101, 
591         9, 10, 43, 45, 48, 57, 43, 45, 
592         48, 57, 48, 57, 13, 32, 44, 46, 
593         9, 10, 43, 45, 48, 57, 13, 32, 
594         44, 46, 69, 101, 9, 10, 43, 45, 
595         48, 57, 13, 32, 44, 9, 10, 13, 
596         32, 44, 46, 69, 101, 9, 10, 48, 
597         57, 43, 45, 48, 57, 48, 57, 13, 
598         32, 44, 9, 10, 48, 57, 13, 32, 
599         44, 46, 69, 101, 9, 10, 48, 57, 
600         43, 45, 48, 57, 48, 57, 13, 32, 
601         44, 46, 9, 10, 43, 45, 48, 57, 
602         13, 32, 44, 46, 69, 101, 9, 10, 
603         43, 45, 48, 57, 13, 32, 44, 46, 
604         69, 101, 9, 10, 43, 45, 48, 57, 
605         13, 32, 44, 46, 69, 101, 9, 10, 
606         43, 45, 48, 57, 43, 45, 48, 57, 
607         48, 57, 13, 32, 44, 46, 9, 10, 
608         43, 45, 48, 57, 13, 32, 44, 46, 
609         69, 101, 9, 10, 43, 45, 48, 57, 
610         43, 45, 48, 57, 48, 57, 13, 32, 
611         44, 46, 9, 10, 43, 45, 48, 57, 
612         13, 32, 43, 45, 46, 9, 10, 48, 
613         57, 43, 45, 48, 57, 48, 57, 13, 
614         32, 44, 46, 9, 10, 48, 57, 13, 
615         32, 43, 45, 46, 9, 10, 48, 57, 
616         13, 32, 44, 9, 10, 13, 32, 44, 
617         9, 10, 13, 32, 44, 46, 69, 101, 
618         9, 10, 43, 45, 48, 57, 43, 45, 
619         48, 57, 48, 57, 0, 13, 32, 44, 
620         46, 65, 67, 72, 76, 77, 81, 83, 
621         84, 86, 90, 97, 99, 104, 108, 109, 
622         113, 115, 116, 118, 122, 9, 10, 43, 
623         45, 48, 57, 43, 45, 48, 57, 48, 
624         57, 13, 32, 44, 46, 9, 10, 43, 
625         45, 48, 57, 0
626 };
628 static const char _svg_path_single_lengths[] = {
629         5, 0, 5, 5, 1, 0, 6, 4, 
630         1, 0, 27, 25, 1, 0, 6, 4, 
631         1, 0, 27, 5, 6, 5, 27, 3, 
632         3, 0, 6, 4, 3, 0, 6, 4, 
633         1, 0, 5, 5, 4, 3, 5, 4, 
634         3, 4, 1, 0, 6, 4, 1, 0, 
635         27, 25, 6, 6, 4, 5, 0, 6, 
636         6, 7, 6, 5, 4, 3, 6, 7, 
637         6, 4, 1, 0, 27, 5, 27, 5, 
638         5, 1, 0, 6, 4, 1, 0, 6, 
639         4, 1, 0, 6, 4, 1, 0, 6, 
640         4, 1, 0, 6, 4, 1, 0, 27, 
641         25, 6, 5, 6, 5, 6, 5, 6, 
642         5, 6, 5, 27, 2, 0, 25, 5, 
643         5, 1, 0, 27, 25, 1, 0, 27, 
644         5, 27, 2, 0, 25, 5, 5, 5, 
645         1, 0, 6, 4, 1, 0, 6, 4, 
646         1, 0, 6, 4, 1, 0, 27, 25, 
647         6, 5, 6, 5, 6, 5, 27, 2, 
648         0, 25, 5, 5, 1, 0, 6, 4, 
649         1, 0, 6, 4, 1, 0, 6, 4, 
650         1, 0, 27, 25, 6, 5, 6, 5, 
651         6, 5, 27, 2, 0, 25, 5, 5, 
652         1, 0, 6, 4, 1, 0, 27, 25, 
653         6, 5, 27, 2, 0, 25, 5, 5, 
654         1, 0, 27, 25, 1, 0, 27, 5, 
655         27, 2, 0, 25, 23, 23, 3, 5, 
656         5, 27, 2, 0, 25, 27, 5, 5, 
657         6, 5, 27, 2, 0, 25, 5, 5, 
658         5, 5, 27, 2, 0, 25, 27, 2, 
659         0, 4, 27, 2, 0, 4, 2, 0, 
660         4, 2, 0, 4, 2, 0, 4, 2, 
661         0, 4, 2, 0, 4, 2, 0, 4, 
662         27, 2, 0, 4, 2, 0, 4, 2, 
663         0, 4, 2, 0, 4, 2, 0, 4, 
664         2, 0, 25, 2, 0, 25, 27, 5, 
665         6, 2, 0, 4, 6, 3, 6, 2, 
666         0, 3, 6, 2, 0, 4, 6, 6, 
667         6, 2, 0, 4, 6, 2, 0, 4, 
668         5, 2, 0, 4, 5, 3, 3, 6, 
669         2, 0, 25, 2, 0, 4, 0
670 };
672 static const char _svg_path_range_lengths[] = {
673         1, 0, 2, 2, 1, 1, 3, 3, 
674         1, 1, 3, 3, 1, 1, 3, 3, 
675         1, 1, 3, 2, 3, 2, 3, 2, 
676         2, 1, 2, 2, 2, 1, 3, 3, 
677         1, 1, 2, 1, 1, 1, 1, 1, 
678         1, 3, 1, 1, 3, 3, 1, 1, 
679         2, 2, 2, 3, 3, 2, 1, 3, 
680         3, 2, 2, 1, 1, 1, 3, 2, 
681         3, 3, 1, 1, 3, 2, 2, 2, 
682         2, 1, 1, 3, 3, 1, 1, 3, 
683         3, 1, 1, 3, 3, 1, 1, 3, 
684         3, 1, 1, 3, 3, 1, 1, 3, 
685         3, 3, 2, 3, 2, 3, 2, 3, 
686         2, 3, 2, 3, 1, 1, 3, 2, 
687         2, 1, 1, 3, 3, 1, 1, 3, 
688         2, 3, 1, 1, 3, 2, 2, 2, 
689         1, 1, 3, 3, 1, 1, 3, 3, 
690         1, 1, 3, 3, 1, 1, 3, 3, 
691         3, 2, 3, 2, 3, 2, 3, 1, 
692         1, 3, 2, 2, 1, 1, 3, 3, 
693         1, 1, 3, 3, 1, 1, 3, 3, 
694         1, 1, 3, 3, 3, 2, 3, 2, 
695         3, 2, 3, 1, 1, 3, 2, 2, 
696         1, 1, 3, 3, 1, 1, 3, 3, 
697         3, 2, 3, 1, 1, 3, 2, 2, 
698         1, 1, 3, 3, 1, 1, 3, 2, 
699         3, 1, 1, 3, 1, 1, 2, 2, 
700         2, 3, 1, 1, 3, 3, 2, 2, 
701         3, 2, 3, 1, 1, 3, 2, 2, 
702         2, 2, 3, 1, 1, 3, 3, 1, 
703         1, 3, 3, 1, 1, 3, 1, 1, 
704         3, 1, 1, 3, 1, 1, 3, 1, 
705         1, 3, 1, 1, 3, 1, 1, 3, 
706         3, 1, 1, 3, 1, 1, 3, 1, 
707         1, 3, 1, 1, 3, 1, 1, 3, 
708         1, 1, 2, 1, 1, 3, 3, 2, 
709         3, 1, 1, 3, 3, 1, 2, 1, 
710         1, 2, 2, 1, 1, 3, 3, 3, 
711         3, 1, 1, 3, 3, 1, 1, 3, 
712         2, 1, 1, 2, 2, 1, 1, 3, 
713         1, 1, 3, 1, 1, 3, 0
714 };
716 static const short _svg_path_index_offsets[] = {
717         0, 7, 7, 15, 23, 26, 28, 38, 
718         46, 49, 51, 82, 111, 114, 116, 126, 
719         134, 137, 139, 170, 178, 188, 196, 227, 
720         233, 239, 241, 250, 257, 263, 265, 275, 
721         283, 286, 288, 296, 303, 309, 314, 321, 
722         327, 332, 340, 343, 345, 355, 363, 366, 
723         368, 398, 426, 435, 445, 453, 461, 463, 
724         473, 483, 493, 502, 509, 515, 520, 530, 
725         540, 550, 558, 561, 563, 594, 602, 632, 
726         640, 648, 651, 653, 663, 671, 674, 676, 
727         686, 694, 697, 699, 709, 717, 720, 722, 
728         732, 740, 743, 745, 755, 763, 766, 768, 
729         799, 828, 838, 846, 856, 864, 874, 882, 
730         892, 900, 910, 918, 949, 953, 955, 984, 
731         992, 1000, 1003, 1005, 1036, 1065, 1068, 1070, 
732         1101, 1109, 1140, 1144, 1146, 1175, 1183, 1191, 
733         1199, 1202, 1204, 1214, 1222, 1225, 1227, 1237, 
734         1245, 1248, 1250, 1260, 1268, 1271, 1273, 1304, 
735         1333, 1343, 1351, 1361, 1369, 1379, 1387, 1418, 
736         1422, 1424, 1453, 1461, 1469, 1472, 1474, 1484, 
737         1492, 1495, 1497, 1507, 1515, 1518, 1520, 1530, 
738         1538, 1541, 1543, 1574, 1603, 1613, 1621, 1631, 
739         1639, 1649, 1657, 1688, 1692, 1694, 1723, 1731, 
740         1739, 1742, 1744, 1754, 1762, 1765, 1767, 1798, 
741         1827, 1837, 1845, 1876, 1880, 1882, 1911, 1919, 
742         1927, 1930, 1932, 1963, 1992, 1995, 1997, 2028, 
743         2036, 2067, 2071, 2073, 2102, 2127, 2152, 2158, 
744         2166, 2174, 2205, 2209, 2211, 2240, 2271, 2279, 
745         2287, 2297, 2305, 2336, 2340, 2342, 2371, 2379, 
746         2387, 2395, 2403, 2434, 2438, 2440, 2469, 2500, 
747         2504, 2506, 2514, 2545, 2549, 2551, 2559, 2563, 
748         2565, 2573, 2577, 2579, 2587, 2591, 2593, 2601, 
749         2605, 2607, 2615, 2619, 2621, 2629, 2633, 2635, 
750         2643, 2674, 2678, 2680, 2688, 2692, 2694, 2702, 
751         2706, 2708, 2716, 2720, 2722, 2730, 2734, 2736, 
752         2744, 2748, 2750, 2778, 2782, 2784, 2813, 2844, 
753         2852, 2862, 2866, 2868, 2876, 2886, 2891, 2900, 
754         2904, 2906, 2912, 2921, 2925, 2927, 2935, 2945, 
755         2955, 2965, 2969, 2971, 2979, 2989, 2993, 2995, 
756         3003, 3011, 3015, 3017, 3024, 3032, 3037, 3042, 
757         3052, 3056, 3058, 3087, 3091, 3093, 3101
758 };
760 static const short _svg_path_indicies[] = {
761         73, 74, 74, 75, 76, 74, 0, 571, 
762         571, 572, 572, 573, 571, 574, 0, 631, 
763         631, 632, 632, 633, 631, 634, 0, 670, 
764         513, 0, 512, 0, 509, 509, 511, 548, 
765         514, 514, 509, 510, 512, 0, 490, 490, 
766         434, 436, 490, 435, 437, 0, 393, 127, 
767         0, 126, 0, 122, 123, 123, 125, 148, 
768         128, 129, 130, 131, 132, 133, 134, 135, 
769         136, 137, 138, 139, 140, 130, 141, 142, 
770         143, 144, 145, 146, 147, 138, 123, 124, 
771         126, 0, 73, 611, 611, 613, 614, 78, 
772         79, 80, 81, 75, 82, 83, 84, 85, 
773         86, 87, 88, 89, 90, 76, 91, 92, 
774         93, 94, 86, 611, 612, 615, 0, 671, 
775         519, 0, 518, 0, 515, 515, 517, 550, 
776         520, 520, 515, 516, 518, 0, 491, 491, 
777         438, 440, 491, 439, 441, 0, 394, 155, 
778         0, 154, 0, 150, 151, 151, 153, 176, 
779         156, 157, 158, 159, 160, 161, 162, 163, 
780         164, 165, 166, 167, 168, 158, 169, 170, 
781         171, 172, 173, 174, 175, 166, 151, 152, 
782         154, 0, 613, 613, 612, 612, 614, 613, 
783         615, 0, 515, 515, 517, 518, 520, 520, 
784         515, 516, 519, 0, 438, 438, 439, 439, 
785         440, 438, 441, 0, 150, 151, 151, 153, 
786         154, 156, 157, 158, 159, 160, 161, 162, 
787         163, 164, 165, 166, 167, 168, 158, 169, 
788         170, 171, 172, 173, 174, 175, 166, 151, 
789         152, 155, 0, 47, 47, 48, 47, 49, 
790         0, 8, 8, 9, 8, 10, 0, 385, 
791         0, 25, 25, 26, 27, 31, 31, 25, 
792         498, 0, 12, 12, 13, 14, 12, 15, 
793         0, 13, 13, 14, 13, 15, 0, 35, 
794         0, 32, 32, 34, 38, 37, 37, 32, 
795         33, 35, 0, 20, 20, 16, 18, 20, 
796         17, 19, 0, 2, 3, 0, 23, 0, 
797         21, 21, 22, 24, 24, 21, 23, 0, 
798         11, 11, 5, 6, 7, 11, 0, 5, 
799         5, 6, 7, 5, 0, 45, 45, 46, 
800         45, 0, 722, 722, 716, 717, 718, 722, 
801         0, 716, 716, 717, 718, 716, 0, 567, 
802         567, 568, 567, 0, 651, 651, 647, 430, 
803         651, 429, 433, 0, 676, 69, 0, 68, 
804         0, 351, 351, 352, 375, 70, 70, 351, 
805         66, 68, 0, 497, 497, 478, 480, 497, 
806         479, 481, 0, 406, 380, 0, 379, 0, 
807         350, 377, 377, 378, 382, 355, 356, 381, 
808         358, 359, 360, 361, 362, 363, 364, 365, 
809         366, 367, 381, 368, 369, 370, 371, 372, 
810         373, 374, 365, 377, 379, 0, 73, 95, 
811         95, 8, 9, 78, 79, 80, 81, 75, 
812         82, 83, 84, 85, 86, 87, 88, 89, 
813         90, 76, 91, 92, 93, 94, 86, 95, 
814         10, 0, 25, 25, 26, 29, 31, 31, 
815         25, 30, 0, 40, 40, 41, 562, 561, 
816         561, 40, 33, 30, 0, 483, 483, 425, 
817         426, 483, 17, 427, 0, 425, 425, 17, 
818         17, 426, 425, 427, 0, 501, 0, 499, 
819         499, 500, 38, 503, 503, 499, 33, 501, 
820         0, 482, 482, 422, 18, 423, 424, 482, 
821         17, 19, 0, 422, 422, 17, 17, 18, 
822         423, 424, 422, 19, 0, 63, 63, 64, 
823         23, 24, 24, 63, 3, 0, 723, 723, 
824         719, 720, 721, 723, 0, 719, 719, 720, 
825         721, 719, 0, 569, 569, 570, 569, 0, 
826         489, 489, 428, 430, 431, 432, 489, 429, 
827         433, 0, 428, 428, 429, 429, 430, 431, 
828         432, 428, 433, 0, 71, 71, 72, 68, 
829         70, 70, 71, 66, 69, 0, 496, 496, 
830         474, 476, 496, 475, 477, 0, 405, 354, 
831         0, 353, 0, 350, 351, 351, 352, 375, 
832         355, 356, 357, 358, 359, 360, 361, 362, 
833         363, 364, 365, 366, 367, 357, 368, 369, 
834         370, 371, 372, 373, 374, 365, 351, 66, 
835         353, 0, 478, 478, 479, 479, 480, 478, 
836         481, 0, 350, 377, 377, 378, 379, 355, 
837         356, 381, 358, 359, 360, 361, 362, 363, 
838         364, 365, 366, 367, 381, 368, 369, 370, 
839         371, 372, 373, 374, 365, 377, 380, 0, 
840         50, 50, 51, 51, 52, 50, 53, 0, 
841         98, 98, 97, 97, 99, 98, 100, 0, 
842         391, 392, 0, 507, 0, 504, 504, 506, 
843         546, 508, 508, 504, 505, 507, 0, 484, 
844         484, 486, 487, 484, 485, 488, 0, 790, 
845         788, 0, 755, 0, 751, 751, 753, 754, 
846         756, 756, 751, 752, 755, 0, 787, 787, 
847         773, 775, 787, 774, 776, 0, 748, 739, 
848         0, 710, 0, 689, 689, 691, 692, 711, 
849         711, 689, 690, 710, 0, 736, 736, 724, 
850         726, 736, 725, 727, 0, 677, 656, 0, 
851         655, 0, 652, 652, 654, 704, 657, 657, 
852         652, 653, 655, 0, 648, 648, 635, 637, 
853         648, 636, 638, 0, 672, 525, 0, 524, 
854         0, 521, 521, 523, 552, 526, 526, 521, 
855         522, 524, 0, 492, 492, 458, 460, 492, 
856         459, 461, 0, 401, 243, 0, 242, 0, 
857         238, 239, 239, 241, 264, 244, 245, 246, 
858         247, 248, 249, 250, 251, 252, 253, 254, 
859         255, 256, 246, 257, 258, 259, 260, 261, 
860         262, 263, 254, 239, 240, 242, 0, 73, 
861         96, 96, 98, 99, 78, 79, 80, 81, 
862         75, 82, 83, 84, 85, 86, 87, 88, 
863         89, 90, 76, 91, 92, 93, 94, 86, 
864         96, 97, 100, 0, 504, 504, 506, 507, 
865         508, 508, 504, 505, 392, 0, 486, 486, 
866         485, 485, 487, 486, 488, 0, 751, 751, 
867         753, 755, 756, 756, 751, 752, 788, 0, 
868         773, 773, 774, 774, 775, 773, 776, 0, 
869         689, 689, 691, 710, 711, 711, 689, 690, 
870         739, 0, 724, 724, 725, 725, 726, 724, 
871         727, 0, 652, 652, 654, 655, 657, 657, 
872         652, 653, 656, 0, 635, 635, 636, 636, 
873         637, 635, 638, 0, 521, 521, 523, 524, 
874         526, 526, 521, 522, 525, 0, 458, 458, 
875         459, 459, 460, 458, 461, 0, 238, 239, 
876         239, 241, 242, 244, 245, 246, 247, 248, 
877         249, 250, 251, 252, 253, 254, 255, 256, 
878         246, 257, 258, 259, 260, 261, 262, 263, 
879         254, 239, 240, 243, 0, 416, 416, 265, 
880         0, 265, 0, 238, 239, 239, 241, 264, 
881         244, 245, 247, 248, 249, 250, 251, 252, 
882         253, 254, 255, 256, 257, 258, 259, 260, 
883         261, 262, 263, 254, 239, 240, 265, 0, 
884         583, 583, 584, 584, 585, 583, 586, 0, 
885         446, 446, 447, 447, 448, 446, 449, 0, 
886         396, 397, 0, 388, 0, 178, 179, 179, 
887         181, 204, 184, 185, 624, 187, 188, 189, 
888         190, 191, 192, 193, 194, 195, 196, 624, 
889         197, 198, 199, 200, 201, 202, 203, 194, 
890         179, 180, 623, 0, 73, 621, 621, 442, 
891         444, 78, 79, 80, 81, 75, 82, 83, 
892         84, 85, 86, 87, 88, 89, 90, 76, 
893         91, 92, 93, 94, 86, 621, 443, 445, 
894         0, 395, 183, 0, 182, 0, 178, 179, 
895         179, 181, 204, 184, 185, 186, 187, 188, 
896         189, 190, 191, 192, 193, 194, 195, 196, 
897         186, 197, 198, 199, 200, 201, 202, 203, 
898         194, 179, 180, 182, 0, 442, 442, 443, 
899         443, 444, 442, 445, 0, 178, 179, 179, 
900         181, 182, 184, 185, 186, 187, 188, 189, 
901         190, 191, 192, 193, 194, 195, 196, 186, 
902         197, 198, 199, 200, 201, 202, 203, 194, 
903         179, 180, 183, 0, 412, 412, 205, 0, 
904         205, 0, 178, 179, 179, 181, 204, 184, 
905         185, 187, 188, 189, 190, 191, 192, 193, 
906         194, 195, 196, 197, 198, 199, 200, 201, 
907         202, 203, 194, 179, 180, 205, 0, 575, 
908         575, 576, 576, 577, 575, 578, 0, 769, 
909         769, 770, 770, 771, 769, 772, 0, 781, 
910         781, 782, 782, 783, 781, 784, 0, 750, 
911         741, 0, 714, 0, 699, 699, 701, 702, 
912         715, 715, 699, 700, 714, 0, 738, 738, 
913         732, 734, 738, 733, 735, 0, 679, 668, 
914         0, 667, 0, 664, 664, 666, 708, 669, 
915         669, 664, 665, 667, 0, 650, 650, 643, 
916         645, 650, 644, 646, 0, 674, 537, 0, 
917         536, 0, 533, 533, 535, 556, 538, 538, 
918         533, 534, 536, 0, 494, 494, 466, 468, 
919         494, 467, 469, 0, 403, 299, 0, 298, 
920         0, 294, 295, 295, 297, 320, 300, 301, 
921         302, 303, 304, 305, 306, 307, 308, 309, 
922         310, 311, 312, 302, 313, 314, 315, 316, 
923         317, 318, 319, 310, 295, 296, 298, 0, 
924         73, 786, 786, 781, 783, 78, 79, 80, 
925         81, 75, 82, 83, 84, 85, 86, 87, 
926         88, 89, 90, 76, 91, 92, 93, 94, 
927         86, 786, 782, 784, 0, 699, 699, 701, 
928         714, 715, 715, 699, 700, 741, 0, 732, 
929         732, 733, 733, 734, 732, 735, 0, 664, 
930         664, 666, 667, 669, 669, 664, 665, 668, 
931         0, 643, 643, 644, 644, 645, 643, 646, 
932         0, 533, 533, 535, 536, 538, 538, 533, 
933         534, 537, 0, 466, 466, 467, 467, 468, 
934         466, 469, 0, 294, 295, 295, 297, 298, 
935         300, 301, 302, 303, 304, 305, 306, 307, 
936         308, 309, 310, 311, 312, 302, 313, 314, 
937         315, 316, 317, 318, 319, 310, 295, 296, 
938         299, 0, 418, 418, 321, 0, 321, 0, 
939         294, 295, 295, 297, 320, 300, 301, 303, 
940         304, 305, 306, 307, 308, 309, 310, 311, 
941         312, 313, 314, 315, 316, 317, 318, 319, 
942         310, 295, 296, 321, 0, 765, 765, 766, 
943         766, 767, 765, 768, 0, 777, 777, 778, 
944         778, 779, 777, 780, 0, 749, 740, 0, 
945         712, 0, 694, 694, 696, 697, 713, 713, 
946         694, 695, 712, 0, 737, 737, 728, 730, 
947         737, 729, 731, 0, 678, 662, 0, 661, 
948         0, 658, 658, 660, 706, 663, 663, 658, 
949         659, 661, 0, 649, 649, 639, 641, 649, 
950         640, 642, 0, 673, 531, 0, 530, 0, 
951         527, 527, 529, 554, 532, 532, 527, 528, 
952         530, 0, 493, 493, 462, 464, 493, 463, 
953         465, 0, 402, 271, 0, 270, 0, 266, 
954         267, 267, 269, 292, 272, 273, 274, 275, 
955         276, 277, 278, 279, 280, 281, 282, 283, 
956         284, 274, 285, 286, 287, 288, 289, 290, 
957         291, 282, 267, 268, 270, 0, 73, 785, 
958         785, 777, 779, 78, 79, 80, 81, 75, 
959         82, 83, 84, 85, 86, 87, 88, 89, 
960         90, 76, 91, 92, 93, 94, 86, 785, 
961         778, 780, 0, 694, 694, 696, 712, 713, 
962         713, 694, 695, 740, 0, 728, 728, 729, 
963         729, 730, 728, 731, 0, 658, 658, 660, 
964         661, 663, 663, 658, 659, 662, 0, 639, 
965         639, 640, 640, 641, 639, 642, 0, 527, 
966         527, 529, 530, 532, 532, 527, 528, 531, 
967         0, 462, 462, 463, 463, 464, 462, 465, 
968         0, 266, 267, 267, 269, 270, 272, 273, 
969         274, 275, 276, 277, 278, 279, 280, 281, 
970         282, 283, 284, 274, 285, 286, 287, 288, 
971         289, 290, 291, 282, 267, 268, 271, 0, 
972         417, 417, 293, 0, 293, 0, 266, 267, 
973         267, 269, 292, 272, 273, 275, 276, 277, 
974         278, 279, 280, 281, 282, 283, 284, 285, 
975         286, 287, 288, 289, 290, 291, 282, 267, 
976         268, 293, 0, 579, 579, 580, 580, 581, 
977         579, 582, 0, 618, 618, 617, 617, 619, 
978         618, 620, 0, 675, 543, 0, 542, 0, 
979         539, 539, 541, 558, 544, 544, 539, 540, 
980         542, 0, 495, 495, 470, 472, 495, 471, 
981         473, 0, 404, 327, 0, 326, 0, 322, 
982         323, 323, 325, 348, 328, 329, 330, 331, 
983         332, 333, 334, 335, 336, 337, 338, 339, 
984         340, 330, 341, 342, 343, 344, 345, 346, 
985         347, 338, 323, 324, 326, 0, 73, 616, 
986         616, 618, 619, 78, 79, 80, 81, 75, 
987         82, 83, 84, 85, 86, 87, 88, 89, 
988         90, 76, 91, 92, 93, 94, 86, 616, 
989         617, 620, 0, 539, 539, 541, 542, 544, 
990         544, 539, 540, 543, 0, 470, 470, 471, 
991         471, 472, 470, 473, 0, 322, 323, 323, 
992         325, 326, 328, 329, 330, 331, 332, 333, 
993         334, 335, 336, 337, 338, 339, 340, 330, 
994         341, 342, 343, 344, 345, 346, 347, 338, 
995         323, 324, 327, 0, 419, 419, 349, 0, 
996         349, 0, 322, 323, 323, 325, 348, 328, 
997         329, 331, 332, 333, 334, 335, 336, 337, 
998         338, 339, 340, 341, 342, 343, 344, 345, 
999         346, 347, 338, 323, 324, 349, 0, 587, 
1000         587, 588, 588, 589, 587, 590, 0, 454, 
1001         454, 455, 455, 456, 454, 457, 0, 399, 
1002         400, 0, 390, 0, 208, 209, 209, 211, 
1003         234, 214, 215, 628, 217, 218, 219, 220, 
1004         221, 222, 223, 224, 225, 226, 628, 227, 
1005         228, 229, 230, 231, 232, 233, 224, 209, 
1006         210, 627, 0, 73, 622, 622, 450, 452, 
1007         78, 79, 80, 81, 75, 82, 83, 84, 
1008         85, 86, 87, 88, 89, 90, 76, 91, 
1009         92, 93, 94, 86, 622, 451, 453, 0, 
1010         398, 213, 0, 212, 0, 208, 209, 209, 
1011         211, 234, 214, 215, 216, 217, 218, 219, 
1012         220, 221, 222, 223, 224, 225, 226, 216, 
1013         227, 228, 229, 230, 231, 232, 233, 224, 
1014         209, 210, 212, 0, 450, 450, 451, 451, 
1015         452, 450, 453, 0, 208, 209, 209, 211, 
1016         212, 214, 215, 216, 217, 218, 219, 220, 
1017         221, 222, 223, 224, 225, 226, 216, 227, 
1018         228, 229, 230, 231, 232, 233, 224, 209, 
1019         210, 213, 0, 414, 414, 235, 0, 235, 
1020         0, 208, 209, 209, 211, 234, 214, 215, 
1021         217, 218, 219, 220, 221, 222, 223, 224, 
1022         225, 226, 227, 228, 229, 230, 231, 232, 
1023         233, 224, 209, 210, 235, 0, 101, 102, 
1024         102, 103, 104, 105, 106, 107, 108, 109, 
1025         110, 111, 112, 113, 114, 115, 116, 117, 
1026         118, 119, 120, 121, 112, 102, 0, 73, 
1027         77, 77, 78, 79, 80, 81, 75, 82, 
1028         83, 84, 85, 86, 87, 88, 89, 90, 
1029         76, 91, 92, 93, 94, 86, 77, 0, 
1030         54, 54, 55, 54, 56, 0, 57, 57, 
1031         58, 58, 59, 57, 60, 0, 603, 603, 
1032         604, 604, 605, 603, 606, 0, 178, 179, 
1033         179, 181, 625, 184, 185, 624, 187, 188, 
1034         189, 190, 191, 192, 193, 194, 195, 196, 
1035         624, 197, 198, 199, 200, 201, 202, 203, 
1036         194, 179, 180, 626, 0, 413, 413, 387, 
1037         0, 387, 0, 178, 179, 179, 181, 204, 
1038         184, 185, 187, 188, 189, 190, 191, 192, 
1039         193, 194, 195, 196, 197, 198, 199, 200, 
1040         201, 202, 203, 194, 179, 180, 206, 0, 
1041         178, 179, 179, 181, 207, 184, 185, 186, 
1042         187, 188, 189, 190, 191, 192, 193, 194, 
1043         195, 196, 186, 197, 198, 199, 200, 201, 
1044         202, 203, 194, 179, 180, 206, 0, 595, 
1045         595, 596, 596, 597, 595, 598, 0, 591, 
1046         591, 592, 592, 593, 591, 594, 0, 509, 
1047         509, 511, 512, 514, 514, 509, 510, 513, 
1048         0, 434, 434, 435, 435, 436, 434, 437, 
1049         0, 122, 123, 123, 125, 126, 128, 129, 
1050         130, 131, 132, 133, 134, 135, 136, 137, 
1051         138, 139, 140, 130, 141, 142, 143, 144, 
1052         145, 146, 147, 138, 123, 124, 127, 0, 
1053         410, 410, 149, 0, 149, 0, 122, 123, 
1054         123, 125, 148, 128, 129, 131, 132, 133, 
1055         134, 135, 136, 137, 138, 139, 140, 141, 
1056         142, 143, 144, 145, 146, 147, 138, 123, 
1057         124, 149, 0, 761, 761, 762, 762, 763, 
1058         761, 764, 0, 757, 757, 758, 758, 759, 
1059         757, 760, 0, 599, 599, 600, 600, 601, 
1060         599, 602, 0, 607, 607, 608, 608, 609, 
1061         607, 610, 0, 208, 209, 209, 211, 629, 
1062         214, 215, 628, 217, 218, 219, 220, 221, 
1063         222, 223, 224, 225, 226, 628, 227, 228, 
1064         229, 230, 231, 232, 233, 224, 209, 210, 
1065         630, 0, 415, 415, 389, 0, 389, 0, 
1066         208, 209, 209, 211, 234, 214, 215, 217, 
1067         218, 219, 220, 221, 222, 223, 224, 225, 
1068         226, 227, 228, 229, 230, 231, 232, 233, 
1069         224, 209, 210, 236, 0, 208, 209, 209, 
1070         211, 237, 214, 215, 216, 217, 218, 219, 
1071         220, 221, 222, 223, 224, 225, 226, 216, 
1072         227, 228, 229, 230, 231, 232, 233, 224, 
1073         209, 210, 236, 0, 682, 682, 549, 0, 
1074         549, 0, 509, 509, 511, 548, 509, 510, 
1075         549, 0, 208, 209, 209, 211, 237, 214, 
1076         215, 628, 217, 218, 219, 220, 221, 222, 
1077         223, 224, 225, 226, 628, 227, 228, 229, 
1078         230, 231, 232, 233, 224, 209, 210, 627, 
1079         0, 687, 687, 559, 0, 559, 0, 539, 
1080         539, 541, 558, 539, 540, 559, 0, 685, 
1081         685, 555, 0, 555, 0, 527, 527, 529, 
1082         554, 527, 528, 555, 0, 746, 746, 707, 
1083         0, 707, 0, 658, 658, 660, 706, 658, 
1084         659, 707, 0, 743, 743, 698, 0, 698, 
1085         0, 694, 694, 696, 697, 694, 695, 698, 
1086         0, 686, 686, 557, 0, 557, 0, 533, 
1087         533, 535, 556, 533, 534, 557, 0, 747, 
1088         747, 709, 0, 709, 0, 664, 664, 666, 
1089         708, 664, 665, 709, 0, 744, 744, 703, 
1090         0, 703, 0, 699, 699, 701, 702, 699, 
1091         700, 703, 0, 178, 179, 179, 181, 207, 
1092         184, 185, 624, 187, 188, 189, 190, 191, 
1093         192, 193, 194, 195, 196, 624, 197, 198, 
1094         199, 200, 201, 202, 203, 194, 179, 180, 
1095         623, 0, 684, 684, 553, 0, 553, 0, 
1096         521, 521, 523, 552, 521, 522, 553, 0, 
1097         745, 745, 705, 0, 705, 0, 652, 652, 
1098         654, 704, 652, 653, 705, 0, 742, 742, 
1099         693, 0, 693, 0, 689, 689, 691, 692, 
1100         689, 690, 693, 0, 791, 791, 789, 0, 
1101         789, 0, 751, 751, 753, 754, 751, 752, 
1102         789, 0, 681, 681, 547, 0, 547, 0, 
1103         504, 504, 506, 546, 504, 505, 547, 0, 
1104         421, 421, 383, 0, 383, 0, 350, 377, 
1105         377, 378, 382, 355, 356, 358, 359, 360, 
1106         361, 362, 363, 364, 365, 366, 367, 368, 
1107         369, 370, 371, 372, 373, 374, 365, 377, 
1108         383, 0, 420, 420, 376, 0, 376, 0, 
1109         350, 351, 351, 352, 375, 355, 356, 358, 
1110         359, 360, 361, 362, 363, 364, 365, 366, 
1111         367, 368, 369, 370, 371, 372, 373, 374, 
1112         365, 351, 66, 376, 0, 350, 351, 351, 
1113         352, 353, 355, 356, 357, 358, 359, 360, 
1114         361, 362, 363, 364, 365, 366, 367, 357, 
1115         368, 369, 370, 371, 372, 373, 374, 365, 
1116         351, 66, 354, 0, 474, 474, 475, 475, 
1117         476, 474, 477, 0, 351, 351, 352, 68, 
1118         70, 70, 351, 66, 69, 0, 688, 688, 
1119         560, 0, 560, 0, 351, 351, 352, 375, 
1120         351, 66, 560, 0, 65, 65, 67, 68, 
1121         70, 70, 65, 66, 69, 0, 565, 565, 
1122         566, 565, 0, 21, 21, 22, 23, 24, 
1123         24, 21, 3, 0, 4, 4, 1, 0, 
1124         1, 0, 21, 21, 22, 21, 1, 0, 
1125         61, 61, 62, 23, 24, 24, 61, 3, 
1126         0, 680, 680, 545, 0, 545, 0, 499, 
1127         499, 500, 38, 499, 33, 545, 0, 499, 
1128         499, 500, 501, 503, 503, 499, 33, 502, 
1129         0, 40, 40, 41, 27, 561, 561, 40, 
1130         33, 498, 0, 40, 40, 41, 42, 561, 
1131         561, 40, 33, 498, 0, 409, 409, 386, 
1132         0, 386, 0, 40, 40, 41, 27, 40, 
1133         33, 28, 0, 40, 40, 41, 42, 37, 
1134         37, 40, 33, 28, 0, 408, 408, 39, 
1135         0, 39, 0, 32, 32, 34, 38, 32, 
1136         33, 39, 0, 16, 16, 17, 17, 18, 
1137         16, 19, 0, 407, 407, 384, 0, 384, 
1138         0, 25, 25, 26, 27, 25, 28, 0, 
1139         647, 647, 429, 429, 430, 647, 433, 0, 
1140         563, 563, 564, 563, 0, 43, 43, 44, 
1141         43, 0, 32, 32, 34, 35, 37, 37, 
1142         32, 33, 36, 0, 411, 411, 177, 0, 
1143         177, 0, 150, 151, 151, 153, 176, 156, 
1144         157, 159, 160, 161, 162, 163, 164, 165, 
1145         166, 167, 168, 169, 170, 171, 172, 173, 
1146         174, 175, 166, 151, 152, 177, 0, 683, 
1147         683, 551, 0, 551, 0, 515, 515, 517, 
1148         550, 515, 516, 551, 0, 0, 0
1149 };
1151 static const short _svg_path_trans_targs_wi[] = {
1152         1, 297, 33, 294, 296, 36, 37, 318, 
1153         24, 25, 50, 35, 27, 28, 29, 319, 
1154         312, 32, 33, 294, 31, 35, 36, 34, 
1155         295, 27, 28, 29, 308, 26, 51, 313, 
1156         31, 32, 312, 30, 319, 309, 33, 311, 
1157         52, 53, 30, 38, 39, 38, 39, 24, 
1158         25, 50, 72, 73, 74, 97, 24, 25, 
1159         50, 72, 73, 74, 97, 59, 60, 59, 
1160         60, 65, 46, 287, 44, 288, 289, 65, 
1161         287, 326, 0, 2, 223, 213, 23, 71, 
1162         111, 125, 126, 154, 182, 198, 212, 214, 
1163         215, 216, 222, 230, 231, 232, 233, 49, 
1164         96, 73, 72, 74, 97, 326, 213, 23, 
1165         71, 111, 125, 2, 126, 154, 182, 198, 
1166         212, 214, 215, 216, 222, 223, 230, 231, 
1167         232, 233, 326, 11, 12, 19, 10, 226, 
1168         23, 71, 227, 111, 125, 2, 126, 154, 
1169         182, 198, 212, 214, 215, 216, 222, 223, 
1170         230, 231, 232, 233, 13, 229, 326, 11, 
1171         12, 19, 18, 22, 23, 71, 320, 111, 
1172         125, 2, 126, 154, 182, 198, 212, 214, 
1173         215, 216, 222, 223, 230, 231, 232, 233, 
1174         13, 322, 326, 116, 117, 120, 119, 121, 
1175         23, 71, 122, 111, 125, 2, 126, 154, 
1176         182, 198, 212, 214, 215, 216, 222, 223, 
1177         230, 231, 232, 233, 118, 124, 221, 119, 
1178         326, 203, 204, 207, 206, 208, 23, 71, 
1179         209, 111, 125, 2, 126, 154, 182, 198, 
1180         212, 214, 215, 216, 222, 223, 230, 231, 
1181         232, 233, 205, 211, 238, 206, 326, 96, 
1182         73, 72, 95, 107, 23, 71, 108, 111, 
1183         125, 2, 126, 154, 182, 198, 212, 214, 
1184         215, 216, 222, 223, 230, 231, 232, 233, 
1185         74, 110, 326, 171, 156, 155, 170, 178, 
1186         23, 71, 179, 111, 125, 2, 126, 154, 
1187         182, 198, 212, 214, 215, 216, 222, 223, 
1188         230, 231, 232, 233, 157, 181, 326, 143, 
1189         128, 127, 142, 150, 23, 71, 151, 111, 
1190         125, 2, 126, 154, 182, 198, 212, 214, 
1191         215, 216, 222, 223, 230, 231, 232, 233, 
1192         129, 153, 326, 191, 184, 183, 190, 194, 
1193         23, 71, 195, 111, 125, 2, 126, 154, 
1194         182, 198, 212, 214, 215, 216, 222, 223, 
1195         230, 231, 232, 233, 185, 197, 326, 45, 
1196         69, 68, 286, 23, 71, 283, 111, 125, 
1197         2, 126, 154, 182, 198, 212, 214, 215, 
1198         216, 222, 223, 230, 231, 232, 233, 47, 
1199         285, 49, 24, 48, 70, 280, 25, 282, 
1200         315, 26, 307, 220, 115, 237, 202, 74, 
1201         97, 9, 17, 118, 114, 217, 205, 201, 
1202         234, 94, 169, 141, 189, 67, 47, 314, 
1203         310, 306, 228, 321, 123, 219, 210, 236, 
1204         109, 180, 152, 196, 284, 281, 57, 58, 
1205         298, 53, 54, 302, 63, 42, 43, 64, 
1206         292, 288, 225, 8, 9, 226, 21, 16, 
1207         17, 22, 120, 117, 118, 121, 112, 113, 
1208         114, 217, 207, 204, 205, 208, 199, 200, 
1209         201, 234, 106, 93, 94, 107, 177, 168, 
1210         169, 178, 149, 140, 141, 150, 193, 188, 
1211         189, 194, 287, 66, 67, 286, 69, 46, 
1212         47, 70, 56, 52, 76, 77, 98, 78, 
1213         99, 62, 7, 15, 92, 167, 139, 187, 
1214         65, 45, 304, 56, 57, 55, 302, 299, 
1215         76, 77, 98, 75, 277, 7, 8, 225, 
1216         6, 224, 239, 15, 16, 21, 14, 20, 
1217         323, 92, 93, 106, 91, 105, 265, 167, 
1218         168, 177, 166, 176, 246, 139, 140, 149, 
1219         138, 148, 255, 187, 188, 193, 186, 192, 
1220         243, 301, 78, 279, 9, 241, 17, 325, 
1221         94, 267, 169, 248, 141, 257, 189, 245, 
1222         291, 305, 303, 41, 316, 62, 63, 41, 
1223         316, 62, 63, 3, 4, 5, 224, 19, 
1224         12, 13, 20, 183, 184, 185, 192, 112, 
1225         113, 114, 217, 199, 200, 201, 234, 3, 
1226         4, 5, 224, 19, 12, 13, 20, 183, 
1227         184, 185, 192, 112, 113, 114, 217, 199, 
1228         200, 201, 234, 11, 12, 19, 13, 20, 
1229         191, 184, 183, 185, 192, 116, 203, 264, 
1230         218, 115, 217, 242, 235, 202, 234, 3, 
1231         4, 5, 224, 104, 89, 90, 105, 175, 
1232         164, 165, 176, 147, 136, 137, 148, 316, 
1233         88, 163, 135, 41, 88, 89, 104, 87, 
1234         103, 268, 163, 164, 175, 162, 174, 249, 
1235         135, 136, 147, 134, 146, 258, 5, 13, 
1236         90, 165, 137, 185, 43, 86, 161, 133, 
1237         300, 278, 240, 324, 266, 247, 256, 244, 
1238         290, 84, 85, 102, 86, 273, 159, 160, 
1239         173, 161, 254, 131, 132, 145, 133, 263, 
1240         90, 270, 165, 251, 137, 260, 83, 271, 
1241         158, 252, 130, 261, 39, 40, 317, 60, 
1242         61, 293, 38, 59, 102, 85, 86, 103, 
1243         173, 160, 161, 174, 145, 132, 133, 146, 
1244         84, 159, 131, 101, 172, 144, 272, 253, 
1245         262, 269, 250, 259, 82, 157, 129, 80, 
1246         81, 100, 82, 79, 274, 155, 156, 157, 
1247         172, 127, 128, 129, 144, 155, 156, 157, 
1248         172, 127, 128, 129, 144, 100, 81, 82, 
1249         101, 155, 156, 157, 172, 127, 128, 129, 
1250         144, 171, 143, 80, 99, 276, 78, 275
1251 };
1253 static const unsigned char _svg_path_trans_actions_wi[] = {
1254         0, 0, 0, 0, 0, 0, 0, 0, 
1255         0, 1, 1, 0, 0, 0, 1, 1, 
1256         0, 1, 1, 1, 0, 3, 3, 0, 
1257         0, 3, 3, 17, 17, 17, 17, 0, 
1258         3, 17, 3, 0, 0, 0, 17, 0, 
1259         3, 3, 17, 5, 5, 7, 7, 9, 
1260         59, 59, 9, 59, 59, 59, 11, 62, 
1261         62, 11, 62, 62, 62, 20, 20, 23, 
1262         23, 53, 17, 53, 0, 0, 0, 56, 
1263         56, 15, 0, 0, 0, 0, 0, 0, 
1264         0, 0, 0, 0, 0, 0, 0, 0, 
1265         0, 0, 0, 0, 0, 0, 0, 0, 
1266         0, 1, 0, 1, 1, 65, 13, 13, 
1267         13, 13, 13, 13, 13, 13, 13, 13, 
1268         13, 13, 13, 13, 13, 13, 13, 13, 
1269         13, 13, 72, 26, 68, 26, 0, 0, 
1270         26, 26, 0, 26, 26, 26, 26, 26, 
1271         26, 26, 26, 26, 26, 26, 26, 26, 
1272         26, 26, 26, 26, 68, 0, 80, 29, 
1273         76, 29, 0, 0, 29, 29, 0, 29, 
1274         29, 29, 29, 29, 29, 29, 29, 29, 
1275         29, 29, 29, 29, 29, 29, 29, 29, 
1276         76, 0, 88, 32, 84, 32, 0, 0, 
1277         32, 32, 0, 32, 32, 32, 32, 32, 
1278         32, 32, 32, 32, 32, 32, 32, 32, 
1279         32, 32, 32, 32, 84, 0, 84, 84, 
1280         96, 35, 92, 35, 0, 0, 35, 35, 
1281         0, 35, 35, 35, 35, 35, 35, 35, 
1282         35, 35, 35, 35, 35, 35, 35, 35, 
1283         35, 35, 92, 0, 92, 92, 104, 38, 
1284         100, 38, 0, 0, 38, 38, 0, 38, 
1285         38, 38, 38, 38, 38, 38, 38, 38, 
1286         38, 38, 38, 38, 38, 38, 38, 38, 
1287         100, 0, 112, 41, 108, 41, 0, 0, 
1288         41, 41, 0, 41, 41, 41, 41, 41, 
1289         41, 41, 41, 41, 41, 41, 41, 41, 
1290         41, 41, 41, 41, 108, 0, 120, 44, 
1291         116, 44, 0, 0, 44, 44, 0, 44, 
1292         44, 44, 44, 44, 44, 44, 44, 44, 
1293         44, 44, 44, 44, 44, 44, 44, 44, 
1294         116, 0, 128, 47, 124, 47, 0, 0, 
1295         47, 47, 0, 47, 47, 47, 47, 47, 
1296         47, 47, 47, 47, 47, 47, 47, 47, 
1297         47, 47, 47, 47, 124, 0, 136, 3, 
1298         3, 0, 0, 50, 50, 0, 50, 50, 
1299         50, 50, 50, 50, 50, 50, 50, 50, 
1300         50, 50, 50, 50, 50, 50, 50, 17, 
1301         0, 50, 50, 0, 0, 0, 132, 0, 
1302         0, 0, 0, 0, 0, 0, 0, 0, 
1303         0, 0, 0, 0, 0, 0, 0, 0, 
1304         0, 0, 0, 0, 0, 0, 0, 0, 
1305         0, 0, 0, 0, 0, 0, 0, 0, 
1306         0, 0, 0, 0, 0, 0, 0, 1, 
1307         1, 0, 1, 1, 0, 1, 1, 1, 
1308         1, 1, 0, 1, 1, 1, 0, 1, 
1309         1, 1, 0, 1, 1, 1, 0, 1, 
1310         1, 1, 0, 1, 1, 1, 0, 1, 
1311         1, 1, 0, 1, 1, 1, 0, 1, 
1312         1, 1, 0, 1, 1, 1, 0, 1, 
1313         1, 1, 0, 1, 1, 1, 0, 1, 
1314         1, 1, 0, 0, 0, 1, 0, 1, 
1315         1, 0, 0, 0, 0, 0, 0, 0, 
1316         0, 0, 17, 3, 3, 0, 0, 0, 
1317         3, 17, 3, 0, 0, 3, 17, 3, 
1318         0, 0, 0, 3, 17, 3, 0, 0, 
1319         0, 3, 17, 3, 0, 0, 0, 3, 
1320         17, 3, 0, 0, 0, 3, 17, 3, 
1321         0, 0, 0, 3, 17, 3, 0, 0, 
1322         0, 0, 17, 0, 17, 0, 17, 0, 
1323         17, 0, 17, 0, 17, 0, 17, 0, 
1324         0, 0, 17, 5, 5, 5, 5, 7, 
1325         7, 7, 7, 9, 59, 59, 59, 9, 
1326         59, 59, 59, 9, 59, 59, 59, 9, 
1327         59, 59, 59, 9, 59, 59, 59, 11, 
1328         62, 62, 62, 11, 62, 62, 62, 11, 
1329         62, 62, 62, 11, 62, 62, 62, 11, 
1330         62, 62, 62, 0, 1, 0, 1, 1, 
1331         0, 1, 0, 1, 1, 0, 0, 84, 
1332         0, 84, 84, 92, 0, 92, 92, 0, 
1333         1, 1, 1, 0, 1, 1, 1, 0, 
1334         1, 1, 1, 0, 1, 1, 1, 0, 
1335         0, 0, 0, 0, 3, 17, 3, 0, 
1336         0, 0, 3, 17, 3, 0, 0, 0, 
1337         3, 17, 3, 0, 0, 0, 0, 0, 
1338         0, 0, 0, 0, 0, 0, 0, 0, 
1339         0, 0, 0, 0, 0, 0, 0, 0, 
1340         0, 3, 17, 3, 17, 0, 3, 17, 
1341         3, 17, 0, 3, 17, 3, 17, 0, 
1342         17, 0, 17, 0, 17, 0, 0, 0, 
1343         0, 0, 0, 0, 0, 0, 0, 0, 
1344         0, 0, 0, 0, 0, 1, 1, 1, 
1345         0, 1, 1, 1, 0, 1, 1, 1, 
1346         0, 0, 0, 0, 0, 0, 0, 0, 
1347         0, 0, 0, 0, 0, 0, 0, 3, 
1348         17, 3, 17, 0, 0, 11, 62, 62, 
1349         62, 11, 62, 62, 62, 9, 59, 59, 
1350         59, 9, 59, 59, 59, 0, 1, 1, 
1351         1, 0, 1, 1, 1, 0, 1, 1, 
1352         1, 0, 0, 0, 0, 0, 0, 0
1353 };
1355 static const int svg_path_start = 0;
1357 static const int svg_path_first_final = 326;
1359 #line 133 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1362 void Parser::parse(char const *str)
1363 throw(SVGPathParseError)
1365     char const *p = str;
1366     char const *start = NULL;
1367     int cs;
1369     _reset();
1371     
1372 #line 1373 "/home/njh/svn/lib2geom/src/svg-path-parser.cpp"
1373         {
1374         cs = svg_path_start;
1375         }
1376         {
1377         int _klen;
1378         unsigned int _trans;
1379         const char *_acts;
1380         unsigned int _nacts;
1381         const char *_keys;
1383 _resume:
1384         if ( cs == 1 )
1385                 goto _out;
1386         _keys = _svg_path_trans_keys + _svg_path_key_offsets[cs];
1387         _trans = _svg_path_index_offsets[cs];
1389         _klen = _svg_path_single_lengths[cs];
1390         if ( _klen > 0 ) {
1391                 const char *_lower = _keys;
1392                 const char *_mid;
1393                 const char *_upper = _keys + _klen - 1;
1394                 while (1) {
1395                         if ( _upper < _lower )
1396                                 break;
1398                         _mid = _lower + ((_upper-_lower) >> 1);
1399                         if ( (*p) < *_mid )
1400                                 _upper = _mid - 1;
1401                         else if ( (*p) > *_mid )
1402                                 _lower = _mid + 1;
1403                         else {
1404                                 _trans += (_mid - _keys);
1405                                 goto _match;
1406                         }
1407                 }
1408                 _keys += _klen;
1409                 _trans += _klen;
1410         }
1412         _klen = _svg_path_range_lengths[cs];
1413         if ( _klen > 0 ) {
1414                 const char *_lower = _keys;
1415                 const char *_mid;
1416                 const char *_upper = _keys + (_klen<<1) - 2;
1417                 while (1) {
1418                         if ( _upper < _lower )
1419                                 break;
1421                         _mid = _lower + (((_upper-_lower) >> 1) & ~1);
1422                         if ( (*p) < _mid[0] )
1423                                 _upper = _mid - 2;
1424                         else if ( (*p) > _mid[1] )
1425                                 _lower = _mid + 2;
1426                         else {
1427                                 _trans += ((_mid - _keys)>>1);
1428                                 goto _match;
1429                         }
1430                 }
1431                 _trans += _klen;
1432         }
1434 _match:
1435         _trans = _svg_path_indicies[_trans];
1436         cs = _svg_path_trans_targs_wi[_trans];
1438         if ( _svg_path_trans_actions_wi[_trans] == 0 )
1439                 goto _again;
1441         _acts = _svg_path_actions + _svg_path_trans_actions_wi[_trans];
1442         _nacts = (unsigned int) *_acts++;
1443         while ( _nacts-- > 0 )
1444         {
1445                 switch ( *_acts++ )
1446                 {
1447         case 0:
1448 #line 145 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1449         {
1450             start = p;
1451         }
1452         break;
1453         case 1:
1454 #line 149 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1455         {
1456             char const *end=p;
1457             std::string buf(start, end);
1458             _push(g_ascii_strtod(buf.c_str(), NULL));
1459             start = NULL;
1460         }
1461         break;
1462         case 2:
1463 #line 156 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1464         {
1465             _push(1.0);
1466         }
1467         break;
1468         case 3:
1469 #line 160 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1470         {
1471             _push(0.0);
1472         }
1473         break;
1474         case 4:
1475 #line 164 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1476         {
1477             _absolute = true;
1478         }
1479         break;
1480         case 5:
1481 #line 168 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1482         {
1483             _absolute = false;
1484         }
1485         break;
1486         case 6:
1487 #line 172 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1488         {
1489             _moveTo(_pop_point());
1490         }
1491         break;
1492         case 7:
1493 #line 176 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1494         {
1495             _lineTo(_pop_point());
1496         }
1497         break;
1498         case 8:
1499 #line 180 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1500         {
1501             _lineTo(Point(_pop_coord(X), _current[Y]));
1502         }
1503         break;
1504         case 9:
1505 #line 184 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1506         {
1507             _lineTo(Point(_current[X], _pop_coord(Y)));
1508         }
1509         break;
1510         case 10:
1511 #line 188 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1512         {
1513             Point p = _pop_point();
1514             Point c1 = _pop_point();
1515             Point c0 = _pop_point();
1516             _curveTo(c0, c1, p);
1517         }
1518         break;
1519         case 11:
1520 #line 195 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1521         {
1522             Point p = _pop_point();
1523             Point c1 = _pop_point();
1524             _curveTo(_cubic_tangent, c1, p);
1525         }
1526         break;
1527         case 12:
1528 #line 201 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1529         {
1530             Point p = _pop_point();
1531             Point c = _pop_point();
1532             _quadTo(c, p);
1533         }
1534         break;
1535         case 13:
1536 #line 207 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1537         {
1538             Point p = _pop_point();
1539             _quadTo(_quad_tangent, p);
1540         }
1541         break;
1542         case 14:
1543 #line 212 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1544         {
1545             Point point = _pop_point();
1546             bool sweep = _pop_flag();
1547             bool large_arc = _pop_flag();
1548             double angle = _pop();
1549             double ry = _pop();
1550             double rx = _pop();
1552             _arcTo(rx, ry, angle, large_arc, sweep, point);
1553         }
1554         break;
1555         case 15:
1556 #line 223 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1557         {
1558             _closePath();
1559         }
1560         break;
1561         case 16:
1562 #line 360 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1563         {goto _out;}
1564         break;
1565 #line 1566 "/home/njh/svn/lib2geom/src/svg-path-parser.cpp"
1566                 }
1567         }
1569 _again:
1570         p += 1;
1571         goto _resume;
1572         _out: {}
1573         }
1574 #line 370 "/home/njh/svn/lib2geom/src/svg-path-parser.rl"
1577     if ( cs < svg_path_first_final ) {
1578         throw SVGPathParseError();
1579     }
1584 void parse_svg_path(char const *str, SVGPathSink &sink)
1585 throw(SVGPathParseError)
1587     Parser parser(sink);
1588     parser.parse(str);
1589     sink.finish();
1594 /*
1595   Local Variables:
1596   mode:c++
1597   c-file-style:"stroustrup"
1598   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
1599   indent-tabs-mode:nil
1600   fill-column:99
1601   End:
1602 */
1603 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :