Fix travis and README conflicts

This commit is contained in:
Matthew Honnibal 2016-10-19 00:16:11 +02:00
commit ae29b9bdfd
95 changed files with 5099 additions and 763 deletions

2
.gitignore vendored
View File

@ -9,6 +9,7 @@ tmp/
.eggs
*.tgz
.sass-cache
.python-version
MANIFEST
@ -36,6 +37,7 @@ data/en/strings
_build/
.env/
tmp/
# Byte-compiled / optimized / DLL files
__pycache__/

View File

@ -1,34 +1,30 @@
language: python
sudo: required
sudo: false
dist: trusty
group: edge
python:
- "2.7"
- "3.4"
- "3.5"
os:
- linux
env:
- VIA="compile"
- VIA="sdist"
install:
- "pip install -r requirements.txt"
- "pip install -e ."
- "mkdir -p corpora/en"
- "cd corpora/en"
- "wget --no-check-certificate http://wordnetcode.princeton.edu/3.0/WordNet-3.0.tar.gz"
- "tar -xzf WordNet-3.0.tar.gz"
- "mv WordNet-3.0 wordnet"
- "cd ../../"
- "python bin/init_model.py en lang_data/ corpora/ data"
- "cp package.json data"
- "sputnik build data en_default.sputnik"
- "sputnik --name spacy install en_default.sputnik"
- "./travis.sh"
script:
- "pip install pytest"
- "python -m pytest spacy"
- if [[ "${VIA}" == "compile" ]]; then SPACY_DATA=models/en python -m pytest spacy; fi
- if [[ "${VIA}" == "pypi" ]]; then python -m pytest `python -c "import pathlib; import spacy; print(pathlib.Path(spacy.__file__).parent.resolve())"`; fi
- if [[ "${VIA}" == "sdist" ]]; then python -m pytest `python -c "import pathlib; import spacy; print(pathlib.Path(spacy.__file__).parent.resolve())"`; fi
notifications:
slack:
secure: F8GvqnweSdzImuLL64TpfG0i5rYl89liyr9tmFVsHl4c0DNiDuGhZivUz0M1broS8svE3OPOllLfQbACG/4KxD890qfF9MoHzvRDlp7U+RtwMV/YAkYn8MGWjPIbRbX0HpGdY7O2Rc9Qy4Kk0T8ZgiqXYIqAz2Eva9/9BlSmsJQ=
email: false

View File

@ -192,6 +192,7 @@ OS X ships with Python and git preinstalled.
Windows
-------
<<<<<<< HEAD
Install a version of Visual Studio Express or higher that matches the version
that was used to compile your Python interpreter. For official distributions
@ -211,6 +212,27 @@ Python install. Run:
Run tests
=========
=======
Install a version of Visual Studio Express or higher that matches the version
that was used to compile your Python interpreter. For official distributions
these are VS 2008 (Python 2.7), VS 2010 (Python 3.4) and VS 2015 (Python 3.5).
Workaround for obsolete system Python
=====================================
If you're stuck using a system with an old version of Python, and you don't
have root access, we've prepared a bootstrap script to help you compile a local
Python install. Run:
.. code:: bash
curl https://raw.githubusercontent.com/spacy-io/gist/master/bootstrap_python_env.sh | bash && source .env/bin/activate
Run tests
=========
>>>>>>> v1.0.0-rc1
spaCy comes with an extensive test suite. First, find out where spaCy is
installed:

View File

@ -17,6 +17,7 @@ import spacy.util
from spacy.syntax.util import Config
from spacy.gold import read_json_file
from spacy.gold import GoldParse
from spacy.gold import merge_sents
from spacy.scorer import Scorer
@ -63,96 +64,24 @@ def score_model(scorer, nlp, raw_text, annot_tuples, verbose=False):
scorer.score(tokens, gold, verbose=verbose)
def _merge_sents(sents):
m_deps = [[], [], [], [], [], []]
m_brackets = []
i = 0
for (ids, words, tags, heads, labels, ner), brackets in sents:
m_deps[0].extend(id_ + i for id_ in ids)
m_deps[1].extend(words)
m_deps[2].extend(tags)
m_deps[3].extend(head + i for head in heads)
m_deps[4].extend(labels)
m_deps[5].extend(ner)
m_brackets.extend((b['first'] + i, b['last'] + i, b['label']) for b in brackets)
i += len(ids)
return [(m_deps, m_brackets)]
def train(Language, gold_tuples, model_dir, n_iter=15, feat_set=u'basic',
seed=0, gold_preproc=False, n_sents=0, corruption_level=0,
beam_width=1, verbose=False,
use_orig_arc_eager=False, pseudoprojective=False):
dep_model_dir = path.join(model_dir, 'deps')
ner_model_dir = path.join(model_dir, 'ner')
pos_model_dir = path.join(model_dir, 'pos')
if path.exists(dep_model_dir):
shutil.rmtree(dep_model_dir)
if path.exists(ner_model_dir):
shutil.rmtree(ner_model_dir)
if path.exists(pos_model_dir):
shutil.rmtree(pos_model_dir)
os.mkdir(dep_model_dir)
os.mkdir(ner_model_dir)
os.mkdir(pos_model_dir)
if pseudoprojective:
# preprocess training data here before ArcEager.get_labels() is called
gold_tuples = PseudoProjectivity.preprocess_training_data(gold_tuples)
Config.write(dep_model_dir, 'config', features=feat_set, seed=seed,
labels=ArcEager.get_labels(gold_tuples),
beam_width=beam_width,projectivize=pseudoprojective)
Config.write(ner_model_dir, 'config', features='ner', seed=seed,
labels=BiluoPushDown.get_labels(gold_tuples),
beam_width=0)
if n_sents > 0:
gold_tuples = gold_tuples[:n_sents]
nlp = Language(data_dir=model_dir, tagger=False, parser=False, entity=False)
nlp.tagger = Tagger.blank(nlp.vocab, Tagger.default_templates())
nlp.parser = Parser.from_dir(dep_model_dir, nlp.vocab.strings, ArcEager)
nlp.entity = Parser.from_dir(ner_model_dir, nlp.vocab.strings, BiluoPushDown)
def train(Language, train_data, dev_data, model_dir, tagger_cfg, parser_cfg, entity_cfg,
n_iter=15, seed=0, gold_preproc=False, n_sents=0, corruption_level=0):
print("Itn.\tP.Loss\tUAS\tNER F.\tTag %\tToken %")
for itn in range(n_iter):
scorer = Scorer()
format_str = '{:d}\t{:d}\t{uas:.3f}\t{ents_f:.3f}\t{tags_acc:.3f}\t{token_acc:.3f}'
with Language.train(model_dir, train_data,
tagger_cfg, parser_cfg, entity_cfg) as trainer:
loss = 0
for raw_text, sents in gold_tuples:
if gold_preproc:
raw_text = None
else:
sents = _merge_sents(sents)
for annot_tuples, ctnt in sents:
if len(annot_tuples[1]) == 1:
continue
score_model(scorer, nlp, raw_text, annot_tuples,
verbose=verbose if itn >= 2 else False)
if raw_text is None:
words = add_noise(annot_tuples[1], corruption_level)
tokens = nlp.tokenizer.tokens_from_list(words)
else:
raw_text = add_noise(raw_text, corruption_level)
tokens = nlp.tokenizer(raw_text)
nlp.tagger(tokens)
gold = GoldParse(tokens, annot_tuples)
if not gold.is_projective:
raise Exception("Non-projective sentence in training: %s" % annot_tuples[1])
loss += nlp.parser.train(tokens, gold)
nlp.entity.train(tokens, gold)
nlp.tagger.train(tokens, gold.tags)
random.shuffle(gold_tuples)
print('%d:\t%d\t%.3f\t%.3f\t%.3f\t%.3f' % (itn, loss, scorer.uas, scorer.ents_f,
scorer.tags_acc,
scorer.token_acc))
print('end training')
nlp.end_training(model_dir)
print('done')
for itn, epoch in enumerate(trainer.epochs(n_iter, gold_preproc=gold_preproc,
augment_data=None)):
for doc, gold in epoch:
trainer.update(doc, gold)
dev_scores = trainer.evaluate(dev_data, gold_preproc=gold_preproc)
print(format_str.format(itn, loss, **dev_scores.scores))
def evaluate(Language, gold_tuples, model_dir, gold_preproc=False, verbose=False,
beam_width=None, cand_preproc=None):
nlp = Language(data_dir=model_dir)
nlp = Language(path=model_dir)
if nlp.lang == 'de':
nlp.vocab.morphology.lemmatizer = lambda string,pos: set([string])
if beam_width is not None:
@ -162,7 +91,7 @@ def evaluate(Language, gold_tuples, model_dir, gold_preproc=False, verbose=False
if gold_preproc:
raw_text = None
else:
sents = _merge_sents(sents)
sents = merge_sents(sents)
for annot_tuples, brackets in sents:
if raw_text is None:
tokens = nlp.tokenizer.tokens_from_list(annot_tuples[1])
@ -219,15 +148,21 @@ def write_parses(Language, dev_loc, model_dir, out_loc):
)
def main(language, train_loc, dev_loc, model_dir, n_sents=0, n_iter=15, out_loc="", verbose=False,
debug=False, corruption_level=0.0, gold_preproc=False, eval_only=False, pseudoprojective=False):
parser_cfg = dict(locals())
tagger_cfg = dict(locals())
entity_cfg = dict(locals())
lang = spacy.util.get_lang_class(language)
parser_cfg['features'] = lang.Defaults.parser_features
entity_cfg['features'] = lang.Defaults.entity_features
if not eval_only:
gold_train = list(read_json_file(train_loc))
train(lang, gold_train, model_dir,
feat_set='basic' if not debug else 'debug',
gold_preproc=gold_preproc, n_sents=n_sents,
corruption_level=corruption_level, n_iter=n_iter,
verbose=verbose,pseudoprojective=pseudoprojective)
gold_dev = list(read_json_file(dev_loc))
train(lang, gold_train, gold_dev, model_dir, tagger_cfg, parser_cfg, entity_cfg,
n_sents=n_sents, gold_preproc=gold_preproc, corruption_level=corruption_level,
n_iter=n_iter)
if out_loc:
write_parses(lang, dev_loc, model_dir, out_loc)
scorer = evaluate(lang, list(read_json_file(dev_loc)),

View File

@ -0,0 +1,63 @@
from __future__ import unicode_literals, print_function
import json
import pathlib
import random
import spacy
from spacy.pipeline import EntityRecognizer
from spacy.gold import GoldParse
def train_ner(nlp, train_data, entity_types):
ner = EntityRecognizer(nlp.vocab, entity_types=entity_types)
for itn in range(5):
random.shuffle(train_data)
for raw_text, entity_offsets in train_data:
doc = nlp.make_doc(raw_text)
gold = GoldParse(doc, entities=entity_offsets)
ner.update(doc, gold)
ner.model.end_training()
return ner
def main(model_dir=None):
if model_dir is not None:
model_dir = pathlb.Path(model_dir)
if not model_dir.exists():
model_dir.mkdir()
assert model_dir.isdir()
nlp = spacy.load('en', parser=False, entity=False, vectors=False)
train_data = [
(
'Who is Shaka Khan?',
[(len('Who is '), len('Who is Shaka Khan'), 'PERSON')]
),
(
'I like London and Berlin.',
[(len('I like '), len('I like London'), 'LOC'),
(len('I like London and '), len('I like London and Berlin'), 'LOC')]
)
]
ner = train_ner(nlp, train_data, ['PERSON', 'LOC'])
doc = nlp.make_doc('Who is Shaka Khan?')
nlp.tagger(doc)
ner(doc)
for word in doc:
print(word.text, word.tag_, word.ent_type_, word.ent_iob)
if model_dir is not None:
with (model_dir / 'config.json').open('wb') as file_:
json.dump(ner.cfg, file_)
ner.model.dump(str(model_dir / 'model'))
if __name__ == '__main__':
main()
# Who "" 2
# is "" 2
# Shaka "" PERSON 3
# Khan "" PERSON 1
# ? "" 2

View File

@ -0,0 +1,75 @@
from __future__ import unicode_literals, print_function
import json
import pathlib
import random
import spacy
from spacy.pipeline import DependencyParser
from spacy.gold import GoldParse
from spacy.tokens import Doc
def train_parser(nlp, train_data, left_labels, right_labels):
parser = DependencyParser(
nlp.vocab,
left_labels=left_labels,
right_labels=right_labels)
for itn in range(1000):
random.shuffle(train_data)
loss = 0
for words, heads, deps in train_data:
doc = Doc(nlp.vocab, words=words)
gold = GoldParse(doc, heads=heads, deps=deps)
loss += parser.update(doc, gold)
parser.model.end_training()
return parser
def main(model_dir=None):
if model_dir is not None:
model_dir = pathlb.Path(model_dir)
if not model_dir.exists():
model_dir.mkdir()
assert model_dir.isdir()
nlp = spacy.load('en', tagger=False, parser=False, entity=False, vectors=False)
train_data = [
(
['They', 'trade', 'mortgage', '-', 'backed', 'securities', '.'],
[1, 1, 4, 4, 5, 1, 1],
['nsubj', 'ROOT', 'compound', 'punct', 'nmod', 'dobj', 'punct']
),
(
['I', 'like', 'London', 'and', 'Berlin', '.'],
[1, 1, 1, 2, 2, 1],
['nsubj', 'ROOT', 'dobj', 'cc', 'conj', 'punct']
)
]
left_labels = set()
right_labels = set()
for _, heads, deps in train_data:
for i, (head, dep) in enumerate(zip(heads, deps)):
if i < head:
left_labels.add(dep)
elif i > head:
right_labels.add(dep)
parser = train_parser(nlp, train_data, sorted(left_labels), sorted(right_labels))
doc = Doc(nlp.vocab, words=['I', 'like', 'securities', '.'])
parser(doc)
for word in doc:
print(word.text, word.dep_, word.head.text)
if model_dir is not None:
with (model_dir / 'config.json').open('wb') as file_:
json.dump(parser.cfg, file_)
parser.model.dump(str(model_dir / 'model'))
if __name__ == '__main__':
main()
# I nsubj like
# like ROOT like
# securities dobj like
# . cc securities

View File

@ -5,12 +5,11 @@ from __future__ import unicode_literals
from __future__ import print_function
import plac
from os import path
import os
from pathlib import Path
from spacy.vocab import Vocab
from spacy.tokenizer import Tokenizer
from spacy.tagger import Tagger
from spacy.tokens import Doc
import random
@ -39,34 +38,41 @@ DATA = [
)
]
def ensure_dir(*parts):
path_ = path.join(*parts)
if not path.exists(path_):
os.mkdir(path_)
return path_
def ensure_dir(path):
if not path.exists():
path.mkdir()
def main(output_dir):
def main(output_dir=None):
if output_dir is not None:
output_dir = Path(output_dir)
ensure_dir(output_dir)
ensure_dir(output_dir, "pos")
ensure_dir(output_dir, "vocab")
ensure_dir(output_dir / "pos")
ensure_dir(output_dir / "vocab")
vocab = Vocab(tag_map=TAG_MAP)
tokenizer = Tokenizer(vocab, {}, None, None, None)
# The default_templates argument is where features are specified. See
# spacy/tagger.pyx for the defaults.
tagger = Tagger.blank(vocab, Tagger.default_templates())
tagger = Tagger(vocab)
for i in range(5):
for words, tags in DATA:
tokens = tokenizer.tokens_from_list(words)
tagger.train(tokens, tags)
doc = Doc(vocab, words=words)
tagger.update(doc, tags)
random.shuffle(DATA)
tagger.model.end_training()
tagger.model.dump(path.join(output_dir, 'pos', 'model'))
with io.open(output_dir, 'vocab', 'strings.json') as file_:
doc = Doc(vocab, orths_and_spaces=zip(["I", "like", "blue", "eggs"], [True]*4))
tagger(doc)
for word in doc:
print(word.text, word.tag_, word.pos_)
if output_dir is not None:
tagger.model.dump(str(output_dir / 'pos' / 'model'))
with (output_dir / 'vocab' / 'strings.json').open('wb') as file_:
tagger.vocab.strings.dump(file_)
if __name__ == '__main__':
plac.call(main)
# I V VERB
# like V VERB
# blue N NOUN
# eggs N NOUN

2
fabfile.py vendored
View File

@ -182,7 +182,7 @@ def train(json_dir=None, dev_loc=None, model_dir=None):
with virtualenv(VENV_DIR):
with lcd(path.dirname(__file__)):
local('python bin/init_model.py en lang_data/ corpora/ ' + model_dir)
local('python bin/parser/train.py %s %s' % (json_dir, model_dir))
local('python bin/parser/train.py -p en %s/train/ %s/development %s' % (json_dir, json_dir, model_dir))
def travis():

View File

@ -2,7 +2,7 @@ cython<0.24
pathlib
numpy>=1.7
cymem>=1.30,<1.32
preshed>=0.46.1,<0.47.0
preshed>=0.46.4,<0.47.0
thinc>=5.0.0,<5.1.0
murmurhash>=0.26,<0.27
plac<0.9.3

View File

@ -1,5 +1,6 @@
#!/usr/bin/env python
from __future__ import print_function
from __future__ import unicode_literals
import os
import subprocess
import sys
@ -47,6 +48,7 @@ MOD_NAMES = [
'spacy.attrs',
'spacy.morphology',
'spacy.tagger',
'spacy.pipeline',
'spacy.syntax.stateclass',
'spacy.syntax._state',
'spacy.tokenizer',
@ -152,11 +154,11 @@ def setup_package():
return clean(root)
with chdir(root):
with open(os.path.join(root, 'spacy', 'about.py')) as f:
with io.open(os.path.join(root, 'spacy', 'about.py'), encoding='utf8') as f:
about = {}
exec(f.read(), about)
with open(os.path.join(root, 'README.rst')) as f:
with io.open(os.path.join(root, 'README.rst'), encoding='utf8') as f:
readme = f.read()
include_dirs = [
@ -181,7 +183,7 @@ def setup_package():
name=about['__title__'],
zip_safe=False,
packages=PACKAGES,
package_data={'': ['*.pyx', '*.pxd', '*.txt', '*.tokens']},
package_data={'': ['*.pyx', '*.pxd', '*.txt', '*.tokens', 'data']},
description=about['__summary__'],
long_description=readme,
author=about['__author__'],
@ -194,11 +196,12 @@ def setup_package():
'numpy>=1.7',
'murmurhash>=0.26,<0.27',
'cymem>=1.30,<1.32',
'preshed>=0.46.1,<0.47',
'preshed>=0.46.0,<0.47.0',
'thinc>=5.0.0,<5.1.0',
'plac',
'six',
'cloudpickle',
'pathlib',
'sputnik>=0.9.2,<0.10.0'],
classifiers=[
'Development Status :: 5 - Production/Stable',

View File

@ -19,43 +19,13 @@ set_lang_class(de.German.lang, de.German)
set_lang_class(zh.Chinese.lang, zh.Chinese)
def blank(name, vocab=None, tokenizer=None, parser=None, tagger=None, entity=None,
matcher=None, serializer=None, vectors=None, pipeline=None):
def load(name, **overrides):
target_name, target_version = util.split_data_name(name)
cls = get_lang_class(target_name)
return cls(
path,
vectors=vectors,
vocab=vocab,
tokenizer=tokenizer,
tagger=tagger,
parser=parser,
entity=entity,
matcher=matcher,
pipeline=pipeline,
serializer=serializer)
path = overrides.get('path', util.get_data_path())
path = util.match_best_version(target_name, target_version, path)
def load(name, vocab=True, tokenizer=True, parser=True, tagger=True, entity=True,
matcher=True, serializer=True, vectors=True, pipeline=True, via=None):
if via is None:
via = util.get_data_path()
target_name, target_version = util.split_data_name(name)
path = util.match_best_version(target_name, target_version, via)
if isinstance(vectors, basestring):
vectors = util.match_best_version(vectors, None, via)
if isinstance(overrides.get('vectors'), basestring):
vectors = util.match_best_version(overrides.get('vectors'), None, path)
cls = get_lang_class(target_name)
return cls(
path,
vectors=vectors,
vocab=vocab,
tokenizer=tokenizer,
tagger=tagger,
parser=parser,
entity=entity,
matcher=matcher,
pipeline=pipeline,
serializer=serializer)
return cls(path=path, **overrides)

View File

@ -4,7 +4,7 @@
# https://github.com/pypa/warehouse/blob/master/warehouse/__about__.py
__title__ = 'spacy'
__version__ = '0.101.0'
__version__ = '1.0.0'
__summary__ = 'Industrial-strength NLP'
__uri__ = 'https://spacy.io'
__author__ = 'Matthew Honnibal'

View File

@ -1,4 +0,0 @@
# Ignore everything in this directory
*
# Except this file
!.gitignore

View File

@ -3,6 +3,7 @@ from __future__ import unicode_literals, print_function
from os import path
from ..language import Language
from ..attrs import LANG
from . import language_data
@ -11,6 +12,8 @@ class German(Language):
class Defaults(Language.Defaults):
tokenizer_exceptions = dict(language_data.TOKENIZER_EXCEPTIONS)
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
lex_attr_getters[LANG] = lambda text: 'de'
prefixes = tuple(language_data.TOKENIZER_PREFIXES)

View File

@ -8,6 +8,7 @@ from .. import util
from ..lemmatizer import Lemmatizer
from ..vocab import Vocab
from ..tokenizer import Tokenizer
from ..attrs import LANG
class English(Language):
@ -15,6 +16,7 @@ class English(Language):
class Defaults(Language.Defaults):
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
lex_attr_getters[LANG] = lambda text: 'en'
tokenizer_exceptions = dict(language_data.TOKENIZER_EXCEPTIONS)
@ -27,4 +29,3 @@ class English(Language):
tag_map = dict(language_data.TAG_MAP)
stop_words = set(language_data.STOP_WORDS)

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals, print_function
import numpy
import io
import json
@ -42,6 +44,21 @@ def tags_to_entities(tags):
return entities
def merge_sents(sents):
m_deps = [[], [], [], [], [], []]
m_brackets = []
i = 0
for (ids, words, tags, heads, labels, ner), brackets in sents:
m_deps[0].extend(id_ + i for id_ in ids)
m_deps[1].extend(words)
m_deps[2].extend(tags)
m_deps[3].extend(head + i for head in heads)
m_deps[4].extend(labels)
m_deps[5].extend(ner)
m_brackets.extend((b['first'] + i, b['last'] + i, b['label']) for b in brackets)
i += len(ids)
return [(m_deps, m_brackets)]
def align(cand_words, gold_words):
cost, edit_path = _min_edit_path(cand_words, gold_words)
@ -128,7 +145,6 @@ def _min_edit_path(cand_words, gold_words):
def read_json_file(loc, docs_filter=None):
print loc
if path.isdir(loc):
for filename in os.listdir(loc):
yield from read_json_file(path.join(loc, filename))
@ -199,33 +215,53 @@ def _consume_ent(tags):
cdef class GoldParse:
def __init__(self, tokens, annot_tuples, brackets=tuple(), make_projective=False):
@classmethod
def from_annot_tuples(cls, doc, annot_tuples, make_projective=False):
_, words, tags, heads, deps, entities = annot_tuples
return cls(doc, words=words, tags=tags, heads=heads, deps=deps, entities=entities,
make_projective=make_projective)
def __init__(self, doc, annot_tuples=None, words=None, tags=None, heads=None,
deps=None, entities=None, make_projective=False):
if words is None:
words = [token.text for token in doc]
if tags is None:
tags = [None for _ in doc]
if heads is None:
heads = [token.i for token in doc]
if deps is None:
deps = [None for _ in doc]
if entities is None:
entities = [None for _ in doc]
elif len(entities) == 0:
entities = ['O' for _ in doc]
elif not isinstance(entities[0], basestring):
# Assume we have entities specified by character offset.
entities = biluo_tags_from_offsets(doc, entities)
self.mem = Pool()
self.loss = 0
self.length = len(tokens)
self.length = len(doc)
# These are filled by the tagger/parser/entity recogniser
self.c.tags = <int*>self.mem.alloc(len(tokens), sizeof(int))
self.c.heads = <int*>self.mem.alloc(len(tokens), sizeof(int))
self.c.labels = <int*>self.mem.alloc(len(tokens), sizeof(int))
self.c.ner = <Transition*>self.mem.alloc(len(tokens), sizeof(Transition))
self.c.brackets = <int**>self.mem.alloc(len(tokens), sizeof(int*))
for i in range(len(tokens)):
self.c.brackets[i] = <int*>self.mem.alloc(len(tokens), sizeof(int))
self.c.tags = <int*>self.mem.alloc(len(doc), sizeof(int))
self.c.heads = <int*>self.mem.alloc(len(doc), sizeof(int))
self.c.labels = <int*>self.mem.alloc(len(doc), sizeof(int))
self.c.ner = <Transition*>self.mem.alloc(len(doc), sizeof(Transition))
self.tags = [None] * len(tokens)
self.heads = [None] * len(tokens)
self.labels = [''] * len(tokens)
self.ner = ['-'] * len(tokens)
self.tags = [None] * len(doc)
self.heads = [None] * len(doc)
self.labels = [''] * len(doc)
self.ner = ['-'] * len(doc)
self.cand_to_gold = align([t.orth_ for t in tokens], annot_tuples[1])
self.gold_to_cand = align(annot_tuples[1], [t.orth_ for t in tokens])
self.cand_to_gold = align([t.orth_ for t in doc], words)
self.gold_to_cand = align(words, [t.orth_ for t in doc])
annot_tuples = (range(len(words)), words, tags, heads, deps, entities)
self.orig_annot = list(zip(*annot_tuples))
words = [w.orth_ for w in tokens]
for i, gold_i in enumerate(self.cand_to_gold):
if words[i].isspace():
if doc[i].text.isspace():
self.tags[i] = 'SP'
self.heads[i] = None
self.labels[i] = None
@ -233,10 +269,10 @@ cdef class GoldParse:
if gold_i is None:
pass
else:
self.tags[i] = annot_tuples[2][gold_i]
self.heads[i] = self.gold_to_cand[annot_tuples[3][gold_i]]
self.labels[i] = annot_tuples[4][gold_i]
self.ner[i] = annot_tuples[5][gold_i]
self.tags[i] = tags[gold_i]
self.heads[i] = self.gold_to_cand[heads[gold_i]]
self.labels[i] = deps[gold_i]
self.ner[i] = entities[gold_i]
cycle = nonproj.contains_cycle(self.heads)
if cycle != None:
@ -246,14 +282,6 @@ cdef class GoldParse:
proj_heads,_ = nonproj.PseudoProjectivity.projectivize(self.heads, self.labels)
self.heads = proj_heads
self.brackets = {}
for (gold_start, gold_end, label_str) in brackets:
start = self.gold_to_cand[gold_start]
end = self.gold_to_cand[gold_end]
if start is not None and end is not None:
self.brackets.setdefault(start, {}).setdefault(end, set())
self.brackets[end][start].add(label_str)
def __len__(self):
return self.length
@ -262,15 +290,68 @@ cdef class GoldParse:
return not nonproj.is_nonproj_tree(self.heads)
def biluo_tags_from_offsets(doc, entities):
'''Encode labelled spans into per-token tags, using the Begin/In/Last/Unit/Out
scheme (biluo).
Arguments:
doc (Doc):
The document that the entity offsets refer to. The output tags will
refer to the token boundaries within the document.
entities (sequence):
A sequence of (start, end, label) triples. start and end should be
character-offset integers denoting the slice into the original string.
Returns:
tags (list):
A list of unicode strings, describing the tags. Each tag string will
be of the form either "", "O" or "{action}-{label}", where action is one
of "B", "I", "L", "U". The string "-" is used where the entity
offsets don't align with the tokenization in the Doc object. The
training algorithm will view these as missing values. "O" denotes
a non-entity token. "B" denotes the beginning of a multi-token entity,
"I" the inside of an entity of three or more tokens, and "L" the end
of an entity of two or more tokens. "U" denotes a single-token entity.
Example:
text = 'I like London.'
entities = [(len('I like '), len('I like London'), 'LOC')]
doc = nlp.tokenizer(text)
tags = biluo_tags_from_offsets(doc, entities)
assert tags == ['O', 'O', 'U-LOC', 'O']
'''
starts = {token.idx: token.i for token in doc}
ends = {token.idx+len(token): token.i for token in doc}
biluo = ['-' for _ in doc]
# Handle entity cases
for start_char, end_char, label in entities:
start_token = starts.get(start_char)
end_token = ends.get(end_char)
# Only interested if the tokenization is correct
if start_token is not None and end_token is not None:
if start_token == end_token:
biluo[start_token] = 'U-%s' % label
else:
biluo[start_token] = 'B-%s' % label
for i in range(start_token+1, end_token):
biluo[i] = 'I-%s' % label
biluo[end_token] = 'L-%s' % label
# Now distinguish the O cases from ones where we miss the tokenization
entity_chars = set()
for start_char, end_char, label in entities:
for i in range(start_char, end_char):
entity_chars.add(i)
for token in doc:
for i in range(token.idx, token.idx+len(token)):
if i in entity_chars:
break
else:
biluo[token.i] = 'O'
return biluo
def is_punct_label(label):
return label == 'P' or label.lower() == 'punct'

View File

@ -2,6 +2,8 @@ from __future__ import absolute_import
from __future__ import unicode_literals
from warnings import warn
import pathlib
from contextlib import contextmanager
import shutil
try:
import ujson as json
@ -15,126 +17,120 @@ except NameError:
basestring = str
from .tokenizer import Tokenizer
from .vocab import Vocab
from .syntax.parser import Parser
from .tagger import Tagger
from .matcher import Matcher
from . import attrs
from . import orth
from .syntax.ner import BiluoPushDown
from .syntax.arc_eager import ArcEager
from . import util
from .lemmatizer import Lemmatizer
from .train import Trainer
from .attrs import TAG, DEP, ENT_IOB, ENT_TYPE, HEAD, PROB, LANG, IS_STOP
from .syntax.parser import get_templates
from .syntax.nonproj import PseudoProjectivity
from .pipeline import DependencyParser, EntityRecognizer
class BaseDefaults(object):
def __init__(self, lang, path):
self.path = path
self.lang = lang
self.lex_attr_getters = dict(self.__class__.lex_attr_getters)
if self.path and (self.path / 'vocab' / 'oov_prob').exists():
with (self.path / 'vocab' / 'oov_prob').open() as file_:
oov_prob = file_.read().strip()
self.lex_attr_getters[PROB] = lambda string: oov_prob
self.lex_attr_getters[LANG] = lambda string: lang
self.lex_attr_getters[IS_STOP] = lambda string: string in self.stop_words
@classmethod
def create_lemmatizer(cls, nlp=None):
if nlp is None or nlp.path is None:
return Lemmatizer({}, {}, {})
else:
return Lemmatizer.load(nlp.path)
def Lemmatizer(self):
return Lemmatizer.load(self.path) if self.path else Lemmatizer({}, {}, {})
@classmethod
def create_vocab(cls, nlp=None):
lemmatizer = cls.create_lemmatizer(nlp)
if nlp is None or nlp.path is None:
return Vocab(lex_attr_getters=cls.lex_attr_getters, tag_map=cls.tag_map,
lemmatizer=lemmatizer)
else:
return Vocab.load(nlp.path, lex_attr_getters=cls.lex_attr_getters,
tag_map=cls.tag_map, lemmatizer=lemmatizer)
def Vectors(self):
@classmethod
def add_vectors(cls, nlp=None):
return True
def Vocab(self, lex_attr_getters=True, tag_map=True,
lemmatizer=True, serializer_freqs=True, vectors=True):
if lex_attr_getters is True:
lex_attr_getters = self.lex_attr_getters
if tag_map is True:
tag_map = self.tag_map
if lemmatizer is True:
lemmatizer = self.Lemmatizer()
if vectors is True:
vectors = self.Vectors()
if self.path:
return Vocab.load(self.path, lex_attr_getters=lex_attr_getters,
tag_map=tag_map, lemmatizer=lemmatizer,
serializer_freqs=serializer_freqs)
else:
return Vocab(lex_attr_getters=lex_attr_getters, tag_map=tag_map,
lemmatizer=lemmatizer, serializer_freqs=serializer_freqs)
def Tokenizer(self, vocab, rules=None, prefix_search=None, suffix_search=None,
infix_finditer=None):
if rules is None:
rules = self.tokenizer_exceptions
if prefix_search is None:
prefix_search = util.compile_prefix_regex(self.prefixes).search
if suffix_search is None:
suffix_search = util.compile_suffix_regex(self.suffixes).search
if infix_finditer is None:
infix_finditer = util.compile_infix_regex(self.infixes).finditer
if self.path:
return Tokenizer.load(self.path, vocab, rules=rules,
prefix_search=prefix_search,
suffix_search=suffix_search,
infix_finditer=infix_finditer)
else:
return Tokenizer(vocab, rules=rules,
@classmethod
def create_tokenizer(cls, nlp=None):
rules = cls.tokenizer_exceptions
prefix_search = util.compile_prefix_regex(cls.prefixes).search
suffix_search = util.compile_suffix_regex(cls.suffixes).search
infix_finditer = util.compile_infix_regex(cls.infixes).finditer
vocab = nlp.vocab if nlp is not None else cls.create_vocab(nlp)
return Tokenizer(nlp.vocab, rules=rules,
prefix_search=prefix_search, suffix_search=suffix_search,
infix_finditer=infix_finditer)
def Tagger(self, vocab):
if self.path:
return Tagger.load(self.path / 'pos', vocab)
@classmethod
def create_tagger(cls, nlp=None):
if nlp is None:
return Tagger(cls.create_vocab(), features=cls.tagger_features)
elif nlp.path is None or not (nlp.path / 'pos').exists():
return Tagger(nlp.vocab, features=cls.tagger_features)
else:
return Tagger.blank(vocab, Tagger.default_templates())
return Tagger.load(nlp.path / 'pos', nlp.vocab)
def Parser(self, vocab):
if self.path:
if (self.path / 'deps').exists():
return Parser.load(self.path / 'deps', vocab, ArcEager)
@classmethod
def create_parser(cls, nlp=None):
if nlp is None:
return DependencyParser(cls.create_vocab(), features=cls.parser_features)
elif nlp.path is None or not (nlp.path / 'deps').exists():
return DependencyParser(nlp.vocab, features=cls.parser_features)
else:
return None
return DependencyParser.load(nlp.path / 'deps', nlp.vocab)
@classmethod
def create_entity(cls, nlp=None):
if nlp is None:
return EntityRecognizer(cls.create_vocab(), features=cls.entity_features)
elif nlp.path is None or not (nlp.path / 'ner').exists():
return EntityRecognizer(nlp.vocab, features=cls.entity_features)
else:
return Parser.blank(vocab, ArcEager,
features=self.parser_features, labels=self.parser_labels)
return EntityRecognizer.load(nlp.path / 'ner', nlp.vocab)
def Entity(self, vocab):
if self.path:
if (self.path / 'ner').exists():
return Parser.load(self.path / 'ner', vocab, BiluoPushDown)
@classmethod
def create_matcher(cls, nlp=None):
if nlp is None:
return Matcher(cls.create_vocab())
elif nlp.path is None or not (nlp.path / 'vocab').exists():
return Matcher(nlp.vocab)
else:
return None
else:
return Parser.blank(vocab, BiluoPushDown,
features=self.entity_features, labels=self.entity_labels)
return Matcher.load(nlp.path / 'vocab', nlp.vocab)
def Matcher(self, vocab):
if self.path:
return Matcher.load(self.path, vocab)
else:
return Matcher(vocab)
@classmethod
def create_pipeline(self, nlp=None):
pipeline = []
if nlp is None:
return []
if nlp.tagger:
pipeline.append(nlp.tagger)
if nlp.parser:
pipeline.append(nlp.parser)
if nlp.entity:
pipeline.append(nlp.entity)
return pipeline
def Pipeline(self, nlp):
return [
nlp.tokenizer,
nlp.tagger,
nlp.parser,
nlp.entity]
prefixes = tuple()
parser_labels = {0: {'ROOT': True}}
suffixes = tuple()
entity_labels = {0: {'PER': True, 'LOC': True, 'ORG': True, 'MISC': True}}
infixes = tuple()
tag_map = {}
tokenizer_exceptions = {}
parser_features = get_templates('parser')
entity_features = get_templates('ner')
tagger_features = Tagger.feature_templates # TODO -- fix this
stop_words = set()
lex_attr_getters = {
@ -171,66 +167,105 @@ class Language(object):
Defaults = BaseDefaults
lang = None
def __init__(self,
path=None,
vocab=True,
tokenizer=True,
tagger=True,
parser=True,
entity=True,
matcher=True,
serializer=True,
vectors=True,
pipeline=True,
defaults=True,
data_dir=None):
"""
A model can be specified:
1) by calling a Language subclass
- spacy.en.English()
2) by calling a Language subclass with data_dir
- spacy.en.English('my/model/root')
- spacy.en.English(data_dir='my/model/root')
3) by package name
- spacy.load('en_default')
- spacy.load('en_default==1.0.0')
4) by package name with a relocated package base
- spacy.load('en_default', via='/my/package/root')
- spacy.load('en_default==1.0.0', via='/my/package/root')
"""
if data_dir is not None and path is None:
warn("'data_dir' argument now named 'path'. Doing what you mean.")
path = data_dir
@classmethod
@contextmanager
def train(cls, path, gold_tuples, *configs):
if isinstance(path, basestring):
path = pathlib.Path(path)
if path is None:
tagger_cfg, parser_cfg, entity_cfg = configs
dep_model_dir = path / 'deps'
ner_model_dir = path / 'ner'
pos_model_dir = path / 'pos'
if dep_model_dir.exists():
shutil.rmtree(str(dep_model_dir))
if ner_model_dir.exists():
shutil.rmtree(str(ner_model_dir))
if pos_model_dir.exists():
shutil.rmtree(str(pos_model_dir))
dep_model_dir.mkdir()
ner_model_dir.mkdir()
pos_model_dir.mkdir()
if parser_cfg['pseudoprojective']:
# preprocess training data here before ArcEager.get_labels() is called
gold_tuples = PseudoProjectivity.preprocess_training_data(gold_tuples)
parser_cfg['labels'] = ArcEager.get_labels(gold_tuples)
entity_cfg['labels'] = BiluoPushDown.get_labels(gold_tuples)
with (dep_model_dir / 'config.json').open('wb') as file_:
json.dump(parser_cfg, file_)
with (ner_model_dir / 'config.json').open('wb') as file_:
json.dump(entity_cfg, file_)
with (pos_model_dir / 'config.json').open('wb') as file_:
json.dump(tagger_cfg, file_)
self = cls(
path=path,
vocab=False,
tokenizer=False,
tagger=False,
parser=False,
entity=False,
matcher=False,
serializer=False,
vectors=False,
pipeline=False)
self.defaults.parser_labels = parser_cfg['labels']
self.defaults.entity_labels = entity_cfg['labels']
self.vocab = self.defaults.Vocab()
self.tokenizer = self.defaults.Tokenizer(self.vocab)
self.tagger = self.defaults.Tagger(self.vocab, **tagger_cfg)
self.parser = self.defaults.Parser(self.vocab, **parser_cfg)
self.entity = self.defaults.Entity(self.vocab, **entity_cfg)
self.pipeline = self.defaults.Pipeline(self)
yield Trainer(self, gold_tuples)
self.end_training()
def __init__(self, path=True, **overrides):
if 'data_dir' in overrides and 'path' not in overrides:
raise ValueError("The argument 'data_dir' has been renamed to 'path'")
path = overrides.get('path', True)
if isinstance(path, basestring):
path = pathlib.Path(path)
if path is True:
path = util.match_best_version(self.lang, '', util.get_data_path())
self.path = path
defaults = defaults if defaults is not True else self.get_defaults(self.path)
self.vocab = vocab if vocab is not True else defaults.Vocab(vectors=vectors)
self.tokenizer = tokenizer if tokenizer is not True else defaults.Tokenizer(self.vocab)
self.tagger = tagger if tagger is not True else defaults.Tagger(self.vocab)
self.entity = entity if entity is not True else defaults.Entity(self.vocab)
self.parser = parser if parser is not True else defaults.Parser(self.vocab)
self.matcher = matcher if matcher is not True else defaults.Matcher(self.vocab)
self.pipeline = pipeline(self) if pipeline is not True else defaults.Pipeline(self)
self.vocab = self.Defaults.create_vocab(self) \
if 'vocab' not in overrides \
else overrides['vocab']
self.tokenizer = self.Defaults.create_tokenizer(self) \
if 'tokenizer' not in overrides \
else overrides['tokenizer']
self.tagger = self.Defaults.create_tagger(self) \
if 'tagger' not in overrides \
else overrides['tagger']
self.parser = self.Defaults.create_parser(self) \
if 'parser' not in overrides \
else overrides['parser']
self.entity = self.Defaults.create_entity(self) \
if 'entity' not in overrides \
else overrides['entity']
self.matcher = self.Defaults.create_matcher(self) \
if 'matcher' not in overrides \
else overrides['matcher']
def __reduce__(self):
args = (
self.path,
self.vocab,
self.tokenizer,
self.tagger,
self.parser,
self.entity,
self.matcher
)
return (self.__class__, args, None, None)
if 'make_doc' in overrides:
self.make_doc = overrides['make_doc']
elif 'create_make_doc' in overrides:
self.make_doc = overrides['create_make_doc']
else:
self.make_doc = lambda text: self.tokenizer(text)
if 'pipeline' in overrides:
self.pipeline = overrides['pipeline']
elif 'create_pipeline' in overrides:
self.pipeline = overrides['create_pipeline']
else:
self.pipeline = [self.tagger, self.parser, self.matcher, self.entity]
def __call__(self, text, tag=True, parse=True, entity=True):
"""Apply the pipeline to some text. The text can span multiple sentences,
@ -249,24 +284,22 @@ class Language(object):
>>> tokens[0].orth_, tokens[0].head.tag_
('An', 'NN')
"""
doc = self.pipeline[0](text)
doc = self.make_doc(text)
if self.entity and entity:
# Add any of the entity labels already set, in case we don't have them.
for token in doc:
if token.ent_type != 0:
self.entity.add_label(token.ent_type)
skip = {self.tagger: not tag, self.parser: not parse, self.entity: not entity}
for proc in self.pipeline[1:]:
for proc in self.pipeline:
if proc and not skip.get(proc):
proc(doc)
return doc
def pipe(self, texts, tag=True, parse=True, entity=True, n_threads=2,
batch_size=1000):
def pipe(self, texts, tag=True, parse=True, entity=True, n_threads=2, batch_size=1000):
skip = {self.tagger: not tag, self.parser: not parse, self.entity: not entity}
stream = self.pipeline[0].pipe(texts,
n_threads=n_threads, batch_size=batch_size)
for proc in self.pipeline[1:]:
stream = (self.make_doc(text) for text in texts)
for proc in self.pipeline:
if proc and not skip.get(proc):
if hasattr(proc, 'pipe'):
stream = proc.pipe(stream, n_threads=n_threads, batch_size=batch_size)
@ -278,15 +311,18 @@ class Language(object):
def end_training(self, path=None):
if path is None:
path = self.path
if self.parser:
self.parser.model.end_training()
self.parser.model.dump(path / 'deps' / 'model')
if self.entity:
self.entity.model.end_training()
self.entity.model.dump(path / 'ner' / 'model')
elif isinstance(path, basestring):
path = pathlib.Path(path)
if self.tagger:
self.tagger.model.end_training()
self.tagger.model.dump(path / 'pos' / 'model')
self.tagger.model.dump(str(path / 'pos' / 'model'))
if self.parser:
self.parser.model.end_training()
self.parser.model.dump(str(path / 'deps' / 'model'))
if self.entity:
self.entity.model.end_training()
self.entity.model.dump(str(path / 'ner' / 'model'))
strings_loc = path / 'vocab' / 'strings.json'
with strings_loc.open('w', encoding='utf8') as file_:
@ -309,7 +345,7 @@ class Language(object):
else:
entity_iob_freqs = []
entity_type_freqs = []
with (path / 'vocab' / 'serializer.json').open('w') as file_:
with (path / 'vocab' / 'serializer.json').open('wb') as file_:
file_.write(
json.dumps([
(TAG, tagger_freqs),

View File

@ -92,8 +92,8 @@ ctypedef TokenPatternC* TokenPatternC_ptr
ctypedef pair[int, TokenPatternC_ptr] StateC
cdef TokenPatternC* init_pattern(Pool mem, object token_specs, attr_t entity_id,
attr_t entity_type) except NULL:
cdef TokenPatternC* init_pattern(Pool mem, attr_t entity_id, attr_t label,
object token_specs) except NULL:
pattern = <TokenPatternC*>mem.alloc(len(token_specs) + 1, sizeof(TokenPatternC))
cdef int i
for i, (quantifier, spec) in enumerate(token_specs):
@ -108,7 +108,7 @@ cdef TokenPatternC* init_pattern(Pool mem, object token_specs, attr_t entity_id,
pattern[i].attrs[0].attr = ID
pattern[i].attrs[0].value = entity_id
pattern[i].attrs[1].attr = ENT_TYPE
pattern[i].attrs[1].value = entity_type
pattern[i].attrs[1].value = label
pattern[i].nr_attr = 0
return pattern
@ -163,37 +163,14 @@ def _convert_strings(token_specs, string_store):
return tokens
def get_bilou(length):
if length == 1:
return [U_ENT]
elif length == 2:
return [B2_ENT, L2_ENT]
elif length == 3:
return [B3_ENT, I3_ENT, L3_ENT]
elif length == 4:
return [B4_ENT, I4_ENT, I4_ENT, L4_ENT]
elif length == 5:
return [B5_ENT, I5_ENT, I5_ENT, I5_ENT, L5_ENT]
elif length == 6:
return [B6_ENT, I6_ENT, I6_ENT, I6_ENT, I6_ENT, L6_ENT]
elif length == 7:
return [B7_ENT, I7_ENT, I7_ENT, I7_ENT, I7_ENT, I7_ENT, L7_ENT]
elif length == 8:
return [B8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, L8_ENT]
elif length == 9:
return [B9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, L9_ENT]
elif length == 10:
return [B10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT,
I10_ENT, I10_ENT, L10_ENT]
else:
raise ValueError("Max length currently 10 for phrase matching")
cdef class Matcher:
cdef Pool mem
cdef vector[TokenPatternC*] patterns
cdef readonly Vocab vocab
cdef public object _patterns
cdef public object _entities
cdef public object _callbacks
cdef public object _acceptors
@classmethod
def load(cls, path, vocab):
@ -205,12 +182,17 @@ cdef class Matcher:
return cls(vocab, patterns)
def __init__(self, vocab, patterns={}):
self._patterns = dict(patterns) # Make sure we own the object
self._patterns = {}
self._entities = {}
self._acceptors = {}
self._callbacks = {}
self.vocab = vocab
self.mem = Pool()
self.vocab = vocab
for entity_key, (etype, attrs, specs) in sorted(self._patterns.items()):
self.add(entity_key, etype, attrs, specs)
for entity_key, (etype, attrs, specs) in sorted(patterns.items()):
self.add_entity(entity_key, attrs)
for spec in specs:
self.add_pattern(entity_key, spec, label=etype)
def __reduce__(self):
return (self.__class__, (self.vocab, self._patterns), None, None)
@ -218,21 +200,69 @@ cdef class Matcher:
property n_patterns:
def __get__(self): return self.patterns.size()
def add(self, entity_key, etype, attrs, specs):
self._patterns[entity_key] = (etype, dict(attrs), list(specs))
if isinstance(entity_key, basestring):
entity_key = self.vocab.strings[entity_key]
if isinstance(etype, basestring):
etype = self.vocab.strings[etype]
elif etype is None:
etype = -1
# TODO: Do something more clever about multiple patterns for single
# entity
def add_entity(self, entity_key, attrs=None, if_exists='raise',
acceptor=None, on_match=None):
if if_exists not in ('raise', 'ignore', 'update'):
raise ValueError(
"Unexpected value for if_exists: %s.\n"
"Expected one of: ['raise', 'ignore', 'update']" % if_exists)
if attrs is None:
attrs = {}
entity_key = self.normalize_entity_key(entity_key)
if self.has_entity(entity_key):
if if_exists == 'raise':
raise KeyError(
"Tried to add entity %s. Entity exists, and if_exists='raise'.\n"
"Set if_exists='ignore' or if_exists='update', or check with "
"matcher.has_entity()")
elif if_exists == 'ignore':
return
self._entities[entity_key] = dict(attrs)
self._patterns.setdefault(entity_key, [])
self._acceptors[entity_key] = acceptor
self._callbacks[entity_key] = on_match
def add_pattern(self, entity_key, token_specs, label=""):
entity_key = self.normalize_entity_key(entity_key)
if not self.has_entity(entity_key):
self.add_entity(entity_key)
if isinstance(label, basestring):
label = self.vocab.strings[label]
elif label is None:
label = 0
spec = _convert_strings(token_specs, self.vocab.strings)
self.patterns.push_back(init_pattern(self.mem, entity_key, label, spec))
self._patterns[entity_key].append((label, token_specs))
def add(self, entity_key, label, attrs, specs, acceptor=None, on_match=None):
self.add_entity(entity_key, attrs=attrs, if_exists='update',
acceptor=acceptor, on_match=on_match)
for spec in specs:
spec = _convert_strings(spec, self.vocab.strings)
self.patterns.push_back(init_pattern(self.mem, spec, entity_key, etype))
self.add_pattern(entity_key, spec, label=label)
def normalize_entity_key(self, entity_key):
if isinstance(entity_key, basestring):
return self.vocab.strings[entity_key]
else:
return entity_key
def has_entity(self, entity_key):
entity_key = self.normalize_entity_key(entity_key)
return entity_key in self._entities
def get_entity(self, entity_key):
entity_key = self.normalize_entity_key(entity_key)
if entity_key in self._entities:
return self._entities[entity_key]
else:
return None
def __call__(self, Doc doc, acceptor=None):
if acceptor is not None:
raise ValueError(
"acceptor keyword argument to Matcher deprecated. Specify acceptor "
"functions when you add patterns instead.")
cdef vector[StateC] partials
cdef int n_partials = 0
cdef int q = 0
@ -267,7 +297,11 @@ cdef class Matcher:
end = token_i+1
ent_id = state.second[1].attrs[0].value
label = state.second[1].attrs[1].value
if acceptor is None or acceptor(doc, ent_id, label, start, end):
acceptor = self._acceptors.get(ent_id)
if acceptor is not None:
match = acceptor(doc, ent_id, label, start, end)
if match:
ent_id, label, start, end = match
matches.append((ent_id, label, start, end))
partials.resize(q)
# Check whether we open any new patterns on this token
@ -293,6 +327,10 @@ cdef class Matcher:
label = pattern[1].attrs[1].value
if acceptor is None or acceptor(doc, ent_id, label, start, end):
matches.append((ent_id, label, start, end))
for i, (ent_id, label, start, end) in enumerate(matches):
on_match = self._callbacks.get(ent_id)
if on_match is not None:
on_match(self, doc, i, matches)
return matches
def pipe(self, docs, batch_size=1000, n_threads=2):
@ -301,6 +339,32 @@ cdef class Matcher:
yield doc
def get_bilou(length):
if length == 1:
return [U_ENT]
elif length == 2:
return [B2_ENT, L2_ENT]
elif length == 3:
return [B3_ENT, I3_ENT, L3_ENT]
elif length == 4:
return [B4_ENT, I4_ENT, I4_ENT, L4_ENT]
elif length == 5:
return [B5_ENT, I5_ENT, I5_ENT, I5_ENT, L5_ENT]
elif length == 6:
return [B6_ENT, I6_ENT, I6_ENT, I6_ENT, I6_ENT, L6_ENT]
elif length == 7:
return [B7_ENT, I7_ENT, I7_ENT, I7_ENT, I7_ENT, I7_ENT, L7_ENT]
elif length == 8:
return [B8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, I8_ENT, L8_ENT]
elif length == 9:
return [B9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, I9_ENT, L9_ENT]
elif length == 10:
return [B10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT, I10_ENT,
I10_ENT, I10_ENT, L10_ENT]
else:
raise ValueError("Max length currently 10 for phrase matching")
cdef class PhraseMatcher:
cdef Pool mem
cdef Vocab vocab

12
spacy/pipeline.pxd Normal file
View File

@ -0,0 +1,12 @@
from .syntax.parser cimport Parser
from .syntax.ner cimport BiluoPushDown
from .syntax.arc_eager cimport ArcEager
from .tagger cimport Tagger
cdef class EntityRecognizer(Parser):
pass
cdef class DependencyParser(Parser):
pass

24
spacy/pipeline.pyx Normal file
View File

@ -0,0 +1,24 @@
from .syntax.parser cimport Parser
from .syntax.ner cimport BiluoPushDown
from .syntax.arc_eager cimport ArcEager
from .vocab cimport Vocab
from .tagger import Tagger
# TODO: The disorganization here is pretty embarrassing. At least it's only
# internals.
from .syntax.parser import get_templates as get_feature_templates
cdef class EntityRecognizer(Parser):
TransitionSystem = BiluoPushDown
feature_templates = get_feature_templates('ner')
cdef class DependencyParser(Parser):
TransitionSystem = ArcEager
feature_templates = get_feature_templates('basic')
__all__ = [Tagger, DependencyParser, EntityRecognizer]

View File

@ -70,6 +70,15 @@ class Scorer(object):
def ents_f(self):
return self.ner.fscore * 100
@property
def scores(self):
return {
'uas': self.uas, 'las': self.las,
'ents_p': self.ents_p, 'ents_r': self.ents_r, 'ents_f': self.ents_f,
'tags_acc': self.tags_acc,
'token_acc': self.token_acc
}
def score(self, tokens, gold, verbose=False, punct_labels=('p', 'punct')):
assert len(tokens) == len(gold)

View File

@ -1,13 +1,11 @@
from libc.stdint cimport int64_t
from cymem.cymem cimport Pool
from preshed.maps cimport PreshMap
from murmurhash.mrmr cimport hash64
from .typedefs cimport attr_t
from libc.stdint cimport int64_t
from .typedefs cimport attr_t, hash_t
from .typedefs cimport hash_t
DEF UINT64_MAX = 18446744073709551615
cpdef hash_t hash_string(unicode string) except 0
@ -24,10 +22,6 @@ cdef class StringStore:
cdef public PreshMap _map
cdef int64_t _resize_at
cdef PreshMap oov_maps
cpdef int remove_oov_map(self, Pool mem) except -1
cdef hash_t intern(self, unicode py_string, Pool mem=*) except UINT64_MAX
cdef const Utf8Str* _intern_utf8(self, const unsigned char* utf8_string,
int length) except NULL
cdef const Utf8Str* intern(self, unicode py_string) except NULL
cdef const Utf8Str* _intern_utf8(self, char* utf8_string, int length) except NULL

View File

@ -1,4 +1,3 @@
# cython: infer_types=True
from __future__ import unicode_literals, absolute_import
cimport cython
@ -7,8 +6,7 @@ from libc.stdint cimport uint64_t
from murmurhash.mrmr cimport hash64
from preshed.maps cimport map_init, map_set, map_get, map_iter
from preshed.maps cimport MapStruct
from preshed.maps cimport map_iter, key_t
from .typedefs cimport hash_t
@ -18,17 +16,13 @@ except ImportError:
import json
DEF UINT64_MAX = 18446744073709551615
cpdef hash_t hash_string(unicode string) except 0:
byte_string = string.encode('utf8')
cdef unsigned char* chars = byte_string
return _hash_utf8(chars, len(byte_string))
chars = string.encode('utf8')
return _hash_utf8(chars, len(chars))
cdef hash_t _hash_utf8(const unsigned char* utf8_string, int length) nogil:
return hash64(<void*>utf8_string, length, 1)
cdef hash_t _hash_utf8(char* utf8_string, int length):
return hash64(utf8_string, length, 1)
cdef unicode _decode(const Utf8Str* string):
@ -80,7 +74,6 @@ cdef class StringStore:
def __init__(self, strings=None):
self.mem = Pool()
self._map = PreshMap()
self.oov_maps = PreshMap()
self._resize_at = 10000
self.c = <Utf8Str*>self.mem.alloc(self._resize_at, sizeof(Utf8Str))
self.size = 1
@ -115,20 +108,13 @@ cdef class StringStore:
byte_string = <bytes>string_or_id
if len(byte_string) == 0:
return 0
key = _hash_utf8(byte_string, len(byte_string))
utf8str = <Utf8Str*>self._map.get(key)
if utf8str is NULL:
raise KeyError(byte_string)
else:
utf8str = self._intern_utf8(byte_string, len(byte_string))
return utf8str - self.c
elif isinstance(string_or_id, unicode):
if len(<unicode>string_or_id) == 0:
return 0
key = hash_string(string_or_id)
utf8str = <Utf8Str*>self._map.get(key)
if utf8str is NULL:
raise KeyError(string_or_id)
else:
byte_string = (<unicode>string_or_id).encode('utf8')
utf8str = self._intern_utf8(byte_string, len(byte_string))
return utf8str - self.c
else:
raise TypeError(type(string_or_id))
@ -145,8 +131,6 @@ cdef class StringStore:
yield _decode(&self.c[i]) if i > 0 else u''
def __reduce__(self):
# TODO: Is it problematic that we don't save the OOV strings?
# Probably yes? We're not restoring all the state...
strings = [""]
for i in range(1, self.size):
string = &self.c[i]
@ -154,77 +138,27 @@ cdef class StringStore:
strings.append(py_string)
return (StringStore, (strings,), None, None, None)
cdef hash_t intern(self, unicode py_string, Pool mem=None) except UINT64_MAX:
if mem is None:
mem = self.mem
cdef hash_t map_key = id(mem)
cdef const Utf8Str* intern(self, unicode py_string) except NULL:
# 0 means missing, but we don't bother offsetting the index.
cdef bytes byte_string = py_string.encode('utf8')
cdef hash_t key = _hash_utf8(byte_string, len(byte_string))
cdef const Utf8Str* utf8str = <Utf8Str*>self._map.get(key)
cdef hash_t map_id = id(mem)
cdef MapStruct* oov_map
if utf8str is not NULL:
return utf8str - self.c
elif mem is None or mem is self.mem:
utf8str = self._intern_utf8(byte_string, len(byte_string))
return utf8str - self.c
else:
new_utf8str = <Utf8Str*>mem.alloc(sizeof(Utf8Str), 1)
oov_map = <MapStruct*>self.oov_maps.get(map_key)
if oov_map is NULL:
oov_map = <MapStruct*>mem.alloc(sizeof(MapStruct), 1)
map_init(mem, oov_map, 16)
self.oov_maps.set(id(mem), oov_map)
new_utf8str[0] = _allocate(mem, byte_string, len(byte_string))
map_set(mem, oov_map, key, new_utf8str)
return key
def decode_int(self, hash_t int_, Pool mem=None):
cdef hash_t map_key
if int_ == 0:
return u''
elif int_ < <uint64_t>self.size:
return _decode(&self.c[int_])
elif mem is None or mem is self.mem:
raise IndexError(int_)
else:
map_key = id(mem)
oov_map = <MapStruct*>self.oov_maps.get(map_key)
if oov_map is NULL:
raise IndexError(
"Trying to decode integer into string, but it's not in " +
"the main store, and the memory pool hasn't been seen before.\n" +
("int_ == %d\n" % int_) +
"id(mem) == %d" % map_key)
else:
utf8str = <const Utf8Str*>map_get(oov_map, int_)
if utf8str is NULL:
raise IndexError(
"Trying to decode integer into string, but it's not in " +
"the main store. The integer was also not found in the " +
"indicated auxiliary pool " +
"(which is usually specific to a document)." +
("int_ == %d\n" % int_) +
"id(mem) == %d" % map_key)
return _decode(utf8str)
return self._intern_utf8(byte_string, len(byte_string))
@cython.final
cdef const Utf8Str* _intern_utf8(self, const unsigned char* utf8_string,
int length) except NULL:
cdef const Utf8Str* _intern_utf8(self, char* utf8_string, int length) except NULL:
# 0 means missing, but we don't bother offsetting the index.
cdef hash_t key = _hash_utf8(utf8_string, length)
value = <Utf8Str*>self._map.get(key)
if value is not NULL:
return value
if self.size == self._resize_at:
self._realloc()
key = _hash_utf8(utf8_string, length)
self.c[self.size] = _allocate(self.mem, utf8_string, length)
self.c[self.size] = _allocate(self.mem, <unsigned char*>utf8_string, length)
self._map.set(key, <void*>&self.c[self.size])
self.size += 1
return &self.c[self.size-1]
cpdef int remove_oov_map(self, Pool mem) except -1:
cdef hash_t key = id(mem)
self._maps.pop(key)
def dump(self, file_):
# TODO: Is it problematic that we don't save the OOV strings? No, right?
string_data = json.dumps(list(self))
if not isinstance(string_data, unicode):
string_data = string_data.decode('utf8')
@ -246,8 +180,8 @@ cdef class StringStore:
# we resize our array. So, first we remap to indices, then we resize,
# then we can acquire the new pointers.
cdef Pool tmp_mem = Pool()
keys = <hash_t*>tmp_mem.alloc(self.size, sizeof(hash_t))
cdef hash_t key
keys = <key_t*>tmp_mem.alloc(self.size, sizeof(key_t))
cdef key_t key
cdef void* value
cdef const Utf8Str ptr
cdef int i = 0

View File

@ -1,3 +1,5 @@
from __future__ import unicode_literals
IDS = {
"": NIL,
"IS_ALPHA": IS_ALPHA,

View File

@ -279,20 +279,32 @@ cdef int _get_root(int word, const GoldParseC* gold) nogil:
cdef class ArcEager(TransitionSystem):
@classmethod
def get_labels(cls, gold_parses):
move_labels = {SHIFT: {'': True}, REDUCE: {'': True}, RIGHT: {},
LEFT: {}, BREAK: {'ROOT': True}}
for raw_text, sents in gold_parses:
def get_actions(cls, **kwargs):
actions = kwargs.get('actions',
{
SHIFT: {'': True},
REDUCE: {'': True},
RIGHT: {},
LEFT: {},
BREAK: {'ROOT': True}})
for label in kwargs.get('left_labels', []):
if label.upper() != 'ROOT':
actions[LEFT][label] = True
for label in kwargs.get('right_labels', []):
if label.upper() != 'ROOT':
actions[RIGHT][label] = True
for raw_text, sents in kwargs.get('gold_parses', []):
for (ids, words, tags, heads, labels, iob), ctnts in sents:
for child, head, label in zip(ids, heads, labels):
if label.upper() == 'ROOT':
label = 'ROOT'
if label != 'ROOT':
if head < child:
move_labels[RIGHT][label] = True
actions[RIGHT][label] = True
elif head > child:
move_labels[LEFT][label] = True
return move_labels
actions[LEFT][label] = True
return actions
property action_types:
def __get__(self):
@ -312,12 +324,6 @@ cdef class ArcEager(TransitionSystem):
# Count frequencies, for use in encoder
self.freqs[HEAD][gold.c.heads[i] - i] += 1
self.freqs[DEP][gold.c.labels[i]] += 1
for end, brackets in gold.brackets.items():
for start, label_strs in brackets.items():
gold.c.brackets[start][end] = 1
for label_str in label_strs:
# Add the encoded label to the set
gold.brackets[end][start].add(self.strings[label_str])
cdef Transition lookup_transition(self, object name) except *:
if '-' in name:

View File

@ -51,11 +51,21 @@ cdef bint _entity_is_sunk(StateClass st, Transition* golds) nogil:
cdef class BiluoPushDown(TransitionSystem):
@classmethod
def get_labels(cls, gold_tuples):
move_labels = {MISSING: {'': True}, BEGIN: {}, IN: {}, LAST: {}, UNIT: {},
OUT: {'': True}}
def get_actions(cls, **kwargs):
actions = kwargs.get('actions',
{
MISSING: {'': True},
BEGIN: {},
IN: {},
LAST: {},
UNIT: {},
OUT: {'': True}
})
for entity_type in kwargs.get('entity_types', []):
for action in (BEGIN, IN, LAST, UNIT):
actions[action][entity_type] = True
moves = ('M', 'B', 'I', 'L', 'U')
for raw_text, sents in gold_tuples:
for raw_text, sents in kwargs.get('gold_tuples', []):
for (ids, words, tags, heads, labels, biluo), _ in sents:
for i, ner_tag in enumerate(biluo):
if ner_tag != 'O' and ner_tag != '-':
@ -63,8 +73,8 @@ cdef class BiluoPushDown(TransitionSystem):
raise ValueError(ner_tag)
_, label = ner_tag.split('-')
for move_str in ('B', 'I', 'L', 'U'):
move_labels[moves.index(move_str)][label] = True
return move_labels
actions[moves.index(move_str)][label] = True
return actions
property action_types:
def __get__(self):

View File

@ -13,6 +13,7 @@ from ._state cimport StateC
cdef class ParserModel(AveragedPerceptron):
cdef void set_featuresC(self, ExampleC* eg, const StateC* state) nogil
cdef class Parser:
cdef readonly Vocab vocab
cdef readonly ParserModel model

View File

@ -67,10 +67,6 @@ def get_templates(name):
pf.tree_shape + pf.trigrams)
def ParserFactory(transition_system):
return lambda strings, dir_: Parser(strings, dir_, transition_system)
cdef class ParserModel(AveragedPerceptron):
cdef void set_featuresC(self, ExampleC* eg, const StateC* state) nogil:
fill_context(eg.atoms, state)
@ -79,27 +75,31 @@ cdef class ParserModel(AveragedPerceptron):
cdef class Parser:
@classmethod
def load(cls, path, Vocab vocab, moves_class):
def load(cls, path, Vocab vocab, TransitionSystem=None, require=False):
with (path / 'config.json').open() as file_:
cfg = json.load(file_)
moves = moves_class(vocab.strings, cfg['labels'])
templates = get_templates(cfg['features'])
model = ParserModel(templates)
# TODO: remove this shim when we don't have to support older data
if 'labels' in cfg:
cfg['actions'] = cfg.pop('labels')
self = cls(vocab, TransitionSystem=TransitionSystem, model=None, **cfg)
if (path / 'model').exists():
model.load(str(path / 'model'))
return cls(vocab, moves, model, **cfg)
self.model.load(str(path / 'model'))
elif require:
raise IOError(
"Required file %s/model not found when loading" % str(path))
return self
@classmethod
def blank(cls, Vocab vocab, moves_class, **cfg):
moves = moves_class(vocab.strings, cfg.get('labels', {}))
templates = cfg.get('features', tuple())
model = ParserModel(templates)
return cls(vocab, moves, model, **cfg)
def __init__(self, Vocab vocab, transition_system, ParserModel model, **cfg):
self.moves = transition_system
self.model = model
def __init__(self, Vocab vocab, TransitionSystem=None, ParserModel model=None, **cfg):
if TransitionSystem is None:
TransitionSystem = self.TransitionSystem
actions = TransitionSystem.get_actions(**cfg)
self.moves = TransitionSystem(vocab.strings, actions)
# TODO: Remove this when we no longer need to support old-style models
if isinstance(cfg.get('features'), basestring):
cfg['features'] = get_templates(cfg['features'])
elif 'features' not in cfg:
cfg['features'] = self.feature_templates
self.model = ParserModel(cfg['features'])
self.cfg = cfg
def __reduce__(self):
@ -191,7 +191,7 @@ cdef class Parser:
free(eg.is_valid)
return 0
def train(self, Doc tokens, GoldParse gold):
def update(self, Doc tokens, GoldParse gold):
self.moves.preprocess_gold(gold)
cdef StateClass stcls = StateClass.init(tokens.c, tokens.length)
self.moves.initialize_state(stcls.c)
@ -283,7 +283,9 @@ cdef class StepwiseState:
cdef Transition action = self.parser.moves.c[self.eg.guess]
return self.parser.moves.move_name(action.move, action.label)
def transition(self, action_name):
def transition(self, action_name=None):
if action_name is None:
action_name = self.predict()
moves = {'S': 0, 'D': 1, 'L': 2, 'R': 3}
if action_name == '_':
action_name = self.predict()
@ -306,14 +308,14 @@ cdef class StepwiseState:
class ParserStateError(ValueError):
def __repr__(self):
raise ValueError(
def __init__(self, doc):
ValueError.__init__(self,
"Error analysing doc -- no valid actions available. This should "
"never happen, so please report the error on the issue tracker. "
"Here's the thread to do so --- reopen it if it's closed:\n"
"https://github.com/spacy-io/spaCy/issues/429\n"
"Please include the text that the parser failed on, which is:\n"
"%s" % repr(self.args[0].text))
"%s" % repr(doc.text))
cdef int _arg_max_clas(const weight_t* scores, int move, const Transition* actions,

View File

@ -21,7 +21,7 @@ cdef class StateClass:
@property
def queue(self):
return {self.B(i) for i in range(self.c._b_i)}
return {self.B(i) for i in range(self.c.buffer_length())}
def print_state(self, words):
words = list(words) + ['_']

View File

@ -14,3 +14,4 @@ cdef class Tagger:
cdef readonly Vocab vocab
cdef readonly TaggerModel model
cdef public dict freqs
cdef public object cfg

View File

@ -15,6 +15,7 @@ from .tokens.doc cimport Doc
from .attrs cimport TAG
from .parts_of_speech cimport NO_TAG, ADJ, ADV, ADP, CONJ, DET, NOUN, NUM, PRON
from .parts_of_speech cimport VERB, X, PUNCT, EOL, SPACE
from .gold cimport GoldParse
from .attrs cimport *
@ -103,58 +104,30 @@ cdef inline void _fill_from_token(atom_t* context, const TokenC* t) nogil:
cdef class Tagger:
"""A part-of-speech tagger for English"""
@classmethod
def default_templates(cls):
return (
(W_orth,),
(P1_lemma, P1_pos),
(P2_lemma, P2_pos),
(N1_orth,),
(N2_orth,),
(W_suffix,),
(W_prefix,),
(P1_pos,),
(P2_pos,),
(P1_pos, P2_pos),
(P1_pos, W_orth),
(P1_suffix,),
(N1_suffix,),
(W_shape,),
(W_cluster,),
(N1_cluster,),
(N2_cluster,),
(P1_cluster,),
(P2_cluster,),
(W_flags,),
(N1_flags,),
(N2_flags,),
(P1_flags,),
(P2_flags,),
)
@classmethod
def blank(cls, vocab, templates):
model = TaggerModel(templates)
return cls(vocab, model)
@classmethod
def load(cls, path, vocab):
def load(cls, path, vocab, require=False):
# TODO: Change this to expect config.json when we don't have to
# support old data.
path = path if not isinstance(path, basestring) else pathlib.Path(path)
if (path / 'templates.json').exists():
with (path / 'templates.json').open() as file_:
templates = json.load(file_)
elif require:
raise IOError(
"Required file %s/templates.json not found when loading Tagger" % str(path))
else:
templates = cls.default_templates()
templates = cls.feature_templates
self = cls(vocab, model=None, feature_templates=templates)
model = TaggerModel(templates)
if (path / 'model').exists():
model.load(str(path / 'model'))
return cls(vocab, model)
self.model.load(str(path / 'model'))
elif require:
raise IOError(
"Required file %s/model not found when loading Tagger" % str(path))
return self
def __init__(self, Vocab vocab, TaggerModel model):
def __init__(self, Vocab vocab, TaggerModel model=None, **cfg):
if model is None:
model = TaggerModel(cfg.get('features', self.feature_templates))
self.vocab = vocab
self.model = model
# TODO: Move this to tag map
@ -162,6 +135,7 @@ cdef class Tagger:
for tag in self.tag_names:
self.freqs[TAG][self.vocab.strings[tag]] = 1
self.freqs[TAG][0] = 1
self.cfg = cfg
@property
def tag_names(self):
@ -208,7 +182,8 @@ cdef class Tagger:
self(doc)
yield doc
def train(self, Doc tokens, object gold_tag_strs):
def update(self, Doc tokens, GoldParse gold):
gold_tag_strs = gold.tags
assert len(tokens) == len(gold_tag_strs)
for tag in gold_tag_strs:
if tag != None and tag not in self.tag_names:
@ -238,3 +213,35 @@ cdef class Tagger:
tokens.is_tagged = True
tokens._py_tokens = [None] * tokens.length
return correct
feature_templates = (
(W_orth,),
(P1_lemma, P1_pos),
(P2_lemma, P2_pos),
(N1_orth,),
(N2_orth,),
(W_suffix,),
(W_prefix,),
(P1_pos,),
(P2_pos,),
(P1_pos, P2_pos),
(P1_pos, W_orth),
(P1_suffix,),
(N1_suffix,),
(W_shape,),
(W_cluster,),
(N1_cluster,),
(N2_cluster,),
(P1_cluster,),
(P2_cluster,),
(W_flags,),
(N1_flags,),
(N2_flags,),
(P1_flags,),
(P2_flags,),
)

View File

@ -1,16 +1,17 @@
import pytest
import os
import spacy
from ..en import English
from ..de import German
@pytest.fixture(scope="session")
def EN():
return spacy.load("en")
return English()
@pytest.fixture(scope="session")
def DE():
return spacy.load("de")
return German()
def pytest_addoption(parser):

View File

View File

@ -0,0 +1,48 @@
from __future__ import unicode_literals
from ...gold import biluo_tags_from_offsets
from ...vocab import Vocab
from ...tokens.doc import Doc
import pytest
@pytest.fixture
def vocab():
return Vocab()
def test_U(vocab):
orths_and_spaces = [('I', True), ('flew', True), ('to', True), ('London', False),
('.', True)]
doc = Doc(vocab, orths_and_spaces=orths_and_spaces)
entities = [(len("I flew to "), len("I flew to London"), 'LOC')]
tags = biluo_tags_from_offsets(doc, entities)
assert tags == ['O', 'O', 'O', 'U-LOC', 'O']
def test_BL(vocab):
orths_and_spaces = [('I', True), ('flew', True), ('to', True), ('San', True),
('Francisco', False), ('.', True)]
doc = Doc(vocab, orths_and_spaces=orths_and_spaces)
entities = [(len("I flew to "), len("I flew to San Francisco"), 'LOC')]
tags = biluo_tags_from_offsets(doc, entities)
assert tags == ['O', 'O', 'O', 'B-LOC', 'L-LOC', 'O']
def test_BIL(vocab):
orths_and_spaces = [('I', True), ('flew', True), ('to', True), ('San', True),
('Francisco', True), ('Valley', False), ('.', True)]
doc = Doc(vocab, orths_and_spaces=orths_and_spaces)
entities = [(len("I flew to "), len("I flew to San Francisco Valley"), 'LOC')]
tags = biluo_tags_from_offsets(doc, entities)
assert tags == ['O', 'O', 'O', 'B-LOC', 'I-LOC', 'L-LOC', 'O']
def test_misalign(vocab):
orths_and_spaces = [('I', True), ('flew', True), ('to', True), ('San', True),
('Francisco', True), ('Valley.', False)]
doc = Doc(vocab, orths_and_spaces=orths_and_spaces)
entities = [(len("I flew to "), len("I flew to San Francisco Valley"), 'LOC')]
tags = biluo_tags_from_offsets(doc, entities)
assert tags == ['O', 'O', 'O', '-', '-', '-']

View File

@ -46,9 +46,9 @@ def test_overlap_issue242():
if os.environ.get('SPACY_DATA'):
data_dir = os.environ.get('SPACY_DATA')
else:
data_dir = None
data_dir = False
nlp = spacy.en.English(data_dir=data_dir, tagger=False, parser=False, entity=False)
nlp = spacy.en.English(path=data_dir, tagger=False, parser=False, entity=False)
nlp.matcher.add('FOOD', 'FOOD', {}, patterns)

View File

@ -6,12 +6,12 @@ import cloudpickle
import io
@pytest.mark.models
def test_pickle(EN):
file_ = io.BytesIO()
cloudpickle.dump(EN.parser, file_)
file_.seek(0)
loaded = pickle.load(file_)
#@pytest.mark.models
#def test_pickle(EN):
# file_ = io.BytesIO()
# cloudpickle.dump(EN.parser, file_)
#
# file_.seek(0)
#
# loaded = pickle.load(file_)
#

View File

@ -28,7 +28,7 @@ def vocab():
else:
path = util.match_best_version('en', None, path)
vocab = English.Defaults('en', path).Vocab()
vocab = English.Defaults.create_vocab()
lex = vocab['dog']
assert vocab[vocab.strings['dog']].orth_ == 'dog'
lex = vocab['the']

View File

@ -29,9 +29,8 @@ def test_root(doc):
assert np.root.head.orth_ == 'is'
def test_root2():
def test_root2(EN):
text = 'through North and South Carolina'
EN = English(parser=False)
doc = EN(text)
heads = np.asarray([[0, 3, -1, -2, -4]], dtype='int32')
doc.from_array([HEAD], heads.T)

View File

@ -3,6 +3,7 @@ from __future__ import unicode_literals
import os
import io
import pickle
import pathlib
from spacy.lemmatizer import Lemmatizer, read_index, read_exc
from spacy import util
@ -12,16 +13,22 @@ import pytest
@pytest.fixture
def path():
return util.match_best_version('en', None,
os.environ.get('SPACY_DATA', util.get_data_path()))
if 'SPACY_DATA' in os.environ:
return pathlib.Path(os.environ['SPACY_DATA'])
else:
return util.match_best_version('en', None, util.get_data_path())
@pytest.fixture
def lemmatizer(path):
if path is not None:
return Lemmatizer.load(path)
else:
return None
def test_read_index(path):
if path is not None:
with (path / 'wordnet' / 'index.noun').open() as file_:
index = read_index(file_)
assert 'man' in index
@ -30,12 +37,15 @@ def test_read_index(path):
def test_read_exc(path):
if path is not None:
with (path / 'wordnet' / 'verb.exc').open() as file_:
exc = read_exc(file_)
assert exc['was'] == ('be',)
def test_noun_lemmas(lemmatizer):
if lemmatizer is None:
return None
do = lemmatizer.noun
assert do('aardwolves') == set(['aardwolf'])
@ -46,23 +56,35 @@ def test_noun_lemmas(lemmatizer):
def test_base_form_dive(lemmatizer):
if lemmatizer is None:
return None
do = lemmatizer.noun
assert do('dive', number='sing') == set(['dive'])
assert do('dive', number='plur') == set(['diva'])
def test_base_form_saw(lemmatizer):
if lemmatizer is None:
return None
do = lemmatizer.verb
assert do('saw', verbform='past') == set(['see'])
def test_smart_quotes(lemmatizer):
if lemmatizer is None:
return None
do = lemmatizer.punct
assert do('') == set(['"'])
assert do('') == set(['"'])
def test_pickle_lemmatizer(lemmatizer):
if lemmatizer is None:
return None
file_ = io.BytesIO()
pickle.dump(lemmatizer, file_)

View File

@ -24,30 +24,30 @@ def test_compile(matcher):
def test_no_match(matcher):
doc = Doc(matcher.vocab, ['I', 'like', 'cheese', '.'])
doc = Doc(matcher.vocab, words=['I', 'like', 'cheese', '.'])
assert matcher(doc) == []
def test_match_start(matcher):
doc = Doc(matcher.vocab, ['JavaScript', 'is', 'good'])
doc = Doc(matcher.vocab, words=['JavaScript', 'is', 'good'])
assert matcher(doc) == [(matcher.vocab.strings['JS'],
matcher.vocab.strings['PRODUCT'], 0, 1)]
def test_match_end(matcher):
doc = Doc(matcher.vocab, ['I', 'like', 'java'])
doc = Doc(matcher.vocab, words=['I', 'like', 'java'])
assert matcher(doc) == [(doc.vocab.strings['Java'],
doc.vocab.strings['PRODUCT'], 2, 3)]
def test_match_middle(matcher):
doc = Doc(matcher.vocab, ['I', 'like', 'Google', 'Now', 'best'])
doc = Doc(matcher.vocab, words=['I', 'like', 'Google', 'Now', 'best'])
assert matcher(doc) == [(doc.vocab.strings['GoogleNow'],
doc.vocab.strings['PRODUCT'], 2, 4)]
def test_match_multi(matcher):
doc = Doc(matcher.vocab, 'I like Google Now and java best'.split())
doc = Doc(matcher.vocab, words='I like Google Now and java best'.split())
assert matcher(doc) == [(doc.vocab.strings['GoogleNow'],
doc.vocab.strings['PRODUCT'], 2, 4),
(doc.vocab.strings['Java'],
@ -61,9 +61,9 @@ def test_match_zero(matcher):
{'OP': '!', 'IS_PUNCT': True},
{'ORTH': '"'}
]])
doc = Doc(matcher.vocab, 'He said , " some words " ...'.split())
doc = Doc(matcher.vocab, words='He said , " some words " ...'.split())
assert len(matcher(doc)) == 1
doc = Doc(matcher.vocab, 'He said , " some three words " ...'.split())
doc = Doc(matcher.vocab, words='He said , " some three words " ...'.split())
assert len(matcher(doc)) == 0
matcher.add('Quote', '', {}, [
[
@ -83,24 +83,24 @@ def test_match_zero_plus(matcher):
{'OP': '*', 'IS_PUNCT': False},
{'ORTH': '"'}
]])
doc = Doc(matcher.vocab, 'He said , " some words " ...'.split())
doc = Doc(matcher.vocab, words='He said , " some words " ...'.split())
assert len(matcher(doc)) == 1
@pytest.mark.models
def test_match_preserved(EN):
patterns = {
'JS': ['PRODUCT', {}, [[{'ORTH': 'JavaScript'}]]],
'GoogleNow': ['PRODUCT', {}, [[{'ORTH': 'Google'}, {'ORTH': 'Now'}]]],
'Java': ['PRODUCT', {}, [[{'LOWER': 'java'}]]],
}
matcher = Matcher(EN.vocab, patterns)
doc = EN.tokenizer('I like java.')
EN.tagger(doc)
assert len(doc.ents) == 0
doc = EN.tokenizer('I like java.')
doc.ents += tuple(matcher(doc))
assert len(doc.ents) == 1
EN.tagger(doc)
EN.entity(doc)
assert len(doc.ents) == 1
#@pytest.mark.models
#def test_match_preserved(EN):
# patterns = {
# 'JS': ['PRODUCT', {}, [[{'ORTH': 'JavaScript'}]]],
# 'GoogleNow': ['PRODUCT', {}, [[{'ORTH': 'Google'}, {'ORTH': 'Now'}]]],
# 'Java': ['PRODUCT', {}, [[{'LOWER': 'java'}]]],
# }
# matcher = Matcher(EN.vocab, patterns)
# doc = EN.tokenizer('I like java.')
# EN.tagger(doc)
# assert len(doc.ents) == 0
# doc = EN.tokenizer('I like java.')
# doc.ents += tuple(matcher(doc))
# assert len(doc.ents) == 1
# EN.tagger(doc)
# EN.entity(doc)
# assert len(doc.ents) == 1

View File

@ -44,6 +44,7 @@ def test_str_builtin(EN):
assert str(tokens[1]) == u'two'
@pytest.mark.models
def test_is_properties(EN):
Hi, comma, my, email, is_, addr = EN(u'Hi, my email is test@me.com')
assert Hi.is_title

View File

@ -21,3 +21,22 @@ def test_is_digit(en_vocab):
assert year.flags & (1 << IS_DIGIT)
mixed = en_vocab['hello1']
assert not mixed.flags & (1 << IS_DIGIT)
def test_add_flag_auto_id(en_vocab):
is_len4 = en_vocab.add_flag(lambda string: len(string) == 4)
assert en_vocab['1999'].check_flag(is_len4) == True
assert en_vocab['1999'].check_flag(IS_DIGIT) == True
assert en_vocab['199'].check_flag(is_len4) == False
assert en_vocab['199'].check_flag(IS_DIGIT) == True
assert en_vocab['the'].check_flag(is_len4) == False
assert en_vocab['dogs'].check_flag(is_len4) == True
def test_add_flag_provided_id(en_vocab):
is_len4 = en_vocab.add_flag(lambda string: len(string) == 4, flag_id=IS_DIGIT)
assert en_vocab['1999'].check_flag(is_len4) == True
assert en_vocab['199'].check_flag(is_len4) == False
assert en_vocab['199'].check_flag(IS_DIGIT) == False
assert en_vocab['the'].check_flag(is_len4) == False
assert en_vocab['dogs'].check_flag(is_len4) == True

View File

@ -9,10 +9,12 @@ def nlp():
if os.environ.get('SPACY_DATA'):
data_dir = os.environ.get('SPACY_DATA')
else:
data_dir = None
return English(data_dir=data_dir)
data_dir = True
return English(path=data_dir)
@pytest.fixture()
def doc(nlp):
for word in ['Hello', ',', 'world', '.', 'Here', 'are', 'two', 'sentences', '.']:
_ = nlp.vocab[word]
return nlp('Hello, world. Here are two sentences.')

View File

@ -32,11 +32,17 @@ cdef class Doc:
cdef public object _vector
cdef public object _vector_norm
cdef public np.ndarray tensor
cdef public object user_data
cdef TokenC* c
cdef public bint is_tagged
cdef public bint is_parsed
cdef public dict getters_for_tokens
cdef public dict getters_for_spans
cdef public list _py_tokens
cdef int length

View File

@ -75,7 +75,7 @@ cdef class Doc:
doc = Doc(nlp.vocab, orths_and_spaces=[(u'Some', True), (u'text', True)])
"""
def __init__(self, Vocab vocab, orths_and_spaces=None):
def __init__(self, Vocab vocab, words=None, spaces=None, orths_and_spaces=None):
'''
Create a Doc object.
@ -89,11 +89,14 @@ cdef class Doc:
A Vocabulary object, which must match any models you want to
use (e.g. tokenizer, parser, entity recognizer).
orths_and_spaces:
A list of tokens in the document as a sequence of
`(orth_id, has_space)` tuples, where `orth_id` is an
integer and `has_space` is a boolean, indicating whether the
token has a trailing space.
words:
A list of unicode strings to add to the document as words. If None,
defaults to empty list.
spaces:
A list of boolean values, of the same length as words. True
means that the word is followed by a space, False means it is not.
If None, defaults to [True]*len(words)
'''
self.vocab = vocab
size = 20
@ -112,11 +115,25 @@ cdef class Doc:
self.length = 0
self.is_tagged = False
self.is_parsed = False
self.getters_for_tokens = {}
self.getters_for_spans = {}
self.tensor = numpy.zeros((0,), dtype='float32')
self.user_data = {}
self._py_tokens = []
self._vector = None
self.noun_chunks_iterator = CHUNKERS.get(self.vocab.lang)
cdef unicode orth
cdef bint has_space
if orths_and_spaces is None and words is not None:
if spaces is None:
spaces = [True] * len(words)
elif len(spaces) != len(words):
raise ValueError(
"Arguments 'words' and 'spaces' should be sequences of the "
"same length, or 'spaces' should be left default at None. "
"spaces should be a sequence of booleans, with True meaning "
"that the word owns a ' ' character following it.")
orths_and_spaces = zip(words, spaces)
if orths_and_spaces is not None:
for orth_space in orths_and_spaces:
if isinstance(orth_space, unicode):
@ -576,9 +593,22 @@ cdef class Doc:
keep_reading = False
yield n_bytes_str + data
def merge(self, int start_idx, int end_idx, unicode tag, unicode lemma,
unicode ent_type):
def merge(self, int start_idx, int end_idx, *args, **attributes):
"""Merge a multi-word expression into a single token."""
cdef unicode tag, lemma, ent_type
if len(args) == 3:
# TODO: Warn deprecation
tag, lemma, ent_type = args
attributes[TAG] = self.vocab.strings[tag]
attributes[LEMMA] = self.vocab.strings[lemma]
attributes[ENT_TYPE] = self.vocab.strings[ent_type]
elif args:
raise ValueError(
"Doc.merge received %d non-keyword arguments. "
"Expected either 3 arguments (deprecated), or 0 (use keyword arguments). "
"Arguments supplied:\n%s\n"
"Keyword arguments:%s\n" % (len(args), repr(args), repr(attributes)))
cdef int start = token_by_start(self.c, self.length, start_idx)
if start == -1:
return None
@ -587,8 +617,11 @@ cdef class Doc:
return None
# Currently we have the token index, we want the range-end index
end += 1
cdef Span span = self[start:end]
tag = self.vocab.strings[attributes.get(TAG, span.root.tag)]
lemma = self.vocab.strings[attributes.get(LEMMA, span.root.lemma)]
ent_type = self.vocab.strings[attributes.get(ENT_TYPE, span.root.ent_type)]
# Get LexemeC for newly merged token
new_orth = ''.join([t.text_with_ws for t in span])
if span[-1].whitespace_:

View File

@ -1,3 +1,5 @@
cimport numpy as np
from .doc cimport Doc

View File

@ -77,10 +77,12 @@ cdef class Span:
for i in range(self.start, self.end):
yield self.doc[i]
def merge(self, unicode tag, unicode lemma, unicode ent_type):
self.doc.merge(self.start_char, self.end_char, tag, lemma, ent_type)
def merge(self, *args, **attributes):
self.doc.merge(self.start_char, self.end_char, *args, **attributes)
def similarity(self, other):
if 'similarity' in self.doc.getters_for_spans:
self.doc.getters_for_spans['similarity'](self, other)
if self.vector_norm == 0.0 or other.vector_norm == 0.0:
return 0.0
return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm)
@ -102,6 +104,8 @@ cdef class Span:
property sent:
'''Get the sentence span that this span is a part of.'''
def __get__(self):
if 'sent' in self.doc.getters_for_spans:
return self.doc.getters_for_spans['sent'](self)
# This should raise if we're not parsed.
self.doc.sents
cdef int n = 0
@ -115,16 +119,22 @@ cdef class Span:
property has_vector:
def __get__(self):
if 'has_vector' in self.doc.getters_for_spans:
return self.doc.getters_for_spans['has_vector'](self)
return any(token.has_vector for token in self)
property vector:
def __get__(self):
if 'vector' in self.doc.getters_for_spans:
return self.doc.getters_for_spans['vector'](self)
if self._vector is None:
self._vector = sum(t.vector for t in self) / len(self)
return self._vector
property vector_norm:
def __get__(self):
if 'vector_norm' in self.doc.getters_for_spans:
return self.doc.getters_for_spans['vector'](self)
cdef float value
if self._vector_norm is None:
self._vector_norm = 1e-20
@ -187,6 +197,8 @@ cdef class Span:
"""
def __get__(self):
self._recalculate_indices()
if 'root' in self.doc.getters_for_spans:
return self.doc.getters_for_spans['root'](self)
# This should probably be called 'head', and the other one called
# 'gov'. But we went with 'head' elsehwhere, and now we're stuck =/
cdef int i

View File

@ -1,3 +1,4 @@
from numpy cimport ndarray
from ..vocab cimport Vocab
from ..structs cimport TokenC
from ..attrs cimport attr_id_t

View File

@ -29,27 +29,6 @@ from ..attrs cimport IS_OOV
from ..lexeme cimport Lexeme
_STR_TRAILING_WHITESPACE = False
def use_deprecated_Token__str__semantics(value):
'''
Preserve deprecated semantics for Token.__str__ and Token.__unicode__ methods.
spaCy < 0.100.7 had a bug in the semantics of the Token.__str__ and Token.__unicode__
built-ins: they included a trailing space. To ease the transition to the
new semantics, you can use this function to switch the old semantics back on.
Example:
from spacy.tokens.token import keep_deprecated_Token.__str__semantics
keep_deprecated_Token.__str__semantics(True)
This function will not remain in future versions --- it's a temporary shim.
'''
global _STR_TRAILING_WHITESPACE
_STR_TRAILING_WHITESPACE = value
cdef class Token:
"""An individual token --- i.e. a word, a punctuation symbol, etc. Created
via Doc.__getitem__ and Doc.__iter__.
@ -64,19 +43,9 @@ cdef class Token:
return self.c.lex.length
def __unicode__(self):
# Users can toggle this on to preserve former buggy semantics.
# Remove this in future versions.
if _STR_TRAILING_WHITESPACE:
return self.text_with_ws
else:
return self.text
def __bytes__(self):
# Users can toggle this on to preserve former buggy semantics.
# Remove this in future versions.
if _STR_TRAILING_WHITESPACE:
return self.text_with_ws.encode('utf8')
else:
return self.text.encode('utf8')
def __str__(self):
@ -94,6 +63,8 @@ cdef class Token:
return self.doc[self.i+i]
def similarity(self, other):
if 'similarity' in self.doc.getters_for_tokens:
return self.doc.getters_for_tokens['similarity'](self, other)
if self.vector_norm == 0 or other.vector_norm == 0:
return 0.0
return numpy.dot(self.vector, other.vector) / (self.vector_norm * other.vector_norm)
@ -116,11 +87,11 @@ cdef class Token:
property text_with_ws:
def __get__(self):
orth_ = self.orth_
cdef unicode orth = self.vocab.strings[self.c.lex.orth]
if self.c.spacy:
return orth_ + u' '
return orth + u' '
else:
return orth_
return orth
property prob:
def __get__(self):
@ -182,6 +153,8 @@ cdef class Token:
property has_vector:
def __get__(self):
if 'has_vector' in self.doc.getters_for_tokens:
return self.doc.getters_for_tokens['has_vector'](self)
cdef int i
for i in range(self.vocab.vectors_length):
if self.c.lex.vector[i] != 0:
@ -191,6 +164,8 @@ cdef class Token:
property vector:
def __get__(self):
if 'vector' in self.doc.getters_for_tokens:
return self.doc.getters_for_tokens['vector'](self)
cdef int length = self.vocab.vectors_length
if length == 0:
raise ValueError(
@ -204,10 +179,15 @@ cdef class Token:
property repvec:
def __get__(self):
return self.vector
raise AttributeError("repvec was renamed to vector in v0.100")
property has_repvec:
def __get__(self):
raise AttributeError("has_repvec was renamed to has_vector in v0.100")
property vector_norm:
def __get__(self):
if 'vector_norm' in self.doc.getters_for_tokens:
return self.doc.getters_for_tokens['vector_norm'](self)
return self.c.lex.l2_norm
property n_lefts:
@ -387,6 +367,9 @@ cdef class Token:
def __get__(self):
"""Get a list of conjoined words."""
cdef Token word
if 'conjuncts' in self.doc.getters_for_tokens:
yield from self.doc.getters_for_tokens['conjuncts'](self)
else:
if self.dep_ != 'conj':
for word in self.rights:
if word.dep_ == 'conj':
@ -403,7 +386,7 @@ cdef class Token:
property ent_type_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.ent_type, mem=self.mem)
return self.vocab.strings[self.c.ent_type]
property ent_iob_:
def __get__(self):
@ -424,7 +407,7 @@ cdef class Token:
property ent_id_:
'''A (string) entity ID. Usually assigned by patterns in the Matcher.'''
def __get__(self):
return self.vocab.strings.decode_int(self.c.ent_id, mem=self.mem)
return self.vocab.strings[self.c.ent_id]
def __set__(self, hash_t key):
# TODO
@ -438,35 +421,35 @@ cdef class Token:
property orth_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lex.orth, mem=self.mem)
return self.vocab.strings[self.c.lex.orth]
property lower_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lex.lower, mem=self.mem)
return self.vocab.strings[self.c.lex.lower]
property norm_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lex.norm, mem=self.mem)
return self.vocab.strings[self.c.lex.norm]
property shape_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lex.shape, mem=self.mem)
return self.vocab.strings[self.c.lex.shape]
property prefix_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lex.prefix, mem=self.mem)
return self.vocab.strings[self.c.lex.prefix]
property suffix_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lex.suffix, mem=self.mem)
return self.vocab.strings[self.c.lex.suffix]
property lang_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lex.lang, mem=self.mem)
return self.vocab.strings[self.c.lex.lang]
property lemma_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.lemma, mem=self.mem)
return self.vocab.strings[self.c.lemma]
property pos_:
def __get__(self):
@ -474,13 +457,13 @@ cdef class Token:
property tag_:
def __get__(self):
return self.vocab.strings.decode_int(self.c.tag, mem=self.mem)
return self.vocab.strings[self.c.tag]
property dep_:
def __get__(self):
return self.vocab.decode_int(self.c.dep, mem=self.mem)
return self.vocab.strings[self.c.dep]
def __set__(self, unicode label):
self.c.dep = self.vocab.strings.intern(label, mem=self.mem)
self.c.dep = self.vocab.strings[label]
property is_oov:
def __get__(self): return Lexeme.c_check_flag(self.c.lex, IS_OOV)

69
spacy/train.py Normal file
View File

@ -0,0 +1,69 @@
from __future__ import absolute_import
from __future__ import unicode_literals
import random
from .gold import GoldParse
from .scorer import Scorer
from .gold import merge_sents
class Trainer(object):
'''Manage training of an NLP pipeline.'''
def __init__(self, nlp, gold_tuples):
self.nlp = nlp
self.gold_tuples = gold_tuples
def epochs(self, nr_epoch, augment_data=None, gold_preproc=False):
def _epoch():
for raw_text, paragraph_tuples in self.gold_tuples:
if gold_preproc:
raw_text = None
else:
paragraph_tuples = merge_sents(paragraph_tuples)
if augment_data is not None:
raw_text, paragraph_tuples = augment_data(raw_text, paragraph_tuples)
docs = self.make_docs(raw_text, paragraph_tuples)
golds = self.make_golds(docs, paragraph_tuples)
for doc, gold in zip(docs, golds):
yield doc, gold
for itn in range(nr_epoch):
random.shuffle(self.gold_tuples)
yield _epoch()
def update(self, doc, gold):
for process in self.nlp.pipeline:
if hasattr(process, 'update'):
process.update(doc, gold)
process(doc)
return doc
def evaluate(self, dev_sents, gold_preproc=False):
scorer = Scorer()
for raw_text, paragraph_tuples in dev_sents:
if gold_preproc:
raw_text = None
else:
paragraph_tuples = merge_sents(paragraph_tuples)
docs = self.make_docs(raw_text, paragraph_tuples)
golds = self.make_golds(docs, paragraph_tuples)
for doc, gold in zip(docs, golds):
for process in self.nlp.pipeline[1:]:
process(doc)
scorer.score(doc, gold)
return scorer
def make_docs(self, raw_text, paragraph_tuples):
if raw_text is not None:
return [self.nlp.tokenizer(raw_text)]
else:
return [self.nlp.tokenizer.tokens_from_list(sent_tuples[0][1])
for sent_tuples in paragraph_tuples]
def make_golds(self, docs, paragraph_tuples):
if len(docs) == 1:
return [GoldParse(docs[0], sent_tuples[0])
for sent_tuples in paragraph_tuples]
else:
return [GoldParse(doc, sent_tuples[0])
for doc, sent_tuples in zip(docs, paragraph_tuples)]

View File

@ -1,10 +1,6 @@
from libc.stdint cimport uint16_t, uint32_t, uint64_t, uintptr_t, int32_t
from libc.stdint cimport uint8_t
from libc.stdint cimport UINT64_MAX as err_hash_t
from libc.stdint cimport UINT64_MAX as err_flags_t
from libc.stdint cimport UINT64_MAX as err_len_t
from libc.stdint cimport UINT64_MAX as err_tag_t
ctypedef uint64_t hash_t
ctypedef char* utf8_t

View File

@ -13,6 +13,7 @@ try:
except NameError:
basestring = str
LANGUAGES = {}
_data_path = pathlib.Path(__file__).parent / 'data'
@ -52,6 +53,8 @@ def or_(val1, val2):
def match_best_version(target_name, target_version, path):
path = path if not isinstance(path, basestring) else pathlib.Path(path)
if not path.exists():
return None
matches = []
for data_name in path.iterdir():
name, version = split_data_name(data_name.parts[-1])

View File

@ -27,7 +27,6 @@ cdef struct _Cached:
cdef class Vocab:
cdef Pool mem
cpdef readonly StringStore strings
cpdef readonly dict oov_stores
cpdef readonly Morphology morphology
cdef readonly int length
cdef public object _serializer

View File

@ -50,7 +50,7 @@ cdef class Vocab:
'''
@classmethod
def load(cls, path, lex_attr_getters=None, vectors=True, lemmatizer=True,
tag_map=True, serializer_freqs=None, **deprecated_kwargs):
tag_map=True, serializer_freqs=True, **deprecated_kwargs):
util.check_renamed_kwargs({'get_lex_attr': 'lex_attr_getters'}, deprecated_kwargs)
if tag_map is True and (path / 'vocab' / 'tag_map.json').exists():
with (path / 'vocab' / 'tag_map.json').open() as file_:
@ -93,7 +93,6 @@ cdef class Vocab:
self._by_hash = PreshMap()
self._by_orth = PreshMap()
self.strings = StringStore()
self.oov_stores = {}
# Load strings in a special order, so that we have an onset number for
# the vocabulary. This way, when words are added in order, the orth ID
# is the frequency rank of the word, plus a certain offset. The structural
@ -130,6 +129,44 @@ cdef class Vocab:
"""The current number of lexemes stored."""
return self.length
def add_flag(self, flag_getter, int flag_id=-1):
'''Set a new boolean flag to words in the vocabulary. The flag_setter
function will be called over the words currently in the vocab, and then
applied to new words as they occur. You'll then be able to access the
flag value on each token, using token.check_flag(flag_id). See also:
Lexeme.set_flag, Lexeme.check_flag, Token.set_flag, Token.check_flag.
Arguments:
flag_getter:
A function f(unicode) -> bool, to get the flag value.
flag_id (int):
An integer between 1 and 63 (inclusive), specifying the bit at which the
flag will be stored. If -1, the lowest available bit will be
chosen.
Returns:
flag_id (int): The integer ID by which the flag value can be checked.
'''
if flag_id == -1:
for bit in range(1, 64):
if bit not in self.lex_attr_getters:
flag_id = bit
break
else:
raise ValueError(
"Cannot find empty bit for new lexical flag. All bits between "
"0 and 63 are occupied. You can replace one by specifying the "
"flag_id explicitly, e.g. nlp.vocab.add_flag(your_func, flag_id=IS_ALPHA")
elif flag_id >= 64 or flag_id < 1:
raise ValueError(
"Invalid value for flag_id: %d. Flag IDs must be between "
"1 and 63 (inclusive)" % flag_id)
for lex in self:
lex.set_flag(flag_id, flag_getter(lex.orth_))
self.lex_attr_getters[flag_id] = flag_getter
return flag_id
cdef const LexemeC* get(self, Pool mem, unicode string) except NULL:
'''Get a pointer to a LexemeC from the lexicon, creating a new Lexeme
if necessary, using memory acquired from the given pool. If the pool
@ -141,7 +178,7 @@ cdef class Vocab:
lex = <LexemeC*>self._by_hash.get(key)
cdef size_t addr
if lex != NULL:
if (string not in self.strings) or (lex.orth != self.strings[string]):
if lex.orth != self.strings[string]:
raise LookupError.mismatched_strings(
lex.orth, self.strings[string], self.strings[lex.orth], string)
return lex
@ -164,10 +201,10 @@ cdef class Vocab:
cdef const LexemeC* _new_lexeme(self, Pool mem, unicode string) except NULL:
cdef hash_t key
cdef bint is_oov = mem is not self.mem
if len(string) < 3 or not is_oov:
if len(string) < 3:
mem = self.mem
lex = <LexemeC*>mem.alloc(sizeof(LexemeC), 1)
lex.orth = self.strings.intern(string, mem=mem)
lex.orth = self.strings[string]
lex.length = len(string)
lex.id = self.length
lex.vector = <float*>mem.alloc(self.vectors_length, sizeof(float))
@ -175,10 +212,10 @@ cdef class Vocab:
for attr, func in self.lex_attr_getters.items():
value = func(string)
if isinstance(value, unicode):
value = self.strings.intern(value)
value = self.strings[value]
if attr == PROB:
lex.prob = value
else:
elif value is not None:
Lexeme.set_struct_attr(lex, attr, value)
if is_oov:
lex.id = 0
@ -206,8 +243,7 @@ cdef class Vocab:
def __getitem__(self, id_or_string):
'''Retrieve a lexeme, given an int ID or a unicode string. If a previously
unseen unicode string is given, a new lexeme is created and stored, and
the string is interned in the vocabulary.
unseen unicode string is given, a new lexeme is created and stored.
Args:
id_or_string (int or unicode):
@ -222,7 +258,7 @@ cdef class Vocab:
'''
cdef attr_t orth
if type(id_or_string) == unicode:
orth = self.strings.intern(id_or_string)
orth = self.strings[id_or_string]
else:
orth = id_or_string
return Lexeme(self, orth)
@ -238,7 +274,7 @@ cdef class Vocab:
if 'pos' in props:
self.morphology.assign_tag(token, props['pos'])
if 'L' in props:
tokens[i].lemma = self.strings.intern(props['L'])
tokens[i].lemma = self.strings[props['L']]
for feature, value in props.get('morph', {}).items():
self.morphology.assign_feature(&token.morph, feature, value)
return tokens

30
travis.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/bash
if [ "${VIA}" == "pypi" ]; then
rm -rf *
pip install spacy
python -m spacy.en.download
python -m spacy.de.download
fi
if [ "${VIA}" == "sdist" ]; then
rm -rf *
pip uninstall spacy
wget https://api.explosion.ai/build/spacy/sdist/$TRAVIS_COMMIT
mv $TRAVIS_COMMIT sdist.tgz
pip install -U sdist.tgz
fi
if [ "${VIA}" == "compile" ]; then
pip install -r requirements.txt
pip install -e .
mkdir -p corpora/en
cd corpora/en
wget --no-check-certificate http://wordnetcode.princeton.edu/3.0/WordNet-3.0.tar.gz
tar -xzf WordNet-3.0.tar.gz
mv WordNet-3.0 wordnet
cd ../../
mkdir models/
python bin/init_model.py en lang_data/ corpora/ models/en
fi

View File

@ -2,16 +2,13 @@
"globals": {
"title": "spaCy.io",
"description": "spaCy is a free open-source library featuring state-of-the-art speed and accuracy and a powerful Python API.",
"url": "https://spacy.io",
"email": "contact@spacy.io",
"company": "spaCy.io",
"SITENAME": "spaCy",
"SLOGAN": "Industrial-strength Natural Language Processing",
"SITE_URL": "https://spacy.io",
"EMAIL": "contact@explosion.ai",
"COMPANY": "Explosion AI",
"COMPANY_URL": "https://explosion.ai",
"DEMOS_URL": "https://demos.explosion.ai",
"navigation": { "Docs": "docs", "Demos": "demos", "Blog": "blog" },
"profiles": { "twitter": "spacy_io", "github": "spacy-io", "reddit": "spacynlp", "medium": "spacy" },
"google_analytics": "UA-58931649-1",
"SOCIAL": {
"twitter": "spacy_io",
"github": "explosion",
@ -25,5 +22,38 @@
"SPACY_VERSION": "0.101.0",
"SPACY_STARS": "2300",
"GITHUB": { "user": "explosion", "repo": "spacy" }
"spacy_version": "0.101.0",
"spacy_stars": "2100",
"github_settings": { "user": "spacy-io", "repo": "spacy" },
"authors" : {
"matt" : {
"name" : "Matthew Honnibal",
"description" : "studied linguistics as an undergrad, and never thought he'd be a programmer. By 2009 he had a PhD in computer science, and in 2014 he left academia to write spaCy. He's from Sydney and lives in Berlin.",
"links": {
"twitter": [ "https://twitter.com/honnibal", "Twitter" ],
"website": [ "https://www.semanticscholar.org/search?q=Matthew%20Honnibal", "Semantic Scholar" ]
}
},
"ines": {
"name": "Ines Montani",
"description": "has developed, designed and implemented our interactive demos and the spacy.io website. She has a degree in media, linguistics and communications, and over ten years experience in web development.",
"links": {
"twitter": [ "https://twitter.com/_inesmontani", "Twitter" ],
"codepen": [ "https://codepen.io/ines", "Codepen"],
"github": [ "https://github.com/ines", "GitHub"],
"website": [ "http://ines.io", "Blog" ]
}
},
"wolfgang": {
"name": "Wolfgang Seeker",
"description": "is a computational linguist from Germany. He is fascinated with the complexity and variety of human language, and spent his PhD looking for ways to make NLP work well with any kind of language in the world. He joined spaCy to build effective and truly multilingual NLP software.",
"links": {
"website": [ "https://www.semanticscholar.org/search?q=Wolfgang%20Seeker", "Semantic Scholar" ]
}
}
}
}
}

View File

@ -0,0 +1,35 @@
include ../_includes/_mixins
//- Article
//- ============================================================================
article.article(id=current.source)
header.article-header
+h2.article-title=title
.article-meta
if author
| by #[a.link(href=(authors[author].url || url) target='_blank')=authors[author].name] on &nbsp;
| #[+date(date)]
.article-body!=yield
footer.article-footer
+grid('padding', 'align-right', 'valign-center')
if hide_social != true
+tweet(title)
if links
for link, index in links
div: +button('primary', 'small', index.toLowerCase())(href=link target='_blank')
+icon(index.toLowerCase(), 'medium', 'secondary')
| Discussion on #{index}
if author
+divider
!=partial('_profile', { label: 'About the Author', style: 'alt' })
!=partial('_newsletter', { divider: 'both' })
!=partial('_latest-posts', { max: 2, _section: _section } )

View File

@ -7,8 +7,13 @@ include _mixins
footer.o-footer.o-inline-list.u-pattern.u-text-center.u-text-label.u-text-strong
span &copy; #{new Date().getFullYear()} #[+a(COMPANY_URL, true)=COMPANY]
<<<<<<< HEAD
+a(COMPANY_URL + "/legal", true) Legal / Imprint
a(href="mailto:#{EMAIL}") #[+icon("mail", 16)]
=======
footer.footer
span &copy; #{new Date().getFullYear()} #{company}
>>>>>>> v1.0.0-rc1
+a("https://twitter.com/" + SOCIAL.twitter)(aria-label="Twitter")
+icon("twitter", 20)

View File

@ -5,7 +5,64 @@
//- Add prefixes to items of an array (for modifier CSS classes)
- function prefixArgs(array, prefix) {
<<<<<<< HEAD
- return array.map(function(arg) {
- return prefix + '--' + arg;
- }).join(' ');
=======
- for(var i = 0; i < array.length; i++) {
- array[i] = prefix + array[i];
- }
- return array.join(' ');
- }
//- Convert date to human readable and timestamp format
input - [string] date in the format YYYY-MM-DD
- function convertDate(input) {
- var dates = [];
- var months = [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ];
- var date = new Date(input);
- dates.full = months[date.getMonth()] + ' ' + date.getDate() + ', ' + date.getFullYear();
- dates.timestamp = JSON.parse(JSON.stringify(date));
- return dates;
- }
//- Convert date to valid RSS pubDate
input - [string] date in the format YYYY-MM-DD
- function convertPubDate(input) {
- var date = new Date(input);
- var pieces = date.toString().split(' ');
- var offsetTime = pieces[5].match(/[-+]\d{4}/);
- var offset = (offsetTime) ? offsetTime : pieces[5];
- var parts = [ pieces[0] + ',', pieces[2], pieces[1], pieces[3], pieces[4], offset ];
- return parts.join(' ');
- }
//- Compile scrset attribute for hero images
image - [object] article image object from _data.json
path - [string] relative path to image folder
- function getScrset(image, path) {
- var scrset = path + image.file + ' ' + image_sizes.medium + 'w';
- if(image.file_small) scrset += ', ' + path + image.file_small + ' ' + image_sizes.small + 'w';
- if(image.file_large) scrset += ', ' + path + image.file_large + ' ' + image_sizes.large + 'w';
- return scrset;
- }
//- Get meta image
- function getMetaImage() {
- if(current.path[0] == 'blog' && image && image.file) {
- return url + '/blog/img/' + (image.file_small || image.file);
- }
- else {
- return url + '/assets/img/social.png';
- }
>>>>>>> v1.0.0-rc1
- }

View File

@ -0,0 +1,27 @@
include _mixins
//- Head
//- ============================================================================
head
title=getPageTitle()
meta(charset='utf-8')
meta(name="viewport" content="width=device-width, initial-scale=1.0")
meta(name='referrer' content='always')
meta(name='description' content=description)
meta(property='og:type' content='website')
meta(property='og:site_name' content=sitename)
meta(property='og:url' content=getCurrentUrl())
meta(property='og:title' content=title)
meta(property='og:description' content=description)
meta(property='og:image' content=getMetaImage())
meta(name='twitter:card' content='summary_large_image')
meta(name='twitter:site' content='@' + profiles.twitter)
meta(name='twitter:title' content=title)
meta(name='twitter:description' content=description)
meta(name='twitter:image' content=getMetaImage())
link(rel='icon' type='image/x-icon' href='/assets/img/favicon.ico')

View File

@ -1,8 +1,389 @@
<<<<<<< HEAD
//- ----------------------------------
//- 💫 INCLUDES > MIXINS
//- ----------------------------------
include _functions
=======
include _functions
//- Mixins
//- ============================================================================
//- Sections for content pages
id - [string] id, can be headline id as it's being prefixed (optional)
block - section content (block and inline elements)
mixin section(id)
section.section(id=(id) ? 'section-' + id : '')&attributes(attributes)
block
//- Flexbox grid to align children elements
...style - [strings] flexbox CSS classes without prefix (optional)
block - container content (block and inline elements)
mixin grid(...style)
.grid(class=prefixArgs(style, 'grid--'))&attributes(attributes)
block
mixin grid-col(...style)
.grid-col(class=prefixArgs(style, 'grid-col--'))&attributes(attributes)
block
//- Aside
headline - [string] Headline of aside (optional)
block - aside content (inline elements)
mixin aside(headline)
span.aside(data-label=headline)&attributes(attributes)
span.aside-body
block
//- Paragraphs
block - paragraph content (inline elements)
mixin lead
p.text-lead&attributes(attributes)
block
//- Various text styles
block - text (inline elements)
mixin example
p.text-example&attributes(attributes)
block
mixin source
span.text-source&attributes(attributes)
block
mixin label(...style)
span(class=(style != '') ? prefixArgs(style, 'label-') : 'label')&attributes(attributes)
block
//- Headings with optional permalinks
id - [string] unique id (optional, no permalink without id)
source - [string] link for source button (optional)
block - headline text (inline elements)
mixin headline(level, id, source)
if level == 2
+h2(id, source)
block
else if level == 3
+h3(id, source)
block
else if level == 4
+h4(id, source)
block
else if level == 5
+h5(id, source)
block
else
+h6(id, source)
block
mixin h1(id, source)
h1(id=id)&attributes(attributes)
+permalink(id, source)
block
mixin h2(id, source)
h2(id=id)&attributes(attributes)
+permalink(id, source)
block
mixin h3(id, source)
h3(id=id)&attributes(attributes)
+permalink(id, source)
block
mixin h4(id, source)
h4(id=id)&attributes(attributes)
+permalink(id, source)
block
mixin h5(id, source)
h5(id=id)&attributes(attributes)
+permalink(id, source)
block
mixin h6(id, source)
h6(id=id)&attributes(attributes)
+permalink(id, source)
block
mixin permalink(id, source)
if id
a.permalink(href='#' + id)
block
else
block
if source
+button('secondary', 'small', 'source')(href=source target='_blank') Source
//- Button
element - [string] specifies HTML element, 'button' or 'link'
...style - [strings] button CSS classes without prefix (optional)
block - button text (inline elements)
mixin button(type, ...style)
- var classname = 'button-' + type + ' ' + ((style) ? prefixArgs(style, 'button--') : '')
a.button(class=classname)&attributes(attributes)
block
mixin form-button(type, ...style)
- var classname = 'button-' + type + ' ' + ((style) ? prefixArgs(style, 'button--') : '')
button(class=classname)&attributes(attributes)
block
//- Input
placeholder - [string] placeholder for input field (optional)
value - [string] value of input field (optional)
mixin input(placeholder, value)
input.input(placeholder=placeholder value=value)&attributes(attributes)
//- Icon
name - [string] icon name, refers to CSS classes
size - [string] 'medium' or 'large' (optional)
type - [string] 'button' (optional)
block - description, if as a text node to the icon element it prevents line
breaks between icon and text (inline elements)
mixin icon(type, ...style)
span(class='icon-' + type + ' ' + prefixArgs(style, 'icon--') aria-hidden="true")&attributes(attributes)
block
//- Image for illustration purposes
file - [string] file name (in /img)
alt - [string] descriptive alt text (optional)
caption - [string] image caption (optional)
mixin image(file, alt, caption, size)
figure.image-container&attributes(attributes)
img(src='img/' + file alt=alt class=(size) ? 'image--' + size : '')
if caption
figcaption.text-caption=caption
block
//- Illustrated code view
title - [string] title of window
mixin code-demo(title)
.x-terminal&attributes(attributes)
.x-terminal-icons: span
.x-terminal-title=title
+code.x-terminal-code
block
//- Data table
head - [array] column headings (optional, without headings no table
head is displayed)
...style - [strings] table CSS classes without prefix (optional)
block - only +row (tr)
mixin table(head, ...style)
table.table(class=prefixArgs(style, 'table--'))&attributes(attributes)
if head
tr.table-row
each column in head
th.table-head-cell=column
block
//- Data table row
block - only +cell (td)
mixin row(...style)
tr.table-row(class=prefixArgs(style, 'table-cell--'))&attributes(attributes)
block
//- Data table cell
block - table cell content (inline elements)
mixin cell(...style)
td.table-cell(class=prefixArgs(style, 'table-cell--'))&attributes(attributes)
block
//- General list (ordered and unordered)
type - [string] 'numbers', 'letters', 'roman' (optional)
start - [integer] starting point of list (1 = list starts at 1 or A)
block - only +item (li)
mixin list(type, start)
if type
ol.list(class='list--' + type style=(start === 0 || start) ? 'counter-reset: li ' + (start - 1) : '')&attributes(attributes)
block
else
ul.list.list--bullets&attributes(attributes)
block
//- List item
block - item text (inline elements)
mixin item
li.list-item&attributes(attributes)
block
//- Blockquote
source - [string] quote source / author (optional)
link - [string] link to quote source (only with source, optional)
block - quote text (inline elements)
mixin quote(source, link)
blockquote.quote&attributes(attributes)
p.quote-text
block
if source && link
| #[a.quote-source(href=link target='_blank')=source]
else if source && !link
.quote-source !{source}
//- Pullquotes with optional 'tweet this' function
tweet - [string] text to be tweeted (optional)
block - pullquote text (inline elements, only shown if no tweet text)
mixin pullquote(tweet)
blockquote.quote&attributes(attributes)
p.quote-text-strong
if tweet
| !{tweet} #[a.quote-source(href=twitterShareUrl(current.path, tweet) target='_blank') Tweet this]
else
block
//- Code block
use as +code(args). to preserve whitespace and prevent code interprettion
language - [string] language for syntax highlighting (optional, default:
'python', see Prism for options: http://prismjs.com)
label - [string] code block headline (optional)
block - code text (inline elements)
mixin code(language, label)
pre.code-block(class='lang-' + (language || default_syntax) data-label=label)&attributes(attributes)
code.code-inline
block
//- Infobox for notes and alerts
label - [string] infobox headline (optional)
block - infobox text (inline and block elements)
mixin infobox(label)
.box.box--info(data-label=label)&attributes(attributes)
p.box-body
block
//- Alerts for notes and updates
mixin alert(button)
.alert&attributes(attributes)
span
block
if button
+form-button('primary', 'small')(onclick='this.parentNode.parentNode.removeChild(this.parentNode);')=button
else
button.alert-close(onclick='this.parentNode.parentNode.removeChild(this.parentNode);')
//- Embeds
border - [boolean] add border to embed container
caption - [string] embed caption
block - embed content (inline and block elements)
mixin embed(border, caption)
figure.embed(class=(border) ? 'embed--border' : '')&attributes(attributes)
block
if caption
figcaption.embed-caption=caption
//- displaCy
filename - [string] name of file in displacy folder (no .html)
caption - [string] caption (optional)
height - [integer] iframe height in px (optional)
mixin displacy(filename, caption, height)
+embed(true, caption).embed--displacy
iframe(src='/blog/displacy/' + filename height=height)
//- Logo, imports SVG
size - [string] 'tiny', 'small', 'regular' or 'large'
mixin logo(size)
!=partial('/_includes/_logo', { logo_size: size })
//- <time> element with date
input - [string] date in the format YYYY-MM-DD
type - [string] 'timestamp' (optional)
mixin date(input, type)
- var dates = convertDate(input)
if type == 'timestamp'
time=dates.timestamp
else
time(datetime=dates.timestamp)=dates.full
//- Divider
type - [string] divider tpe
mixin divider(type, ...style)
div(class=((type) ? 'divider-' + type : 'divider') + ' ' + prefixArgs(style, 'divider--'))&attributes(attributes)
if type == 'text'
.divider-text-content
block
else
block
//- Twitter Share Button
tweet - [string] text to be shared with the tweet
>>>>>>> v1.0.0-rc1
include _mixins/_base
include _mixins/_components

View File

@ -1,12 +1,24 @@
<<<<<<< HEAD
//- ----------------------------------
//- 💫 GLOBAL LAYOUT
//- ----------------------------------
=======
include _includes/_mixins
- var _section = current.path[0]
- var _site = current.source
- var is_blog = (_section == 'blog')
- var is_article = ( (_section == 'blog' && _site != 'index') || template == 'article')
- var has_asides = (is_article || (_section == 'docs' && asides != false) || asides)
>>>>>>> v1.0.0-rc1
include _includes/_mixins
doctype html
html(lang="en")
<<<<<<< HEAD
title=(current.path[0] == "index") ? SITENAME + " | " + SLOGAN : title + " | " + SITENAME
meta(charset="utf-8")
@ -38,6 +50,14 @@ html(lang="en")
header.o-header.u-pattern.u-text-center
if current.path[1] == "tutorials"
h2.u-heading-1.u-text-shadow Tutorials
=======
!=partial("_includes/_head", { _section: _section })
link(href='/assets/css/' + ((is_blog) ? stylesheets.blog : stylesheets.default) + '.css' rel='stylesheet')
link(href='/' + feed rel='alternate' type='application/rss+xml' title='RSS')
body.body
!=partial('_includes/_nav', { _section: _section, _site: _site })
>>>>>>> v1.0.0-rc1
else
+h(1).u-text-shadow=title
@ -51,9 +71,19 @@ html(lang="en")
!=yield
<<<<<<< HEAD
else
!=yield
include _includes/_footer
=======
else
!=yield
!=partial('_includes/_footer')
each script in scripts
script(src='/assets/js/' + script + '.js', type='text/javascript')
>>>>>>> v1.0.0-rc1
include _includes/_scripts

View File

@ -0,0 +1,35 @@
// Variables
// ============================================================================
$alert-background : color(white)
$alert-border : 2px solid
$alert-close-size : 2.25rem
$alert-color : color($theme)
$alert-padding : 1.5rem 2rem
$alert-shadow : 0 0 10px rgba(color(black), 0.25)
// Style
// ============================================================================
// Alert boxes
// .alert - alert container
// .alert-close - icon to close alert
.alert
@include position(fixed, bottom, left, 0, 0)
align-items: center
background: $alert-background
border-top: $alert-border
box-shadow: $alert-shadow
color: $alert-color
display: flex
justify-content: space-between
padding: $alert-padding
width: 100%
z-index: 200
.alert-close
@include icon(close, currentColor, 0, $alert-close-size)
background: transparent
color: $alert-color

View File

@ -0,0 +1,57 @@
// Images - Variables
// ============================================================================
$image-background : color(grey, light)
$image-profile-margin : 1rem 3rem
$image-profile-width : $width-profile
$image-ratio : $image-ratio
$image-width-l : 100%
$image-width-m : 75%
$image-width-s : 50%
// Images - Style
// ============================================================================
// Image Containers
// .image-container - container for figures and inline images
// .image-hero - container for hero image for blog posts
// .image-profile - container for profile photo
.image-container
@extend .block
margin-left: 0
margin-right: 0
.image-profile
@include size($image-profile-width)
background: $image-background
border-radius: 50%
margin: $image-profile-margin
overflow: hidden
shape-outside: circle()
// Image sizes
// .image--small - small width
// .image--medium - medium width
// .image--large - large width
.image--small
width: $image-width-s
.image--medium
width: $image-width-m
.image--large
width: $image-width-l
// Global image ratio
.image-ratio
background: $image-background
height: 0
overflow: hidden
padding-bottom: (100% / $image-ratio)
width: 100%

View File

@ -0,0 +1,21 @@
// Footer - Variables
// ============================================================================
$footer-background : color($theme) pattern($theme)
$footer-color : color(white)
$footer-padding : 2.75rem 0 7.5rem 0
$footer-text-align : center
// Footer - Style
// ============================================================================
.footer
@extend .link-list
background: $footer-background
color: $footer-color
overflow: auto
padding: $footer-padding
position: relative
text-align: $footer-text-align
z-index: 200

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

View File

@ -5,6 +5,247 @@
},
"announcement" : {
<<<<<<< HEAD
"title": "Important Announcement"
=======
"title": "Important Announcement",
"date": "2016-08-09",
"description": "Dear spaCy users, Unfortunately, we (Henning Peters and Matthew Honnibal) are parting ways. Breaking up is never easy, and it's taken us a while to get our stuff together. Hopefully, you didn't notice anything was up — if you did, we hope you haven't been inconvenienced.",
"image": {
"file": "introducing-spacy.jpg",
"file_small": "introducing-spacy_small.jpg",
"file_large": "introducing-spacy_large.jpg"
},
"links": false,
"hide_social": true
},
"syntaxnet-in-context": {
"title": "SyntaxNet in context: Understanding Google's new TensorFlow NLP model",
"date": "2016-05-13",
"author": "matt",
"description": "Yesterday, Google open sourced their Tensorflow-based dependency parsing library, SyntaxNet. The library gives access to a line of neural network parsing models published by Google researchers over the last two years. I've been following this work closely since it was published, and have been looking forward to the software being published. This post tries to provide some context around the release — what's new here, and how important is it?",
"image": {
"file": "syntaxnet.jpg",
"file_small": "syntaxnet_small.jpg",
"file_large": "syntaxnet_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": false
},
"german-model": {
"title": "spaCy now speaks German",
"date": "2016-05-09",
"author": "wolfgang",
"description": "Many people have asked us to make spaCy available for their language. Being based in Berlin, German was an obvious choice for our first second language. Now spaCy can do all the cool things you use for processing English on German text too. But more importantly, teaching spaCy to speak German required us to drop some comfortable but English-specific assumptions about how language works and made spaCy fit to learn more languages in the future.",
"image": {
"file": "german.jpg",
"file_small": "german_small.jpg",
"file_large": "german_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": {
"HackerNews": "https://news.ycombinator.com/item?id=11690212"
}
},
"multithreading-with-cython": {
"title": "Multi-threading spaCy's parser and named entity recogniser",
"date": "2016-05-11",
"author": "matt",
"description": "In v0.100.3, we quietly rolled out support for GIL-free multi-threading for spaCy's syntactic dependency parsing and named entity recognition models. Because these models take up a lot of memory, we've wanted to release the global interpretter lock (GIL) around them for a long time. When we finally did, it seemed a little too good to be true, so we delayed celebration &mdash; and then quickly moved on to other things. It's now past time for a write-up.",
"image" : {
"file": "cython.jpg",
"file_small": "cython_small.jpg",
"file_large": "cython_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": false
},
"eli5-computers-learn-reading": {
"title": "Statistical NLP in the Ten Hundred Most Common English Words",
"date": "2016-04-04",
"author": "matt",
"description": "When I was little, my favorite TV shows all had talking computers. Now Im big and there are still no talking computers, so Im trying to make some myself. Well, we can make computers say things. But when we say things back, they dont really understand. Why not?",
"image" : {
"file": "basic-english.jpg",
"file_small": "basic-english_small.jpg",
"file_large": "basic-english_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": false
},
"modular-markup": {
"title": "Rebuilding a Website with Modular Markup Components",
"date": "2016-03-31",
"author": "ines",
"description": "In a small team, everyone should be able to contribute content to the website and make use of the full set of visual components, without having to worry about design or write complex HTML. To help us write docs, tutorials and blog posts about spaCy, we've developed a powerful set of modularized markup components, implemented using Jade.",
"image": {
"file": "markup.jpg",
"file_small": "markup_small.jpg",
"file_large": "markup_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
}
},
"sense2vec-with-spacy": {
"title": "Sense2vec with spaCy and Gensim",
"date": "2016-02-15",
"author": "matt",
"description": "If you were doing text analytics in 2015, you were probably using word2vec. Sense2vec (Trask et. al, 2015) is a new twist on word2vec that lets you learn more interesting, detailed and context-sensitive word vectors. This post motivates the idea, explains our implementation, and comes with an interactive demo that we've found surprisingly addictive.",
"image" : {
"file": "sense2vec.jpg",
"file_small": "sense2vec_small.jpg",
"file_large": "sense2vec_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": {
"HackerNews": "https://news.ycombinator.com/item?id=11106386",
"ProductHunt": "https://www.producthunt.com/tech/spacy-io"
}
},
"spacy-now-mit": {
"title": "AGPL Not Free Enough: spaCy now MIT",
"date": "2015-09-28",
"author": "matt",
"description": "Three big announcements: we're changing license, to MIT from AGPL; a new co-founder is coming on board, Henning Peters; and we're launching a new service, to adapt spaCy's statistical models to your task.",
"image" : {
"file": "agpl-not-free.jpg",
"file_small": "agpl-not-free_small.jpg",
"file_large": "agpl-not-free_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": {
"HackerNews": "https://news.ycombinator.com/item?id=10288089"
}
},
"dead-code-should-be-buried": {
"title": "Dead Code Should Be Buried",
"date": "2015-09-04",
"author": "matt",
"description": "Natural Language Processing moves fast, so maintaining a good library means constantly throwing things away. Most libraries are failing badly at this, as academics hate to editorialize. This post explains the problem, why it's so damaging, and why I wrote spaCy to do things differently.",
"image" : {
"file": "deadcode.jpg",
"file_small": "deadcode_small.jpg",
"file_large": "deadcode_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": {
"Reddit": "https://www.reddit.com/r/programming/comments/3jmgck/dead_code_should_be_buried_why_i_wrote_spacy/",
"HackerNews": "https://news.ycombinator.com/item?id=10173669"
}
},
"displacy-dependency-visualizer": {
"featured": true,
"title": "Displaying Linguistic Structure with CSS",
"date": "2015-08-19",
"author": "matt",
"description": "One of the features of the relaunch I'm most excited about is the displaCy visualizer and annotation tool. This solves two problems I've thought about a lot: first, how can I help people understand what information spaCy gives them access to? Without a good visualization, the ideas are very abstract. Second, how can we make dependency trees easy for humans to create?",
"image": {
"file": "displacy.jpg",
"file_small": "displacy_small.jpg",
"file_large": "displacy_large.jpg"
},
"links": {
"Reddit": "https://www.reddit.com/r/programming/comments/3hoj0b/displaying_linguistic_structure_with_css/"
}
},
"introducing-spacy": {
"title": "Introducing spaCy",
"date": "2015-02-19",
"author": "matt",
"description": "Computers don't understand text. This is unfortunate, because that's what the web almost entirely consists of. We want to recommend people text based on other text they liked. We want to shorten text to display it on a mobile screen. We want to aggregate it, link it, filter it, categorise it, generate it and correct it. spaCy provides a library of utility functions that help programmers build such products.",
"image": {
"file": "introducing-spacy.jpg",
"file_small": "introducing-spacy_small.jpg",
"file_large": "introducing-spacy_large.jpg"
},
"links": {
"Reddit": "https://www.reddit.com/r/programming/comments/2tlyrr/spacy_industrialstrength_nlp_with_pythoncython",
"HackerNews": "https://news.ycombinator.com/item?id=8942783"
}
},
"how-spacy-works": {
"title": "How spaCy Works",
"date": "2015-02-19",
"author": "matt",
"description": "This post is a work in progress, explaining some of how spaCy is designed and implemented, and noting which algorithms were used. spaCy is built on science, not alchemy, and when new discoveries are made, we publish them. We want to stay on the same page as the academic community, to use their work. Still, explaining everything takes time — so this post isn't yet as complete as we'd like it to be. Stay tuned.",
"image": {
"file": "how-spacy-works.jpg",
"file_small": "how-spacy-works_small.jpg",
"file_large": "how-spacy-works_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
}
},
"writing-c-in-cython": {
"title": "Writing C in Cython",
"date": "2014-10-21",
"author": "matt",
"description": "For the last two years, Ive done almost all of my work in Cython. And I dont mean, I write Python, and then “Cythonize” it, with various type-declarations et cetera. I just, write Cython. I use \"raw\" C structs and arrays, and occasionally C++ vectors, with a thin wrapper around malloc/free that I wrote myself. The code is almost always exactly as fast as C/C++, because that's really all it is, but with Python right there, if I want it.",
"image" : {
"file": "cython.jpg",
"file_small": "cython_small.jpg",
"file_large": "cython_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": {
"Reddit": "https://www.reddit.com/r/Python/comments/2jvdw9/writing_c_in_cython/",
"HackerNews": "https://news.ycombinator.com/item?id=8483872"
}
},
"parsing-english-in-python": {
"title": "Parsing English in 500 Lines of Python",
"date": "2013-12-18",
"author": "matt",
"description": "This post explains how transition-based dependency parsers work, and argues that this algorithm represents a break-through in natural language understanding. A concise sample implementation is provided, in 500 lines of Python, with no external dependencies. This post was written in 2013. In 2015 this type of parser is now increasingly dominant.",
"image" : {
"file": "pizza.jpg",
"file_small": "pizza_small.jpg",
"file_large": "pizza_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": {
"Reddit": "https://www.reddit.com/r/programming/comments/245jte/parsing_english_with_500_lines_of_python/",
"HackerNews": "https://news.ycombinator.com/item?id=7658864"
}
},
"part-of-speech-pos-tagger-in-python": {
"title": "A Good Part-of-Speech Tagger in about 200 Lines of Python",
"date": "2013-09-18",
"author": "matt",
"description": "Up-to-date knowledge about natural language processing is mostly locked away in academia. And academics are mostly pretty self-conscious when we write. Were careful. We dont want to stick our necks out too much. But under-confident recommendations suck, so heres how to write a good part-of-speech tagger.",
"image" : {
"file": "pos-tagger.jpg",
"file_small": "pos-tagger_small.jpg",
"file_large": "pos-tagger_large.jpg",
"credit": "Kemal Sanli",
"url": "https://dribbble.com/kemal"
},
"links": {
"Reddit": "https://www.reddit.com/r/programming/comments/1mdn75/a_good_partofspeech_tagger_in_200_lines_of_python/"
}
>>>>>>> v1.0.0-rc1
}
}

View File

@ -1,5 +1,6 @@
include ../_includes/_mixins
<<<<<<< HEAD
.u-padding
+label #[+date("2016-08-09")]
@ -10,3 +11,12 @@ include ../_includes/_mixins
p.u-text-medium Here's how this is going to work: Matt will continue to develop and maintain spaCy and all related projects under his name. Nothing will change for you. Henning will take over our legal structure and start a new business under a new name.
p.u-text-medium Sincerely,#[br] Henning Peters and Matthew Honnibal
=======
+lead Dear spaCy users,
p Unfortunately, we (Henning Peters and Matthew Honnibal) are parting ways. Breaking up is never easy, and it's taken us a while to get our stuff together. Hopefully, you didn't notice anything was up — if you did, we hope you haven't been inconvenienced.
p Here's how this is going to work: Matt will continue to develop and maintain spaCy and all related projects under his name. Nothing will change for you. Henning will take over our legal structure and start a new business under a new name.
p Sincerely,#[br] Henning Peters and Matthew Honnibal
>>>>>>> v1.0.0-rc1

View File

@ -0,0 +1,28 @@
include ../_includes/_mixins
+lead A syntactic dependency parse is a kind of shallow meaning representation. It's an important piece of many language understanding and text processing technologies. Now that these representations can be computed quickly, and with increasingly high accuracy, they're being used in lots of applications &ndash; translation, sentiment analysis, and summarization are major application areas.
p I've been living and breathing similar representations for most of my career. But there's always been a problem: talking about these things is tough. Most people haven't thought much about grammatical structure, and the idea of them is inherently abstract. When I left academia to write #[a(href=url target="_blank") spaCy], I knew I wanted a good visualizer. Unfortunately, I also knew I'd never be the one to write it. I'm deeply graphically challenged. Fortunately, when working with #[a(href="http://ines.io" target="_blank") Ines] to build this site, she really nailed the problem, with a solution I'd never have thought of. I really love the result, which we're calling #[a(href="/demos/displacy" target="_blank") displaCy]:
+displacy("robots-in-popular-culture", "Scroll to see the full parse")
p The #[a(href="https://code.google.com/p/whatswrong/" target="_blank") best alternative] is a Java command-line tool that outputs static images, which look like this:
+image("linguistic-structure.jpg", "Output of the Brat parse tree visualizer")
p I find the output of the CMU visualizer basically unreadable. Pretty much all visualizers suffer from this problem: they don't add enough space. I always thought this was a hard problem, and a good Javascript visualizer would need to do something crazy with Canvas. Ines quickly proposed a much better solution, based on native, web-standard technologies.
p The idea is to use CSS to draw shapes, mostly with border styling, and some arithmetic to figure out the spacing:
+quote("Ines Montani, Developing Displacy", "http://ines.io/blog/developing-displacy") The arrow needs only one HTML element, #[code &lt;div class="arrow"&gt;] and the CSS pseudo-elements #[code :before] and #[code :after]. The #[code :before] pseudo-element is used for the arc and is essentially a circle (#[code border-radius: 50%]) with a black outline. Since its parent #[code .arrow] is only half its height and set to #[code overflow: hidden], its "cut in half" and ends up looking like a half circle.
p To me, this seemed like witchcraft, or a hack at best. But I was quickly won over: if all we do is declare the data and the relationships, in standards-compliant HTML and CSS, then we can simply step back and let the browser do its job. We know the code will be small, the layout will work on a variety of display, and we'll have a ready separation of style and content. For long output, we simply let the graphic overflow, and let users scroll.
p What I'm particularly excited about is the potential for displaCy as an #[a(href="http://spacy.io/displacy/?manual=Robots%20in%20popular%20culture%20are%20there%20to%20remind%20us%20of%20the%20awesomeness%20of%20unbounded%20human%20agency" target="_blank") annotation tool]. It may seem unintuitive at first, but I think it will be much better to annotate texts the way the parser operates, with a small set of actions and a stack, than by selecting arcs directly. Why? A few reasons:
+list
+item You're always asked a question. You don't have to decide-what-to-decide.
+item The viewport can scroll with the user, making it easier to work with spacious, readable designs.
+item With only 4-6 different actions, it's easy to have key-based input.
p Efficient manual annotation is incredibly important. If we can get that right, then we can offer you cheap domain adaptation. You give us some text, we get it annotated, and ship you a custom model, that's much more accurate on your data. If you're interested in helping us beta test this idea, #[a(href="mailto:" + email) get in touch].

View File

@ -0,0 +1,37 @@
include ../_includes/_mixins
+lead Because we've been doing the same thing for a long time, sometimes we get very used to talking about our work in words that most people don't use. So, here's another take on it, in the style of #[a(href="https://xkcd.com/thing-explainer/" target="_blank") thing explainer].
p When I was little, my favorite TV shows all had talking computers. Now I'm big and there are still no talking computers. At least, not really talking. We can make them, like, #[em say] things — but I want them to #[em tell us] things. And I want them to listen, and to read. Why is this so hard?
p It turns out that almost anything we say could mean many many different things, but we don't notice because almost all of those meanings would be weird or stupid or just not possible. If I say:
+example: a(href="http://spacy.io/demos/displacy?full=I%20saw%20a%20movie%20in%20a%20dress" target="_blank") I saw a movie in a dress
p Would you ever ask me,
+example &#8220;Were you in the dress, or was the movie in the dress?&#8221;
p It's weird to even think of that. But a computer just might, because there are other cases like:
+example: a(href="http://spacy.io/demos/displacy?full=The%20TV%20showed%20a%20girl%20in%20a%20dress" target="_blank") The TV showed a girl in a dress
p Where the words hang together in the other way. People used to think that the answer was to tell the computer lots and lots of facts. But then you wake up one day and you're writing facts like #[em movies do not wear dresses], and you wonder where it all went wrong. Actually it's even worse than that. Not only are there too many facts, most of them are not even really facts! #[a(href="https://en.wikipedia.org/wiki/Cyc" target="_blank") People really tried this]. We've found that the world is made up of #[em if]s and #[em but]s.
+aside('Unconstrained Vocabulary').
If you have a fixed constraint like #[em People wear dresses], and #[em Movies are not people], how does the system cope when someone talks about #[em dressing a script]? Even if nobody has ever said this before, someone might in future. Language is creative, and exceptions are the rule.
p These days we just show the computer lots and lots and lots of words. We gave up trying to get it to understand what a “dress” is. We let #[em dress] be just some letters. But if it is seen it around #[em girl] enough times (which is just some other letters, which are seen around some #[strong other] other letters), it can make good guesses.
p It doesn't always guess right, but we can tell how often it does, and we can think of ways it help it learn better. We have a number, and we can slowly make it bigger, a little bit by a little bit.
p (One thing I've learned is, people are great at making a number bigger, if you pay a lot of them to try. The key is to pick numbers where, if they make the number bigger, they can't help but have done something actually good. This is harder than it sounds. Some say no numbers are like this. I ask them to show me much good being done another way, but they never can.)
+aside("Unconstrained Vocabulary").
The potential problem with focusing on a benchmark task is #[a(href="https://en.wikipedia.org/wiki/Goodhart%27s_law") Goodhart&#39;s Law]. The AI community is conscious of the problem and has done well at averting it.
+pullquote("Instead of telling the computer facts, what we needed to do was tell it how to learn.")
p The ideas we come up with for getting the computer to talk, listen or read a little better can be used to get it to see or plan a little better, and the other way around. Once we stopped telling it things like “#[em movies do not wear dresses]”, things really took off.
p Each bit of work still only makes our numbers a little bit bigger, and the bigger the numbers go, the harder they are to raise. But that is a good problem to have. Now that computers can read quite well, I think we should be able to do pretty great things. What should we get them to read?

View File

@ -0,0 +1,214 @@
include ../_includes/_mixins
+lead Many people have asked us to make spaCy available for their language. Being based in Berlin, German was an obvious choice for our first second language. Now SpaCy can do all the cool things you use for processing English on German text too. But more importantly, teaching spaCy to speak German required us to drop some comfortable but English-specific assumptions about how language works and made spaCy fit to learn more languages in the future.
p The current release features high-accuracy syntactic dependency parsing, named entity recognition, part-of-speech tagging, token and sentence segmentation, and noun phrase chunking. It also comes with word vectors representations, produced from word2vec. As you'll see below, #[a(href="#run-spacy") installation and usage] work much the same for both German and English. However, there are some small differences, that follow from the two languages' differing linguistic structure.
+h2("german-like-english") German is like English but different
p On the evolutionary tree of languages, German and English are close cousins, on the Germanic branch of the Indo-European family. They share a relatively recent common ancestor, so they're structurally similar. And where they differ, it's mostly English that's weird, not German. The algorithmic changes needed to process German are an important step towards processing many other languages.
p English has very simple rules for word formation (aka #[b morphology]), and very strict rules for #[b word order]. This means that an English-only NLP system can get away with some very useful simplifying assumptions. German is the perfect language to unwind these. German word order and morphology are still relatively restricted, so we can make the necessary algorithmic changes without being overwhelmed by the additional complexity.
+aside("Word order and morphology") While the division between word order and morphology is useful for thinking about the problem, it is an artificial one. In reality, both phenomena are two sides of the same coin and interact heavily with each other.
+h2("word-order") Word order
p When Germans learn English in school, one of the first things they are taught to memorize is #[em Subject-Verb-Object] or SVO. In English, the subject comes first, then the verb, then the object. If you change that order, the meaning of the sentence changes. #[em The dog bites the man] means something different from #[em The man bites the dog] even though both sentences use the exact same words. In German &mdash; as in many other languages &mdash; this is not the case. German allows for any order of subject and object in a sentence and only restricts the position of the verb. In German, you can say #[em Der Hund beißt den Mann] and #[em Den Mann beißt der Hund] and both sentences mean #[em The dog bites the man].
+aside("Subject and Object") In a prototypical sentence, e.g., #[em John hits the ball], the #[a(href="https://en.wikipedia.org/wiki/Subject_(grammar)" target="_blank") grammatical subject] maps to the person/thing that acts (#[em John]) whereas the #[a(href="https://en.wikipedia.org/wiki/Object_(grammar)" target="_blank") grammatical object] maps to the person/thing that is acted upon (#[em the ball]). All languages have mechanisms to change this mapping though.
+quote("Sherlock Holmes, in <em>A Scandal in Bohemia</em>")
| Do you note the peculiar construction of the sentence &mdash; 'This account of you we have from all quarters received.'
br
br
| A Frenchman or Russian could not have written that. It is the German who is so uncourteous to his verbs.
p One of the more difficult things for people who learn German as a second language is to figure out where to put the verb. German verbs are usually at the end of a sentence, under certain circumstances, the verb or a part of it moves to the first or second position. For instance, compare the English sentence in the example below to its German counterpart. While all the parts of the English verb stay together, the German verb is distributed over the sentence. The main part (the one carrying the meaning) is at the end of the sentence and the other part (the auxiliary verb) comes in second position after the subject.
+image("german_verb_align.svg", "", "In German, verbs are put at the end of a sentence.", "small").text-center
p The fact that German verbs come at the end of the sentence, or are split as in the example above, has some implications for language understanding technologies. So far, the syntactic structures that spaCy predicted for English sentences were always #[i projective], which means that you could draw them without ever having to cross two arcs. In order to accommodate languages with less restrictive word order than English &mdash; for example German &mdash; the parser now also predicts non-projective structures, i.e., structures where arcs may cross.
+aside("Non-projectivity") Formally, an arc from word #[i h] to word #[i d] is called non-projective if there is at least one word #[i k] between #[i k] and #[i d] which is not a direct or indirect descendant of #[i h]. A tree is non-projective if it has at least one non-projective arc.
p To illustrate the difference, consider the example below. We want the syntactic structure to represent the fact that it is the flight that was booked the day before, hence we want the parser to predict an arc between #[em flight] and #[em booked]. And of course we want the parser to predict the same arc also for the German counterpart, in this case between #[em Flug] and #[em gebucht habe]. However, because the German verb comes last, there can be crossing arcs in the German structure. This is not the only type of German construction that leaves us with a non-projective parse, but it is a frequent one. Moreover, unlike some cases where you could change your linguistic theory to avoid the crossing arcs, this one is well motivated by data and very difficult to avoid without losing information.
+image("german_english_proj.svg", "", "Syntactic structures for English are usually projective.", "small").text-center
+image("german_german_nonproj.svg", "", "Syntactic structure for German. Non-projective arcs marked in blue.", "small").text-center
p To summarize the above, we need non-projective trees to represent the information that we are interested in when parsing natural language. Okay, so we want crossing arcs. What's the problem? The problem is that crossing arcs force us to give up a very useful constraint. The set of possible non-projective trees is considerably larger than the set of possible projective trees. What's more, the algorithm spaCy uses to search for a projective tree is both simpler and more efficient than the equivalent non-projective algorithms, so restricting spaCy to projective dependency parsing has given us a win on two fronts: we've been able to do less work computationally, while also encoding important prior knowledge about the problem space into the system.
p Unfortunately, this &lsquo;prior knowledge&rsquo; was never quite true. It's a simplifying assumption. In the same way that a physicist might assume a frictionless surface or a #[a(href="https://en.wikipedia.org/wiki/Spherical_cow") spherical cow], sometimes it's useful for computational linguists to assume projective trees and context-free grammars. For English, projective trees are a good-value simplification &mdash; the cow of English is not quite a perfect sphere, but it's close. The cow of German is considerably less round, and we can make our model more accurate by taking this into account.
+h2("pseudoproj-parsing") Pseudo-projective parsing
p Luckily for us, the problem of predicting non-projective structures has received a lot of attention over the last decade. One observation that was made early on is that these non-projective arcs are rare. Usually, only a few percent of the arcs in #[a(href="https://en.wikipedia.org/wiki/Treebank" target="_blank") linguistic treebanks] are non-projective, even for languages with unrestrictive word order. This means that we can afford to use approaches with a higher worst-case complexity because the worst case basically never occurs and therefore has virtually no impact on the efficiency of our NLP systems.
p Several methods have been proposed for dealing with non-projective arcs. Most change the parsing algorithm to search through the full space of possible structures directly, or at least a large part of it. In spaCy, we opted for a more indirect approach. #[a(href="http://www.aclweb.org/anthology/P05-1013" target="_blank") Nivre and Nilsson (2005)] propose a simple procedure they call #[b pseudo-projective parsing]. The parser is trained on projective structures that are produced from non-projective structures by reattaching the non-projective arcs higher in the tree until they are projective. The original attachment site is encoded in the label of the respective arc. The parser thus learns to predict projective structures with specially decorated arc labels. The output of the parser is then post-processed to reattach decorated arcs to their proper syntactic head according to their arc label, thereby re-introducing non-projective arcs.
+aside("Decoration schemes") #[a(href="http://www.aclweb.org/anthology/P05-1013" target="_blank") Nivre and Nilsson (2005)] test three different ways of decorating labels. SpaCy currently uses the #[em head] decoration scheme because it is a good compromise between the amount of encoded information and increase in the number of arc labels.
+image("german_pseudoproj.svg", "", "Pseudo-projective parsing. Training data is projectivized and decorated before training the model. Decorated arcs in parser output are re-attached to their non-projective head in a post-processing step.", "large").text-center
p Using pseudo-projective parsing allows spaCy to produce non-projective structures without having to sacrifice the efficient parsing algorithm, which is restricted to projective structures. And because non-projective arcs are rare, the post-processing step only ever has to reattach one or two arcs in every other sentence, which makes its impact on the overall parsing speed negligable even though its worst case complexity is higher than the parser's. In fact, we didn't notice any difference in speed when parsing German with this approach. And when we know that our training data is projective, we just switch it off.
+h3("accuracy") Evaluation of pseudo-projective parsing
p Pseudo-projective parsing makes a big difference in German because the parser can recover arcs that a purely projective model cannot. The numbers in the table show the percentage of arcs that were correctly attached by the parser (unlabeled attachment score (UAS) ignores the label, labeled attachment score (LAS) takes it into account). We train and evaluate the German model on the TiGer treebank (see #[a(href="#Data-sources") below]).
+table(["System", "UAS", "LAS"])
+row
+cell German, forcing projective structures
+cell 90.86%
+cell 88.60%
+row
+cell German, allowing non-projective structures
+cell 92.22%
+cell 90.14%
//- +row
//- +cell English
//- +cell 91.15%
//- +cell 89.13%
+h2("morphology") Morphology
p One other important difference between English and German is the richer morphology of German words. German words can change their form depending on their grammatical function in a sentence. English words do this too, for example by appending an #[i s] to a noun to mark plural (#[i ticket] &rarr; #[i tickets]). However, in most languages word forms of the same word show much more variety than in English, and this is also the case in German. German is also famous for its capacity to form #[a(href="https://en.wikipedia.org/wiki/Rinderkennzeichnungs-_und_Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz" target="_blank") really long words], another process that is driven by the morphological system.
p While German is clearly a language with rich morphology, it isn't the most crucial aspect for natural language processing of German (depending on the task, of course &#128521;). While processing languages like Hungarian, Turkish, or Czech is hopeless without a proper treatment of morphological processes, German can be processed reasonably well without. We therefore released the German model without a morphological component &mdash; for now. We're working on adding such a component to spaCy, not just for improving the German model but also to make the next step towards learning more languages.
+h2("run-spacy") Showtime
p As for English, spaCy now provides a pretrained model for processing German. This model currently provides functionality for tokenization, part-of-speech tagging, syntactic parsing, and named entity recognition. In addition, #[code spacy.de] also comes with pre-trained word representations, in the form of word vectors and hierarchical cluster IDs.
p Installing the German model on your machine is as easy as for English:
+code('bash','Install German model').
pip install spacy
python -m spacy.de.download
p Once installed you can use it from Python like the English model. If you've been loading spaCy using the #[code English()] class directly, now's a good time to switch over to the newer #[code spacy.load()] function:
+code('python','Parse German').
from __future__ import print_function, unicode_literals
import spacy
nlp = spacy.load('de')
doc = nlp(u'Ich bin ein Berliner.')
# show universal pos tags
print(' '.join('{word}/{tag}'.format(word=t.orth_, tag=t.pos_) for t in doc))
# output: Ich/PRON bin/AUX ein/DET Berliner/NOUN ./PUNCT
# show German specific pos tags (STTS)
print(' '.join('{word}/{tag}'.format(word.orth_, tag.tag_) for t in doc))
# output: Ich/PPER bin/VAFIN ein/ART Berliner/NN ./$.
# show dependency arcs
print('\n'.join('{child:&lt;8} &lt;{label:-^7} {head}'.format(child=t.orth_, label=t.dep_, head=t.head.orth_) for t in doc))
# output: (sb: subject, nk: noun kernel, pd: predicate)
# Ich &lt;--sb--- bin
# bin &lt;-ROOT-- bin
# ein &lt;--nk--- Berliner
# Berliner &lt;--pd--- bin
# . &lt;-punct- bin
p As for English, German provides named entities and a noun chunk iterator to extract basic information from the data. The NER model can currently distinguish persons, locations, and organizations. We are currently looking into ways of extending this to more classes.
+code('python','Named entity recognition').
# show named entities
for ent in doc.ents:
print(ent.text)
# output:
# Berliner
p The noun chunk iterator provides easy access to base noun phrases in the form of an iterator. The iterator requires the dependency structure to be present and returns all noun phrases that the parser recognized.
+code('python','Noun chunks').
# show noun chunks
for chunk in doc.noun_chunks:
print(chunk.text)
# output:
# ein Berliner
# noun chunks include so-called measure constructions ...
doc = de(u'Ich möchte gern zum Essen eine Tasse Kaffee bestellen.')
print [ chunk for chunk in doc.noun_chunks ]
# output:
# [Essen, eine Tasse Kaffee]
# ... and close appositions
doc = de(u'Der Senator vermeidet das Thema Flughafen.')
print [ chunk for chunk in doc.noun_chunks ]
# output:
# [Der Senator, das Thema Flughafen]
p The German model comes with word vectors trained on a mix of text from Wikipedia and the Open Subtitles corpus. The vectors were produced using the skip-gram with negative sampling word2vec algorithm using #[a(href="https://radimrehurek.com/gensim/" target="_blank") Gensim], with a context window of 2.
p You can use the vector representation with the #[code .vector] attribute and the #[code .similarity()] method on spaCy's #[code Lexeme], #[code Token], #[code Span] and #[code Doc] objects.
+code('python','Word vectors').
# Use word vectors
de = spacy.load('de')
doc = de(u'Der Apfel und die Orange sind ähnlich')
assert len(doc.vector) == len(doc[0].vector))
der_apfel = doc[:2]
die_orange = doc[3:5]
der_apfel.similarity(die_orange)
# output:
# 0.63665210991205579
der, apfel = der_apfel
der.similarity(apfel)
# output:
# 0.24995991403916812
p While we try to always provide good defaults in spaCy, the word2vec family of algorithms give you a lot of knobs to twiddle, so you might benefit from custom trained vectors. You can get expert help on this by #[a(href="mailto:" + email) contacting us] about consulting.
//- The developers of Gensim, #[a(href="https://rare-technologies.com/" target="_blank") RaRe Technologies], also offer excellent services to help you put word2vec into production.
//- +h2("Performance") Performance
//- +table(["", "POS acc", "Dep (UAS/LAS)", "NER (Prec/Rec/F1)"])
//- +row
//- +cell spaCy German
//- +cell 97.56
//- +cell 92.22/90.14
//- +cell 82.95/73.76/78.08
+h2("Caveats") Caveats
p With the German parser potentially returning non-projective structures, some assumptions about syntactic structures that would hold for the English parser don't hold for the German one. For example, the subtree of a particular token doesn't necessarily span a consecutive substring of the input sentence anymore. Furthermore, a token may have no direct left dependents but can still have a left edge (the left-most descendant of the token) that is further left of the token.
+code('python','Caveats with non-projectivity').
doc = nlp(u'Den Berliner hat der Hund nicht gebissen.')
# heads array: [1, 6, 2, 4, 2, 6, 2, 2] (second token is attached with a non-projective arc)
# most subtrees cover a consecutive span of the input
print [ (t.i, t.orth_) for t in doc[4].subtree ]
# output:
# [(3, u'der'), (4, u'Hund')]
# but some subtrees have gaps
print [ (t.i, t.orth_) for t in doc[6].subtree ]
# output:
# [(0, u'Den'), (1, u'Berliner'), (5, u'nicht'), (6, u'gebissen')]
# the root has no left dependents:
print doc[2].n_lefts
# output:
# 0
# but the root's left-most descendant is not the root itself but a token further left
print (doc[2].left_edge.i, doc[2].left_edge.orth_)
# output:
# (0, u'Den')
+h2("Data-sources") Data sources
p The German model is trained on the German #[a(href="http://www.ims.uni-stuttgart.de/forschung/ressourcen/korpora/tiger.html" target="_blank") TiGer treebank] converted to dependencies. The language-specific part-of-speech tags use the #[a(href="http://www.sfs.uni-tuebingen.de/resources/stts-1999.pdf" target="_blank") Stuttgart-Tübingen Tag Set (STTS)] (document in German). The model for named entity recognition is trained on the #[a(href="https://www.lt.tu-darmstadt.de/de/data/german-named-entity-recognition/" target="_blank") German Named Entity Recognition Data] from the TU Darmstadt. For estimating word probabilities we rely on data provided by the #[a(href="http://hpsg.fu-berlin.de/cow/" target="_blank") COW project]. Word vectors and Brown clusters are computed on a combination of the German Wikipedia and the German part of #[a(href="http://opus.lingfil.uu.se/OpenSubtitles2016.php" target="_blank") OpenSubtitles2016] which is based on data from #[a(href="http://www.opensubtitles.org/" target="_blank") opensubtitles.org]. Buy these people a beer and a cookie when you meet them :).
+h2("call") Want spaCy to speak your language?
p There is still a lot to do for German, but that doesn't mean spaCy can't start learning another language in the meantime. You can advocate for what languages should be added next on the #[a(href="https://reddit.com/r/" + profiles.reddit) spaCy subreddit], or #[a(href="mailto:" + email) get in touch] about sponsoring development.

View File

@ -0,0 +1,143 @@
include ../_includes/_mixins
+lead The following are some hasty preliminary notes on how spaCy works. The short story is, there are no new killer algorithms. The way that the tokenizer works is novel and a bit neat, and the parser has a new feature set, but otherwise the key algorithms are well known in the recent literature.
p Some might also wonder how I get Python code to run so fast. I don't &ndash; spaCy is written in #[a(href="http://cython.org" target="_blank") Cython], an optionally statically-typed language that compiles to C or C++, which is then loaded as a C extension module. This makes it #[a(href="/blog/writing-c-in-cython" target="_blank") easy] to achieve the performance of native C code, but allows the use of Python language features, via the Python C API. The Python unicode library was particularly useful to me. I think it would have been much more difficult to write spaCy in another language.
+h3("tokenizer-and-lexicon") Tokenizer and Lexicon
p Tokenization is the task of splitting a string into meaningful pieces, called tokens, which you can then compute with. In practice, the task is usually to match the tokenization performed in some treebank, or other corpus. If we want to apply a tagger, entity recogniser, parser etc, then we want our run-time text to match the training conventions. If we want to use a model that's been trained to expect "isn't" to be split into two tokens, ["is", "n't"], then that's how we need to prepare our data.
p In order to train spaCy's models with the best data available, I therefore tokenize English according to the Penn Treebank scheme. It's not perfect, but it's what everybody is using, and it's good enough.
+h3("what-we-dont-do") What we don't do
p The Penn Treebank was distributed with a script called tokenizer.sed, which tokenizes ASCII newswire text roughly according to the Penn Treebank standard. Almost all tokenizers are based on these regular expressions, with various updates to account for unicode characters, and the fact that it's no longer 1986 &ndash; today's text has URLs, emails, emoji, etc.
p Usually, the resulting regular expressions are applied in multiple passes, which is quite inefficient. Often no care is taken to preserve indices into the original string. If you lose these indices, it'll be difficult to calculate mark-up based on your annotations.
+h3("tokenizer-algorithm") Tokenizer Algorithm
p spaCy's tokenizer assumes that no tokens will cross whitespace &ndash; there will be no multi-word tokens. If we want these, we can post-process the token-stream later, merging as necessary. This assumption allows us to deal only with small chunks of text. We can cache the processing of these, and simplify our expressions somewhat.
p Here is what the outer-loop would look like in Python. (You can see the production implementation, in Cython, #[a(href="https://github.com/" + profiles.github + "/spaCy/blob/master/spacy/tokenizer.pyx#L56" target="_blank") here].)
+code.
cache = {}
def tokenize(text):
tokens = []
for substring in text.split(' '):
if substring in cache:
tokens.extend(cache[substring])
else:
subtokens = _tokenize_substring(substring)
tokens.extend(subtokens)
cache[substring] = subtokens
return tokens
p The actual work is performed in #[code _tokenize_substring]. For this, I divide the tokenization rules into three pieces:
+list
+item A prefixes expression, which matches from the start of the string;
+item A suffixes expression, which matches from the end of the string;
+item A special-cases table, which matches the whole string.
p The algorithm then proceeds roughly like this (consider this like pseudo-code; this was written quickly and has not been executed):
+code.
# Tokens which can be attached at the beginning or end of another
prefix_re = _make_re([",", '"', '(', ...])
suffix_re = _make_re(s[",", "'", ":", "'s", ...])
# Contractions etc are simply enumerated, since they're a finite set. We
# can also specify anything we like here, which is nice --- different data
# has different quirks, so we want to be able to add ad hoc exceptions.
special_cases = {
"can't": ("ca", "n't"),
"won't": ("wo", "n't"),
"he'd've": ("he", "'d", "'ve"),
...
":)": (":)",) # We can add any arbitrary thing to this list.
}
def _tokenize_substring(substring):
prefixes = []
suffixes = []
while substring not in special_cases:
prefix, substring = _apply_re(substring, prefix_re)
if prefix:
prefixes.append(prefix)
else&#58;
suffix, substring = _apply_re(substring, suffix_re)
if suffix:
suffixes.append(suffix)
else&#58;
break
p This procedure splits off tokens from the start and end of the string, at each point checking whether the remaining string is in our special-cases table. If it is, we stop splitting, and return the tokenization at that point.
p The advantage of this design is that the prefixes, suffixes and special-cases can be declared separately, in easy-to-understand files. If a new entry is added to the special-cases, you can be sure that it won't have some unforeseen consequence to a complicated regular-expression grammar.
+h3("coupling-tokenizer-lexicon") Coupling the Tokenizer and Lexicon
p As mentioned above, the tokenizer is designed to support easy caching. If all we were caching were the matched substrings, this would not be so advantageous. Instead, what we do is create a struct which houses all of our lexical features, and cache *that*. The tokens are then simply pointers to these rich lexical types.
p In a sample of text, vocabulary size grows exponentially slower than word count. So any computations we can perform over the vocabulary and apply to the word count are efficient.
+h3("part-of-speech-tagger") Part-of-speech Tagger
p In 2013, I wrote a blog post describing #[a(href="/blog/part-of-speech-POS-tagger-in-python/" target="_blank") how to write a good part of speech tagger]. My recommendation then was to use greedy decoding with the averaged perceptron. I think this is still the best approach, so it's what I implemented in spaCy.
p The tutorial also recommends the use of Brown cluster features, and case normalization features, as these make the model more robust and domain independent. spaCy's tagger makes heavy use of these features.
+h3("dependency-parser") Dependency Parser
p The parser uses the algorithm described in my #[a(href="/blog/parsing-english-in-python" target="_blank") 2014 blog post]. This algorithm, shift-reduce dependency parsing, is becoming widely adopted due to its compelling speed/accuracy trade-off.
p Some quick details about spaCy's take on this, for those who happen to know these models well. I'll write up a better description shortly.
+list("numbers")
+item I use greedy decoding, not beam search;
+item I use the arc-eager transition system;
+item I use the Goldberg and Nivre (2012) dynamic oracle.
+item I use the non-monotonic update from my CoNLL 2013 paper (Honnibal, Goldberg and Johnson 2013).
p So far, this is exactly the configuration from the CoNLL 2013 paper, which scored 91.0. So how have I gotten it to 92.4? The following tweaks:
+list("numbers")
+item I use Brown cluster features &ndash; these help a lot;
+item I redesigned the feature set. I've long known that the Zhang and Nivre (2011) feature set was suboptimal, but a few features don't make a very compelling publication. Still, they're important.
+item When I do the dynamic oracle training, I also make the upate cost-sensitive: if the oracle determines that the move the parser took has a cost of N, then the weights for the gold class are incremented by +N, and the weights for the predicted class are incremented by -N. This only made a small (0.1-0.2%) difference.
+h3("implementation") Implementation
p I don't do anything algorithmically novel to improve the efficiency of the parser. However, I was very careful in the implementation.
p A greedy shift-reduce parser with a linear model boils down to the following loop:
+code.
def parse(words, model, feature_funcs, n_classes):
state = init_state(words)
for _ in range(len(words) * 2):
features = [templ(state) for templ in feature_funcs]
scores = [0 for _ in range(n_classes)]
for feat in features:
weights = model[feat]
for i, weight in enumerate(weights):
scores[i] += weight
class_, score = max(enumerate(scores), key=lambda item: item[1])
transition(state, class_)
p The parser makes 2N transitions for a sentence of length N. In order to select the transition, it extracts a vector of K features from the state. Each feature is used as a key into a hash table managed by the model. The features map to a vector of weights, of length C. We then dot product the feature weights to the scores vector we are building for that instance.
p The inner-most loop here is not so bad: we only have a few dozen classes, so pit's just a short dot product. Both of the vectors are in the cache, so this pis a snack to a modern CPU.
p The bottle-neck in this algorithm is the 2NK look-ups into the hash-table that we must make, as these almost always have to hit main memory. The feature-set is enormously large, because all of our features are one-hot boolean indicators. Some of the features will be common, so they'll lurk around in the CPU's cache hierarchy. But a lot of them won't be, and accessing main memory takes a lot of cycles.
p I used to use the Google dense_hash_map implementation. This seemed a solid choice: it came from a big brand, it was in C++, and it seemed very complicated. Later, I read #[a(href="http://preshing.com/20130107/this-hash-table-is-faster-than-a-judy-array/" target="_blank") Jeff Preshing&apos;s excellent post] on open-addressing with linear probing. This really spoke to me. I had assumed that a fast hash table implementation would necessarily be very complicated, but no &ndash; this is another situation where the simple strategy wins.
p I've packaged my Cython implementation separately from spaCy, in the package #[a(href="https://github.com/syllog1sm/preshed" target="_blank") preshed] &ndash; for "pre-hashed", but also as a nod to Preshing. I've also taken great care over the feature extraction and perceptron code, which I'm distributing in a package named #[a(href="https://github.com/honnibal/thinc" target="_blank") thinc] (since it's for learning very sparse models with Cython).
p By the way: from comparing notes with a few people, it seems common to implement linear models in a way that's suboptimal for multi-class classification. The mistake is to store in the hash-table one weight per (feature, class) pair, rather than mapping the feature to a vector of weights, for all of the classes. This is bad because it means you need to hit the table C times, one per class, as you always need to evaluate a feature against all of the classes. In the case of the parser, this means the hash table is accessed 2NKC times, instead of the 2NK times if you have a weights vector. You should also be careful to store the weights contiguously in memory &ndash; you don't want a linked list here. I use a block-sparse format, because my problems tend to have a few dozen classes.
p I guess if I had to summarize my experience, I'd say that the efficiency of these models is really all about the data structures. We want to stay small, and stay contiguous. Minimize redundancy and minimize pointer chasing. That's why Cython is so well suited to this: we get to lay out our data structures, and manage the memory ourselves, with full C-level control.

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
website/blog/img/german.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@ -0,0 +1,158 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="284pt" height="74pt" viewBox="0 0 284 74" version="1.1">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d="M 1.359375 -6.21875 L 1.625 -5.8125 C 1.65625 -5.71875 1.734375 -5.6875 1.828125 -5.6875 C 1.859375 -5.6875 1.90625 -5.703125 1.953125 -5.734375 C 2 -5.765625 2.078125 -5.8125 2.140625 -5.84375 C 2.21875 -5.890625 2.296875 -5.921875 2.40625 -5.953125 C 2.515625 -5.984375 2.640625 -6 2.78125 -6 C 2.984375 -6 3.15625 -5.953125 3.296875 -5.84375 C 3.421875 -5.734375 3.484375 -5.578125 3.484375 -5.40625 C 3.484375 -5.25 3.46875 -5.125 3.40625 -5.015625 C 3.34375 -4.921875 3.265625 -4.828125 3.1875 -4.734375 C 3.09375 -4.65625 3 -4.578125 2.90625 -4.5 C 2.796875 -4.4375 2.71875 -4.359375 2.625 -4.28125 C 2.546875 -4.203125 2.484375 -4.109375 2.4375 -4.03125 C 2.390625 -3.921875 2.375 -3.828125 2.390625 -3.703125 L 2.453125 -3.0625 L 3.125 -3.0625 L 3.21875 -3.625 C 3.234375 -3.71875 3.265625 -3.796875 3.328125 -3.859375 C 3.390625 -3.921875 3.46875 -3.984375 3.5625 -4.0625 C 3.640625 -4.140625 3.734375 -4.203125 3.828125 -4.28125 C 3.9375 -4.359375 4.03125 -4.453125 4.09375 -4.5625 C 4.1875 -4.671875 4.25 -4.796875 4.3125 -4.9375 C 4.359375 -5.09375 4.390625 -5.25 4.390625 -5.453125 C 4.390625 -5.65625 4.359375 -5.84375 4.28125 -6.015625 C 4.203125 -6.171875 4.09375 -6.3125 3.96875 -6.4375 C 3.828125 -6.546875 3.671875 -6.640625 3.484375 -6.703125 C 3.296875 -6.765625 3.09375 -6.796875 2.859375 -6.796875 C 2.6875 -6.796875 2.546875 -6.78125 2.40625 -6.75 C 2.25 -6.71875 2.125 -6.6875 2 -6.625 C 1.875 -6.578125 1.75 -6.515625 1.65625 -6.453125 C 1.546875 -6.375 1.453125 -6.296875 1.359375 -6.21875 Z M 2.15625 -1.59375 C 2.15625 -1.421875 2.21875 -1.28125 2.328125 -1.171875 C 2.4375 -1.046875 2.578125 -1 2.765625 -1 C 2.84375 -1 2.921875 -1.015625 2.984375 -1.03125 C 3.0625 -1.0625 3.125 -1.109375 3.171875 -1.171875 C 3.234375 -1.21875 3.265625 -1.28125 3.296875 -1.359375 C 3.328125 -1.421875 3.34375 -1.515625 3.34375 -1.59375 C 3.34375 -1.671875 3.328125 -1.75 3.296875 -1.828125 C 3.265625 -1.90625 3.234375 -1.96875 3.171875 -2.015625 C 3.125 -2.078125 3.0625 -2.125 2.984375 -2.15625 C 2.921875 -2.1875 2.84375 -2.203125 2.765625 -2.203125 C 2.578125 -2.203125 2.4375 -2.140625 2.328125 -2.015625 C 2.21875 -1.90625 2.15625 -1.765625 2.15625 -1.59375 Z M 0.25 -7.8125 L 0.25 0 L 5.5625 0 L 5.5625 -7.8125 Z M 0.515625 -0.296875 L 0.515625 -7.515625 L 5.25 -7.515625 L 5.25 -0.296875 Z M 0.515625 -0.296875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-1">
<path style="stroke:none;" d="M 2.203125 0 L 2.203125 -7.8125 L 1.140625 -7.8125 L 1.140625 0 Z M 2.203125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 0.078125 -5.53125 L 1.859375 0 L 2.59375 0 C 2.703125 0 2.78125 -0.0625 2.8125 -0.1875 L 4.0625 -3.921875 C 4.078125 -4.015625 4.109375 -4.09375 4.125 -4.1875 C 4.140625 -4.265625 4.171875 -4.359375 4.1875 -4.4375 C 4.203125 -4.359375 4.21875 -4.265625 4.234375 -4.1875 C 4.25 -4.09375 4.28125 -4.015625 4.3125 -3.9375 L 5.53125 -0.1875 C 5.5625 -0.0625 5.640625 0 5.71875 0 L 6.5 0 L 8.28125 -5.53125 L 7.546875 -5.53125 C 7.484375 -5.53125 7.421875 -5.5 7.375 -5.46875 C 7.328125 -5.4375 7.28125 -5.375 7.265625 -5.328125 L 6.1875 -1.765625 C 6.15625 -1.65625 6.125 -1.53125 6.09375 -1.40625 C 6.0625 -1.265625 6.046875 -1.140625 6.03125 -1.03125 C 6 -1.140625 5.96875 -1.265625 5.9375 -1.390625 C 5.90625 -1.515625 5.875 -1.640625 5.828125 -1.765625 L 4.6875 -5.34375 C 4.671875 -5.40625 4.640625 -5.4375 4.59375 -5.484375 C 4.546875 -5.515625 4.484375 -5.53125 4.40625 -5.53125 L 3.984375 -5.53125 C 3.921875 -5.53125 3.859375 -5.515625 3.8125 -5.484375 C 3.78125 -5.4375 3.734375 -5.40625 3.71875 -5.34375 L 2.5625 -1.765625 C 2.515625 -1.640625 2.484375 -1.515625 2.4375 -1.390625 C 2.40625 -1.265625 2.375 -1.140625 2.34375 -1.015625 C 2.328125 -1.140625 2.3125 -1.265625 2.28125 -1.390625 C 2.25 -1.515625 2.21875 -1.640625 2.203125 -1.765625 L 1.140625 -5.328125 C 1.125 -5.375 1.078125 -5.421875 1.03125 -5.46875 C 0.984375 -5.5 0.921875 -5.53125 0.84375 -5.53125 Z M 0.078125 -5.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-3">
<path style="stroke:none;" d="M 4.859375 0 L 4.859375 -3.53125 C 4.859375 -3.84375 4.8125 -4.125 4.734375 -4.390625 C 4.640625 -4.640625 4.515625 -4.859375 4.359375 -5.046875 C 4.1875 -5.21875 3.984375 -5.359375 3.75 -5.46875 C 3.515625 -5.578125 3.234375 -5.625 2.921875 -5.625 C 2.5 -5.625 2.109375 -5.546875 1.75 -5.40625 C 1.40625 -5.25 1.078125 -5.03125 0.765625 -4.75 L 0.9375 -4.4375 C 0.96875 -4.390625 1.015625 -4.34375 1.0625 -4.3125 C 1.109375 -4.265625 1.171875 -4.25 1.234375 -4.25 C 1.3125 -4.25 1.40625 -4.28125 1.484375 -4.34375 C 1.578125 -4.40625 1.671875 -4.46875 1.78125 -4.546875 C 1.90625 -4.625 2.046875 -4.6875 2.21875 -4.75 C 2.375 -4.8125 2.578125 -4.84375 2.8125 -4.84375 C 3.171875 -4.84375 3.4375 -4.734375 3.625 -4.5 C 3.8125 -4.28125 3.90625 -3.96875 3.90625 -3.53125 L 3.90625 -3.109375 C 3.265625 -3.09375 2.75 -3.03125 2.3125 -2.9375 C 1.875 -2.828125 1.53125 -2.703125 1.265625 -2.546875 C 1 -2.390625 0.796875 -2.21875 0.6875 -2 C 0.5625 -1.8125 0.5 -1.59375 0.5 -1.375 C 0.5 -1.125 0.546875 -0.90625 0.625 -0.734375 C 0.703125 -0.546875 0.8125 -0.390625 0.953125 -0.265625 C 1.09375 -0.15625 1.25 -0.0625 1.4375 0 C 1.625 0.046875 1.828125 0.09375 2.046875 0.09375 C 2.25 0.09375 2.453125 0.078125 2.625 0.03125 C 2.796875 0 2.953125 -0.046875 3.109375 -0.125 C 3.265625 -0.203125 3.40625 -0.28125 3.546875 -0.390625 C 3.6875 -0.484375 3.828125 -0.609375 3.96875 -0.734375 L 4.078125 -0.234375 C 4.09375 -0.140625 4.140625 -0.078125 4.1875 -0.046875 C 4.25 -0.015625 4.328125 0 4.421875 0 Z M 2.328125 -0.59375 C 2.203125 -0.59375 2.09375 -0.609375 1.984375 -0.640625 C 1.875 -0.671875 1.78125 -0.71875 1.703125 -0.78125 C 1.609375 -0.859375 1.546875 -0.9375 1.5 -1.046875 C 1.453125 -1.15625 1.4375 -1.28125 1.4375 -1.421875 C 1.4375 -1.578125 1.484375 -1.71875 1.578125 -1.84375 C 1.65625 -1.96875 1.796875 -2.0625 2 -2.15625 C 2.1875 -2.25 2.453125 -2.328125 2.765625 -2.375 C 3.0625 -2.4375 3.453125 -2.46875 3.90625 -2.484375 L 3.90625 -1.34375 C 3.796875 -1.21875 3.671875 -1.125 3.5625 -1.03125 C 3.453125 -0.9375 3.328125 -0.859375 3.203125 -0.796875 C 3.078125 -0.734375 2.9375 -0.6875 2.796875 -0.640625 C 2.65625 -0.609375 2.5 -0.59375 2.328125 -0.59375 Z M 2.328125 -0.59375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-4">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.15625 -5.609375 2.8125 -5.53125 2.515625 -5.359375 C 2.21875 -5.203125 1.953125 -4.984375 1.71875 -4.71875 L 1.640625 -5.328125 C 1.59375 -5.453125 1.515625 -5.53125 1.375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-5">
<path style="stroke:none;" d="M 2.46875 0.09375 C 2.71875 0.09375 2.96875 0.046875 3.203125 -0.046875 C 3.4375 -0.140625 3.640625 -0.25 3.8125 -0.421875 L 3.515625 -0.875 C 3.484375 -0.9375 3.4375 -0.96875 3.390625 -0.96875 C 3.359375 -0.96875 3.328125 -0.953125 3.28125 -0.921875 C 3.25 -0.90625 3.203125 -0.875 3.140625 -0.84375 C 3.09375 -0.8125 3.03125 -0.78125 2.953125 -0.75 C 2.875 -0.71875 2.796875 -0.703125 2.6875 -0.703125 C 2.515625 -0.703125 2.359375 -0.765625 2.25 -0.875 C 2.140625 -1 2.078125 -1.15625 2.078125 -1.390625 L 2.078125 -4.71875 L 3.671875 -4.71875 L 3.671875 -5.421875 L 2.078125 -5.421875 L 2.078125 -7.3125 L 1.59375 -7.3125 C 1.53125 -7.3125 1.484375 -7.296875 1.4375 -7.265625 C 1.40625 -7.234375 1.375 -7.1875 1.375 -7.125 L 1.140625 -5.421875 L 0.234375 -5.3125 L 0.234375 -4.921875 C 0.234375 -4.859375 0.265625 -4.796875 0.296875 -4.765625 C 0.34375 -4.734375 0.390625 -4.71875 0.453125 -4.71875 L 1.109375 -4.71875 L 1.109375 -1.328125 C 1.109375 -0.875 1.234375 -0.53125 1.46875 -0.28125 C 1.703125 -0.03125 2.03125 0.09375 2.46875 0.09375 Z M 2.46875 0.09375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-6">
<path style="stroke:none;" d="M 3.03125 -5.609375 C 2.625 -5.609375 2.265625 -5.546875 1.9375 -5.40625 C 1.609375 -5.265625 1.34375 -5.078125 1.109375 -4.84375 C 0.875 -4.59375 0.703125 -4.296875 0.578125 -3.9375 C 0.453125 -3.59375 0.390625 -3.203125 0.390625 -2.765625 C 0.390625 -2.328125 0.453125 -1.9375 0.578125 -1.59375 C 0.703125 -1.234375 0.875 -0.9375 1.109375 -0.6875 C 1.34375 -0.453125 1.609375 -0.25 1.9375 -0.125 C 2.265625 0.015625 2.625 0.078125 3.03125 0.078125 C 3.4375 0.078125 3.796875 0.015625 4.125 -0.125 C 4.453125 -0.25 4.734375 -0.453125 4.953125 -0.6875 C 5.1875 -0.9375 5.359375 -1.234375 5.46875 -1.59375 C 5.59375 -1.9375 5.65625 -2.328125 5.65625 -2.765625 C 5.65625 -3.203125 5.59375 -3.59375 5.46875 -3.9375 C 5.359375 -4.296875 5.1875 -4.59375 4.953125 -4.84375 C 4.734375 -5.078125 4.453125 -5.265625 4.125 -5.40625 C 3.796875 -5.546875 3.4375 -5.609375 3.03125 -5.609375 Z M 3.03125 -0.6875 C 2.75 -0.6875 2.515625 -0.734375 2.3125 -0.828125 C 2.109375 -0.921875 1.9375 -1.046875 1.796875 -1.234375 C 1.671875 -1.40625 1.5625 -1.625 1.5 -1.875 C 1.421875 -2.140625 1.390625 -2.4375 1.390625 -2.765625 C 1.390625 -3.09375 1.421875 -3.375 1.5 -3.640625 C 1.5625 -3.90625 1.671875 -4.109375 1.796875 -4.296875 C 1.9375 -4.484375 2.109375 -4.609375 2.3125 -4.703125 C 2.515625 -4.796875 2.75 -4.84375 3.03125 -4.84375 C 3.578125 -4.84375 3.984375 -4.65625 4.25 -4.296875 C 4.515625 -3.9375 4.65625 -3.421875 4.65625 -2.765625 C 4.65625 -2.109375 4.515625 -1.59375 4.25 -1.234375 C 3.984375 -0.859375 3.578125 -0.6875 3.03125 -0.6875 Z M 3.03125 -0.6875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-7">
<path style="stroke:none;" d="M 4.5625 -4.546875 L 4.828125 -4.890625 C 4.59375 -5.125 4.328125 -5.296875 4.03125 -5.421875 C 3.734375 -5.546875 3.390625 -5.609375 3 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.890625 -5.40625 C 1.578125 -5.25 1.296875 -5.0625 1.078125 -4.8125 C 0.859375 -4.546875 0.6875 -4.25 0.578125 -3.90625 C 0.453125 -3.5625 0.40625 -3.171875 0.40625 -2.765625 C 0.40625 -2.3125 0.46875 -1.90625 0.59375 -1.5625 C 0.71875 -1.203125 0.890625 -0.90625 1.109375 -0.671875 C 1.328125 -0.421875 1.578125 -0.234375 1.875 -0.109375 C 2.171875 0.015625 2.5 0.078125 2.84375 0.078125 C 3.234375 0.078125 3.625 0.015625 3.984375 -0.125 C 4.34375 -0.265625 4.640625 -0.484375 4.875 -0.78125 L 4.609375 -1.125 C 4.5625 -1.1875 4.5 -1.21875 4.421875 -1.21875 C 4.359375 -1.21875 4.296875 -1.1875 4.21875 -1.140625 C 4.15625 -1.078125 4.078125 -1.015625 3.96875 -0.953125 C 3.875 -0.875 3.75 -0.8125 3.59375 -0.765625 C 3.4375 -0.703125 3.25 -0.671875 3.015625 -0.671875 C 2.765625 -0.671875 2.546875 -0.71875 2.34375 -0.8125 C 2.140625 -0.90625 1.96875 -1.046875 1.84375 -1.21875 C 1.703125 -1.390625 1.59375 -1.609375 1.515625 -1.875 C 1.4375 -2.125 1.40625 -2.4375 1.40625 -2.765625 C 1.40625 -3.09375 1.4375 -3.375 1.5 -3.625 C 1.578125 -3.890625 1.6875 -4.109375 1.828125 -4.296875 C 1.96875 -4.46875 2.140625 -4.609375 2.34375 -4.71875 C 2.546875 -4.796875 2.796875 -4.859375 3.0625 -4.859375 C 3.265625 -4.859375 3.4375 -4.828125 3.578125 -4.78125 C 3.71875 -4.734375 3.828125 -4.6875 3.9375 -4.640625 C 4.03125 -4.578125 4.109375 -4.53125 4.171875 -4.484375 C 4.234375 -4.4375 4.296875 -4.421875 4.359375 -4.421875 C 4.40625 -4.421875 4.453125 -4.421875 4.484375 -4.453125 C 4.5 -4.46875 4.53125 -4.5 4.5625 -4.546875 Z M 4.5625 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-8">
<path style="stroke:none;" d="M 2.984375 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.90625 -5.40625 C 1.578125 -5.265625 1.3125 -5.078125 1.09375 -4.828125 C 0.859375 -4.578125 0.703125 -4.28125 0.578125 -3.953125 C 0.46875 -3.625 0.40625 -3.265625 0.40625 -2.875 C 0.40625 -2.40625 0.46875 -1.96875 0.59375 -1.609375 C 0.734375 -1.25 0.921875 -0.9375 1.140625 -0.6875 C 1.390625 -0.4375 1.65625 -0.25 1.984375 -0.125 C 2.296875 0.015625 2.65625 0.078125 3.03125 0.078125 C 3.234375 0.078125 3.4375 0.0625 3.640625 0.015625 C 3.84375 -0.015625 4.046875 -0.0625 4.234375 -0.125 C 4.421875 -0.203125 4.609375 -0.28125 4.765625 -0.390625 C 4.9375 -0.5 5.078125 -0.625 5.203125 -0.78125 L 4.921875 -1.125 C 4.890625 -1.1875 4.828125 -1.21875 4.75 -1.21875 C 4.6875 -1.21875 4.609375 -1.1875 4.53125 -1.140625 C 4.4375 -1.078125 4.328125 -1.015625 4.203125 -0.953125 C 4.078125 -0.890625 3.921875 -0.828125 3.75 -0.78125 C 3.578125 -0.71875 3.359375 -0.6875 3.125 -0.6875 C 2.859375 -0.6875 2.625 -0.734375 2.40625 -0.8125 C 2.203125 -0.90625 2.015625 -1.03125 1.859375 -1.203125 C 1.71875 -1.375 1.59375 -1.59375 1.5 -1.84375 C 1.421875 -2.109375 1.375 -2.40625 1.359375 -2.765625 L 5.03125 -2.765625 C 5.125 -2.765625 5.1875 -2.78125 5.21875 -2.828125 C 5.25 -2.890625 5.265625 -2.984375 5.265625 -3.140625 C 5.265625 -3.53125 5.21875 -3.875 5.109375 -4.1875 C 4.984375 -4.5 4.828125 -4.75 4.625 -4.96875 C 4.421875 -5.171875 4.171875 -5.328125 3.90625 -5.4375 C 3.625 -5.5625 3.3125 -5.609375 2.984375 -5.609375 Z M 3 -4.890625 C 3.234375 -4.890625 3.421875 -4.859375 3.59375 -4.78125 C 3.765625 -4.71875 3.921875 -4.609375 4.03125 -4.46875 C 4.15625 -4.328125 4.25 -4.171875 4.3125 -3.984375 C 4.375 -3.796875 4.40625 -3.59375 4.40625 -3.359375 L 1.390625 -3.359375 C 1.46875 -3.84375 1.625 -4.21875 1.890625 -4.5 C 2.171875 -4.765625 2.53125 -4.890625 3 -4.890625 Z M 3 -4.890625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-9">
<path style="stroke:none;" d="M 1.875 -8.03125 L 0.90625 -8.03125 L 0.90625 0 L 1.875 0 Z M 1.875 -8.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-10">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.171875 -5.609375 2.84375 -5.53125 2.546875 -5.390625 C 2.265625 -5.234375 2 -5.03125 1.765625 -4.78125 L 1.765625 -8.03125 L 0.796875 -8.03125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-11">
<path style="stroke:none;" d="M 1.015625 0 L 1.984375 0 L 1.984375 -4.71875 L 3.390625 -4.71875 L 3.390625 -5.421875 L 1.953125 -5.421875 L 1.953125 -5.703125 C 1.953125 -6.1875 2.078125 -6.578125 2.34375 -6.84375 C 2.59375 -7.109375 2.953125 -7.25 3.4375 -7.25 C 3.578125 -7.25 3.75 -7.25 3.953125 -7.234375 C 4.140625 -7.21875 4.34375 -7.21875 4.53125 -7.203125 L 4.53125 0 L 5.5 0 L 5.5 -7.890625 L 4.96875 -7.890625 C 4.703125 -7.890625 4.421875 -7.90625 4.15625 -7.921875 C 3.875 -7.953125 3.578125 -7.96875 3.28125 -7.96875 C 2.90625 -7.96875 2.578125 -7.90625 2.296875 -7.78125 C 2 -7.65625 1.765625 -7.5 1.578125 -7.296875 C 1.390625 -7.09375 1.25 -6.859375 1.15625 -6.578125 C 1.0625 -6.296875 1.015625 -6.015625 1.015625 -5.703125 L 1.015625 -5.421875 L 0.140625 -5.421875 L 0.140625 -5.015625 C 0.140625 -4.953125 0.15625 -4.890625 0.21875 -4.859375 C 0.265625 -4.8125 0.328125 -4.78125 0.40625 -4.765625 L 1.015625 -4.6875 Z M 1.015625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-12">
<path style="stroke:none;" d="M 1.875 -5.53125 L 0.90625 -5.53125 L 0.90625 0 L 1.875 0 Z M 2.09375 -7.265625 C 2.09375 -7.34375 2.078125 -7.4375 2.046875 -7.53125 C 2 -7.609375 1.953125 -7.6875 1.890625 -7.75 C 1.828125 -7.8125 1.75 -7.859375 1.65625 -7.90625 C 1.578125 -7.9375 1.484375 -7.953125 1.390625 -7.953125 C 1.296875 -7.953125 1.203125 -7.9375 1.140625 -7.90625 C 1.046875 -7.859375 0.96875 -7.8125 0.921875 -7.75 C 0.84375 -7.6875 0.796875 -7.609375 0.765625 -7.53125 C 0.71875 -7.4375 0.703125 -7.34375 0.703125 -7.265625 C 0.703125 -7.171875 0.71875 -7.078125 0.765625 -6.984375 C 0.796875 -6.921875 0.84375 -6.84375 0.921875 -6.765625 C 0.96875 -6.71875 1.046875 -6.65625 1.140625 -6.625 C 1.203125 -6.59375 1.296875 -6.578125 1.390625 -6.578125 C 1.484375 -6.578125 1.578125 -6.59375 1.65625 -6.625 C 1.75 -6.65625 1.828125 -6.71875 1.890625 -6.765625 C 1.953125 -6.84375 2 -6.921875 2.046875 -6.984375 C 2.078125 -7.078125 2.09375 -7.171875 2.09375 -7.265625 Z M 2.09375 -7.265625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-13">
<path style="stroke:none;" d="M 2.65625 -5.609375 C 2.34375 -5.609375 2.078125 -5.578125 1.8125 -5.484375 C 1.5625 -5.40625 1.34375 -5.296875 1.15625 -5.140625 C 0.96875 -4.984375 0.8125 -4.796875 0.71875 -4.5625 C 0.609375 -4.359375 0.5625 -4.109375 0.5625 -3.84375 C 0.5625 -3.5 0.640625 -3.203125 0.796875 -2.953125 C 0.953125 -2.703125 1.15625 -2.5 1.4375 -2.34375 C 1.3125 -2.28125 1.21875 -2.21875 1.125 -2.140625 C 1.046875 -2.0625 0.96875 -1.984375 0.90625 -1.90625 C 0.84375 -1.828125 0.796875 -1.734375 0.78125 -1.640625 C 0.75 -1.5625 0.734375 -1.484375 0.734375 -1.40625 C 0.734375 -1.203125 0.78125 -1.03125 0.875 -0.921875 C 0.953125 -0.796875 1.078125 -0.6875 1.25 -0.625 C 0.9375 -0.5 0.703125 -0.359375 0.53125 -0.15625 C 0.359375 0.015625 0.265625 0.25 0.265625 0.53125 C 0.265625 0.71875 0.328125 0.90625 0.421875 1.078125 C 0.53125 1.265625 0.671875 1.40625 0.875 1.546875 C 1.078125 1.6875 1.328125 1.78125 1.625 1.875 C 1.9375 1.953125 2.28125 1.984375 2.6875 1.984375 C 3.09375 1.984375 3.453125 1.9375 3.78125 1.828125 C 4.09375 1.734375 4.359375 1.59375 4.59375 1.421875 C 4.8125 1.25 4.984375 1.046875 5.09375 0.828125 C 5.21875 0.609375 5.265625 0.375 5.265625 0.140625 C 5.265625 -0.109375 5.21875 -0.328125 5.109375 -0.484375 C 5.015625 -0.640625 4.875 -0.765625 4.6875 -0.859375 C 4.515625 -0.953125 4.328125 -1.015625 4.09375 -1.046875 C 3.875 -1.09375 3.65625 -1.125 3.421875 -1.140625 C 3.1875 -1.15625 2.96875 -1.171875 2.75 -1.171875 C 2.515625 -1.171875 2.328125 -1.203125 2.15625 -1.234375 C 1.96875 -1.25 1.828125 -1.296875 1.734375 -1.375 C 1.625 -1.4375 1.578125 -1.53125 1.578125 -1.671875 C 1.578125 -1.75 1.609375 -1.828125 1.65625 -1.90625 C 1.71875 -2 1.8125 -2.078125 1.921875 -2.15625 C 2.15625 -2.09375 2.40625 -2.0625 2.65625 -2.0625 C 2.953125 -2.0625 3.234375 -2.09375 3.484375 -2.1875 C 3.734375 -2.265625 3.953125 -2.390625 4.140625 -2.546875 C 4.328125 -2.703125 4.46875 -2.890625 4.5625 -3.109375 C 4.671875 -3.328125 4.734375 -3.578125 4.734375 -3.84375 C 4.734375 -4.125 4.671875 -4.390625 4.546875 -4.625 L 5.171875 -4.71875 C 5.328125 -4.75 5.40625 -4.828125 5.40625 -4.953125 L 5.40625 -5.3125 L 3.90625 -5.3125 C 3.734375 -5.40625 3.546875 -5.484375 3.328125 -5.546875 C 3.125 -5.59375 2.890625 -5.609375 2.65625 -5.609375 Z M 4.375 0.296875 C 4.375 0.453125 4.34375 0.578125 4.265625 0.703125 C 4.1875 0.8125 4.078125 0.921875 3.9375 1.015625 C 3.796875 1.09375 3.609375 1.15625 3.40625 1.203125 C 3.203125 1.265625 2.96875 1.28125 2.703125 1.28125 C 2.4375 1.28125 2.203125 1.265625 2 1.203125 C 1.8125 1.171875 1.640625 1.109375 1.515625 1.03125 C 1.375 0.953125 1.28125 0.859375 1.21875 0.75 C 1.15625 0.640625 1.125 0.53125 1.125 0.40625 C 1.125 0.203125 1.1875 0.03125 1.3125 -0.109375 C 1.4375 -0.25 1.609375 -0.359375 1.828125 -0.46875 C 2 -0.4375 2.1875 -0.421875 2.390625 -0.40625 C 2.578125 -0.390625 2.765625 -0.375 2.96875 -0.375 C 3.15625 -0.359375 3.328125 -0.34375 3.5 -0.328125 C 3.671875 -0.3125 3.828125 -0.265625 3.953125 -0.234375 C 4.078125 -0.1875 4.1875 -0.109375 4.265625 -0.03125 C 4.34375 0.046875 4.375 0.15625 4.375 0.296875 Z M 2.65625 -2.703125 C 2.46875 -2.703125 2.296875 -2.71875 2.140625 -2.78125 C 2 -2.828125 1.875 -2.90625 1.765625 -3.015625 C 1.65625 -3.109375 1.59375 -3.234375 1.53125 -3.359375 C 1.484375 -3.5 1.453125 -3.640625 1.453125 -3.8125 C 1.453125 -4.15625 1.5625 -4.421875 1.765625 -4.625 C 1.96875 -4.828125 2.265625 -4.921875 2.65625 -4.921875 C 3.046875 -4.921875 3.34375 -4.828125 3.5625 -4.625 C 3.75 -4.421875 3.859375 -4.15625 3.859375 -3.8125 C 3.859375 -3.640625 3.828125 -3.5 3.78125 -3.359375 C 3.734375 -3.234375 3.65625 -3.109375 3.5625 -3.015625 C 3.453125 -2.90625 3.328125 -2.828125 3.171875 -2.78125 C 3.03125 -2.71875 2.859375 -2.703125 2.65625 -2.703125 Z M 2.65625 -2.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-14">
<path style="stroke:none;" d="M 0.828125 0 L 1.453125 0 C 1.59375 0 1.671875 -0.078125 1.703125 -0.203125 L 1.75 -0.703125 C 1.9375 -0.46875 2.15625 -0.265625 2.40625 -0.125 C 2.65625 0 2.96875 0.078125 3.3125 0.078125 C 3.6875 0.078125 4.015625 0 4.3125 -0.140625 C 4.609375 -0.296875 4.859375 -0.484375 5.078125 -0.75 C 5.265625 -1 5.4375 -1.3125 5.546875 -1.65625 C 5.65625 -2.015625 5.703125 -2.390625 5.703125 -2.796875 C 5.703125 -3.25 5.65625 -3.65625 5.5625 -4.015625 C 5.453125 -4.359375 5.3125 -4.65625 5.140625 -4.890625 C 4.953125 -5.125 4.734375 -5.3125 4.484375 -5.4375 C 4.21875 -5.546875 3.9375 -5.609375 3.609375 -5.609375 C 3.234375 -5.609375 2.890625 -5.53125 2.59375 -5.359375 C 2.296875 -5.203125 2.03125 -5 1.8125 -4.734375 L 1.8125 -8.03125 L 0.828125 -8.03125 Z M 3.296875 -4.84375 C 3.515625 -4.84375 3.71875 -4.796875 3.890625 -4.71875 C 4.0625 -4.640625 4.203125 -4.53125 4.328125 -4.359375 C 4.453125 -4.1875 4.546875 -3.984375 4.609375 -3.71875 C 4.671875 -3.46875 4.703125 -3.15625 4.703125 -2.796875 C 4.703125 -2.109375 4.5625 -1.59375 4.28125 -1.234375 C 4.015625 -0.859375 3.609375 -0.671875 3.09375 -0.671875 C 2.828125 -0.671875 2.59375 -0.71875 2.390625 -0.828125 C 2.171875 -0.921875 1.984375 -1.09375 1.8125 -1.328125 L 1.8125 -4 C 2 -4.265625 2.21875 -4.46875 2.46875 -4.625 C 2.703125 -4.765625 2.984375 -4.84375 3.296875 -4.84375 Z M 3.296875 -4.84375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-15">
<path style="stroke:none;" d="M 1.8125 -8.03125 L 0.828125 -8.03125 L 0.828125 0 L 1.8125 0 L 1.8125 -2.640625 L 2.078125 -2.640625 C 2.1875 -2.640625 2.265625 -2.625 2.328125 -2.609375 C 2.375 -2.578125 2.4375 -2.53125 2.484375 -2.453125 L 4.296875 -0.1875 C 4.359375 -0.125 4.40625 -0.078125 4.453125 -0.046875 C 4.515625 -0.015625 4.59375 0 4.671875 0 L 5.546875 0 L 3.375 -2.71875 C 3.328125 -2.796875 3.28125 -2.859375 3.234375 -2.921875 C 3.171875 -2.984375 3.125 -3.03125 3.046875 -3.0625 C 3.109375 -3.109375 3.171875 -3.140625 3.21875 -3.203125 C 3.265625 -3.25 3.328125 -3.296875 3.375 -3.359375 L 5.40625 -5.53125 L 4.515625 -5.53125 C 4.421875 -5.53125 4.359375 -5.5 4.296875 -5.46875 C 4.25 -5.4375 4.1875 -5.390625 4.140625 -5.328125 L 2.390625 -3.453125 C 2.328125 -3.390625 2.28125 -3.359375 2.234375 -3.34375 C 2.1875 -3.3125 2.125 -3.296875 2.0625 -3.296875 L 1.8125 -3.296875 Z M 1.8125 -8.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-16">
<path style="stroke:none;" d="M 4.6875 0 L 5.265625 0 L 5.265625 -8.03125 L 4.296875 -8.03125 L 4.296875 -4.96875 C 4.09375 -5.171875 3.890625 -5.328125 3.640625 -5.453125 C 3.40625 -5.5625 3.125 -5.625 2.78125 -5.625 C 2.40625 -5.625 2.078125 -5.546875 1.78125 -5.40625 C 1.484375 -5.25 1.234375 -5.046875 1.03125 -4.796875 C 0.828125 -4.53125 0.671875 -4.234375 0.5625 -3.875 C 0.453125 -3.53125 0.390625 -3.15625 0.390625 -2.75 C 0.390625 -2.28125 0.4375 -1.875 0.546875 -1.53125 C 0.640625 -1.171875 0.78125 -0.875 0.953125 -0.640625 C 1.140625 -0.40625 1.359375 -0.234375 1.625 -0.109375 C 1.875 0.015625 2.171875 0.078125 2.484375 0.078125 C 2.875 0.078125 3.21875 -0.015625 3.515625 -0.1875 C 3.828125 -0.359375 4.09375 -0.578125 4.328125 -0.875 L 4.421875 -0.203125 C 4.453125 -0.0625 4.546875 0 4.6875 0 Z M 2.796875 -0.703125 C 2.578125 -0.703125 2.375 -0.75 2.203125 -0.828125 C 2.03125 -0.90625 1.875 -1.015625 1.765625 -1.1875 C 1.640625 -1.359375 1.546875 -1.5625 1.484375 -1.828125 C 1.421875 -2.078125 1.390625 -2.390625 1.390625 -2.75 C 1.390625 -3.421875 1.53125 -3.953125 1.8125 -4.3125 C 2.09375 -4.671875 2.484375 -4.859375 3 -4.859375 C 3.25 -4.859375 3.484375 -4.8125 3.703125 -4.71875 C 3.921875 -4.625 4.109375 -4.453125 4.296875 -4.21875 L 4.296875 -1.546875 C 4.09375 -1.28125 3.875 -1.078125 3.625 -0.921875 C 3.390625 -0.78125 3.125 -0.703125 2.796875 -0.703125 Z M 2.796875 -0.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-17">
<path style="stroke:none;" d="M 2.421875 1.625 L 5.5 -5.53125 L 4.71875 -5.53125 C 4.65625 -5.53125 4.609375 -5.5 4.546875 -5.46875 C 4.5 -5.4375 4.453125 -5.375 4.4375 -5.328125 L 3 -1.84375 C 2.96875 -1.765625 2.9375 -1.6875 2.921875 -1.609375 C 2.890625 -1.515625 2.875 -1.4375 2.84375 -1.359375 C 2.828125 -1.4375 2.796875 -1.515625 2.78125 -1.609375 C 2.75 -1.6875 2.71875 -1.765625 2.6875 -1.84375 L 1.21875 -5.328125 C 1.1875 -5.375 1.15625 -5.421875 1.109375 -5.46875 C 1.0625 -5.5 1 -5.53125 0.921875 -5.53125 L 0.078125 -5.53125 L 2.359375 -0.328125 L 1.34375 1.875 L 2.0625 1.875 C 2.171875 1.875 2.25 1.84375 2.296875 1.8125 C 2.34375 1.765625 2.390625 1.703125 2.421875 1.625 Z M 2.421875 1.625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-18">
<path style="stroke:none;" d="M 3.953125 -4.609375 L 4.171875 -4.96875 C 3.96875 -5.171875 3.71875 -5.328125 3.421875 -5.4375 C 3.140625 -5.546875 2.8125 -5.609375 2.453125 -5.609375 C 2.140625 -5.609375 1.859375 -5.5625 1.609375 -5.484375 C 1.375 -5.390625 1.171875 -5.28125 1 -5.125 C 0.828125 -4.984375 0.703125 -4.8125 0.609375 -4.609375 C 0.53125 -4.421875 0.484375 -4.21875 0.484375 -4.015625 C 0.484375 -3.78125 0.53125 -3.578125 0.609375 -3.40625 C 0.6875 -3.234375 0.796875 -3.109375 0.9375 -2.984375 C 1.0625 -2.875 1.21875 -2.78125 1.390625 -2.703125 C 1.5625 -2.640625 1.75 -2.5625 1.921875 -2.515625 C 2.109375 -2.453125 2.28125 -2.390625 2.453125 -2.34375 C 2.625 -2.296875 2.78125 -2.21875 2.90625 -2.15625 C 3.046875 -2.078125 3.15625 -2 3.234375 -1.890625 C 3.3125 -1.796875 3.359375 -1.671875 3.359375 -1.515625 C 3.359375 -1.390625 3.34375 -1.28125 3.296875 -1.171875 C 3.25 -1.0625 3.171875 -0.96875 3.078125 -0.890625 C 2.984375 -0.796875 2.875 -0.734375 2.71875 -0.6875 C 2.578125 -0.625 2.421875 -0.609375 2.234375 -0.609375 C 2 -0.609375 1.828125 -0.640625 1.671875 -0.6875 C 1.53125 -0.734375 1.40625 -0.796875 1.296875 -0.859375 C 1.203125 -0.921875 1.109375 -0.96875 1.03125 -1.03125 C 0.96875 -1.078125 0.890625 -1.09375 0.828125 -1.09375 C 0.765625 -1.09375 0.703125 -1.09375 0.671875 -1.0625 C 0.625 -1.03125 0.59375 -1 0.5625 -0.953125 L 0.34375 -0.578125 C 0.5625 -0.390625 0.828125 -0.234375 1.140625 -0.09375 C 1.4375 0.015625 1.796875 0.09375 2.1875 0.09375 C 2.515625 0.09375 2.8125 0.046875 3.078125 -0.046875 C 3.328125 -0.140625 3.546875 -0.265625 3.734375 -0.421875 C 3.90625 -0.578125 4.046875 -0.765625 4.140625 -0.984375 C 4.21875 -1.203125 4.265625 -1.4375 4.265625 -1.6875 C 4.265625 -1.90625 4.234375 -2.109375 4.140625 -2.25 C 4.0625 -2.421875 3.953125 -2.546875 3.828125 -2.65625 C 3.6875 -2.765625 3.53125 -2.859375 3.359375 -2.9375 C 3.203125 -3 3.015625 -3.078125 2.828125 -3.125 C 2.65625 -3.203125 2.484375 -3.25 2.3125 -3.296875 C 2.140625 -3.359375 1.984375 -3.40625 1.859375 -3.484375 C 1.71875 -3.5625 1.609375 -3.640625 1.53125 -3.734375 C 1.453125 -3.828125 1.40625 -3.9375 1.40625 -4.078125 C 1.40625 -4.203125 1.421875 -4.296875 1.484375 -4.390625 C 1.53125 -4.5 1.609375 -4.578125 1.6875 -4.65625 C 1.78125 -4.71875 1.890625 -4.78125 2.03125 -4.828125 C 2.15625 -4.859375 2.3125 -4.890625 2.46875 -4.890625 C 2.65625 -4.890625 2.828125 -4.859375 2.96875 -4.828125 C 3.09375 -4.78125 3.21875 -4.734375 3.3125 -4.6875 C 3.421875 -4.640625 3.5 -4.59375 3.578125 -4.546875 C 3.640625 -4.515625 3.703125 -4.5 3.75 -4.5 C 3.84375 -4.5 3.921875 -4.53125 3.953125 -4.609375 Z M 3.953125 -4.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-19">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -3.515625 C 1.921875 -3.890625 2.109375 -4.171875 2.328125 -4.375 C 2.5625 -4.5625 2.84375 -4.671875 3.1875 -4.671875 C 3.375 -4.671875 3.515625 -4.65625 3.625 -4.609375 C 3.734375 -4.578125 3.8125 -4.5625 3.859375 -4.5625 C 3.953125 -4.5625 4 -4.609375 4.03125 -4.703125 L 4.15625 -5.421875 C 4.046875 -5.484375 3.9375 -5.53125 3.8125 -5.578125 C 3.6875 -5.609375 3.546875 -5.625 3.390625 -5.625 C 3.015625 -5.625 2.6875 -5.515625 2.421875 -5.296875 C 2.140625 -5.078125 1.90625 -4.78125 1.71875 -4.390625 L 1.65625 -5.25 C 1.640625 -5.359375 1.609375 -5.421875 1.578125 -5.46875 C 1.53125 -5.5 1.453125 -5.53125 1.359375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
</g>
</defs>
<g id="surface1">
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="0.131" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-2" x="11.182" y="71.422"/>
<use xlink:href="#glyph0-3" x="19.538371" y="71.422"/>
<use xlink:href="#glyph0-4" x="25.069284" y="71.422"/>
<use xlink:href="#glyph0-5" x="31.134744" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="42.905" y="71.422"/>
<use xlink:href="#glyph0-6" x="46.974094" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-7" x="60.741" y="71.422"/>
<use xlink:href="#glyph0-3" x="65.83555" y="71.422"/>
<use xlink:href="#glyph0-4" x="71.366463" y="71.422"/>
<use xlink:href="#glyph0-7" x="77.431923" y="71.422"/>
<use xlink:href="#glyph0-8" x="82.526473" y="71.422"/>
<use xlink:href="#glyph0-9" x="88.242841" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="98.738" y="71.422"/>
<use xlink:href="#glyph0-10" x="102.807094" y="71.422"/>
<use xlink:href="#glyph0-8" x="108.872554" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-11" x="122.29" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-12" x="128.77" y="71.422"/>
<use xlink:href="#glyph0-13" x="131.56273" y="71.422"/>
<use xlink:href="#glyph0-10" x="137.13728" y="71.422"/>
<use xlink:href="#glyph0-5" x="143.202739" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="154.974" y="71.422"/>
<use xlink:href="#glyph0-10" x="159.043094" y="71.422"/>
<use xlink:href="#glyph0-3" x="165.108554" y="71.422"/>
<use xlink:href="#glyph0-5" x="170.639468" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="182.41" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-14" x="193.461" y="71.422"/>
<use xlink:href="#glyph0-6" x="199.559187" y="71.422"/>
<use xlink:href="#glyph0-6" x="205.624646" y="71.422"/>
<use xlink:href="#glyph0-15" x="211.690106" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-8" x="217.079201" y="71.422"/>
<use xlink:href="#glyph0-16" x="222.79557" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-17" x="236.595" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-8" x="242.038641" y="71.422"/>
<use xlink:href="#glyph0-18" x="247.755009" y="71.422"/>
<use xlink:href="#glyph0-5" x="252.489559" y="71.422"/>
<use xlink:href="#glyph0-8" x="256.558653" y="71.422"/>
<use xlink:href="#glyph0-19" x="262.275021" y="71.422"/>
<use xlink:href="#glyph0-16" x="266.671389" y="71.422"/>
<use xlink:href="#glyph0-3" x="272.769576" y="71.422"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-17" x="278.125944" y="71.422"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -118.729594 56.362625 L -118.729594 10.37825 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 23.191406 60.183594 L 25.261719 56.039062 L 23.191406 57.59375 L 21.117188 56.039062 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -122.713969 7.788406 L -125.120219 19.120437 C -125.440531 20.643875 -126.963969 21.882156 -128.522562 21.882156 L -134.311625 21.882156 C -135.866312 21.882156 -137.38975 20.643875 -137.713969 19.120437 L -139.581156 10.323562 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 1.804688 60.183594 L 4.691406 56.558594 L 2.339844 57.648438 L 0.636719 55.695312 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -111.756937 7.788406 L -109.362406 30.362625 C -109.034281 33.460281 -106.245219 35.972 -103.131937 35.972 L -74.659281 35.972 C -71.546 35.972 -68.756937 33.460281 -68.428812 30.362625 L -66.307719 10.366531 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 75.886719 60.183594 L 77.511719 55.839844 L 75.613281 57.605469 L 73.386719 56.277344 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -70.018656 7.788406 L -72.421 19.120437 C -72.745219 20.643875 -74.268656 21.882156 -75.82725 21.882156 L -88.143656 21.882156 C -89.698344 21.882156 -91.221781 20.643875 -91.546 19.120437 L -93.413187 10.323562 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 47.972656 60.183594 L 50.859375 56.558594 L 48.507812 57.648438 L 46.804688 55.695312 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -62.049906 7.788406 L -59.655375 30.362625 C -59.32725 33.460281 -56.534281 35.972 -53.424906 35.972 L -15.76475 35.972 C -12.651469 35.972 -9.862406 33.460281 -9.534281 30.362625 L -7.413187 10.366531 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 134.78125 60.183594 L 136.40625 55.839844 L 134.507812 57.605469 L 132.28125 56.277344 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -11.124125 7.788406 L -13.530375 19.120437 C -13.850687 20.643875 -15.374125 21.882156 -16.932719 21.882156 L -29.45225 21.882156 C -31.006937 21.882156 -32.530375 20.643875 -32.854594 19.120437 L -34.721781 10.323562 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 106.664062 60.183594 L 109.550781 56.558594 L 107.199219 57.648438 L 105.496094 55.695312 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -3.155375 7.788406 L -0.760844 41.62825 C -0.432719 46.288406 3.618063 50.061844 8.289938 50.061844 L 57.813375 50.061844 C 62.481344 50.061844 66.536031 46.288406 66.864156 41.62825 L 69.075094 10.374344 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 211.179688 60.183594 L 212.953125 55.902344 L 210.996094 57.597656 L 208.820312 56.195312 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 65.270406 7.788406 L 62.875875 30.362625 C 62.54775 33.460281 59.758688 35.972 56.645406 35.972 L 31.543844 35.972 C 28.430563 35.972 25.6415 33.460281 25.313375 30.362625 L 23.192281 10.366531 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 164.839844 60.183594 L 167.339844 56.277344 L 165.113281 57.605469 L 163.214844 55.839844 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 62.282125 7.788406 L 59.879781 19.120437 C 59.555563 20.643875 58.032125 21.882156 56.477438 21.882156 L 47.969625 21.882156 C 46.414938 21.882156 44.8915 20.643875 44.567281 19.120437 L 42.700094 10.323562 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 184.085938 60.183594 L 186.972656 56.558594 L 184.621094 57.648438 L 182.917969 55.695312 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 73.243063 7.788406 L 75.645406 19.120437 C 75.969625 20.643875 77.493063 21.882156 79.04775 21.882156 L 112.426656 21.882156 C 113.981344 21.882156 115.508688 20.643875 115.829 19.120437 L 117.696188 10.323562 " transform="matrix(1,0,0,-1,141.921,67.972)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 260.15625 60.183594 L 261.324219 55.695312 L 259.617188 57.648438 L 257.265625 56.558594 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -0,0 +1,308 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="340pt" height="111pt" viewBox="0 0 340 111" version="1.1">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d="M 1.359375 -6.21875 L 1.625 -5.8125 C 1.65625 -5.71875 1.734375 -5.6875 1.828125 -5.6875 C 1.859375 -5.6875 1.90625 -5.703125 1.953125 -5.734375 C 2 -5.765625 2.078125 -5.8125 2.140625 -5.84375 C 2.21875 -5.890625 2.296875 -5.921875 2.40625 -5.953125 C 2.515625 -5.984375 2.640625 -6 2.78125 -6 C 2.984375 -6 3.15625 -5.953125 3.296875 -5.84375 C 3.421875 -5.734375 3.484375 -5.578125 3.484375 -5.40625 C 3.484375 -5.25 3.46875 -5.125 3.40625 -5.015625 C 3.34375 -4.921875 3.265625 -4.828125 3.1875 -4.734375 C 3.09375 -4.65625 3 -4.578125 2.90625 -4.5 C 2.796875 -4.4375 2.71875 -4.359375 2.625 -4.28125 C 2.546875 -4.203125 2.484375 -4.109375 2.4375 -4.03125 C 2.390625 -3.921875 2.375 -3.828125 2.390625 -3.703125 L 2.453125 -3.0625 L 3.125 -3.0625 L 3.21875 -3.625 C 3.234375 -3.71875 3.265625 -3.796875 3.328125 -3.859375 C 3.390625 -3.921875 3.46875 -3.984375 3.5625 -4.0625 C 3.640625 -4.140625 3.734375 -4.203125 3.828125 -4.28125 C 3.9375 -4.359375 4.03125 -4.453125 4.09375 -4.5625 C 4.1875 -4.671875 4.25 -4.796875 4.3125 -4.9375 C 4.359375 -5.09375 4.390625 -5.25 4.390625 -5.453125 C 4.390625 -5.65625 4.359375 -5.84375 4.28125 -6.015625 C 4.203125 -6.171875 4.09375 -6.3125 3.96875 -6.4375 C 3.828125 -6.546875 3.671875 -6.640625 3.484375 -6.703125 C 3.296875 -6.765625 3.09375 -6.796875 2.859375 -6.796875 C 2.6875 -6.796875 2.546875 -6.78125 2.40625 -6.75 C 2.25 -6.71875 2.125 -6.6875 2 -6.625 C 1.875 -6.578125 1.75 -6.515625 1.65625 -6.453125 C 1.546875 -6.375 1.453125 -6.296875 1.359375 -6.21875 Z M 2.15625 -1.59375 C 2.15625 -1.421875 2.21875 -1.28125 2.328125 -1.171875 C 2.4375 -1.046875 2.578125 -1 2.765625 -1 C 2.84375 -1 2.921875 -1.015625 2.984375 -1.03125 C 3.0625 -1.0625 3.125 -1.109375 3.171875 -1.171875 C 3.234375 -1.21875 3.265625 -1.28125 3.296875 -1.359375 C 3.328125 -1.421875 3.34375 -1.515625 3.34375 -1.59375 C 3.34375 -1.671875 3.328125 -1.75 3.296875 -1.828125 C 3.265625 -1.90625 3.234375 -1.96875 3.171875 -2.015625 C 3.125 -2.078125 3.0625 -2.125 2.984375 -2.15625 C 2.921875 -2.1875 2.84375 -2.203125 2.765625 -2.203125 C 2.578125 -2.203125 2.4375 -2.140625 2.328125 -2.015625 C 2.21875 -1.90625 2.15625 -1.765625 2.15625 -1.59375 Z M 0.25 -7.8125 L 0.25 0 L 5.5625 0 L 5.5625 -7.8125 Z M 0.515625 -0.296875 L 0.515625 -7.515625 L 5.25 -7.515625 L 5.25 -0.296875 Z M 0.515625 -0.296875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-1">
<path style="stroke:none;" d="M 2.203125 0 L 2.203125 -7.8125 L 1.140625 -7.8125 L 1.140625 0 Z M 2.203125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 4.5625 -4.546875 L 4.828125 -4.890625 C 4.59375 -5.125 4.328125 -5.296875 4.03125 -5.421875 C 3.734375 -5.546875 3.390625 -5.609375 3 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.890625 -5.40625 C 1.578125 -5.25 1.296875 -5.0625 1.078125 -4.8125 C 0.859375 -4.546875 0.6875 -4.25 0.578125 -3.90625 C 0.453125 -3.5625 0.40625 -3.171875 0.40625 -2.765625 C 0.40625 -2.3125 0.46875 -1.90625 0.59375 -1.5625 C 0.71875 -1.203125 0.890625 -0.90625 1.109375 -0.671875 C 1.328125 -0.421875 1.578125 -0.234375 1.875 -0.109375 C 2.171875 0.015625 2.5 0.078125 2.84375 0.078125 C 3.234375 0.078125 3.625 0.015625 3.984375 -0.125 C 4.34375 -0.265625 4.640625 -0.484375 4.875 -0.78125 L 4.609375 -1.125 C 4.5625 -1.1875 4.5 -1.21875 4.421875 -1.21875 C 4.359375 -1.21875 4.296875 -1.1875 4.21875 -1.140625 C 4.15625 -1.078125 4.078125 -1.015625 3.96875 -0.953125 C 3.875 -0.875 3.75 -0.8125 3.59375 -0.765625 C 3.4375 -0.703125 3.25 -0.671875 3.015625 -0.671875 C 2.765625 -0.671875 2.546875 -0.71875 2.34375 -0.8125 C 2.140625 -0.90625 1.96875 -1.046875 1.84375 -1.21875 C 1.703125 -1.390625 1.59375 -1.609375 1.515625 -1.875 C 1.4375 -2.125 1.40625 -2.4375 1.40625 -2.765625 C 1.40625 -3.09375 1.4375 -3.375 1.5 -3.625 C 1.578125 -3.890625 1.6875 -4.109375 1.828125 -4.296875 C 1.96875 -4.46875 2.140625 -4.609375 2.34375 -4.71875 C 2.546875 -4.796875 2.796875 -4.859375 3.0625 -4.859375 C 3.265625 -4.859375 3.4375 -4.828125 3.578125 -4.78125 C 3.71875 -4.734375 3.828125 -4.6875 3.9375 -4.640625 C 4.03125 -4.578125 4.109375 -4.53125 4.171875 -4.484375 C 4.234375 -4.4375 4.296875 -4.421875 4.359375 -4.421875 C 4.40625 -4.421875 4.453125 -4.421875 4.484375 -4.453125 C 4.5 -4.46875 4.53125 -4.5 4.5625 -4.546875 Z M 4.5625 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-3">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.171875 -5.609375 2.84375 -5.53125 2.546875 -5.390625 C 2.265625 -5.234375 2 -5.03125 1.765625 -4.78125 L 1.765625 -8.03125 L 0.796875 -8.03125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-4">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.109375 C 1.9375 -4.34375 2.125 -4.515625 2.328125 -4.640625 C 2.53125 -4.765625 2.765625 -4.84375 3 -4.84375 C 3.34375 -4.84375 3.59375 -4.734375 3.78125 -4.515625 C 3.953125 -4.296875 4.046875 -3.953125 4.046875 -3.515625 L 4.046875 0 L 5.015625 0 L 5.015625 -3.515625 C 5.015625 -3.734375 5.046875 -3.921875 5.109375 -4.09375 C 5.171875 -4.265625 5.265625 -4.390625 5.375 -4.5 C 5.484375 -4.609375 5.609375 -4.6875 5.75 -4.75 C 5.890625 -4.8125 6.046875 -4.84375 6.203125 -4.84375 C 6.5625 -4.84375 6.84375 -4.71875 7.03125 -4.5 C 7.21875 -4.28125 7.3125 -3.953125 7.3125 -3.515625 L 7.3125 0 L 8.28125 0 L 8.28125 -3.515625 C 8.28125 -3.84375 8.234375 -4.15625 8.15625 -4.40625 C 8.078125 -4.671875 7.953125 -4.890625 7.796875 -5.0625 C 7.640625 -5.25 7.4375 -5.375 7.21875 -5.46875 C 6.984375 -5.5625 6.734375 -5.609375 6.4375 -5.609375 C 6.265625 -5.609375 6.078125 -5.59375 5.90625 -5.546875 C 5.71875 -5.5 5.5625 -5.4375 5.40625 -5.34375 C 5.25 -5.25 5.109375 -5.125 4.984375 -4.984375 C 4.859375 -4.828125 4.75 -4.65625 4.671875 -4.453125 C 4.578125 -4.8125 4.40625 -5.09375 4.171875 -5.296875 C 3.953125 -5.5 3.640625 -5.609375 3.265625 -5.609375 C 2.9375 -5.609375 2.640625 -5.53125 2.390625 -5.375 C 2.140625 -5.21875 1.90625 -5 1.703125 -4.75 L 1.640625 -5.328125 C 1.59375 -5.453125 1.515625 -5.53125 1.375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-5">
<path style="stroke:none;" d="M 1.296875 -7.03125 C 1.296875 -7.109375 1.28125 -7.1875 1.25 -7.265625 C 1.21875 -7.34375 1.171875 -7.40625 1.125 -7.46875 C 1.0625 -7.53125 1 -7.5625 0.921875 -7.609375 C 0.84375 -7.640625 0.765625 -7.65625 0.6875 -7.65625 C 0.59375 -7.65625 0.53125 -7.640625 0.453125 -7.609375 C 0.375 -7.5625 0.3125 -7.53125 0.265625 -7.46875 C 0.203125 -7.40625 0.15625 -7.34375 0.125 -7.265625 C 0.09375 -7.1875 0.078125 -7.109375 0.078125 -7.03125 C 0.078125 -6.953125 0.09375 -6.859375 0.125 -6.796875 C 0.15625 -6.71875 0.203125 -6.65625 0.265625 -6.609375 C 0.3125 -6.546875 0.375 -6.5 0.453125 -6.46875 C 0.53125 -6.4375 0.59375 -6.421875 0.6875 -6.421875 C 0.765625 -6.421875 0.84375 -6.4375 0.921875 -6.46875 C 1 -6.5 1.0625 -6.546875 1.125 -6.609375 C 1.171875 -6.65625 1.21875 -6.71875 1.25 -6.796875 C 1.28125 -6.859375 1.296875 -6.953125 1.296875 -7.03125 Z M 3.265625 -7.03125 C 3.265625 -7.109375 3.25 -7.1875 3.21875 -7.265625 C 3.171875 -7.34375 3.140625 -7.40625 3.078125 -7.46875 C 3.015625 -7.53125 2.953125 -7.5625 2.875 -7.609375 C 2.8125 -7.640625 2.71875 -7.65625 2.640625 -7.65625 C 2.5625 -7.65625 2.484375 -7.640625 2.40625 -7.609375 C 2.328125 -7.5625 2.265625 -7.53125 2.21875 -7.46875 C 2.15625 -7.40625 2.109375 -7.34375 2.078125 -7.265625 C 2.046875 -7.1875 2.03125 -7.109375 2.03125 -7.03125 C 2.03125 -6.953125 2.046875 -6.859375 2.078125 -6.796875 C 2.109375 -6.71875 2.15625 -6.65625 2.21875 -6.609375 C 2.265625 -6.546875 2.328125 -6.5 2.40625 -6.46875 C 2.484375 -6.4375 2.5625 -6.421875 2.640625 -6.421875 C 2.71875 -6.421875 2.8125 -6.4375 2.875 -6.46875 C 2.953125 -6.5 3.015625 -6.546875 3.078125 -6.609375 C 3.140625 -6.65625 3.171875 -6.71875 3.21875 -6.796875 C 3.25 -6.859375 3.265625 -6.953125 3.265625 -7.03125 Z M 3.265625 -7.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-6">
<path style="stroke:none;" d="M 3.03125 -5.609375 C 2.625 -5.609375 2.265625 -5.546875 1.9375 -5.40625 C 1.609375 -5.265625 1.34375 -5.078125 1.109375 -4.84375 C 0.875 -4.59375 0.703125 -4.296875 0.578125 -3.9375 C 0.453125 -3.59375 0.390625 -3.203125 0.390625 -2.765625 C 0.390625 -2.328125 0.453125 -1.9375 0.578125 -1.59375 C 0.703125 -1.234375 0.875 -0.9375 1.109375 -0.6875 C 1.34375 -0.453125 1.609375 -0.25 1.9375 -0.125 C 2.265625 0.015625 2.625 0.078125 3.03125 0.078125 C 3.4375 0.078125 3.796875 0.015625 4.125 -0.125 C 4.453125 -0.25 4.734375 -0.453125 4.953125 -0.6875 C 5.1875 -0.9375 5.359375 -1.234375 5.46875 -1.59375 C 5.59375 -1.9375 5.65625 -2.328125 5.65625 -2.765625 C 5.65625 -3.203125 5.59375 -3.59375 5.46875 -3.9375 C 5.359375 -4.296875 5.1875 -4.59375 4.953125 -4.84375 C 4.734375 -5.078125 4.453125 -5.265625 4.125 -5.40625 C 3.796875 -5.546875 3.4375 -5.609375 3.03125 -5.609375 Z M 3.03125 -0.6875 C 2.75 -0.6875 2.515625 -0.734375 2.3125 -0.828125 C 2.109375 -0.921875 1.9375 -1.046875 1.796875 -1.234375 C 1.671875 -1.40625 1.5625 -1.625 1.5 -1.875 C 1.421875 -2.140625 1.390625 -2.4375 1.390625 -2.765625 C 1.390625 -3.09375 1.421875 -3.375 1.5 -3.640625 C 1.5625 -3.90625 1.671875 -4.109375 1.796875 -4.296875 C 1.9375 -4.484375 2.109375 -4.609375 2.3125 -4.703125 C 2.515625 -4.796875 2.75 -4.84375 3.03125 -4.84375 C 3.578125 -4.84375 3.984375 -4.65625 4.25 -4.296875 C 4.515625 -3.9375 4.65625 -3.421875 4.65625 -2.765625 C 4.65625 -2.109375 4.515625 -1.59375 4.25 -1.234375 C 3.984375 -0.859375 3.578125 -0.6875 3.03125 -0.6875 Z M 3.03125 -0.6875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-7">
<path style="stroke:none;" d="M 2.46875 0.09375 C 2.71875 0.09375 2.96875 0.046875 3.203125 -0.046875 C 3.4375 -0.140625 3.640625 -0.25 3.8125 -0.421875 L 3.515625 -0.875 C 3.484375 -0.9375 3.4375 -0.96875 3.390625 -0.96875 C 3.359375 -0.96875 3.328125 -0.953125 3.28125 -0.921875 C 3.25 -0.90625 3.203125 -0.875 3.140625 -0.84375 C 3.09375 -0.8125 3.03125 -0.78125 2.953125 -0.75 C 2.875 -0.71875 2.796875 -0.703125 2.6875 -0.703125 C 2.515625 -0.703125 2.359375 -0.765625 2.25 -0.875 C 2.140625 -1 2.078125 -1.15625 2.078125 -1.390625 L 2.078125 -4.71875 L 3.671875 -4.71875 L 3.671875 -5.421875 L 2.078125 -5.421875 L 2.078125 -7.3125 L 1.59375 -7.3125 C 1.53125 -7.3125 1.484375 -7.296875 1.4375 -7.265625 C 1.40625 -7.234375 1.375 -7.1875 1.375 -7.125 L 1.140625 -5.421875 L 0.234375 -5.3125 L 0.234375 -4.921875 C 0.234375 -4.859375 0.265625 -4.796875 0.296875 -4.765625 C 0.34375 -4.734375 0.390625 -4.71875 0.453125 -4.71875 L 1.109375 -4.71875 L 1.109375 -1.328125 C 1.109375 -0.875 1.234375 -0.53125 1.46875 -0.28125 C 1.703125 -0.03125 2.03125 0.09375 2.46875 0.09375 Z M 2.46875 0.09375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-8">
<path style="stroke:none;" d="M 2.984375 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.90625 -5.40625 C 1.578125 -5.265625 1.3125 -5.078125 1.09375 -4.828125 C 0.859375 -4.578125 0.703125 -4.28125 0.578125 -3.953125 C 0.46875 -3.625 0.40625 -3.265625 0.40625 -2.875 C 0.40625 -2.40625 0.46875 -1.96875 0.59375 -1.609375 C 0.734375 -1.25 0.921875 -0.9375 1.140625 -0.6875 C 1.390625 -0.4375 1.65625 -0.25 1.984375 -0.125 C 2.296875 0.015625 2.65625 0.078125 3.03125 0.078125 C 3.234375 0.078125 3.4375 0.0625 3.640625 0.015625 C 3.84375 -0.015625 4.046875 -0.0625 4.234375 -0.125 C 4.421875 -0.203125 4.609375 -0.28125 4.765625 -0.390625 C 4.9375 -0.5 5.078125 -0.625 5.203125 -0.78125 L 4.921875 -1.125 C 4.890625 -1.1875 4.828125 -1.21875 4.75 -1.21875 C 4.6875 -1.21875 4.609375 -1.1875 4.53125 -1.140625 C 4.4375 -1.078125 4.328125 -1.015625 4.203125 -0.953125 C 4.078125 -0.890625 3.921875 -0.828125 3.75 -0.78125 C 3.578125 -0.71875 3.359375 -0.6875 3.125 -0.6875 C 2.859375 -0.6875 2.625 -0.734375 2.40625 -0.8125 C 2.203125 -0.90625 2.015625 -1.03125 1.859375 -1.203125 C 1.71875 -1.375 1.59375 -1.59375 1.5 -1.84375 C 1.421875 -2.109375 1.375 -2.40625 1.359375 -2.765625 L 5.03125 -2.765625 C 5.125 -2.765625 5.1875 -2.78125 5.21875 -2.828125 C 5.25 -2.890625 5.265625 -2.984375 5.265625 -3.140625 C 5.265625 -3.53125 5.21875 -3.875 5.109375 -4.1875 C 4.984375 -4.5 4.828125 -4.75 4.625 -4.96875 C 4.421875 -5.171875 4.171875 -5.328125 3.90625 -5.4375 C 3.625 -5.5625 3.3125 -5.609375 2.984375 -5.609375 Z M 3 -4.890625 C 3.234375 -4.890625 3.421875 -4.859375 3.59375 -4.78125 C 3.765625 -4.71875 3.921875 -4.609375 4.03125 -4.46875 C 4.15625 -4.328125 4.25 -4.171875 4.3125 -3.984375 C 4.375 -3.796875 4.40625 -3.59375 4.40625 -3.359375 L 1.390625 -3.359375 C 1.46875 -3.84375 1.625 -4.21875 1.890625 -4.5 C 2.171875 -4.765625 2.53125 -4.890625 3 -4.890625 Z M 3 -4.890625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-9">
<path style="stroke:none;" d="M 4.6875 0 L 5.265625 0 L 5.265625 -8.03125 L 4.296875 -8.03125 L 4.296875 -4.96875 C 4.09375 -5.171875 3.890625 -5.328125 3.640625 -5.453125 C 3.40625 -5.5625 3.125 -5.625 2.78125 -5.625 C 2.40625 -5.625 2.078125 -5.546875 1.78125 -5.40625 C 1.484375 -5.25 1.234375 -5.046875 1.03125 -4.796875 C 0.828125 -4.53125 0.671875 -4.234375 0.5625 -3.875 C 0.453125 -3.53125 0.390625 -3.15625 0.390625 -2.75 C 0.390625 -2.28125 0.4375 -1.875 0.546875 -1.53125 C 0.640625 -1.171875 0.78125 -0.875 0.953125 -0.640625 C 1.140625 -0.40625 1.359375 -0.234375 1.625 -0.109375 C 1.875 0.015625 2.171875 0.078125 2.484375 0.078125 C 2.875 0.078125 3.21875 -0.015625 3.515625 -0.1875 C 3.828125 -0.359375 4.09375 -0.578125 4.328125 -0.875 L 4.421875 -0.203125 C 4.453125 -0.0625 4.546875 0 4.6875 0 Z M 2.796875 -0.703125 C 2.578125 -0.703125 2.375 -0.75 2.203125 -0.828125 C 2.03125 -0.90625 1.875 -1.015625 1.765625 -1.1875 C 1.640625 -1.359375 1.546875 -1.5625 1.484375 -1.828125 C 1.421875 -2.078125 1.390625 -2.390625 1.390625 -2.75 C 1.390625 -3.421875 1.53125 -3.953125 1.8125 -4.3125 C 2.09375 -4.671875 2.484375 -4.859375 3 -4.859375 C 3.25 -4.859375 3.484375 -4.8125 3.703125 -4.71875 C 3.921875 -4.625 4.109375 -4.453125 4.296875 -4.21875 L 4.296875 -1.546875 C 4.09375 -1.28125 3.875 -1.078125 3.625 -0.921875 C 3.390625 -0.78125 3.125 -0.703125 2.796875 -0.703125 Z M 2.796875 -0.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-10">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.15625 -5.609375 2.8125 -5.53125 2.515625 -5.359375 C 2.21875 -5.203125 1.953125 -4.984375 1.71875 -4.71875 L 1.640625 -5.328125 C 1.59375 -5.453125 1.515625 -5.53125 1.375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-11">
<path style="stroke:none;" d="M 5.765625 -7.8125 L 0.953125 -7.8125 L 0.953125 0 L 2.015625 0 L 2.015625 -3.359375 L 5.21875 -3.359375 L 5.21875 -4.21875 L 2.015625 -4.21875 L 2.015625 -6.953125 L 5.765625 -6.953125 Z M 5.765625 -7.8125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-12">
<path style="stroke:none;" d="M 1.875 -8.03125 L 0.90625 -8.03125 L 0.90625 0 L 1.875 0 Z M 1.875 -8.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-13">
<path style="stroke:none;" d="M 1.640625 -5.53125 L 0.671875 -5.53125 L 0.671875 -2 C 0.671875 -1.6875 0.703125 -1.40625 0.78125 -1.140625 C 0.859375 -0.890625 0.96875 -0.671875 1.140625 -0.484375 C 1.296875 -0.3125 1.484375 -0.15625 1.71875 -0.0625 C 1.953125 0.03125 2.21875 0.09375 2.515625 0.09375 C 2.90625 0.09375 3.234375 0 3.546875 -0.15625 C 3.84375 -0.3125 4.109375 -0.53125 4.34375 -0.796875 L 4.421875 -0.203125 C 4.453125 -0.0625 4.546875 0 4.6875 0 L 5.265625 0 L 5.265625 -5.53125 L 4.296875 -5.53125 L 4.296875 -1.453125 C 4.078125 -1.203125 3.84375 -1.03125 3.59375 -0.890625 C 3.34375 -0.75 3.078125 -0.6875 2.796875 -0.6875 C 2.40625 -0.6875 2.109375 -0.796875 1.921875 -1.03125 C 1.734375 -1.265625 1.640625 -1.578125 1.640625 -2 Z M 1.640625 -5.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-14">
<path style="stroke:none;" d="M 2.65625 -5.609375 C 2.34375 -5.609375 2.078125 -5.578125 1.8125 -5.484375 C 1.5625 -5.40625 1.34375 -5.296875 1.15625 -5.140625 C 0.96875 -4.984375 0.8125 -4.796875 0.71875 -4.5625 C 0.609375 -4.359375 0.5625 -4.109375 0.5625 -3.84375 C 0.5625 -3.5 0.640625 -3.203125 0.796875 -2.953125 C 0.953125 -2.703125 1.15625 -2.5 1.4375 -2.34375 C 1.3125 -2.28125 1.21875 -2.21875 1.125 -2.140625 C 1.046875 -2.0625 0.96875 -1.984375 0.90625 -1.90625 C 0.84375 -1.828125 0.796875 -1.734375 0.78125 -1.640625 C 0.75 -1.5625 0.734375 -1.484375 0.734375 -1.40625 C 0.734375 -1.203125 0.78125 -1.03125 0.875 -0.921875 C 0.953125 -0.796875 1.078125 -0.6875 1.25 -0.625 C 0.9375 -0.5 0.703125 -0.359375 0.53125 -0.15625 C 0.359375 0.015625 0.265625 0.25 0.265625 0.53125 C 0.265625 0.71875 0.328125 0.90625 0.421875 1.078125 C 0.53125 1.265625 0.671875 1.40625 0.875 1.546875 C 1.078125 1.6875 1.328125 1.78125 1.625 1.875 C 1.9375 1.953125 2.28125 1.984375 2.6875 1.984375 C 3.09375 1.984375 3.453125 1.9375 3.78125 1.828125 C 4.09375 1.734375 4.359375 1.59375 4.59375 1.421875 C 4.8125 1.25 4.984375 1.046875 5.09375 0.828125 C 5.21875 0.609375 5.265625 0.375 5.265625 0.140625 C 5.265625 -0.109375 5.21875 -0.328125 5.109375 -0.484375 C 5.015625 -0.640625 4.875 -0.765625 4.6875 -0.859375 C 4.515625 -0.953125 4.328125 -1.015625 4.09375 -1.046875 C 3.875 -1.09375 3.65625 -1.125 3.421875 -1.140625 C 3.1875 -1.15625 2.96875 -1.171875 2.75 -1.171875 C 2.515625 -1.171875 2.328125 -1.203125 2.15625 -1.234375 C 1.96875 -1.25 1.828125 -1.296875 1.734375 -1.375 C 1.625 -1.4375 1.578125 -1.53125 1.578125 -1.671875 C 1.578125 -1.75 1.609375 -1.828125 1.65625 -1.90625 C 1.71875 -2 1.8125 -2.078125 1.921875 -2.15625 C 2.15625 -2.09375 2.40625 -2.0625 2.65625 -2.0625 C 2.953125 -2.0625 3.234375 -2.09375 3.484375 -2.1875 C 3.734375 -2.265625 3.953125 -2.390625 4.140625 -2.546875 C 4.328125 -2.703125 4.46875 -2.890625 4.5625 -3.109375 C 4.671875 -3.328125 4.734375 -3.578125 4.734375 -3.84375 C 4.734375 -4.125 4.671875 -4.390625 4.546875 -4.625 L 5.171875 -4.71875 C 5.328125 -4.75 5.40625 -4.828125 5.40625 -4.953125 L 5.40625 -5.3125 L 3.90625 -5.3125 C 3.734375 -5.40625 3.546875 -5.484375 3.328125 -5.546875 C 3.125 -5.59375 2.890625 -5.609375 2.65625 -5.609375 Z M 4.375 0.296875 C 4.375 0.453125 4.34375 0.578125 4.265625 0.703125 C 4.1875 0.8125 4.078125 0.921875 3.9375 1.015625 C 3.796875 1.09375 3.609375 1.15625 3.40625 1.203125 C 3.203125 1.265625 2.96875 1.28125 2.703125 1.28125 C 2.4375 1.28125 2.203125 1.265625 2 1.203125 C 1.8125 1.171875 1.640625 1.109375 1.515625 1.03125 C 1.375 0.953125 1.28125 0.859375 1.21875 0.75 C 1.15625 0.640625 1.125 0.53125 1.125 0.40625 C 1.125 0.203125 1.1875 0.03125 1.3125 -0.109375 C 1.4375 -0.25 1.609375 -0.359375 1.828125 -0.46875 C 2 -0.4375 2.1875 -0.421875 2.390625 -0.40625 C 2.578125 -0.390625 2.765625 -0.375 2.96875 -0.375 C 3.15625 -0.359375 3.328125 -0.34375 3.5 -0.328125 C 3.671875 -0.3125 3.828125 -0.265625 3.953125 -0.234375 C 4.078125 -0.1875 4.1875 -0.109375 4.265625 -0.03125 C 4.34375 0.046875 4.375 0.15625 4.375 0.296875 Z M 2.65625 -2.703125 C 2.46875 -2.703125 2.296875 -2.71875 2.140625 -2.78125 C 2 -2.828125 1.875 -2.90625 1.765625 -3.015625 C 1.65625 -3.109375 1.59375 -3.234375 1.53125 -3.359375 C 1.484375 -3.5 1.453125 -3.640625 1.453125 -3.8125 C 1.453125 -4.15625 1.5625 -4.421875 1.765625 -4.625 C 1.96875 -4.828125 2.265625 -4.921875 2.65625 -4.921875 C 3.046875 -4.921875 3.34375 -4.828125 3.5625 -4.625 C 3.75 -4.421875 3.859375 -4.15625 3.859375 -3.8125 C 3.859375 -3.640625 3.828125 -3.5 3.78125 -3.359375 C 3.734375 -3.234375 3.65625 -3.109375 3.5625 -3.015625 C 3.453125 -2.90625 3.328125 -2.828125 3.171875 -2.78125 C 3.03125 -2.71875 2.859375 -2.703125 2.65625 -2.703125 Z M 2.65625 -2.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-15">
<path style="stroke:none;" d="M 3.953125 -4.609375 L 4.171875 -4.96875 C 3.96875 -5.171875 3.71875 -5.328125 3.421875 -5.4375 C 3.140625 -5.546875 2.8125 -5.609375 2.453125 -5.609375 C 2.140625 -5.609375 1.859375 -5.5625 1.609375 -5.484375 C 1.375 -5.390625 1.171875 -5.28125 1 -5.125 C 0.828125 -4.984375 0.703125 -4.8125 0.609375 -4.609375 C 0.53125 -4.421875 0.484375 -4.21875 0.484375 -4.015625 C 0.484375 -3.78125 0.53125 -3.578125 0.609375 -3.40625 C 0.6875 -3.234375 0.796875 -3.109375 0.9375 -2.984375 C 1.0625 -2.875 1.21875 -2.78125 1.390625 -2.703125 C 1.5625 -2.640625 1.75 -2.5625 1.921875 -2.515625 C 2.109375 -2.453125 2.28125 -2.390625 2.453125 -2.34375 C 2.625 -2.296875 2.78125 -2.21875 2.90625 -2.15625 C 3.046875 -2.078125 3.15625 -2 3.234375 -1.890625 C 3.3125 -1.796875 3.359375 -1.671875 3.359375 -1.515625 C 3.359375 -1.390625 3.34375 -1.28125 3.296875 -1.171875 C 3.25 -1.0625 3.171875 -0.96875 3.078125 -0.890625 C 2.984375 -0.796875 2.875 -0.734375 2.71875 -0.6875 C 2.578125 -0.625 2.421875 -0.609375 2.234375 -0.609375 C 2 -0.609375 1.828125 -0.640625 1.671875 -0.6875 C 1.53125 -0.734375 1.40625 -0.796875 1.296875 -0.859375 C 1.203125 -0.921875 1.109375 -0.96875 1.03125 -1.03125 C 0.96875 -1.078125 0.890625 -1.09375 0.828125 -1.09375 C 0.765625 -1.09375 0.703125 -1.09375 0.671875 -1.0625 C 0.625 -1.03125 0.59375 -1 0.5625 -0.953125 L 0.34375 -0.578125 C 0.5625 -0.390625 0.828125 -0.234375 1.140625 -0.09375 C 1.4375 0.015625 1.796875 0.09375 2.1875 0.09375 C 2.515625 0.09375 2.8125 0.046875 3.078125 -0.046875 C 3.328125 -0.140625 3.546875 -0.265625 3.734375 -0.421875 C 3.90625 -0.578125 4.046875 -0.765625 4.140625 -0.984375 C 4.21875 -1.203125 4.265625 -1.4375 4.265625 -1.6875 C 4.265625 -1.90625 4.234375 -2.109375 4.140625 -2.25 C 4.0625 -2.421875 3.953125 -2.546875 3.828125 -2.65625 C 3.6875 -2.765625 3.53125 -2.859375 3.359375 -2.9375 C 3.203125 -3 3.015625 -3.078125 2.828125 -3.125 C 2.65625 -3.203125 2.484375 -3.25 2.3125 -3.296875 C 2.140625 -3.359375 1.984375 -3.40625 1.859375 -3.484375 C 1.71875 -3.5625 1.609375 -3.640625 1.53125 -3.734375 C 1.453125 -3.828125 1.40625 -3.9375 1.40625 -4.078125 C 1.40625 -4.203125 1.421875 -4.296875 1.484375 -4.390625 C 1.53125 -4.5 1.609375 -4.578125 1.6875 -4.65625 C 1.78125 -4.71875 1.890625 -4.78125 2.03125 -4.828125 C 2.15625 -4.859375 2.3125 -4.890625 2.46875 -4.890625 C 2.65625 -4.890625 2.828125 -4.859375 2.96875 -4.828125 C 3.09375 -4.78125 3.21875 -4.734375 3.3125 -4.6875 C 3.421875 -4.640625 3.5 -4.59375 3.578125 -4.546875 C 3.640625 -4.515625 3.703125 -4.5 3.75 -4.5 C 3.84375 -4.5 3.921875 -4.53125 3.953125 -4.609375 Z M 3.953125 -4.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-16">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -3.515625 C 1.921875 -3.890625 2.109375 -4.171875 2.328125 -4.375 C 2.5625 -4.5625 2.84375 -4.671875 3.1875 -4.671875 C 3.375 -4.671875 3.515625 -4.65625 3.625 -4.609375 C 3.734375 -4.578125 3.8125 -4.5625 3.859375 -4.5625 C 3.953125 -4.5625 4 -4.609375 4.03125 -4.703125 L 4.15625 -5.421875 C 4.046875 -5.484375 3.9375 -5.53125 3.8125 -5.578125 C 3.6875 -5.609375 3.546875 -5.625 3.390625 -5.625 C 3.015625 -5.625 2.6875 -5.515625 2.421875 -5.296875 C 2.140625 -5.078125 1.90625 -4.78125 1.71875 -4.390625 L 1.65625 -5.25 C 1.640625 -5.359375 1.609375 -5.421875 1.578125 -5.46875 C 1.53125 -5.5 1.453125 -5.53125 1.359375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-17">
<path style="stroke:none;" d="M 1.875 -5.53125 L 0.90625 -5.53125 L 0.90625 0 L 1.875 0 Z M 2.09375 -7.265625 C 2.09375 -7.34375 2.078125 -7.4375 2.046875 -7.53125 C 2 -7.609375 1.953125 -7.6875 1.890625 -7.75 C 1.828125 -7.8125 1.75 -7.859375 1.65625 -7.90625 C 1.578125 -7.9375 1.484375 -7.953125 1.390625 -7.953125 C 1.296875 -7.953125 1.203125 -7.9375 1.140625 -7.90625 C 1.046875 -7.859375 0.96875 -7.8125 0.921875 -7.75 C 0.84375 -7.6875 0.796875 -7.609375 0.765625 -7.53125 C 0.71875 -7.4375 0.703125 -7.34375 0.703125 -7.265625 C 0.703125 -7.171875 0.71875 -7.078125 0.765625 -6.984375 C 0.796875 -6.921875 0.84375 -6.84375 0.921875 -6.765625 C 0.96875 -6.71875 1.046875 -6.65625 1.140625 -6.625 C 1.203125 -6.59375 1.296875 -6.578125 1.390625 -6.578125 C 1.484375 -6.578125 1.578125 -6.59375 1.65625 -6.625 C 1.75 -6.65625 1.828125 -6.71875 1.890625 -6.765625 C 1.953125 -6.84375 2 -6.921875 2.046875 -6.984375 C 2.078125 -7.078125 2.09375 -7.171875 2.09375 -7.265625 Z M 2.09375 -7.265625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-18">
<path style="stroke:none;" d="M 0.828125 0 L 1.453125 0 C 1.59375 0 1.671875 -0.078125 1.703125 -0.203125 L 1.75 -0.703125 C 1.9375 -0.46875 2.15625 -0.265625 2.40625 -0.125 C 2.65625 0 2.96875 0.078125 3.3125 0.078125 C 3.6875 0.078125 4.015625 0 4.3125 -0.140625 C 4.609375 -0.296875 4.859375 -0.484375 5.078125 -0.75 C 5.265625 -1 5.4375 -1.3125 5.546875 -1.65625 C 5.65625 -2.015625 5.703125 -2.390625 5.703125 -2.796875 C 5.703125 -3.25 5.65625 -3.65625 5.5625 -4.015625 C 5.453125 -4.359375 5.3125 -4.65625 5.140625 -4.890625 C 4.953125 -5.125 4.734375 -5.3125 4.484375 -5.4375 C 4.21875 -5.546875 3.9375 -5.609375 3.609375 -5.609375 C 3.234375 -5.609375 2.890625 -5.53125 2.59375 -5.359375 C 2.296875 -5.203125 2.03125 -5 1.8125 -4.734375 L 1.8125 -8.03125 L 0.828125 -8.03125 Z M 3.296875 -4.84375 C 3.515625 -4.84375 3.71875 -4.796875 3.890625 -4.71875 C 4.0625 -4.640625 4.203125 -4.53125 4.328125 -4.359375 C 4.453125 -4.1875 4.546875 -3.984375 4.609375 -3.71875 C 4.671875 -3.46875 4.703125 -3.15625 4.703125 -2.796875 C 4.703125 -2.109375 4.5625 -1.59375 4.28125 -1.234375 C 4.015625 -0.859375 3.609375 -0.671875 3.09375 -0.671875 C 2.828125 -0.671875 2.59375 -0.71875 2.390625 -0.828125 C 2.171875 -0.921875 1.984375 -1.09375 1.8125 -1.328125 L 1.8125 -4 C 2 -4.265625 2.21875 -4.46875 2.46875 -4.625 C 2.703125 -4.765625 2.984375 -4.84375 3.296875 -4.84375 Z M 3.296875 -4.84375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-19">
<path style="stroke:none;" d="M 4.859375 0 L 4.859375 -3.53125 C 4.859375 -3.84375 4.8125 -4.125 4.734375 -4.390625 C 4.640625 -4.640625 4.515625 -4.859375 4.359375 -5.046875 C 4.1875 -5.21875 3.984375 -5.359375 3.75 -5.46875 C 3.515625 -5.578125 3.234375 -5.625 2.921875 -5.625 C 2.5 -5.625 2.109375 -5.546875 1.75 -5.40625 C 1.40625 -5.25 1.078125 -5.03125 0.765625 -4.75 L 0.9375 -4.4375 C 0.96875 -4.390625 1.015625 -4.34375 1.0625 -4.3125 C 1.109375 -4.265625 1.171875 -4.25 1.234375 -4.25 C 1.3125 -4.25 1.40625 -4.28125 1.484375 -4.34375 C 1.578125 -4.40625 1.671875 -4.46875 1.78125 -4.546875 C 1.90625 -4.625 2.046875 -4.6875 2.21875 -4.75 C 2.375 -4.8125 2.578125 -4.84375 2.8125 -4.84375 C 3.171875 -4.84375 3.4375 -4.734375 3.625 -4.5 C 3.8125 -4.28125 3.90625 -3.96875 3.90625 -3.53125 L 3.90625 -3.109375 C 3.265625 -3.09375 2.75 -3.03125 2.3125 -2.9375 C 1.875 -2.828125 1.53125 -2.703125 1.265625 -2.546875 C 1 -2.390625 0.796875 -2.21875 0.6875 -2 C 0.5625 -1.8125 0.5 -1.59375 0.5 -1.375 C 0.5 -1.125 0.546875 -0.90625 0.625 -0.734375 C 0.703125 -0.546875 0.8125 -0.390625 0.953125 -0.265625 C 1.09375 -0.15625 1.25 -0.0625 1.4375 0 C 1.625 0.046875 1.828125 0.09375 2.046875 0.09375 C 2.25 0.09375 2.453125 0.078125 2.625 0.03125 C 2.796875 0 2.953125 -0.046875 3.109375 -0.125 C 3.265625 -0.203125 3.40625 -0.28125 3.546875 -0.390625 C 3.6875 -0.484375 3.828125 -0.609375 3.96875 -0.734375 L 4.078125 -0.234375 C 4.09375 -0.140625 4.140625 -0.078125 4.1875 -0.046875 C 4.25 -0.015625 4.328125 0 4.421875 0 Z M 2.328125 -0.59375 C 2.203125 -0.59375 2.09375 -0.609375 1.984375 -0.640625 C 1.875 -0.671875 1.78125 -0.71875 1.703125 -0.78125 C 1.609375 -0.859375 1.546875 -0.9375 1.5 -1.046875 C 1.453125 -1.15625 1.4375 -1.28125 1.4375 -1.421875 C 1.4375 -1.578125 1.484375 -1.71875 1.578125 -1.84375 C 1.65625 -1.96875 1.796875 -2.0625 2 -2.15625 C 2.1875 -2.25 2.453125 -2.328125 2.765625 -2.375 C 3.0625 -2.4375 3.453125 -2.46875 3.90625 -2.484375 L 3.90625 -1.34375 C 3.796875 -1.21875 3.671875 -1.125 3.5625 -1.03125 C 3.453125 -0.9375 3.328125 -0.859375 3.203125 -0.796875 C 3.078125 -0.734375 2.9375 -0.6875 2.796875 -0.640625 C 2.65625 -0.609375 2.5 -0.59375 2.328125 -0.59375 Z M 2.328125 -0.59375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-0">
<path style="stroke:none;" d="M 1.125 -5.109375 L 1.328125 -4.78125 C 1.375 -4.703125 1.421875 -4.671875 1.5 -4.671875 C 1.53125 -4.671875 1.5625 -4.6875 1.609375 -4.71875 C 1.65625 -4.75 1.703125 -4.78125 1.765625 -4.8125 C 1.828125 -4.84375 1.890625 -4.875 1.984375 -4.890625 C 2.0625 -4.921875 2.171875 -4.9375 2.28125 -4.9375 C 2.453125 -4.9375 2.59375 -4.890625 2.703125 -4.796875 C 2.8125 -4.71875 2.875 -4.59375 2.875 -4.4375 C 2.875 -4.3125 2.84375 -4.21875 2.796875 -4.125 C 2.75 -4.046875 2.6875 -3.96875 2.625 -3.890625 C 2.546875 -3.828125 2.46875 -3.765625 2.390625 -3.703125 C 2.3125 -3.640625 2.234375 -3.578125 2.15625 -3.515625 C 2.09375 -3.453125 2.046875 -3.375 2 -3.3125 C 1.96875 -3.234375 1.953125 -3.140625 1.96875 -3.046875 L 2.015625 -2.515625 L 2.5625 -2.515625 L 2.640625 -2.984375 C 2.65625 -3.046875 2.6875 -3.109375 2.734375 -3.171875 C 2.796875 -3.234375 2.859375 -3.28125 2.921875 -3.34375 C 3 -3.40625 3.078125 -3.453125 3.15625 -3.53125 C 3.234375 -3.59375 3.3125 -3.65625 3.375 -3.75 C 3.4375 -3.84375 3.5 -3.9375 3.546875 -4.0625 C 3.59375 -4.1875 3.609375 -4.328125 3.609375 -4.484375 C 3.609375 -4.65625 3.578125 -4.8125 3.515625 -4.9375 C 3.453125 -5.078125 3.375 -5.203125 3.265625 -5.296875 C 3.15625 -5.390625 3.015625 -5.46875 2.875 -5.515625 C 2.71875 -5.5625 2.546875 -5.59375 2.359375 -5.59375 C 2.21875 -5.59375 2.09375 -5.578125 1.96875 -5.546875 C 1.859375 -5.53125 1.75 -5.5 1.640625 -5.453125 C 1.53125 -5.40625 1.4375 -5.359375 1.359375 -5.296875 C 1.28125 -5.25 1.203125 -5.1875 1.125 -5.109375 Z M 1.78125 -1.3125 C 1.78125 -1.171875 1.828125 -1.046875 1.921875 -0.953125 C 2.015625 -0.859375 2.125 -0.8125 2.265625 -0.8125 C 2.34375 -0.8125 2.40625 -0.828125 2.453125 -0.859375 C 2.515625 -0.875 2.5625 -0.921875 2.609375 -0.953125 C 2.65625 -1 2.6875 -1.0625 2.71875 -1.109375 C 2.734375 -1.171875 2.75 -1.234375 2.75 -1.3125 C 2.75 -1.375 2.734375 -1.4375 2.71875 -1.5 C 2.6875 -1.5625 2.65625 -1.625 2.609375 -1.65625 C 2.5625 -1.703125 2.515625 -1.75 2.453125 -1.765625 C 2.40625 -1.796875 2.34375 -1.8125 2.265625 -1.8125 C 2.125 -1.8125 2.015625 -1.765625 1.921875 -1.65625 C 1.828125 -1.5625 1.78125 -1.453125 1.78125 -1.3125 Z M 0.203125 -6.421875 L 0.203125 0 L 4.5625 0 L 4.5625 -6.421875 Z M 0.421875 -0.234375 L 0.421875 -6.171875 L 4.3125 -6.171875 L 4.3125 -0.234375 Z M 0.421875 -0.234375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-1">
<path style="stroke:none;" d="M 1.8125 0 L 1.8125 -6.421875 L 0.9375 -6.421875 L 0.9375 0 Z M 1.8125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-2">
<path style="stroke:none;" d="M 0.0625 -4.546875 L 1.53125 0 L 2.140625 0 C 2.21875 0 2.28125 -0.046875 2.3125 -0.15625 L 3.34375 -3.234375 C 3.359375 -3.296875 3.375 -3.375 3.390625 -3.4375 C 3.40625 -3.515625 3.421875 -3.578125 3.4375 -3.65625 C 3.453125 -3.578125 3.46875 -3.515625 3.484375 -3.4375 C 3.5 -3.375 3.515625 -3.296875 3.546875 -3.234375 L 4.546875 -0.15625 C 4.578125 -0.046875 4.625 0 4.703125 0 L 5.34375 0 L 6.8125 -4.546875 L 6.203125 -4.546875 C 6.15625 -4.546875 6.109375 -4.53125 6.0625 -4.5 C 6.015625 -4.46875 5.984375 -4.421875 5.984375 -4.375 L 5.09375 -1.453125 C 5.0625 -1.359375 5.03125 -1.265625 5.015625 -1.15625 C 4.984375 -1.046875 4.96875 -0.9375 4.953125 -0.84375 C 4.9375 -0.9375 4.90625 -1.046875 4.875 -1.140625 C 4.859375 -1.25 4.828125 -1.34375 4.796875 -1.453125 L 3.859375 -4.390625 C 3.84375 -4.4375 3.8125 -4.46875 3.78125 -4.5 C 3.734375 -4.53125 3.6875 -4.546875 3.625 -4.546875 L 3.28125 -4.546875 C 3.21875 -4.546875 3.171875 -4.53125 3.140625 -4.5 C 3.109375 -4.46875 3.078125 -4.4375 3.0625 -4.390625 L 2.109375 -1.453125 C 2.078125 -1.34375 2.046875 -1.234375 2.015625 -1.140625 C 1.984375 -1.046875 1.953125 -0.9375 1.921875 -0.84375 C 1.921875 -0.9375 1.890625 -1.046875 1.875 -1.140625 C 1.859375 -1.234375 1.828125 -1.34375 1.8125 -1.453125 L 0.9375 -4.375 C 0.921875 -4.421875 0.890625 -4.46875 0.859375 -4.5 C 0.8125 -4.53125 0.765625 -4.546875 0.6875 -4.546875 Z M 0.0625 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-3">
<path style="stroke:none;" d="M 3.984375 0 L 3.984375 -2.90625 C 3.984375 -3.15625 3.953125 -3.390625 3.890625 -3.609375 C 3.828125 -3.8125 3.71875 -4 3.578125 -4.140625 C 3.453125 -4.296875 3.28125 -4.40625 3.078125 -4.5 C 2.890625 -4.578125 2.65625 -4.625 2.40625 -4.625 C 2.046875 -4.625 1.734375 -4.5625 1.4375 -4.4375 C 1.15625 -4.328125 0.890625 -4.140625 0.625 -3.90625 L 0.78125 -3.640625 C 0.796875 -3.609375 0.828125 -3.5625 0.875 -3.546875 C 0.921875 -3.515625 0.953125 -3.5 1.015625 -3.5 C 1.078125 -3.5 1.15625 -3.53125 1.21875 -3.5625 C 1.296875 -3.625 1.375 -3.671875 1.46875 -3.734375 C 1.5625 -3.796875 1.6875 -3.859375 1.828125 -3.90625 C 1.953125 -3.953125 2.109375 -3.984375 2.3125 -3.984375 C 2.609375 -3.984375 2.828125 -3.890625 2.984375 -3.703125 C 3.125 -3.53125 3.203125 -3.265625 3.203125 -2.90625 L 3.203125 -2.546875 C 2.6875 -2.53125 2.25 -2.5 1.90625 -2.40625 C 1.546875 -2.328125 1.25 -2.21875 1.046875 -2.09375 C 0.8125 -1.96875 0.65625 -1.828125 0.5625 -1.65625 C 0.46875 -1.484375 0.40625 -1.3125 0.40625 -1.140625 C 0.40625 -0.921875 0.453125 -0.75 0.515625 -0.59375 C 0.578125 -0.453125 0.671875 -0.328125 0.78125 -0.21875 C 0.890625 -0.125 1.03125 -0.046875 1.1875 0 C 1.34375 0.046875 1.5 0.078125 1.6875 0.078125 C 1.859375 0.078125 2.015625 0.0625 2.15625 0.03125 C 2.296875 0 2.4375 -0.046875 2.5625 -0.109375 C 2.6875 -0.15625 2.796875 -0.234375 2.921875 -0.328125 C 3.03125 -0.40625 3.140625 -0.5 3.265625 -0.609375 L 3.359375 -0.1875 C 3.375 -0.109375 3.40625 -0.0625 3.453125 -0.03125 C 3.5 -0.015625 3.5625 0 3.640625 0 Z M 1.921875 -0.484375 C 1.8125 -0.484375 1.71875 -0.5 1.625 -0.53125 C 1.53125 -0.546875 1.46875 -0.59375 1.390625 -0.640625 C 1.328125 -0.703125 1.28125 -0.78125 1.234375 -0.859375 C 1.203125 -0.953125 1.171875 -1.046875 1.171875 -1.171875 C 1.171875 -1.296875 1.21875 -1.40625 1.296875 -1.515625 C 1.359375 -1.609375 1.484375 -1.703125 1.640625 -1.78125 C 1.796875 -1.859375 2.015625 -1.90625 2.265625 -1.953125 C 2.53125 -2 2.84375 -2.03125 3.203125 -2.046875 L 3.203125 -1.09375 C 3.109375 -1 3.015625 -0.921875 2.9375 -0.84375 C 2.828125 -0.765625 2.734375 -0.703125 2.640625 -0.65625 C 2.53125 -0.59375 2.421875 -0.5625 2.3125 -0.53125 C 2.1875 -0.5 2.0625 -0.484375 1.921875 -0.484375 Z M 1.921875 -0.484375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-4">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -3.34375 C 1.625 -3.53125 1.8125 -3.6875 2.015625 -3.8125 C 2.21875 -3.921875 2.4375 -3.984375 2.6875 -3.984375 C 3 -3.984375 3.25 -3.890625 3.40625 -3.6875 C 3.5625 -3.5 3.640625 -3.234375 3.640625 -2.890625 L 3.640625 0 L 4.4375 0 L 4.4375 -2.890625 C 4.4375 -3.140625 4.40625 -3.390625 4.34375 -3.59375 C 4.265625 -3.8125 4.171875 -3.984375 4.046875 -4.140625 C 3.921875 -4.296875 3.765625 -4.40625 3.5625 -4.5 C 3.375 -4.578125 3.15625 -4.609375 2.921875 -4.609375 C 2.59375 -4.609375 2.3125 -4.546875 2.078125 -4.40625 C 1.828125 -4.28125 1.609375 -4.109375 1.40625 -3.890625 L 1.34375 -4.375 C 1.3125 -4.484375 1.234375 -4.546875 1.125 -4.546875 L 0.65625 -4.546875 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-5">
<path style="stroke:none;" d="M 2.03125 0.078125 C 2.234375 0.078125 2.4375 0.03125 2.625 -0.03125 C 2.828125 -0.109375 2.984375 -0.203125 3.125 -0.34375 L 2.890625 -0.71875 C 2.859375 -0.765625 2.828125 -0.796875 2.78125 -0.796875 C 2.765625 -0.796875 2.734375 -0.796875 2.703125 -0.765625 C 2.671875 -0.75 2.625 -0.71875 2.59375 -0.6875 C 2.546875 -0.65625 2.484375 -0.640625 2.4375 -0.625 C 2.375 -0.59375 2.296875 -0.578125 2.203125 -0.578125 C 2.0625 -0.578125 1.953125 -0.625 1.859375 -0.71875 C 1.765625 -0.8125 1.71875 -0.953125 1.71875 -1.140625 L 1.71875 -3.875 L 3.015625 -3.875 L 3.015625 -4.453125 L 1.71875 -4.453125 L 1.71875 -6.015625 L 1.3125 -6.015625 C 1.265625 -6.015625 1.21875 -6 1.1875 -5.96875 C 1.15625 -5.953125 1.125 -5.90625 1.125 -5.859375 L 0.9375 -4.46875 L 0.203125 -4.375 L 0.203125 -4.046875 C 0.203125 -3.984375 0.21875 -3.953125 0.25 -3.921875 C 0.28125 -3.890625 0.3125 -3.875 0.375 -3.875 L 0.921875 -3.875 L 0.921875 -1.09375 C 0.921875 -0.71875 1.015625 -0.4375 1.203125 -0.234375 C 1.40625 -0.03125 1.671875 0.078125 2.03125 0.078125 Z M 2.03125 0.078125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-6">
<path style="stroke:none;" d="M 0.453125 -3.03125 L 0.453125 -2.34375 L 2.65625 -2.34375 L 2.65625 -3.03125 Z M 0.453125 -3.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-7">
<path style="stroke:none;" d="M 2.5 -4.609375 C 2.15625 -4.609375 1.859375 -4.5625 1.59375 -4.453125 C 1.328125 -4.34375 1.09375 -4.171875 0.90625 -3.984375 C 0.71875 -3.78125 0.578125 -3.53125 0.46875 -3.234375 C 0.375 -2.953125 0.328125 -2.625 0.328125 -2.28125 C 0.328125 -1.921875 0.375 -1.59375 0.46875 -1.3125 C 0.578125 -1.015625 0.71875 -0.765625 0.90625 -0.5625 C 1.09375 -0.375 1.328125 -0.203125 1.59375 -0.09375 C 1.859375 0.015625 2.15625 0.0625 2.5 0.0625 C 2.828125 0.0625 3.125 0.015625 3.390625 -0.09375 C 3.65625 -0.203125 3.890625 -0.375 4.078125 -0.5625 C 4.265625 -0.765625 4.40625 -1.015625 4.5 -1.3125 C 4.609375 -1.59375 4.65625 -1.921875 4.65625 -2.28125 C 4.65625 -2.625 4.609375 -2.953125 4.5 -3.234375 C 4.40625 -3.53125 4.265625 -3.78125 4.078125 -3.984375 C 3.890625 -4.171875 3.65625 -4.34375 3.390625 -4.453125 C 3.125 -4.5625 2.828125 -4.609375 2.5 -4.609375 Z M 2.5 -0.5625 C 2.265625 -0.5625 2.0625 -0.59375 1.90625 -0.671875 C 1.734375 -0.75 1.59375 -0.859375 1.484375 -1.015625 C 1.375 -1.15625 1.28125 -1.34375 1.234375 -1.546875 C 1.171875 -1.765625 1.140625 -2 1.140625 -2.265625 C 1.140625 -2.53125 1.171875 -2.78125 1.234375 -3 C 1.28125 -3.203125 1.375 -3.390625 1.484375 -3.53125 C 1.59375 -3.6875 1.734375 -3.796875 1.90625 -3.875 C 2.0625 -3.953125 2.265625 -3.984375 2.5 -3.984375 C 2.9375 -3.984375 3.28125 -3.828125 3.5 -3.53125 C 3.71875 -3.234375 3.828125 -2.8125 3.828125 -2.265625 C 3.828125 -1.734375 3.71875 -1.3125 3.5 -1.015625 C 3.28125 -0.703125 2.9375 -0.5625 2.5 -0.5625 Z M 2.5 -0.5625 "/>
</symbol>
<symbol overflow="visible" id="glyph1-8">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -3.34375 C 1.625 -3.53125 1.8125 -3.6875 2.015625 -3.8125 C 2.21875 -3.921875 2.4375 -3.984375 2.6875 -3.984375 C 3 -3.984375 3.25 -3.890625 3.40625 -3.6875 C 3.5625 -3.5 3.640625 -3.234375 3.640625 -2.890625 L 3.640625 0 L 4.4375 0 L 4.4375 -2.890625 C 4.4375 -3.140625 4.40625 -3.390625 4.34375 -3.59375 C 4.265625 -3.8125 4.171875 -3.984375 4.046875 -4.140625 C 3.921875 -4.296875 3.765625 -4.40625 3.5625 -4.5 C 3.375 -4.578125 3.15625 -4.609375 2.921875 -4.609375 C 2.609375 -4.609375 2.34375 -4.546875 2.09375 -4.4375 C 1.859375 -4.3125 1.640625 -4.140625 1.453125 -3.9375 L 1.453125 -6.609375 L 0.65625 -6.609375 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-9">
<path style="stroke:none;" d="M 2.453125 -4.609375 C 2.125 -4.609375 1.828125 -4.5625 1.5625 -4.4375 C 1.296875 -4.328125 1.078125 -4.171875 0.890625 -3.96875 C 0.71875 -3.765625 0.578125 -3.53125 0.46875 -3.25 C 0.375 -2.984375 0.328125 -2.6875 0.328125 -2.359375 C 0.328125 -1.96875 0.390625 -1.625 0.5 -1.328125 C 0.59375 -1.015625 0.75 -0.765625 0.9375 -0.5625 C 1.140625 -0.359375 1.359375 -0.203125 1.625 -0.09375 C 1.890625 0.015625 2.1875 0.0625 2.5 0.0625 C 2.65625 0.0625 2.828125 0.046875 3 0.015625 C 3.15625 -0.015625 3.328125 -0.046875 3.484375 -0.109375 C 3.640625 -0.171875 3.78125 -0.234375 3.921875 -0.328125 C 4.0625 -0.40625 4.171875 -0.515625 4.28125 -0.640625 L 4.046875 -0.921875 C 4.015625 -0.984375 3.96875 -1 3.90625 -1 C 3.859375 -1 3.796875 -0.984375 3.71875 -0.9375 C 3.65625 -0.890625 3.5625 -0.84375 3.453125 -0.78125 C 3.359375 -0.734375 3.234375 -0.6875 3.078125 -0.640625 C 2.9375 -0.59375 2.765625 -0.5625 2.5625 -0.5625 C 2.34375 -0.5625 2.15625 -0.59375 1.984375 -0.671875 C 1.8125 -0.734375 1.65625 -0.84375 1.53125 -0.984375 C 1.40625 -1.125 1.3125 -1.3125 1.234375 -1.515625 C 1.171875 -1.734375 1.125 -1.984375 1.125 -2.265625 L 4.140625 -2.265625 C 4.21875 -2.265625 4.265625 -2.296875 4.296875 -2.328125 C 4.328125 -2.375 4.34375 -2.453125 4.34375 -2.578125 C 4.34375 -2.90625 4.28125 -3.1875 4.203125 -3.4375 C 4.09375 -3.703125 3.96875 -3.90625 3.796875 -4.078125 C 3.640625 -4.25 3.4375 -4.390625 3.203125 -4.46875 C 2.984375 -4.5625 2.71875 -4.609375 2.453125 -4.609375 Z M 2.46875 -4.03125 C 2.65625 -4.03125 2.8125 -4 2.953125 -3.9375 C 3.09375 -3.875 3.21875 -3.78125 3.3125 -3.671875 C 3.421875 -3.5625 3.5 -3.4375 3.546875 -3.28125 C 3.59375 -3.125 3.625 -2.953125 3.625 -2.765625 L 1.140625 -2.765625 C 1.203125 -3.15625 1.34375 -3.46875 1.5625 -3.6875 C 1.78125 -3.921875 2.078125 -4.03125 2.46875 -4.03125 Z M 2.46875 -4.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-10">
<path style="stroke:none;" d="M 0.828125 0 L 1.640625 0 L 1.640625 -3.875 L 2.796875 -3.875 L 2.796875 -4.453125 L 1.609375 -4.453125 L 1.609375 -4.6875 C 1.609375 -5.09375 1.71875 -5.40625 1.921875 -5.625 C 2.140625 -5.859375 2.4375 -5.96875 2.828125 -5.96875 C 2.9375 -5.96875 3.078125 -5.953125 3.25 -5.953125 C 3.40625 -5.9375 3.5625 -5.9375 3.734375 -5.921875 L 3.734375 0 L 4.53125 0 L 4.53125 -6.484375 L 4.078125 -6.484375 C 3.859375 -6.484375 3.640625 -6.5 3.421875 -6.515625 C 3.1875 -6.53125 2.953125 -6.546875 2.703125 -6.546875 C 2.390625 -6.546875 2.109375 -6.5 1.890625 -6.40625 C 1.65625 -6.296875 1.453125 -6.171875 1.296875 -6 C 1.140625 -5.828125 1.03125 -5.640625 0.953125 -5.40625 C 0.875 -5.1875 0.828125 -4.953125 0.828125 -4.6875 L 0.828125 -4.453125 L 0.109375 -4.453125 L 0.109375 -4.125 C 0.109375 -4.0625 0.140625 -4.015625 0.171875 -3.984375 C 0.21875 -3.953125 0.265625 -3.9375 0.328125 -3.921875 L 0.828125 -3.859375 Z M 0.828125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-11">
<path style="stroke:none;" d="M 1.546875 -4.546875 L 0.75 -4.546875 L 0.75 0 L 1.546875 0 Z M 1.71875 -5.96875 C 1.71875 -6.046875 1.703125 -6.125 1.671875 -6.1875 C 1.640625 -6.265625 1.59375 -6.328125 1.546875 -6.375 C 1.5 -6.421875 1.4375 -6.46875 1.375 -6.5 C 1.296875 -6.53125 1.21875 -6.546875 1.140625 -6.546875 C 1.078125 -6.546875 1 -6.53125 0.9375 -6.5 C 0.859375 -6.46875 0.796875 -6.421875 0.75 -6.375 C 0.703125 -6.328125 0.65625 -6.265625 0.625 -6.1875 C 0.59375 -6.125 0.578125 -6.046875 0.578125 -5.96875 C 0.578125 -5.890625 0.59375 -5.828125 0.625 -5.75 C 0.65625 -5.6875 0.703125 -5.625 0.75 -5.5625 C 0.796875 -5.515625 0.859375 -5.484375 0.9375 -5.453125 C 1 -5.421875 1.078125 -5.40625 1.140625 -5.40625 C 1.21875 -5.40625 1.296875 -5.421875 1.375 -5.453125 C 1.4375 -5.484375 1.5 -5.515625 1.546875 -5.5625 C 1.59375 -5.625 1.640625 -5.6875 1.671875 -5.75 C 1.703125 -5.828125 1.71875 -5.890625 1.71875 -5.96875 Z M 1.71875 -5.96875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-12">
<path style="stroke:none;" d="M 2.1875 -4.625 C 1.9375 -4.625 1.703125 -4.578125 1.484375 -4.515625 C 1.28125 -4.453125 1.09375 -4.34375 0.953125 -4.21875 C 0.796875 -4.09375 0.671875 -3.9375 0.59375 -3.765625 C 0.5 -3.578125 0.46875 -3.375 0.46875 -3.15625 C 0.46875 -2.875 0.53125 -2.640625 0.65625 -2.4375 C 0.78125 -2.21875 0.953125 -2.046875 1.171875 -1.921875 C 1.078125 -1.875 1 -1.828125 0.921875 -1.765625 C 0.859375 -1.703125 0.796875 -1.625 0.75 -1.5625 C 0.703125 -1.5 0.65625 -1.421875 0.640625 -1.359375 C 0.609375 -1.28125 0.59375 -1.21875 0.59375 -1.15625 C 0.59375 -0.984375 0.640625 -0.859375 0.71875 -0.75 C 0.796875 -0.65625 0.890625 -0.5625 1.015625 -0.515625 C 0.78125 -0.421875 0.578125 -0.296875 0.4375 -0.140625 C 0.296875 0.015625 0.21875 0.203125 0.21875 0.4375 C 0.21875 0.59375 0.265625 0.75 0.34375 0.890625 C 0.4375 1.03125 0.546875 1.15625 0.71875 1.28125 C 0.890625 1.390625 1.09375 1.46875 1.34375 1.53125 C 1.59375 1.609375 1.875 1.640625 2.203125 1.640625 C 2.546875 1.640625 2.84375 1.59375 3.109375 1.5 C 3.375 1.421875 3.59375 1.3125 3.765625 1.171875 C 3.953125 1.03125 4.09375 0.859375 4.1875 0.6875 C 4.28125 0.5 4.34375 0.3125 4.34375 0.109375 C 4.34375 -0.09375 4.296875 -0.265625 4.203125 -0.390625 C 4.125 -0.53125 4 -0.625 3.859375 -0.703125 C 3.71875 -0.78125 3.5625 -0.828125 3.375 -0.859375 C 3.1875 -0.890625 3 -0.921875 2.8125 -0.9375 C 2.625 -0.953125 2.4375 -0.953125 2.25 -0.96875 C 2.078125 -0.96875 1.90625 -0.984375 1.765625 -1.015625 C 1.625 -1.03125 1.5 -1.078125 1.421875 -1.125 C 1.34375 -1.1875 1.296875 -1.265625 1.296875 -1.375 C 1.296875 -1.4375 1.3125 -1.5 1.359375 -1.578125 C 1.421875 -1.640625 1.484375 -1.703125 1.578125 -1.765625 C 1.765625 -1.71875 1.96875 -1.6875 2.1875 -1.6875 C 2.4375 -1.6875 2.65625 -1.71875 2.875 -1.796875 C 3.078125 -1.859375 3.25 -1.953125 3.40625 -2.09375 C 3.5625 -2.21875 3.671875 -2.375 3.765625 -2.5625 C 3.84375 -2.734375 3.890625 -2.9375 3.890625 -3.15625 C 3.890625 -3.390625 3.84375 -3.609375 3.734375 -3.8125 L 4.25 -3.875 C 4.375 -3.90625 4.4375 -3.96875 4.4375 -4.0625 L 4.4375 -4.359375 L 3.203125 -4.359375 C 3.0625 -4.453125 2.90625 -4.515625 2.734375 -4.5625 C 2.5625 -4.59375 2.375 -4.625 2.1875 -4.625 Z M 3.59375 0.25 C 3.59375 0.375 3.5625 0.46875 3.5 0.578125 C 3.4375 0.671875 3.359375 0.765625 3.234375 0.828125 C 3.109375 0.90625 2.96875 0.953125 2.796875 1 C 2.625 1.03125 2.4375 1.046875 2.21875 1.046875 C 2 1.046875 1.8125 1.03125 1.65625 1 C 1.484375 0.953125 1.34375 0.90625 1.234375 0.84375 C 1.140625 0.78125 1.046875 0.703125 1 0.625 C 0.953125 0.53125 0.921875 0.4375 0.921875 0.328125 C 0.921875 0.171875 0.984375 0.03125 1.078125 -0.078125 C 1.1875 -0.203125 1.328125 -0.296875 1.5 -0.375 C 1.640625 -0.359375 1.796875 -0.34375 1.953125 -0.328125 C 2.125 -0.328125 2.28125 -0.3125 2.4375 -0.3125 C 2.59375 -0.296875 2.734375 -0.28125 2.875 -0.265625 C 3.015625 -0.25 3.140625 -0.21875 3.25 -0.1875 C 3.359375 -0.140625 3.4375 -0.09375 3.5 -0.03125 C 3.5625 0.046875 3.59375 0.140625 3.59375 0.25 Z M 2.1875 -2.21875 C 2.03125 -2.21875 1.890625 -2.25 1.765625 -2.28125 C 1.640625 -2.328125 1.53125 -2.390625 1.453125 -2.46875 C 1.375 -2.5625 1.3125 -2.65625 1.265625 -2.765625 C 1.21875 -2.875 1.203125 -3 1.203125 -3.140625 C 1.203125 -3.40625 1.28125 -3.625 1.453125 -3.796875 C 1.625 -3.96875 1.859375 -4.046875 2.1875 -4.046875 C 2.5 -4.046875 2.75 -3.96875 2.921875 -3.796875 C 3.09375 -3.625 3.171875 -3.40625 3.171875 -3.140625 C 3.171875 -3 3.15625 -2.875 3.109375 -2.765625 C 3.078125 -2.65625 3.015625 -2.5625 2.921875 -2.46875 C 2.84375 -2.390625 2.734375 -2.328125 2.609375 -2.28125 C 2.484375 -2.25 2.34375 -2.21875 2.1875 -2.21875 Z M 2.1875 -2.21875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-13">
<path style="stroke:none;" d="M 3.75 -3.734375 L 3.96875 -4.015625 C 3.78125 -4.203125 3.5625 -4.359375 3.3125 -4.453125 C 3.0625 -4.5625 2.796875 -4.609375 2.46875 -4.609375 C 2.125 -4.609375 1.828125 -4.5625 1.5625 -4.4375 C 1.296875 -4.328125 1.0625 -4.15625 0.890625 -3.953125 C 0.703125 -3.75 0.5625 -3.5 0.46875 -3.203125 C 0.375 -2.921875 0.328125 -2.609375 0.328125 -2.28125 C 0.328125 -1.90625 0.390625 -1.578125 0.484375 -1.28125 C 0.59375 -0.984375 0.734375 -0.75 0.90625 -0.546875 C 1.09375 -0.34375 1.296875 -0.203125 1.546875 -0.09375 C 1.796875 0.015625 2.046875 0.0625 2.34375 0.0625 C 2.65625 0.0625 2.984375 0.015625 3.28125 -0.109375 C 3.5625 -0.21875 3.8125 -0.390625 4.015625 -0.640625 L 3.796875 -0.921875 C 3.765625 -0.984375 3.703125 -1 3.640625 -1 C 3.578125 -1 3.53125 -0.984375 3.46875 -0.9375 C 3.421875 -0.890625 3.359375 -0.84375 3.265625 -0.78125 C 3.1875 -0.71875 3.078125 -0.671875 2.953125 -0.625 C 2.828125 -0.578125 2.671875 -0.5625 2.46875 -0.5625 C 2.28125 -0.5625 2.09375 -0.59375 1.921875 -0.671875 C 1.765625 -0.75 1.625 -0.859375 1.515625 -1 C 1.40625 -1.140625 1.3125 -1.328125 1.25 -1.546875 C 1.1875 -1.75 1.15625 -2 1.15625 -2.28125 C 1.15625 -2.53125 1.1875 -2.78125 1.234375 -2.984375 C 1.296875 -3.203125 1.390625 -3.375 1.5 -3.53125 C 1.609375 -3.671875 1.765625 -3.796875 1.921875 -3.875 C 2.09375 -3.953125 2.296875 -3.984375 2.515625 -3.984375 C 2.6875 -3.984375 2.828125 -3.96875 2.9375 -3.9375 C 3.046875 -3.890625 3.15625 -3.859375 3.234375 -3.8125 C 3.3125 -3.765625 3.375 -3.71875 3.4375 -3.6875 C 3.484375 -3.65625 3.53125 -3.625 3.578125 -3.625 C 3.625 -3.625 3.65625 -3.640625 3.6875 -3.65625 C 3.703125 -3.671875 3.734375 -3.703125 3.75 -3.734375 Z M 3.75 -3.734375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-14">
<path style="stroke:none;" d="M 1.546875 -6.609375 L 0.75 -6.609375 L 0.75 0 L 1.546875 0 Z M 1.546875 -6.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-15">
<path style="stroke:none;" d="M 1.984375 1.34375 L 4.515625 -4.546875 L 3.890625 -4.546875 C 3.828125 -4.546875 3.78125 -4.53125 3.734375 -4.5 C 3.703125 -4.46875 3.671875 -4.421875 3.65625 -4.375 L 2.46875 -1.515625 C 2.4375 -1.453125 2.421875 -1.390625 2.40625 -1.3125 C 2.375 -1.25 2.359375 -1.1875 2.34375 -1.109375 C 2.328125 -1.1875 2.3125 -1.25 2.28125 -1.3125 C 2.265625 -1.390625 2.25 -1.453125 2.21875 -1.515625 L 1 -4.375 C 0.984375 -4.421875 0.953125 -4.453125 0.921875 -4.5 C 0.875 -4.53125 0.828125 -4.546875 0.75 -4.546875 L 0.0625 -4.546875 L 1.9375 -0.265625 L 1.109375 1.53125 L 1.703125 1.53125 C 1.78125 1.53125 1.84375 1.515625 1.890625 1.484375 C 1.921875 1.453125 1.953125 1.40625 1.984375 1.34375 Z M 1.984375 1.34375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-16">
<path style="stroke:none;" d="M 3.25 -3.796875 L 3.4375 -4.078125 C 3.265625 -4.25 3.0625 -4.375 2.8125 -4.46875 C 2.578125 -4.5625 2.3125 -4.609375 2.015625 -4.609375 C 1.765625 -4.609375 1.53125 -4.578125 1.328125 -4.5 C 1.125 -4.4375 0.953125 -4.34375 0.828125 -4.21875 C 0.6875 -4.09375 0.578125 -3.953125 0.5 -3.796875 C 0.4375 -3.640625 0.40625 -3.46875 0.40625 -3.296875 C 0.40625 -3.109375 0.4375 -2.9375 0.5 -2.796875 C 0.5625 -2.65625 0.65625 -2.546875 0.765625 -2.453125 C 0.875 -2.359375 1 -2.28125 1.140625 -2.21875 C 1.28125 -2.171875 1.4375 -2.109375 1.578125 -2.0625 C 1.734375 -2.015625 1.875 -1.96875 2.015625 -1.921875 C 2.15625 -1.890625 2.28125 -1.828125 2.390625 -1.78125 C 2.5 -1.71875 2.59375 -1.640625 2.65625 -1.5625 C 2.71875 -1.484375 2.765625 -1.375 2.765625 -1.25 C 2.765625 -1.140625 2.75 -1.046875 2.703125 -0.96875 C 2.671875 -0.875 2.609375 -0.796875 2.53125 -0.71875 C 2.453125 -0.65625 2.359375 -0.59375 2.25 -0.5625 C 2.125 -0.515625 1.984375 -0.5 1.828125 -0.5 C 1.65625 -0.5 1.5 -0.53125 1.375 -0.5625 C 1.25 -0.609375 1.15625 -0.65625 1.0625 -0.703125 C 0.984375 -0.75 0.90625 -0.796875 0.859375 -0.84375 C 0.796875 -0.890625 0.734375 -0.90625 0.6875 -0.90625 C 0.625 -0.90625 0.578125 -0.890625 0.546875 -0.875 C 0.515625 -0.859375 0.484375 -0.828125 0.46875 -0.78125 L 0.28125 -0.484375 C 0.453125 -0.3125 0.671875 -0.1875 0.9375 -0.078125 C 1.1875 0.015625 1.46875 0.078125 1.796875 0.078125 C 2.078125 0.078125 2.3125 0.03125 2.53125 -0.046875 C 2.734375 -0.109375 2.921875 -0.21875 3.0625 -0.34375 C 3.21875 -0.46875 3.328125 -0.625 3.40625 -0.8125 C 3.46875 -0.984375 3.515625 -1.171875 3.515625 -1.390625 C 3.515625 -1.578125 3.484375 -1.734375 3.40625 -1.859375 C 3.34375 -1.984375 3.25 -2.09375 3.140625 -2.1875 C 3.03125 -2.28125 2.90625 -2.359375 2.765625 -2.40625 C 2.625 -2.46875 2.484375 -2.53125 2.328125 -2.578125 C 2.1875 -2.625 2.046875 -2.671875 1.90625 -2.71875 C 1.765625 -2.765625 1.640625 -2.8125 1.53125 -2.859375 C 1.40625 -2.921875 1.328125 -2.984375 1.25 -3.0625 C 1.1875 -3.140625 1.15625 -3.25 1.15625 -3.359375 C 1.15625 -3.453125 1.171875 -3.53125 1.21875 -3.609375 C 1.25 -3.6875 1.3125 -3.765625 1.390625 -3.828125 C 1.46875 -3.890625 1.5625 -3.9375 1.671875 -3.96875 C 1.78125 -4 1.890625 -4.015625 2.03125 -4.015625 C 2.1875 -4.015625 2.328125 -4 2.4375 -3.96875 C 2.546875 -3.9375 2.640625 -3.890625 2.71875 -3.859375 C 2.8125 -3.8125 2.875 -3.78125 2.9375 -3.75 C 3 -3.71875 3.046875 -3.6875 3.09375 -3.6875 C 3.171875 -3.6875 3.21875 -3.71875 3.25 -3.796875 Z M 3.25 -3.796875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-17">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -2.890625 C 1.578125 -3.203125 1.734375 -3.4375 1.921875 -3.59375 C 2.109375 -3.765625 2.34375 -3.84375 2.625 -3.84375 C 2.78125 -3.84375 2.890625 -3.828125 2.984375 -3.796875 C 3.0625 -3.765625 3.140625 -3.75 3.171875 -3.75 C 3.25 -3.75 3.296875 -3.796875 3.3125 -3.859375 L 3.421875 -4.46875 C 3.328125 -4.515625 3.234375 -4.546875 3.140625 -4.578125 C 3.03125 -4.609375 2.921875 -4.625 2.796875 -4.625 C 2.484375 -4.625 2.21875 -4.53125 1.984375 -4.359375 C 1.765625 -4.171875 1.5625 -3.9375 1.40625 -3.609375 L 1.359375 -4.328125 C 1.34375 -4.40625 1.328125 -4.46875 1.296875 -4.5 C 1.265625 -4.53125 1.203125 -4.546875 1.109375 -4.546875 L 0.65625 -4.546875 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-18">
<path style="stroke:none;" d="M 3.859375 0 L 4.328125 0 L 4.328125 -6.609375 L 3.53125 -6.609375 L 3.53125 -4.078125 C 3.375 -4.25 3.203125 -4.390625 3 -4.484375 C 2.796875 -4.578125 2.5625 -4.625 2.28125 -4.625 C 1.984375 -4.625 1.703125 -4.5625 1.46875 -4.4375 C 1.21875 -4.328125 1.015625 -4.15625 0.84375 -3.9375 C 0.671875 -3.734375 0.546875 -3.484375 0.453125 -3.1875 C 0.375 -2.90625 0.328125 -2.59375 0.328125 -2.25 C 0.328125 -1.875 0.359375 -1.546875 0.4375 -1.25 C 0.53125 -0.96875 0.640625 -0.71875 0.796875 -0.53125 C 0.9375 -0.34375 1.125 -0.1875 1.328125 -0.09375 C 1.546875 0.015625 1.78125 0.0625 2.046875 0.0625 C 2.359375 0.0625 2.65625 -0.015625 2.890625 -0.15625 C 3.140625 -0.296875 3.375 -0.484375 3.5625 -0.71875 L 3.640625 -0.171875 C 3.671875 -0.046875 3.734375 0 3.859375 0 Z M 2.3125 -0.578125 C 2.125 -0.578125 1.953125 -0.609375 1.8125 -0.671875 C 1.671875 -0.734375 1.546875 -0.84375 1.453125 -0.984375 C 1.34375 -1.109375 1.28125 -1.28125 1.21875 -1.5 C 1.171875 -1.703125 1.140625 -1.953125 1.140625 -2.25 C 1.140625 -2.8125 1.265625 -3.25 1.484375 -3.546875 C 1.71875 -3.84375 2.046875 -4 2.46875 -4 C 2.671875 -4 2.875 -3.953125 3.046875 -3.890625 C 3.21875 -3.796875 3.375 -3.65625 3.53125 -3.46875 L 3.53125 -1.265625 C 3.359375 -1.046875 3.1875 -0.890625 2.984375 -0.765625 C 2.796875 -0.640625 2.5625 -0.578125 2.3125 -0.578125 Z M 2.3125 -0.578125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-19">
<path style="stroke:none;" d="M 0.6875 0 L 1.203125 0 C 1.3125 0 1.375 -0.0625 1.40625 -0.171875 L 1.4375 -0.578125 C 1.59375 -0.375 1.78125 -0.21875 1.984375 -0.109375 C 2.1875 0 2.4375 0.0625 2.71875 0.0625 C 3.03125 0.0625 3.3125 0 3.546875 -0.109375 C 3.796875 -0.234375 4 -0.40625 4.171875 -0.625 C 4.34375 -0.828125 4.46875 -1.078125 4.5625 -1.359375 C 4.640625 -1.65625 4.6875 -1.96875 4.6875 -2.296875 C 4.6875 -2.671875 4.65625 -3.015625 4.5625 -3.296875 C 4.484375 -3.59375 4.375 -3.828125 4.21875 -4.03125 C 4.078125 -4.21875 3.890625 -4.375 3.6875 -4.46875 C 3.46875 -4.5625 3.234375 -4.609375 2.96875 -4.609375 C 2.65625 -4.609375 2.375 -4.546875 2.140625 -4.40625 C 1.890625 -4.28125 1.671875 -4.109375 1.484375 -3.890625 L 1.484375 -6.609375 L 0.6875 -6.609375 Z M 2.703125 -3.984375 C 2.890625 -3.984375 3.046875 -3.953125 3.203125 -3.890625 C 3.34375 -3.828125 3.46875 -3.71875 3.5625 -3.59375 C 3.65625 -3.453125 3.734375 -3.28125 3.78125 -3.0625 C 3.84375 -2.859375 3.859375 -2.59375 3.859375 -2.296875 C 3.859375 -1.734375 3.75 -1.3125 3.53125 -1.015625 C 3.296875 -0.703125 2.96875 -0.5625 2.546875 -0.5625 C 2.328125 -0.5625 2.140625 -0.59375 1.96875 -0.671875 C 1.78125 -0.765625 1.625 -0.890625 1.484375 -1.09375 L 1.484375 -3.296875 C 1.65625 -3.515625 1.828125 -3.671875 2.03125 -3.796875 C 2.21875 -3.921875 2.453125 -3.984375 2.703125 -3.984375 Z M 2.703125 -3.984375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-20">
<path style="stroke:none;" d="M 1.484375 -6.609375 L 0.6875 -6.609375 L 0.6875 0 L 1.484375 0 L 1.484375 -2.171875 L 1.703125 -2.171875 C 1.796875 -2.171875 1.859375 -2.15625 1.90625 -2.140625 C 1.953125 -2.125 2 -2.078125 2.046875 -2.015625 L 3.53125 -0.15625 C 3.578125 -0.109375 3.625 -0.0625 3.671875 -0.03125 C 3.71875 -0.015625 3.765625 0 3.84375 0 L 4.5625 0 L 2.78125 -2.25 C 2.734375 -2.296875 2.703125 -2.359375 2.65625 -2.40625 C 2.609375 -2.453125 2.5625 -2.484375 2.515625 -2.53125 C 2.5625 -2.5625 2.609375 -2.59375 2.640625 -2.625 C 2.6875 -2.671875 2.734375 -2.71875 2.765625 -2.765625 L 4.4375 -4.546875 L 3.71875 -4.546875 C 3.640625 -4.546875 3.578125 -4.53125 3.53125 -4.5 C 3.5 -4.46875 3.453125 -4.4375 3.40625 -4.375 L 1.96875 -2.84375 C 1.921875 -2.796875 1.875 -2.765625 1.84375 -2.75 C 1.796875 -2.71875 1.75 -2.71875 1.6875 -2.71875 L 1.484375 -2.71875 Z M 1.484375 -6.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-21">
<path style="stroke:none;" d="M 0.078125 -4.546875 L 1.9375 0 L 2.65625 0 L 4.5 -4.546875 L 3.890625 -4.546875 C 3.828125 -4.546875 3.78125 -4.53125 3.734375 -4.5 C 3.6875 -4.46875 3.65625 -4.421875 3.640625 -4.375 L 2.484375 -1.453125 C 2.4375 -1.34375 2.40625 -1.234375 2.375 -1.125 C 2.34375 -1.015625 2.328125 -0.921875 2.296875 -0.8125 C 2.28125 -0.921875 2.25 -1.015625 2.234375 -1.125 C 2.203125 -1.234375 2.171875 -1.34375 2.140625 -1.453125 L 0.984375 -4.375 C 0.96875 -4.421875 0.9375 -4.46875 0.890625 -4.5 C 0.859375 -4.53125 0.796875 -4.546875 0.734375 -4.546875 Z M 0.078125 -4.546875 "/>
</symbol>
</g>
</defs>
<g id="surface1">
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="-0.869" y="92.338"/>
<use xlink:href="#glyph0-2" x="2.480094" y="92.338"/>
<use xlink:href="#glyph0-3" x="7.574643" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-4" x="21.342" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="31.656" y="92.284"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-6" x="30.298" y="92.338"/>
<use xlink:href="#glyph0-2" x="36.36346" y="92.338"/>
<use xlink:href="#glyph0-3" x="41.458009" y="92.338"/>
<use xlink:href="#glyph0-7" x="47.523469" y="92.338"/>
<use xlink:href="#glyph0-8" x="51.592563" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-9" x="65.01" y="92.338"/>
<use xlink:href="#glyph0-8" x="71.108187" y="92.338"/>
<use xlink:href="#glyph0-10" x="76.824555" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-11" x="90.592" y="92.338"/>
<use xlink:href="#glyph0-12" x="96.766551" y="92.338"/>
<use xlink:href="#glyph0-13" x="99.55928" y="92.338"/>
<use xlink:href="#glyph0-14" x="105.62474" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-15" x="118.901" y="92.338"/>
<use xlink:href="#glyph0-7" x="123.635549" y="92.338"/>
<use xlink:href="#glyph0-6" x="127.704644" y="92.338"/>
<use xlink:href="#glyph0-16" x="133.770103" y="92.338"/>
<use xlink:href="#glyph0-10" x="138.166471" y="92.338"/>
<use xlink:href="#glyph0-17" x="144.23193" y="92.338"/>
<use xlink:href="#glyph0-8" x="147.02466" y="92.338"/>
<use xlink:href="#glyph0-16" x="152.741028" y="92.338"/>
<use xlink:href="#glyph0-8" x="157.137396" y="92.338"/>
<use xlink:href="#glyph0-10" x="162.853764" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-9" x="176.621" y="92.338"/>
<use xlink:href="#glyph0-8" x="182.719187" y="92.338"/>
<use xlink:href="#glyph0-10" x="188.435555" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-17" x="202.203" y="92.338"/>
<use xlink:href="#glyph0-2" x="204.99573" y="92.338"/>
<use xlink:href="#glyph0-3" x="210.090279" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-14" x="225.084" y="92.338"/>
<use xlink:href="#glyph0-8" x="230.65855" y="92.338"/>
<use xlink:href="#glyph0-15" x="236.374919" y="92.338"/>
<use xlink:href="#glyph0-7" x="241.109468" y="92.338"/>
<use xlink:href="#glyph0-8" x="245.178562" y="92.338"/>
<use xlink:href="#glyph0-16" x="250.894931" y="92.338"/>
<use xlink:href="#glyph0-10" x="255.291298" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-14" x="270.285" y="92.338"/>
<use xlink:href="#glyph0-8" x="275.85955" y="92.338"/>
<use xlink:href="#glyph0-18" x="281.575919" y="92.338"/>
<use xlink:href="#glyph0-13" x="287.674105" y="92.338"/>
<use xlink:href="#glyph0-2" x="293.739565" y="92.338"/>
<use xlink:href="#glyph0-3" x="298.834115" y="92.338"/>
<use xlink:href="#glyph0-7" x="304.899574" y="92.338"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-3" x="316.67" y="92.338"/>
<use xlink:href="#glyph0-19" x="322.73546" y="92.338"/>
<use xlink:href="#glyph0-18" x="328.266373" y="92.338"/>
<use xlink:href="#glyph0-8" x="334.36456" y="92.338"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="5.009" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-2" x="23.733" y="108.609"/>
<use xlink:href="#glyph1-3" x="30.601262" y="108.609"/>
<use xlink:href="#glyph1-4" x="35.147227" y="108.609"/>
<use xlink:href="#glyph1-5" x="40.132546" y="108.609"/>
<use xlink:href="#glyph1-6" x="43.477013" y="108.609"/>
<use xlink:href="#glyph1-5" x="46.588354" y="108.609"/>
<use xlink:href="#glyph1-7" x="49.932821" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-5" x="67.436" y="108.609"/>
<use xlink:href="#glyph1-8" x="70.780467" y="108.609"/>
<use xlink:href="#glyph1-9" x="75.765786" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-10" x="90.629" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-11" x="95.955" y="108.609"/>
<use xlink:href="#glyph1-12" x="98.250398" y="108.609"/>
<use xlink:href="#glyph1-8" x="102.832229" y="108.609"/>
<use xlink:href="#glyph1-5" x="107.817547" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-13" x="131.46" y="108.609"/>
<use xlink:href="#glyph1-3" x="135.647309" y="108.609"/>
<use xlink:href="#glyph1-4" x="140.193274" y="108.609"/>
<use xlink:href="#glyph1-13" x="145.178592" y="108.609"/>
<use xlink:href="#glyph1-9" x="149.365901" y="108.609"/>
<use xlink:href="#glyph1-14" x="154.064294" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-5" x="177.451" y="108.609"/>
<use xlink:href="#glyph1-8" x="180.795467" y="108.609"/>
<use xlink:href="#glyph1-3" x="185.780786" y="108.609"/>
<use xlink:href="#glyph1-5" x="190.32675" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="207.803" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-15" x="223.857" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="228.331234" y="108.609"/>
<use xlink:href="#glyph1-16" x="233.029627" y="108.609"/>
<use xlink:href="#glyph1-5" x="236.921045" y="108.609"/>
<use xlink:href="#glyph1-9" x="240.265512" y="108.609"/>
<use xlink:href="#glyph1-17" x="244.963906" y="108.609"/>
<use xlink:href="#glyph1-18" x="248.577365" y="108.609"/>
<use xlink:href="#glyph1-3" x="253.589582" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-15" x="257.992085" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-19" x="275.065" y="108.609"/>
<use xlink:href="#glyph1-7" x="280.077218" y="108.609"/>
<use xlink:href="#glyph1-7" x="285.062536" y="108.609"/>
<use xlink:href="#glyph1-20" x="290.047854" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="294.477256" y="108.609"/>
<use xlink:href="#glyph1-18" x="299.17565" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-8" x="319.095" y="108.609"/>
<use xlink:href="#glyph1-3" x="324.080318" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-21" x="328.482821" y="108.609"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="332.957054" y="108.609"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -130.281781 85.414625 L -130.281781 18.516188 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 39.324219 81.097656 L 41.394531 76.953125 L 39.324219 78.507812 L 37.25 76.953125 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -134.266156 15.926344 L -136.672406 27.258375 C -136.992719 28.781813 -138.516156 30.016188 -140.07475 30.016188 L -157.414594 30.016188 C -158.973187 30.016188 -160.496625 28.781813 -160.816937 27.258375 L -162.684125 18.4615 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 6.382812 81.097656 L 9.273438 77.472656 L 6.921875 78.5625 L 5.214844 76.613281 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -126.297406 15.926344 L -123.902875 49.762281 C -123.57475 54.422438 -119.523969 58.199781 -114.852094 58.199781 L -37.141156 58.199781 C -32.469281 58.199781 -28.4185 54.422438 -28.090375 49.762281 L -25.879437 18.508375 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 143.910156 81.097656 L 145.683594 76.820312 L 143.726562 78.515625 L 141.550781 77.109375 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -74.688031 15.926344 L -77.090375 27.258375 C -77.414594 28.781813 -78.938031 30.016188 -80.496625 30.016188 L -89.848187 30.016188 C -91.406781 30.016188 -92.930219 28.781813 -93.254437 27.258375 L -95.117719 18.4615 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 73.949219 81.097656 L 76.835938 77.472656 L 74.488281 78.5625 L 72.78125 76.613281 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(3.529358%,63.920593%,83.529663%);stroke-opacity:1;stroke-miterlimit:10;" d="M -71.69975 15.926344 L -69.309125 68.926344 C -68.977094 76.238844 -62.777875 82.164625 -55.461469 82.164625 L 142.534625 82.164625 C 149.851031 82.164625 156.05025 76.238844 156.378375 68.926344 L 158.655719 18.512281 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(3.529358%,63.920593%,83.529663%);fill-opacity:1;" d="M 328.378906 81.097656 L 330.261719 76.863281 L 328.261719 78.511719 L 326.121094 77.050781 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -29.680219 15.926344 L -32.086469 27.258375 C -32.406781 28.781813 -33.930219 30.016188 -35.488812 30.016188 L -62.902875 30.016188 C -64.461469 30.016188 -65.984906 28.781813 -66.305219 27.258375 L -68.172406 18.4615 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 100.894531 81.097656 L 103.785156 77.472656 L 101.433594 78.5625 L 99.726562 76.613281 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(3.529358%,63.920593%,83.529663%);stroke-opacity:1;stroke-miterlimit:10;" d="M 116.038531 15.926344 L 113.644 42.445875 C 113.315875 46.090406 110.0815 49.043531 106.42525 49.043531 L 25.569781 49.043531 C 21.909625 49.043531 18.679156 46.090406 18.351031 42.445875 L 16.186969 18.504469 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(3.529358%,63.920593%,83.529663%);fill-opacity:1;" d="M 185.5625 81.097656 L 187.996094 77.15625 L 185.792969 78.519531 L 183.871094 76.785156 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 113.046344 15.926344 L 110.644 27.258375 C 110.319781 28.781813 108.796344 30.016188 107.241656 30.016188 L 79.421344 30.016188 C 77.866656 30.016188 76.343219 28.781813 76.019 27.258375 L 74.151813 18.4615 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 243.222656 81.097656 L 246.109375 77.472656 L 243.757812 78.5625 L 242.054688 76.613281 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 154.784625 15.926344 L 152.394 49.762281 C 152.065875 54.422438 148.011188 58.199781 143.343219 58.199781 L 51.019 58.199781 C 46.347125 58.199781 42.296344 54.422438 41.968219 49.762281 L 39.757281 18.508375 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 209.179688 81.097656 L 211.539062 77.109375 L 209.363281 78.515625 L 207.40625 76.820312 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 151.796344 15.926344 L 149.394 27.258375 C 149.069781 28.781813 147.546344 30.016188 145.991656 30.016188 L 125.827594 30.016188 C 124.272906 30.016188 122.749469 28.781813 122.42525 27.258375 L 120.558063 18.4615 " transform="matrix(1,0,0,-1,169.606,97.024)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 289.628906 81.097656 L 292.515625 77.472656 L 290.164062 78.5625 L 288.460938 76.613281 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

View File

@ -0,0 +1,871 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="514pt" height="250pt" viewBox="0 0 514 250" version="1.1">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d="M 1.359375 -6.21875 L 1.625 -5.8125 C 1.65625 -5.71875 1.734375 -5.6875 1.828125 -5.6875 C 1.859375 -5.6875 1.90625 -5.703125 1.953125 -5.734375 C 2 -5.765625 2.078125 -5.8125 2.140625 -5.84375 C 2.21875 -5.890625 2.296875 -5.921875 2.40625 -5.953125 C 2.515625 -5.984375 2.640625 -6 2.78125 -6 C 2.984375 -6 3.15625 -5.953125 3.296875 -5.84375 C 3.421875 -5.734375 3.484375 -5.578125 3.484375 -5.40625 C 3.484375 -5.25 3.46875 -5.125 3.40625 -5.015625 C 3.34375 -4.921875 3.265625 -4.828125 3.1875 -4.734375 C 3.09375 -4.65625 3 -4.578125 2.90625 -4.5 C 2.796875 -4.4375 2.71875 -4.359375 2.625 -4.28125 C 2.546875 -4.203125 2.484375 -4.109375 2.4375 -4.03125 C 2.390625 -3.921875 2.375 -3.828125 2.390625 -3.703125 L 2.453125 -3.0625 L 3.125 -3.0625 L 3.21875 -3.625 C 3.234375 -3.71875 3.265625 -3.796875 3.328125 -3.859375 C 3.390625 -3.921875 3.46875 -3.984375 3.5625 -4.0625 C 3.640625 -4.140625 3.734375 -4.203125 3.828125 -4.28125 C 3.9375 -4.359375 4.03125 -4.453125 4.09375 -4.5625 C 4.1875 -4.671875 4.25 -4.796875 4.3125 -4.9375 C 4.359375 -5.09375 4.390625 -5.25 4.390625 -5.453125 C 4.390625 -5.65625 4.359375 -5.84375 4.28125 -6.015625 C 4.203125 -6.171875 4.09375 -6.3125 3.96875 -6.4375 C 3.828125 -6.546875 3.671875 -6.640625 3.484375 -6.703125 C 3.296875 -6.765625 3.09375 -6.796875 2.859375 -6.796875 C 2.6875 -6.796875 2.546875 -6.78125 2.40625 -6.75 C 2.25 -6.71875 2.125 -6.6875 2 -6.625 C 1.875 -6.578125 1.75 -6.515625 1.65625 -6.453125 C 1.546875 -6.375 1.453125 -6.296875 1.359375 -6.21875 Z M 2.15625 -1.59375 C 2.15625 -1.421875 2.21875 -1.28125 2.328125 -1.171875 C 2.4375 -1.046875 2.578125 -1 2.765625 -1 C 2.84375 -1 2.921875 -1.015625 2.984375 -1.03125 C 3.0625 -1.0625 3.125 -1.109375 3.171875 -1.171875 C 3.234375 -1.21875 3.265625 -1.28125 3.296875 -1.359375 C 3.328125 -1.421875 3.34375 -1.515625 3.34375 -1.59375 C 3.34375 -1.671875 3.328125 -1.75 3.296875 -1.828125 C 3.265625 -1.90625 3.234375 -1.96875 3.171875 -2.015625 C 3.125 -2.078125 3.0625 -2.125 2.984375 -2.15625 C 2.921875 -2.1875 2.84375 -2.203125 2.765625 -2.203125 C 2.578125 -2.203125 2.4375 -2.140625 2.328125 -2.015625 C 2.21875 -1.90625 2.15625 -1.765625 2.15625 -1.59375 Z M 0.25 -7.8125 L 0.25 0 L 5.5625 0 L 5.5625 -7.8125 Z M 0.515625 -0.296875 L 0.515625 -7.515625 L 5.25 -7.515625 L 5.25 -0.296875 Z M 0.515625 -0.296875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-1">
<path style="stroke:none;" d="M 2.203125 0 L 2.203125 -7.8125 L 1.140625 -7.8125 L 1.140625 0 Z M 2.203125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 4.5625 -4.546875 L 4.828125 -4.890625 C 4.59375 -5.125 4.328125 -5.296875 4.03125 -5.421875 C 3.734375 -5.546875 3.390625 -5.609375 3 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.890625 -5.40625 C 1.578125 -5.25 1.296875 -5.0625 1.078125 -4.8125 C 0.859375 -4.546875 0.6875 -4.25 0.578125 -3.90625 C 0.453125 -3.5625 0.40625 -3.171875 0.40625 -2.765625 C 0.40625 -2.3125 0.46875 -1.90625 0.59375 -1.5625 C 0.71875 -1.203125 0.890625 -0.90625 1.109375 -0.671875 C 1.328125 -0.421875 1.578125 -0.234375 1.875 -0.109375 C 2.171875 0.015625 2.5 0.078125 2.84375 0.078125 C 3.234375 0.078125 3.625 0.015625 3.984375 -0.125 C 4.34375 -0.265625 4.640625 -0.484375 4.875 -0.78125 L 4.609375 -1.125 C 4.5625 -1.1875 4.5 -1.21875 4.421875 -1.21875 C 4.359375 -1.21875 4.296875 -1.1875 4.21875 -1.140625 C 4.15625 -1.078125 4.078125 -1.015625 3.96875 -0.953125 C 3.875 -0.875 3.75 -0.8125 3.59375 -0.765625 C 3.4375 -0.703125 3.25 -0.671875 3.015625 -0.671875 C 2.765625 -0.671875 2.546875 -0.71875 2.34375 -0.8125 C 2.140625 -0.90625 1.96875 -1.046875 1.84375 -1.21875 C 1.703125 -1.390625 1.59375 -1.609375 1.515625 -1.875 C 1.4375 -2.125 1.40625 -2.4375 1.40625 -2.765625 C 1.40625 -3.09375 1.4375 -3.375 1.5 -3.625 C 1.578125 -3.890625 1.6875 -4.109375 1.828125 -4.296875 C 1.96875 -4.46875 2.140625 -4.609375 2.34375 -4.71875 C 2.546875 -4.796875 2.796875 -4.859375 3.0625 -4.859375 C 3.265625 -4.859375 3.4375 -4.828125 3.578125 -4.78125 C 3.71875 -4.734375 3.828125 -4.6875 3.9375 -4.640625 C 4.03125 -4.578125 4.109375 -4.53125 4.171875 -4.484375 C 4.234375 -4.4375 4.296875 -4.421875 4.359375 -4.421875 C 4.40625 -4.421875 4.453125 -4.421875 4.484375 -4.453125 C 4.5 -4.46875 4.53125 -4.5 4.5625 -4.546875 Z M 4.5625 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-3">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.171875 -5.609375 2.84375 -5.53125 2.546875 -5.390625 C 2.265625 -5.234375 2 -5.03125 1.765625 -4.78125 L 1.765625 -8.03125 L 0.796875 -8.03125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-4">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.109375 C 1.9375 -4.34375 2.125 -4.515625 2.328125 -4.640625 C 2.53125 -4.765625 2.765625 -4.84375 3 -4.84375 C 3.34375 -4.84375 3.59375 -4.734375 3.78125 -4.515625 C 3.953125 -4.296875 4.046875 -3.953125 4.046875 -3.515625 L 4.046875 0 L 5.015625 0 L 5.015625 -3.515625 C 5.015625 -3.734375 5.046875 -3.921875 5.109375 -4.09375 C 5.171875 -4.265625 5.265625 -4.390625 5.375 -4.5 C 5.484375 -4.609375 5.609375 -4.6875 5.75 -4.75 C 5.890625 -4.8125 6.046875 -4.84375 6.203125 -4.84375 C 6.5625 -4.84375 6.84375 -4.71875 7.03125 -4.5 C 7.21875 -4.28125 7.3125 -3.953125 7.3125 -3.515625 L 7.3125 0 L 8.28125 0 L 8.28125 -3.515625 C 8.28125 -3.84375 8.234375 -4.15625 8.15625 -4.40625 C 8.078125 -4.671875 7.953125 -4.890625 7.796875 -5.0625 C 7.640625 -5.25 7.4375 -5.375 7.21875 -5.46875 C 6.984375 -5.5625 6.734375 -5.609375 6.4375 -5.609375 C 6.265625 -5.609375 6.078125 -5.59375 5.90625 -5.546875 C 5.71875 -5.5 5.5625 -5.4375 5.40625 -5.34375 C 5.25 -5.25 5.109375 -5.125 4.984375 -4.984375 C 4.859375 -4.828125 4.75 -4.65625 4.671875 -4.453125 C 4.578125 -4.8125 4.40625 -5.09375 4.171875 -5.296875 C 3.953125 -5.5 3.640625 -5.609375 3.265625 -5.609375 C 2.9375 -5.609375 2.640625 -5.53125 2.390625 -5.375 C 2.140625 -5.21875 1.90625 -5 1.703125 -4.75 L 1.640625 -5.328125 C 1.59375 -5.453125 1.515625 -5.53125 1.375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-5">
<path style="stroke:none;" d="M 1.296875 -7.03125 C 1.296875 -7.109375 1.28125 -7.1875 1.25 -7.265625 C 1.21875 -7.34375 1.171875 -7.40625 1.125 -7.46875 C 1.0625 -7.53125 1 -7.5625 0.921875 -7.609375 C 0.84375 -7.640625 0.765625 -7.65625 0.6875 -7.65625 C 0.59375 -7.65625 0.53125 -7.640625 0.453125 -7.609375 C 0.375 -7.5625 0.3125 -7.53125 0.265625 -7.46875 C 0.203125 -7.40625 0.15625 -7.34375 0.125 -7.265625 C 0.09375 -7.1875 0.078125 -7.109375 0.078125 -7.03125 C 0.078125 -6.953125 0.09375 -6.859375 0.125 -6.796875 C 0.15625 -6.71875 0.203125 -6.65625 0.265625 -6.609375 C 0.3125 -6.546875 0.375 -6.5 0.453125 -6.46875 C 0.53125 -6.4375 0.59375 -6.421875 0.6875 -6.421875 C 0.765625 -6.421875 0.84375 -6.4375 0.921875 -6.46875 C 1 -6.5 1.0625 -6.546875 1.125 -6.609375 C 1.171875 -6.65625 1.21875 -6.71875 1.25 -6.796875 C 1.28125 -6.859375 1.296875 -6.953125 1.296875 -7.03125 Z M 3.265625 -7.03125 C 3.265625 -7.109375 3.25 -7.1875 3.21875 -7.265625 C 3.171875 -7.34375 3.140625 -7.40625 3.078125 -7.46875 C 3.015625 -7.53125 2.953125 -7.5625 2.875 -7.609375 C 2.8125 -7.640625 2.71875 -7.65625 2.640625 -7.65625 C 2.5625 -7.65625 2.484375 -7.640625 2.40625 -7.609375 C 2.328125 -7.5625 2.265625 -7.53125 2.21875 -7.46875 C 2.15625 -7.40625 2.109375 -7.34375 2.078125 -7.265625 C 2.046875 -7.1875 2.03125 -7.109375 2.03125 -7.03125 C 2.03125 -6.953125 2.046875 -6.859375 2.078125 -6.796875 C 2.109375 -6.71875 2.15625 -6.65625 2.21875 -6.609375 C 2.265625 -6.546875 2.328125 -6.5 2.40625 -6.46875 C 2.484375 -6.4375 2.5625 -6.421875 2.640625 -6.421875 C 2.71875 -6.421875 2.8125 -6.4375 2.875 -6.46875 C 2.953125 -6.5 3.015625 -6.546875 3.078125 -6.609375 C 3.140625 -6.65625 3.171875 -6.71875 3.21875 -6.796875 C 3.25 -6.859375 3.265625 -6.953125 3.265625 -7.03125 Z M 3.265625 -7.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-6">
<path style="stroke:none;" d="M 3.03125 -5.609375 C 2.625 -5.609375 2.265625 -5.546875 1.9375 -5.40625 C 1.609375 -5.265625 1.34375 -5.078125 1.109375 -4.84375 C 0.875 -4.59375 0.703125 -4.296875 0.578125 -3.9375 C 0.453125 -3.59375 0.390625 -3.203125 0.390625 -2.765625 C 0.390625 -2.328125 0.453125 -1.9375 0.578125 -1.59375 C 0.703125 -1.234375 0.875 -0.9375 1.109375 -0.6875 C 1.34375 -0.453125 1.609375 -0.25 1.9375 -0.125 C 2.265625 0.015625 2.625 0.078125 3.03125 0.078125 C 3.4375 0.078125 3.796875 0.015625 4.125 -0.125 C 4.453125 -0.25 4.734375 -0.453125 4.953125 -0.6875 C 5.1875 -0.9375 5.359375 -1.234375 5.46875 -1.59375 C 5.59375 -1.9375 5.65625 -2.328125 5.65625 -2.765625 C 5.65625 -3.203125 5.59375 -3.59375 5.46875 -3.9375 C 5.359375 -4.296875 5.1875 -4.59375 4.953125 -4.84375 C 4.734375 -5.078125 4.453125 -5.265625 4.125 -5.40625 C 3.796875 -5.546875 3.4375 -5.609375 3.03125 -5.609375 Z M 3.03125 -0.6875 C 2.75 -0.6875 2.515625 -0.734375 2.3125 -0.828125 C 2.109375 -0.921875 1.9375 -1.046875 1.796875 -1.234375 C 1.671875 -1.40625 1.5625 -1.625 1.5 -1.875 C 1.421875 -2.140625 1.390625 -2.4375 1.390625 -2.765625 C 1.390625 -3.09375 1.421875 -3.375 1.5 -3.640625 C 1.5625 -3.90625 1.671875 -4.109375 1.796875 -4.296875 C 1.9375 -4.484375 2.109375 -4.609375 2.3125 -4.703125 C 2.515625 -4.796875 2.75 -4.84375 3.03125 -4.84375 C 3.578125 -4.84375 3.984375 -4.65625 4.25 -4.296875 C 4.515625 -3.9375 4.65625 -3.421875 4.65625 -2.765625 C 4.65625 -2.109375 4.515625 -1.59375 4.25 -1.234375 C 3.984375 -0.859375 3.578125 -0.6875 3.03125 -0.6875 Z M 3.03125 -0.6875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-7">
<path style="stroke:none;" d="M 2.46875 0.09375 C 2.71875 0.09375 2.96875 0.046875 3.203125 -0.046875 C 3.4375 -0.140625 3.640625 -0.25 3.8125 -0.421875 L 3.515625 -0.875 C 3.484375 -0.9375 3.4375 -0.96875 3.390625 -0.96875 C 3.359375 -0.96875 3.328125 -0.953125 3.28125 -0.921875 C 3.25 -0.90625 3.203125 -0.875 3.140625 -0.84375 C 3.09375 -0.8125 3.03125 -0.78125 2.953125 -0.75 C 2.875 -0.71875 2.796875 -0.703125 2.6875 -0.703125 C 2.515625 -0.703125 2.359375 -0.765625 2.25 -0.875 C 2.140625 -1 2.078125 -1.15625 2.078125 -1.390625 L 2.078125 -4.71875 L 3.671875 -4.71875 L 3.671875 -5.421875 L 2.078125 -5.421875 L 2.078125 -7.3125 L 1.59375 -7.3125 C 1.53125 -7.3125 1.484375 -7.296875 1.4375 -7.265625 C 1.40625 -7.234375 1.375 -7.1875 1.375 -7.125 L 1.140625 -5.421875 L 0.234375 -5.3125 L 0.234375 -4.921875 C 0.234375 -4.859375 0.265625 -4.796875 0.296875 -4.765625 C 0.34375 -4.734375 0.390625 -4.71875 0.453125 -4.71875 L 1.109375 -4.71875 L 1.109375 -1.328125 C 1.109375 -0.875 1.234375 -0.53125 1.46875 -0.28125 C 1.703125 -0.03125 2.03125 0.09375 2.46875 0.09375 Z M 2.46875 0.09375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-8">
<path style="stroke:none;" d="M 2.984375 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.90625 -5.40625 C 1.578125 -5.265625 1.3125 -5.078125 1.09375 -4.828125 C 0.859375 -4.578125 0.703125 -4.28125 0.578125 -3.953125 C 0.46875 -3.625 0.40625 -3.265625 0.40625 -2.875 C 0.40625 -2.40625 0.46875 -1.96875 0.59375 -1.609375 C 0.734375 -1.25 0.921875 -0.9375 1.140625 -0.6875 C 1.390625 -0.4375 1.65625 -0.25 1.984375 -0.125 C 2.296875 0.015625 2.65625 0.078125 3.03125 0.078125 C 3.234375 0.078125 3.4375 0.0625 3.640625 0.015625 C 3.84375 -0.015625 4.046875 -0.0625 4.234375 -0.125 C 4.421875 -0.203125 4.609375 -0.28125 4.765625 -0.390625 C 4.9375 -0.5 5.078125 -0.625 5.203125 -0.78125 L 4.921875 -1.125 C 4.890625 -1.1875 4.828125 -1.21875 4.75 -1.21875 C 4.6875 -1.21875 4.609375 -1.1875 4.53125 -1.140625 C 4.4375 -1.078125 4.328125 -1.015625 4.203125 -0.953125 C 4.078125 -0.890625 3.921875 -0.828125 3.75 -0.78125 C 3.578125 -0.71875 3.359375 -0.6875 3.125 -0.6875 C 2.859375 -0.6875 2.625 -0.734375 2.40625 -0.8125 C 2.203125 -0.90625 2.015625 -1.03125 1.859375 -1.203125 C 1.71875 -1.375 1.59375 -1.59375 1.5 -1.84375 C 1.421875 -2.109375 1.375 -2.40625 1.359375 -2.765625 L 5.03125 -2.765625 C 5.125 -2.765625 5.1875 -2.78125 5.21875 -2.828125 C 5.25 -2.890625 5.265625 -2.984375 5.265625 -3.140625 C 5.265625 -3.53125 5.21875 -3.875 5.109375 -4.1875 C 4.984375 -4.5 4.828125 -4.75 4.625 -4.96875 C 4.421875 -5.171875 4.171875 -5.328125 3.90625 -5.4375 C 3.625 -5.5625 3.3125 -5.609375 2.984375 -5.609375 Z M 3 -4.890625 C 3.234375 -4.890625 3.421875 -4.859375 3.59375 -4.78125 C 3.765625 -4.71875 3.921875 -4.609375 4.03125 -4.46875 C 4.15625 -4.328125 4.25 -4.171875 4.3125 -3.984375 C 4.375 -3.796875 4.40625 -3.59375 4.40625 -3.359375 L 1.390625 -3.359375 C 1.46875 -3.84375 1.625 -4.21875 1.890625 -4.5 C 2.171875 -4.765625 2.53125 -4.890625 3 -4.890625 Z M 3 -4.890625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-9">
<path style="stroke:none;" d="M 4.6875 0 L 5.265625 0 L 5.265625 -8.03125 L 4.296875 -8.03125 L 4.296875 -4.96875 C 4.09375 -5.171875 3.890625 -5.328125 3.640625 -5.453125 C 3.40625 -5.5625 3.125 -5.625 2.78125 -5.625 C 2.40625 -5.625 2.078125 -5.546875 1.78125 -5.40625 C 1.484375 -5.25 1.234375 -5.046875 1.03125 -4.796875 C 0.828125 -4.53125 0.671875 -4.234375 0.5625 -3.875 C 0.453125 -3.53125 0.390625 -3.15625 0.390625 -2.75 C 0.390625 -2.28125 0.4375 -1.875 0.546875 -1.53125 C 0.640625 -1.171875 0.78125 -0.875 0.953125 -0.640625 C 1.140625 -0.40625 1.359375 -0.234375 1.625 -0.109375 C 1.875 0.015625 2.171875 0.078125 2.484375 0.078125 C 2.875 0.078125 3.21875 -0.015625 3.515625 -0.1875 C 3.828125 -0.359375 4.09375 -0.578125 4.328125 -0.875 L 4.421875 -0.203125 C 4.453125 -0.0625 4.546875 0 4.6875 0 Z M 2.796875 -0.703125 C 2.578125 -0.703125 2.375 -0.75 2.203125 -0.828125 C 2.03125 -0.90625 1.875 -1.015625 1.765625 -1.1875 C 1.640625 -1.359375 1.546875 -1.5625 1.484375 -1.828125 C 1.421875 -2.078125 1.390625 -2.390625 1.390625 -2.75 C 1.390625 -3.421875 1.53125 -3.953125 1.8125 -4.3125 C 2.09375 -4.671875 2.484375 -4.859375 3 -4.859375 C 3.25 -4.859375 3.484375 -4.8125 3.703125 -4.71875 C 3.921875 -4.625 4.109375 -4.453125 4.296875 -4.21875 L 4.296875 -1.546875 C 4.09375 -1.28125 3.875 -1.078125 3.625 -0.921875 C 3.390625 -0.78125 3.125 -0.703125 2.796875 -0.703125 Z M 2.796875 -0.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-10">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.15625 -5.609375 2.8125 -5.53125 2.515625 -5.359375 C 2.21875 -5.203125 1.953125 -4.984375 1.71875 -4.71875 L 1.640625 -5.328125 C 1.59375 -5.453125 1.515625 -5.53125 1.375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-11">
<path style="stroke:none;" d="M 5.765625 -7.8125 L 0.953125 -7.8125 L 0.953125 0 L 2.015625 0 L 2.015625 -3.359375 L 5.21875 -3.359375 L 5.21875 -4.21875 L 2.015625 -4.21875 L 2.015625 -6.953125 L 5.765625 -6.953125 Z M 5.765625 -7.8125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-12">
<path style="stroke:none;" d="M 1.875 -8.03125 L 0.90625 -8.03125 L 0.90625 0 L 1.875 0 Z M 1.875 -8.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-13">
<path style="stroke:none;" d="M 1.640625 -5.53125 L 0.671875 -5.53125 L 0.671875 -2 C 0.671875 -1.6875 0.703125 -1.40625 0.78125 -1.140625 C 0.859375 -0.890625 0.96875 -0.671875 1.140625 -0.484375 C 1.296875 -0.3125 1.484375 -0.15625 1.71875 -0.0625 C 1.953125 0.03125 2.21875 0.09375 2.515625 0.09375 C 2.90625 0.09375 3.234375 0 3.546875 -0.15625 C 3.84375 -0.3125 4.109375 -0.53125 4.34375 -0.796875 L 4.421875 -0.203125 C 4.453125 -0.0625 4.546875 0 4.6875 0 L 5.265625 0 L 5.265625 -5.53125 L 4.296875 -5.53125 L 4.296875 -1.453125 C 4.078125 -1.203125 3.84375 -1.03125 3.59375 -0.890625 C 3.34375 -0.75 3.078125 -0.6875 2.796875 -0.6875 C 2.40625 -0.6875 2.109375 -0.796875 1.921875 -1.03125 C 1.734375 -1.265625 1.640625 -1.578125 1.640625 -2 Z M 1.640625 -5.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-14">
<path style="stroke:none;" d="M 2.65625 -5.609375 C 2.34375 -5.609375 2.078125 -5.578125 1.8125 -5.484375 C 1.5625 -5.40625 1.34375 -5.296875 1.15625 -5.140625 C 0.96875 -4.984375 0.8125 -4.796875 0.71875 -4.5625 C 0.609375 -4.359375 0.5625 -4.109375 0.5625 -3.84375 C 0.5625 -3.5 0.640625 -3.203125 0.796875 -2.953125 C 0.953125 -2.703125 1.15625 -2.5 1.4375 -2.34375 C 1.3125 -2.28125 1.21875 -2.21875 1.125 -2.140625 C 1.046875 -2.0625 0.96875 -1.984375 0.90625 -1.90625 C 0.84375 -1.828125 0.796875 -1.734375 0.78125 -1.640625 C 0.75 -1.5625 0.734375 -1.484375 0.734375 -1.40625 C 0.734375 -1.203125 0.78125 -1.03125 0.875 -0.921875 C 0.953125 -0.796875 1.078125 -0.6875 1.25 -0.625 C 0.9375 -0.5 0.703125 -0.359375 0.53125 -0.15625 C 0.359375 0.015625 0.265625 0.25 0.265625 0.53125 C 0.265625 0.71875 0.328125 0.90625 0.421875 1.078125 C 0.53125 1.265625 0.671875 1.40625 0.875 1.546875 C 1.078125 1.6875 1.328125 1.78125 1.625 1.875 C 1.9375 1.953125 2.28125 1.984375 2.6875 1.984375 C 3.09375 1.984375 3.453125 1.9375 3.78125 1.828125 C 4.09375 1.734375 4.359375 1.59375 4.59375 1.421875 C 4.8125 1.25 4.984375 1.046875 5.09375 0.828125 C 5.21875 0.609375 5.265625 0.375 5.265625 0.140625 C 5.265625 -0.109375 5.21875 -0.328125 5.109375 -0.484375 C 5.015625 -0.640625 4.875 -0.765625 4.6875 -0.859375 C 4.515625 -0.953125 4.328125 -1.015625 4.09375 -1.046875 C 3.875 -1.09375 3.65625 -1.125 3.421875 -1.140625 C 3.1875 -1.15625 2.96875 -1.171875 2.75 -1.171875 C 2.515625 -1.171875 2.328125 -1.203125 2.15625 -1.234375 C 1.96875 -1.25 1.828125 -1.296875 1.734375 -1.375 C 1.625 -1.4375 1.578125 -1.53125 1.578125 -1.671875 C 1.578125 -1.75 1.609375 -1.828125 1.65625 -1.90625 C 1.71875 -2 1.8125 -2.078125 1.921875 -2.15625 C 2.15625 -2.09375 2.40625 -2.0625 2.65625 -2.0625 C 2.953125 -2.0625 3.234375 -2.09375 3.484375 -2.1875 C 3.734375 -2.265625 3.953125 -2.390625 4.140625 -2.546875 C 4.328125 -2.703125 4.46875 -2.890625 4.5625 -3.109375 C 4.671875 -3.328125 4.734375 -3.578125 4.734375 -3.84375 C 4.734375 -4.125 4.671875 -4.390625 4.546875 -4.625 L 5.171875 -4.71875 C 5.328125 -4.75 5.40625 -4.828125 5.40625 -4.953125 L 5.40625 -5.3125 L 3.90625 -5.3125 C 3.734375 -5.40625 3.546875 -5.484375 3.328125 -5.546875 C 3.125 -5.59375 2.890625 -5.609375 2.65625 -5.609375 Z M 4.375 0.296875 C 4.375 0.453125 4.34375 0.578125 4.265625 0.703125 C 4.1875 0.8125 4.078125 0.921875 3.9375 1.015625 C 3.796875 1.09375 3.609375 1.15625 3.40625 1.203125 C 3.203125 1.265625 2.96875 1.28125 2.703125 1.28125 C 2.4375 1.28125 2.203125 1.265625 2 1.203125 C 1.8125 1.171875 1.640625 1.109375 1.515625 1.03125 C 1.375 0.953125 1.28125 0.859375 1.21875 0.75 C 1.15625 0.640625 1.125 0.53125 1.125 0.40625 C 1.125 0.203125 1.1875 0.03125 1.3125 -0.109375 C 1.4375 -0.25 1.609375 -0.359375 1.828125 -0.46875 C 2 -0.4375 2.1875 -0.421875 2.390625 -0.40625 C 2.578125 -0.390625 2.765625 -0.375 2.96875 -0.375 C 3.15625 -0.359375 3.328125 -0.34375 3.5 -0.328125 C 3.671875 -0.3125 3.828125 -0.265625 3.953125 -0.234375 C 4.078125 -0.1875 4.1875 -0.109375 4.265625 -0.03125 C 4.34375 0.046875 4.375 0.15625 4.375 0.296875 Z M 2.65625 -2.703125 C 2.46875 -2.703125 2.296875 -2.71875 2.140625 -2.78125 C 2 -2.828125 1.875 -2.90625 1.765625 -3.015625 C 1.65625 -3.109375 1.59375 -3.234375 1.53125 -3.359375 C 1.484375 -3.5 1.453125 -3.640625 1.453125 -3.8125 C 1.453125 -4.15625 1.5625 -4.421875 1.765625 -4.625 C 1.96875 -4.828125 2.265625 -4.921875 2.65625 -4.921875 C 3.046875 -4.921875 3.34375 -4.828125 3.5625 -4.625 C 3.75 -4.421875 3.859375 -4.15625 3.859375 -3.8125 C 3.859375 -3.640625 3.828125 -3.5 3.78125 -3.359375 C 3.734375 -3.234375 3.65625 -3.109375 3.5625 -3.015625 C 3.453125 -2.90625 3.328125 -2.828125 3.171875 -2.78125 C 3.03125 -2.71875 2.859375 -2.703125 2.65625 -2.703125 Z M 2.65625 -2.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-15">
<path style="stroke:none;" d="M 3.953125 -4.609375 L 4.171875 -4.96875 C 3.96875 -5.171875 3.71875 -5.328125 3.421875 -5.4375 C 3.140625 -5.546875 2.8125 -5.609375 2.453125 -5.609375 C 2.140625 -5.609375 1.859375 -5.5625 1.609375 -5.484375 C 1.375 -5.390625 1.171875 -5.28125 1 -5.125 C 0.828125 -4.984375 0.703125 -4.8125 0.609375 -4.609375 C 0.53125 -4.421875 0.484375 -4.21875 0.484375 -4.015625 C 0.484375 -3.78125 0.53125 -3.578125 0.609375 -3.40625 C 0.6875 -3.234375 0.796875 -3.109375 0.9375 -2.984375 C 1.0625 -2.875 1.21875 -2.78125 1.390625 -2.703125 C 1.5625 -2.640625 1.75 -2.5625 1.921875 -2.515625 C 2.109375 -2.453125 2.28125 -2.390625 2.453125 -2.34375 C 2.625 -2.296875 2.78125 -2.21875 2.90625 -2.15625 C 3.046875 -2.078125 3.15625 -2 3.234375 -1.890625 C 3.3125 -1.796875 3.359375 -1.671875 3.359375 -1.515625 C 3.359375 -1.390625 3.34375 -1.28125 3.296875 -1.171875 C 3.25 -1.0625 3.171875 -0.96875 3.078125 -0.890625 C 2.984375 -0.796875 2.875 -0.734375 2.71875 -0.6875 C 2.578125 -0.625 2.421875 -0.609375 2.234375 -0.609375 C 2 -0.609375 1.828125 -0.640625 1.671875 -0.6875 C 1.53125 -0.734375 1.40625 -0.796875 1.296875 -0.859375 C 1.203125 -0.921875 1.109375 -0.96875 1.03125 -1.03125 C 0.96875 -1.078125 0.890625 -1.09375 0.828125 -1.09375 C 0.765625 -1.09375 0.703125 -1.09375 0.671875 -1.0625 C 0.625 -1.03125 0.59375 -1 0.5625 -0.953125 L 0.34375 -0.578125 C 0.5625 -0.390625 0.828125 -0.234375 1.140625 -0.09375 C 1.4375 0.015625 1.796875 0.09375 2.1875 0.09375 C 2.515625 0.09375 2.8125 0.046875 3.078125 -0.046875 C 3.328125 -0.140625 3.546875 -0.265625 3.734375 -0.421875 C 3.90625 -0.578125 4.046875 -0.765625 4.140625 -0.984375 C 4.21875 -1.203125 4.265625 -1.4375 4.265625 -1.6875 C 4.265625 -1.90625 4.234375 -2.109375 4.140625 -2.25 C 4.0625 -2.421875 3.953125 -2.546875 3.828125 -2.65625 C 3.6875 -2.765625 3.53125 -2.859375 3.359375 -2.9375 C 3.203125 -3 3.015625 -3.078125 2.828125 -3.125 C 2.65625 -3.203125 2.484375 -3.25 2.3125 -3.296875 C 2.140625 -3.359375 1.984375 -3.40625 1.859375 -3.484375 C 1.71875 -3.5625 1.609375 -3.640625 1.53125 -3.734375 C 1.453125 -3.828125 1.40625 -3.9375 1.40625 -4.078125 C 1.40625 -4.203125 1.421875 -4.296875 1.484375 -4.390625 C 1.53125 -4.5 1.609375 -4.578125 1.6875 -4.65625 C 1.78125 -4.71875 1.890625 -4.78125 2.03125 -4.828125 C 2.15625 -4.859375 2.3125 -4.890625 2.46875 -4.890625 C 2.65625 -4.890625 2.828125 -4.859375 2.96875 -4.828125 C 3.09375 -4.78125 3.21875 -4.734375 3.3125 -4.6875 C 3.421875 -4.640625 3.5 -4.59375 3.578125 -4.546875 C 3.640625 -4.515625 3.703125 -4.5 3.75 -4.5 C 3.84375 -4.5 3.921875 -4.53125 3.953125 -4.609375 Z M 3.953125 -4.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-16">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -3.515625 C 1.921875 -3.890625 2.109375 -4.171875 2.328125 -4.375 C 2.5625 -4.5625 2.84375 -4.671875 3.1875 -4.671875 C 3.375 -4.671875 3.515625 -4.65625 3.625 -4.609375 C 3.734375 -4.578125 3.8125 -4.5625 3.859375 -4.5625 C 3.953125 -4.5625 4 -4.609375 4.03125 -4.703125 L 4.15625 -5.421875 C 4.046875 -5.484375 3.9375 -5.53125 3.8125 -5.578125 C 3.6875 -5.609375 3.546875 -5.625 3.390625 -5.625 C 3.015625 -5.625 2.6875 -5.515625 2.421875 -5.296875 C 2.140625 -5.078125 1.90625 -4.78125 1.71875 -4.390625 L 1.65625 -5.25 C 1.640625 -5.359375 1.609375 -5.421875 1.578125 -5.46875 C 1.53125 -5.5 1.453125 -5.53125 1.359375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-17">
<path style="stroke:none;" d="M 1.875 -5.53125 L 0.90625 -5.53125 L 0.90625 0 L 1.875 0 Z M 2.09375 -7.265625 C 2.09375 -7.34375 2.078125 -7.4375 2.046875 -7.53125 C 2 -7.609375 1.953125 -7.6875 1.890625 -7.75 C 1.828125 -7.8125 1.75 -7.859375 1.65625 -7.90625 C 1.578125 -7.9375 1.484375 -7.953125 1.390625 -7.953125 C 1.296875 -7.953125 1.203125 -7.9375 1.140625 -7.90625 C 1.046875 -7.859375 0.96875 -7.8125 0.921875 -7.75 C 0.84375 -7.6875 0.796875 -7.609375 0.765625 -7.53125 C 0.71875 -7.4375 0.703125 -7.34375 0.703125 -7.265625 C 0.703125 -7.171875 0.71875 -7.078125 0.765625 -6.984375 C 0.796875 -6.921875 0.84375 -6.84375 0.921875 -6.765625 C 0.96875 -6.71875 1.046875 -6.65625 1.140625 -6.625 C 1.203125 -6.59375 1.296875 -6.578125 1.390625 -6.578125 C 1.484375 -6.578125 1.578125 -6.59375 1.65625 -6.625 C 1.75 -6.65625 1.828125 -6.71875 1.890625 -6.765625 C 1.953125 -6.84375 2 -6.921875 2.046875 -6.984375 C 2.078125 -7.078125 2.09375 -7.171875 2.09375 -7.265625 Z M 2.09375 -7.265625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-18">
<path style="stroke:none;" d="M 0.828125 0 L 1.453125 0 C 1.59375 0 1.671875 -0.078125 1.703125 -0.203125 L 1.75 -0.703125 C 1.9375 -0.46875 2.15625 -0.265625 2.40625 -0.125 C 2.65625 0 2.96875 0.078125 3.3125 0.078125 C 3.6875 0.078125 4.015625 0 4.3125 -0.140625 C 4.609375 -0.296875 4.859375 -0.484375 5.078125 -0.75 C 5.265625 -1 5.4375 -1.3125 5.546875 -1.65625 C 5.65625 -2.015625 5.703125 -2.390625 5.703125 -2.796875 C 5.703125 -3.25 5.65625 -3.65625 5.5625 -4.015625 C 5.453125 -4.359375 5.3125 -4.65625 5.140625 -4.890625 C 4.953125 -5.125 4.734375 -5.3125 4.484375 -5.4375 C 4.21875 -5.546875 3.9375 -5.609375 3.609375 -5.609375 C 3.234375 -5.609375 2.890625 -5.53125 2.59375 -5.359375 C 2.296875 -5.203125 2.03125 -5 1.8125 -4.734375 L 1.8125 -8.03125 L 0.828125 -8.03125 Z M 3.296875 -4.84375 C 3.515625 -4.84375 3.71875 -4.796875 3.890625 -4.71875 C 4.0625 -4.640625 4.203125 -4.53125 4.328125 -4.359375 C 4.453125 -4.1875 4.546875 -3.984375 4.609375 -3.71875 C 4.671875 -3.46875 4.703125 -3.15625 4.703125 -2.796875 C 4.703125 -2.109375 4.5625 -1.59375 4.28125 -1.234375 C 4.015625 -0.859375 3.609375 -0.671875 3.09375 -0.671875 C 2.828125 -0.671875 2.59375 -0.71875 2.390625 -0.828125 C 2.171875 -0.921875 1.984375 -1.09375 1.8125 -1.328125 L 1.8125 -4 C 2 -4.265625 2.21875 -4.46875 2.46875 -4.625 C 2.703125 -4.765625 2.984375 -4.84375 3.296875 -4.84375 Z M 3.296875 -4.84375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-19">
<path style="stroke:none;" d="M 4.859375 0 L 4.859375 -3.53125 C 4.859375 -3.84375 4.8125 -4.125 4.734375 -4.390625 C 4.640625 -4.640625 4.515625 -4.859375 4.359375 -5.046875 C 4.1875 -5.21875 3.984375 -5.359375 3.75 -5.46875 C 3.515625 -5.578125 3.234375 -5.625 2.921875 -5.625 C 2.5 -5.625 2.109375 -5.546875 1.75 -5.40625 C 1.40625 -5.25 1.078125 -5.03125 0.765625 -4.75 L 0.9375 -4.4375 C 0.96875 -4.390625 1.015625 -4.34375 1.0625 -4.3125 C 1.109375 -4.265625 1.171875 -4.25 1.234375 -4.25 C 1.3125 -4.25 1.40625 -4.28125 1.484375 -4.34375 C 1.578125 -4.40625 1.671875 -4.46875 1.78125 -4.546875 C 1.90625 -4.625 2.046875 -4.6875 2.21875 -4.75 C 2.375 -4.8125 2.578125 -4.84375 2.8125 -4.84375 C 3.171875 -4.84375 3.4375 -4.734375 3.625 -4.5 C 3.8125 -4.28125 3.90625 -3.96875 3.90625 -3.53125 L 3.90625 -3.109375 C 3.265625 -3.09375 2.75 -3.03125 2.3125 -2.9375 C 1.875 -2.828125 1.53125 -2.703125 1.265625 -2.546875 C 1 -2.390625 0.796875 -2.21875 0.6875 -2 C 0.5625 -1.8125 0.5 -1.59375 0.5 -1.375 C 0.5 -1.125 0.546875 -0.90625 0.625 -0.734375 C 0.703125 -0.546875 0.8125 -0.390625 0.953125 -0.265625 C 1.09375 -0.15625 1.25 -0.0625 1.4375 0 C 1.625 0.046875 1.828125 0.09375 2.046875 0.09375 C 2.25 0.09375 2.453125 0.078125 2.625 0.03125 C 2.796875 0 2.953125 -0.046875 3.109375 -0.125 C 3.265625 -0.203125 3.40625 -0.28125 3.546875 -0.390625 C 3.6875 -0.484375 3.828125 -0.609375 3.96875 -0.734375 L 4.078125 -0.234375 C 4.09375 -0.140625 4.140625 -0.078125 4.1875 -0.046875 C 4.25 -0.015625 4.328125 0 4.421875 0 Z M 2.328125 -0.59375 C 2.203125 -0.59375 2.09375 -0.609375 1.984375 -0.640625 C 1.875 -0.671875 1.78125 -0.71875 1.703125 -0.78125 C 1.609375 -0.859375 1.546875 -0.9375 1.5 -1.046875 C 1.453125 -1.15625 1.4375 -1.28125 1.4375 -1.421875 C 1.4375 -1.578125 1.484375 -1.71875 1.578125 -1.84375 C 1.65625 -1.96875 1.796875 -2.0625 2 -2.15625 C 2.1875 -2.25 2.453125 -2.328125 2.765625 -2.375 C 3.0625 -2.4375 3.453125 -2.46875 3.90625 -2.484375 L 3.90625 -1.34375 C 3.796875 -1.21875 3.671875 -1.125 3.5625 -1.03125 C 3.453125 -0.9375 3.328125 -0.859375 3.203125 -0.796875 C 3.078125 -0.734375 2.9375 -0.6875 2.796875 -0.640625 C 2.65625 -0.609375 2.5 -0.59375 2.328125 -0.59375 Z M 2.328125 -0.59375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-0">
<path style="stroke:none;" d="M 1.125 -5.109375 L 1.328125 -4.78125 C 1.375 -4.703125 1.421875 -4.671875 1.5 -4.671875 C 1.53125 -4.671875 1.5625 -4.6875 1.609375 -4.71875 C 1.65625 -4.75 1.703125 -4.78125 1.765625 -4.8125 C 1.828125 -4.84375 1.890625 -4.875 1.984375 -4.890625 C 2.0625 -4.921875 2.171875 -4.9375 2.28125 -4.9375 C 2.453125 -4.9375 2.59375 -4.890625 2.703125 -4.796875 C 2.8125 -4.71875 2.875 -4.59375 2.875 -4.4375 C 2.875 -4.3125 2.84375 -4.21875 2.796875 -4.125 C 2.75 -4.046875 2.6875 -3.96875 2.625 -3.890625 C 2.546875 -3.828125 2.46875 -3.765625 2.390625 -3.703125 C 2.3125 -3.640625 2.234375 -3.578125 2.15625 -3.515625 C 2.09375 -3.453125 2.046875 -3.375 2 -3.3125 C 1.96875 -3.234375 1.953125 -3.140625 1.96875 -3.046875 L 2.015625 -2.515625 L 2.5625 -2.515625 L 2.640625 -2.984375 C 2.65625 -3.046875 2.6875 -3.109375 2.734375 -3.171875 C 2.796875 -3.234375 2.859375 -3.28125 2.921875 -3.34375 C 3 -3.40625 3.078125 -3.453125 3.15625 -3.53125 C 3.234375 -3.59375 3.3125 -3.65625 3.375 -3.75 C 3.4375 -3.84375 3.5 -3.9375 3.546875 -4.0625 C 3.59375 -4.1875 3.609375 -4.328125 3.609375 -4.484375 C 3.609375 -4.65625 3.578125 -4.8125 3.515625 -4.9375 C 3.453125 -5.078125 3.375 -5.203125 3.265625 -5.296875 C 3.15625 -5.390625 3.015625 -5.46875 2.875 -5.515625 C 2.71875 -5.5625 2.546875 -5.59375 2.359375 -5.59375 C 2.21875 -5.59375 2.09375 -5.578125 1.96875 -5.546875 C 1.859375 -5.53125 1.75 -5.5 1.640625 -5.453125 C 1.53125 -5.40625 1.4375 -5.359375 1.359375 -5.296875 C 1.28125 -5.25 1.203125 -5.1875 1.125 -5.109375 Z M 1.78125 -1.3125 C 1.78125 -1.171875 1.828125 -1.046875 1.921875 -0.953125 C 2.015625 -0.859375 2.125 -0.8125 2.265625 -0.8125 C 2.34375 -0.8125 2.40625 -0.828125 2.453125 -0.859375 C 2.515625 -0.875 2.5625 -0.921875 2.609375 -0.953125 C 2.65625 -1 2.6875 -1.0625 2.71875 -1.109375 C 2.734375 -1.171875 2.75 -1.234375 2.75 -1.3125 C 2.75 -1.375 2.734375 -1.4375 2.71875 -1.5 C 2.6875 -1.5625 2.65625 -1.625 2.609375 -1.65625 C 2.5625 -1.703125 2.515625 -1.75 2.453125 -1.765625 C 2.40625 -1.796875 2.34375 -1.8125 2.265625 -1.8125 C 2.125 -1.8125 2.015625 -1.765625 1.921875 -1.65625 C 1.828125 -1.5625 1.78125 -1.453125 1.78125 -1.3125 Z M 0.203125 -6.421875 L 0.203125 0 L 4.5625 0 L 4.5625 -6.421875 Z M 0.421875 -0.234375 L 0.421875 -6.171875 L 4.3125 -6.171875 L 4.3125 -0.234375 Z M 0.421875 -0.234375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-1">
<path style="stroke:none;" d="M 1.8125 0 L 1.8125 -6.421875 L 0.9375 -6.421875 L 0.9375 0 Z M 1.8125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-2">
<path style="stroke:none;" d="M 0.0625 -4.546875 L 1.53125 0 L 2.140625 0 C 2.21875 0 2.28125 -0.046875 2.3125 -0.15625 L 3.34375 -3.234375 C 3.359375 -3.296875 3.375 -3.375 3.390625 -3.4375 C 3.40625 -3.515625 3.421875 -3.578125 3.4375 -3.65625 C 3.453125 -3.578125 3.46875 -3.515625 3.484375 -3.4375 C 3.5 -3.375 3.515625 -3.296875 3.546875 -3.234375 L 4.546875 -0.15625 C 4.578125 -0.046875 4.625 0 4.703125 0 L 5.34375 0 L 6.8125 -4.546875 L 6.203125 -4.546875 C 6.15625 -4.546875 6.109375 -4.53125 6.0625 -4.5 C 6.015625 -4.46875 5.984375 -4.421875 5.984375 -4.375 L 5.09375 -1.453125 C 5.0625 -1.359375 5.03125 -1.265625 5.015625 -1.15625 C 4.984375 -1.046875 4.96875 -0.9375 4.953125 -0.84375 C 4.9375 -0.9375 4.90625 -1.046875 4.875 -1.140625 C 4.859375 -1.25 4.828125 -1.34375 4.796875 -1.453125 L 3.859375 -4.390625 C 3.84375 -4.4375 3.8125 -4.46875 3.78125 -4.5 C 3.734375 -4.53125 3.6875 -4.546875 3.625 -4.546875 L 3.28125 -4.546875 C 3.21875 -4.546875 3.171875 -4.53125 3.140625 -4.5 C 3.109375 -4.46875 3.078125 -4.4375 3.0625 -4.390625 L 2.109375 -1.453125 C 2.078125 -1.34375 2.046875 -1.234375 2.015625 -1.140625 C 1.984375 -1.046875 1.953125 -0.9375 1.921875 -0.84375 C 1.921875 -0.9375 1.890625 -1.046875 1.875 -1.140625 C 1.859375 -1.234375 1.828125 -1.34375 1.8125 -1.453125 L 0.9375 -4.375 C 0.921875 -4.421875 0.890625 -4.46875 0.859375 -4.5 C 0.8125 -4.53125 0.765625 -4.546875 0.6875 -4.546875 Z M 0.0625 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-3">
<path style="stroke:none;" d="M 3.984375 0 L 3.984375 -2.90625 C 3.984375 -3.15625 3.953125 -3.390625 3.890625 -3.609375 C 3.828125 -3.8125 3.71875 -4 3.578125 -4.140625 C 3.453125 -4.296875 3.28125 -4.40625 3.078125 -4.5 C 2.890625 -4.578125 2.65625 -4.625 2.40625 -4.625 C 2.046875 -4.625 1.734375 -4.5625 1.4375 -4.4375 C 1.15625 -4.328125 0.890625 -4.140625 0.625 -3.90625 L 0.78125 -3.640625 C 0.796875 -3.609375 0.828125 -3.5625 0.875 -3.546875 C 0.921875 -3.515625 0.953125 -3.5 1.015625 -3.5 C 1.078125 -3.5 1.15625 -3.53125 1.21875 -3.5625 C 1.296875 -3.625 1.375 -3.671875 1.46875 -3.734375 C 1.5625 -3.796875 1.6875 -3.859375 1.828125 -3.90625 C 1.953125 -3.953125 2.109375 -3.984375 2.3125 -3.984375 C 2.609375 -3.984375 2.828125 -3.890625 2.984375 -3.703125 C 3.125 -3.53125 3.203125 -3.265625 3.203125 -2.90625 L 3.203125 -2.546875 C 2.6875 -2.53125 2.25 -2.5 1.90625 -2.40625 C 1.546875 -2.328125 1.25 -2.21875 1.046875 -2.09375 C 0.8125 -1.96875 0.65625 -1.828125 0.5625 -1.65625 C 0.46875 -1.484375 0.40625 -1.3125 0.40625 -1.140625 C 0.40625 -0.921875 0.453125 -0.75 0.515625 -0.59375 C 0.578125 -0.453125 0.671875 -0.328125 0.78125 -0.21875 C 0.890625 -0.125 1.03125 -0.046875 1.1875 0 C 1.34375 0.046875 1.5 0.078125 1.6875 0.078125 C 1.859375 0.078125 2.015625 0.0625 2.15625 0.03125 C 2.296875 0 2.4375 -0.046875 2.5625 -0.109375 C 2.6875 -0.15625 2.796875 -0.234375 2.921875 -0.328125 C 3.03125 -0.40625 3.140625 -0.5 3.265625 -0.609375 L 3.359375 -0.1875 C 3.375 -0.109375 3.40625 -0.0625 3.453125 -0.03125 C 3.5 -0.015625 3.5625 0 3.640625 0 Z M 1.921875 -0.484375 C 1.8125 -0.484375 1.71875 -0.5 1.625 -0.53125 C 1.53125 -0.546875 1.46875 -0.59375 1.390625 -0.640625 C 1.328125 -0.703125 1.28125 -0.78125 1.234375 -0.859375 C 1.203125 -0.953125 1.171875 -1.046875 1.171875 -1.171875 C 1.171875 -1.296875 1.21875 -1.40625 1.296875 -1.515625 C 1.359375 -1.609375 1.484375 -1.703125 1.640625 -1.78125 C 1.796875 -1.859375 2.015625 -1.90625 2.265625 -1.953125 C 2.53125 -2 2.84375 -2.03125 3.203125 -2.046875 L 3.203125 -1.09375 C 3.109375 -1 3.015625 -0.921875 2.9375 -0.84375 C 2.828125 -0.765625 2.734375 -0.703125 2.640625 -0.65625 C 2.53125 -0.59375 2.421875 -0.5625 2.3125 -0.53125 C 2.1875 -0.5 2.0625 -0.484375 1.921875 -0.484375 Z M 1.921875 -0.484375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-4">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -3.34375 C 1.625 -3.53125 1.8125 -3.6875 2.015625 -3.8125 C 2.21875 -3.921875 2.4375 -3.984375 2.6875 -3.984375 C 3 -3.984375 3.25 -3.890625 3.40625 -3.6875 C 3.5625 -3.5 3.640625 -3.234375 3.640625 -2.890625 L 3.640625 0 L 4.4375 0 L 4.4375 -2.890625 C 4.4375 -3.140625 4.40625 -3.390625 4.34375 -3.59375 C 4.265625 -3.8125 4.171875 -3.984375 4.046875 -4.140625 C 3.921875 -4.296875 3.765625 -4.40625 3.5625 -4.5 C 3.375 -4.578125 3.15625 -4.609375 2.921875 -4.609375 C 2.59375 -4.609375 2.3125 -4.546875 2.078125 -4.40625 C 1.828125 -4.28125 1.609375 -4.109375 1.40625 -3.890625 L 1.34375 -4.375 C 1.3125 -4.484375 1.234375 -4.546875 1.125 -4.546875 L 0.65625 -4.546875 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-5">
<path style="stroke:none;" d="M 2.03125 0.078125 C 2.234375 0.078125 2.4375 0.03125 2.625 -0.03125 C 2.828125 -0.109375 2.984375 -0.203125 3.125 -0.34375 L 2.890625 -0.71875 C 2.859375 -0.765625 2.828125 -0.796875 2.78125 -0.796875 C 2.765625 -0.796875 2.734375 -0.796875 2.703125 -0.765625 C 2.671875 -0.75 2.625 -0.71875 2.59375 -0.6875 C 2.546875 -0.65625 2.484375 -0.640625 2.4375 -0.625 C 2.375 -0.59375 2.296875 -0.578125 2.203125 -0.578125 C 2.0625 -0.578125 1.953125 -0.625 1.859375 -0.71875 C 1.765625 -0.8125 1.71875 -0.953125 1.71875 -1.140625 L 1.71875 -3.875 L 3.015625 -3.875 L 3.015625 -4.453125 L 1.71875 -4.453125 L 1.71875 -6.015625 L 1.3125 -6.015625 C 1.265625 -6.015625 1.21875 -6 1.1875 -5.96875 C 1.15625 -5.953125 1.125 -5.90625 1.125 -5.859375 L 0.9375 -4.46875 L 0.203125 -4.375 L 0.203125 -4.046875 C 0.203125 -3.984375 0.21875 -3.953125 0.25 -3.921875 C 0.28125 -3.890625 0.3125 -3.875 0.375 -3.875 L 0.921875 -3.875 L 0.921875 -1.09375 C 0.921875 -0.71875 1.015625 -0.4375 1.203125 -0.234375 C 1.40625 -0.03125 1.671875 0.078125 2.03125 0.078125 Z M 2.03125 0.078125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-6">
<path style="stroke:none;" d="M 0.453125 -3.03125 L 0.453125 -2.34375 L 2.65625 -2.34375 L 2.65625 -3.03125 Z M 0.453125 -3.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-7">
<path style="stroke:none;" d="M 2.5 -4.609375 C 2.15625 -4.609375 1.859375 -4.5625 1.59375 -4.453125 C 1.328125 -4.34375 1.09375 -4.171875 0.90625 -3.984375 C 0.71875 -3.78125 0.578125 -3.53125 0.46875 -3.234375 C 0.375 -2.953125 0.328125 -2.625 0.328125 -2.28125 C 0.328125 -1.921875 0.375 -1.59375 0.46875 -1.3125 C 0.578125 -1.015625 0.71875 -0.765625 0.90625 -0.5625 C 1.09375 -0.375 1.328125 -0.203125 1.59375 -0.09375 C 1.859375 0.015625 2.15625 0.0625 2.5 0.0625 C 2.828125 0.0625 3.125 0.015625 3.390625 -0.09375 C 3.65625 -0.203125 3.890625 -0.375 4.078125 -0.5625 C 4.265625 -0.765625 4.40625 -1.015625 4.5 -1.3125 C 4.609375 -1.59375 4.65625 -1.921875 4.65625 -2.28125 C 4.65625 -2.625 4.609375 -2.953125 4.5 -3.234375 C 4.40625 -3.53125 4.265625 -3.78125 4.078125 -3.984375 C 3.890625 -4.171875 3.65625 -4.34375 3.390625 -4.453125 C 3.125 -4.5625 2.828125 -4.609375 2.5 -4.609375 Z M 2.5 -0.5625 C 2.265625 -0.5625 2.0625 -0.59375 1.90625 -0.671875 C 1.734375 -0.75 1.59375 -0.859375 1.484375 -1.015625 C 1.375 -1.15625 1.28125 -1.34375 1.234375 -1.546875 C 1.171875 -1.765625 1.140625 -2 1.140625 -2.265625 C 1.140625 -2.53125 1.171875 -2.78125 1.234375 -3 C 1.28125 -3.203125 1.375 -3.390625 1.484375 -3.53125 C 1.59375 -3.6875 1.734375 -3.796875 1.90625 -3.875 C 2.0625 -3.953125 2.265625 -3.984375 2.5 -3.984375 C 2.9375 -3.984375 3.28125 -3.828125 3.5 -3.53125 C 3.71875 -3.234375 3.828125 -2.8125 3.828125 -2.265625 C 3.828125 -1.734375 3.71875 -1.3125 3.5 -1.015625 C 3.28125 -0.703125 2.9375 -0.5625 2.5 -0.5625 Z M 2.5 -0.5625 "/>
</symbol>
<symbol overflow="visible" id="glyph1-8">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -3.34375 C 1.625 -3.53125 1.8125 -3.6875 2.015625 -3.8125 C 2.21875 -3.921875 2.4375 -3.984375 2.6875 -3.984375 C 3 -3.984375 3.25 -3.890625 3.40625 -3.6875 C 3.5625 -3.5 3.640625 -3.234375 3.640625 -2.890625 L 3.640625 0 L 4.4375 0 L 4.4375 -2.890625 C 4.4375 -3.140625 4.40625 -3.390625 4.34375 -3.59375 C 4.265625 -3.8125 4.171875 -3.984375 4.046875 -4.140625 C 3.921875 -4.296875 3.765625 -4.40625 3.5625 -4.5 C 3.375 -4.578125 3.15625 -4.609375 2.921875 -4.609375 C 2.609375 -4.609375 2.34375 -4.546875 2.09375 -4.4375 C 1.859375 -4.3125 1.640625 -4.140625 1.453125 -3.9375 L 1.453125 -6.609375 L 0.65625 -6.609375 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-9">
<path style="stroke:none;" d="M 2.453125 -4.609375 C 2.125 -4.609375 1.828125 -4.5625 1.5625 -4.4375 C 1.296875 -4.328125 1.078125 -4.171875 0.890625 -3.96875 C 0.71875 -3.765625 0.578125 -3.53125 0.46875 -3.25 C 0.375 -2.984375 0.328125 -2.6875 0.328125 -2.359375 C 0.328125 -1.96875 0.390625 -1.625 0.5 -1.328125 C 0.59375 -1.015625 0.75 -0.765625 0.9375 -0.5625 C 1.140625 -0.359375 1.359375 -0.203125 1.625 -0.09375 C 1.890625 0.015625 2.1875 0.0625 2.5 0.0625 C 2.65625 0.0625 2.828125 0.046875 3 0.015625 C 3.15625 -0.015625 3.328125 -0.046875 3.484375 -0.109375 C 3.640625 -0.171875 3.78125 -0.234375 3.921875 -0.328125 C 4.0625 -0.40625 4.171875 -0.515625 4.28125 -0.640625 L 4.046875 -0.921875 C 4.015625 -0.984375 3.96875 -1 3.90625 -1 C 3.859375 -1 3.796875 -0.984375 3.71875 -0.9375 C 3.65625 -0.890625 3.5625 -0.84375 3.453125 -0.78125 C 3.359375 -0.734375 3.234375 -0.6875 3.078125 -0.640625 C 2.9375 -0.59375 2.765625 -0.5625 2.5625 -0.5625 C 2.34375 -0.5625 2.15625 -0.59375 1.984375 -0.671875 C 1.8125 -0.734375 1.65625 -0.84375 1.53125 -0.984375 C 1.40625 -1.125 1.3125 -1.3125 1.234375 -1.515625 C 1.171875 -1.734375 1.125 -1.984375 1.125 -2.265625 L 4.140625 -2.265625 C 4.21875 -2.265625 4.265625 -2.296875 4.296875 -2.328125 C 4.328125 -2.375 4.34375 -2.453125 4.34375 -2.578125 C 4.34375 -2.90625 4.28125 -3.1875 4.203125 -3.4375 C 4.09375 -3.703125 3.96875 -3.90625 3.796875 -4.078125 C 3.640625 -4.25 3.4375 -4.390625 3.203125 -4.46875 C 2.984375 -4.5625 2.71875 -4.609375 2.453125 -4.609375 Z M 2.46875 -4.03125 C 2.65625 -4.03125 2.8125 -4 2.953125 -3.9375 C 3.09375 -3.875 3.21875 -3.78125 3.3125 -3.671875 C 3.421875 -3.5625 3.5 -3.4375 3.546875 -3.28125 C 3.59375 -3.125 3.625 -2.953125 3.625 -2.765625 L 1.140625 -2.765625 C 1.203125 -3.15625 1.34375 -3.46875 1.5625 -3.6875 C 1.78125 -3.921875 2.078125 -4.03125 2.46875 -4.03125 Z M 2.46875 -4.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-10">
<path style="stroke:none;" d="M 0.828125 0 L 1.640625 0 L 1.640625 -3.875 L 2.796875 -3.875 L 2.796875 -4.453125 L 1.609375 -4.453125 L 1.609375 -4.6875 C 1.609375 -5.09375 1.71875 -5.40625 1.921875 -5.625 C 2.140625 -5.859375 2.4375 -5.96875 2.828125 -5.96875 C 2.9375 -5.96875 3.078125 -5.953125 3.25 -5.953125 C 3.40625 -5.9375 3.5625 -5.9375 3.734375 -5.921875 L 3.734375 0 L 4.53125 0 L 4.53125 -6.484375 L 4.078125 -6.484375 C 3.859375 -6.484375 3.640625 -6.5 3.421875 -6.515625 C 3.1875 -6.53125 2.953125 -6.546875 2.703125 -6.546875 C 2.390625 -6.546875 2.109375 -6.5 1.890625 -6.40625 C 1.65625 -6.296875 1.453125 -6.171875 1.296875 -6 C 1.140625 -5.828125 1.03125 -5.640625 0.953125 -5.40625 C 0.875 -5.1875 0.828125 -4.953125 0.828125 -4.6875 L 0.828125 -4.453125 L 0.109375 -4.453125 L 0.109375 -4.125 C 0.109375 -4.0625 0.140625 -4.015625 0.171875 -3.984375 C 0.21875 -3.953125 0.265625 -3.9375 0.328125 -3.921875 L 0.828125 -3.859375 Z M 0.828125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-11">
<path style="stroke:none;" d="M 1.546875 -4.546875 L 0.75 -4.546875 L 0.75 0 L 1.546875 0 Z M 1.71875 -5.96875 C 1.71875 -6.046875 1.703125 -6.125 1.671875 -6.1875 C 1.640625 -6.265625 1.59375 -6.328125 1.546875 -6.375 C 1.5 -6.421875 1.4375 -6.46875 1.375 -6.5 C 1.296875 -6.53125 1.21875 -6.546875 1.140625 -6.546875 C 1.078125 -6.546875 1 -6.53125 0.9375 -6.5 C 0.859375 -6.46875 0.796875 -6.421875 0.75 -6.375 C 0.703125 -6.328125 0.65625 -6.265625 0.625 -6.1875 C 0.59375 -6.125 0.578125 -6.046875 0.578125 -5.96875 C 0.578125 -5.890625 0.59375 -5.828125 0.625 -5.75 C 0.65625 -5.6875 0.703125 -5.625 0.75 -5.5625 C 0.796875 -5.515625 0.859375 -5.484375 0.9375 -5.453125 C 1 -5.421875 1.078125 -5.40625 1.140625 -5.40625 C 1.21875 -5.40625 1.296875 -5.421875 1.375 -5.453125 C 1.4375 -5.484375 1.5 -5.515625 1.546875 -5.5625 C 1.59375 -5.625 1.640625 -5.6875 1.671875 -5.75 C 1.703125 -5.828125 1.71875 -5.890625 1.71875 -5.96875 Z M 1.71875 -5.96875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-12">
<path style="stroke:none;" d="M 2.1875 -4.625 C 1.9375 -4.625 1.703125 -4.578125 1.484375 -4.515625 C 1.28125 -4.453125 1.09375 -4.34375 0.953125 -4.21875 C 0.796875 -4.09375 0.671875 -3.9375 0.59375 -3.765625 C 0.5 -3.578125 0.46875 -3.375 0.46875 -3.15625 C 0.46875 -2.875 0.53125 -2.640625 0.65625 -2.4375 C 0.78125 -2.21875 0.953125 -2.046875 1.171875 -1.921875 C 1.078125 -1.875 1 -1.828125 0.921875 -1.765625 C 0.859375 -1.703125 0.796875 -1.625 0.75 -1.5625 C 0.703125 -1.5 0.65625 -1.421875 0.640625 -1.359375 C 0.609375 -1.28125 0.59375 -1.21875 0.59375 -1.15625 C 0.59375 -0.984375 0.640625 -0.859375 0.71875 -0.75 C 0.796875 -0.65625 0.890625 -0.5625 1.015625 -0.515625 C 0.78125 -0.421875 0.578125 -0.296875 0.4375 -0.140625 C 0.296875 0.015625 0.21875 0.203125 0.21875 0.4375 C 0.21875 0.59375 0.265625 0.75 0.34375 0.890625 C 0.4375 1.03125 0.546875 1.15625 0.71875 1.28125 C 0.890625 1.390625 1.09375 1.46875 1.34375 1.53125 C 1.59375 1.609375 1.875 1.640625 2.203125 1.640625 C 2.546875 1.640625 2.84375 1.59375 3.109375 1.5 C 3.375 1.421875 3.59375 1.3125 3.765625 1.171875 C 3.953125 1.03125 4.09375 0.859375 4.1875 0.6875 C 4.28125 0.5 4.34375 0.3125 4.34375 0.109375 C 4.34375 -0.09375 4.296875 -0.265625 4.203125 -0.390625 C 4.125 -0.53125 4 -0.625 3.859375 -0.703125 C 3.71875 -0.78125 3.5625 -0.828125 3.375 -0.859375 C 3.1875 -0.890625 3 -0.921875 2.8125 -0.9375 C 2.625 -0.953125 2.4375 -0.953125 2.25 -0.96875 C 2.078125 -0.96875 1.90625 -0.984375 1.765625 -1.015625 C 1.625 -1.03125 1.5 -1.078125 1.421875 -1.125 C 1.34375 -1.1875 1.296875 -1.265625 1.296875 -1.375 C 1.296875 -1.4375 1.3125 -1.5 1.359375 -1.578125 C 1.421875 -1.640625 1.484375 -1.703125 1.578125 -1.765625 C 1.765625 -1.71875 1.96875 -1.6875 2.1875 -1.6875 C 2.4375 -1.6875 2.65625 -1.71875 2.875 -1.796875 C 3.078125 -1.859375 3.25 -1.953125 3.40625 -2.09375 C 3.5625 -2.21875 3.671875 -2.375 3.765625 -2.5625 C 3.84375 -2.734375 3.890625 -2.9375 3.890625 -3.15625 C 3.890625 -3.390625 3.84375 -3.609375 3.734375 -3.8125 L 4.25 -3.875 C 4.375 -3.90625 4.4375 -3.96875 4.4375 -4.0625 L 4.4375 -4.359375 L 3.203125 -4.359375 C 3.0625 -4.453125 2.90625 -4.515625 2.734375 -4.5625 C 2.5625 -4.59375 2.375 -4.625 2.1875 -4.625 Z M 3.59375 0.25 C 3.59375 0.375 3.5625 0.46875 3.5 0.578125 C 3.4375 0.671875 3.359375 0.765625 3.234375 0.828125 C 3.109375 0.90625 2.96875 0.953125 2.796875 1 C 2.625 1.03125 2.4375 1.046875 2.21875 1.046875 C 2 1.046875 1.8125 1.03125 1.65625 1 C 1.484375 0.953125 1.34375 0.90625 1.234375 0.84375 C 1.140625 0.78125 1.046875 0.703125 1 0.625 C 0.953125 0.53125 0.921875 0.4375 0.921875 0.328125 C 0.921875 0.171875 0.984375 0.03125 1.078125 -0.078125 C 1.1875 -0.203125 1.328125 -0.296875 1.5 -0.375 C 1.640625 -0.359375 1.796875 -0.34375 1.953125 -0.328125 C 2.125 -0.328125 2.28125 -0.3125 2.4375 -0.3125 C 2.59375 -0.296875 2.734375 -0.28125 2.875 -0.265625 C 3.015625 -0.25 3.140625 -0.21875 3.25 -0.1875 C 3.359375 -0.140625 3.4375 -0.09375 3.5 -0.03125 C 3.5625 0.046875 3.59375 0.140625 3.59375 0.25 Z M 2.1875 -2.21875 C 2.03125 -2.21875 1.890625 -2.25 1.765625 -2.28125 C 1.640625 -2.328125 1.53125 -2.390625 1.453125 -2.46875 C 1.375 -2.5625 1.3125 -2.65625 1.265625 -2.765625 C 1.21875 -2.875 1.203125 -3 1.203125 -3.140625 C 1.203125 -3.40625 1.28125 -3.625 1.453125 -3.796875 C 1.625 -3.96875 1.859375 -4.046875 2.1875 -4.046875 C 2.5 -4.046875 2.75 -3.96875 2.921875 -3.796875 C 3.09375 -3.625 3.171875 -3.40625 3.171875 -3.140625 C 3.171875 -3 3.15625 -2.875 3.109375 -2.765625 C 3.078125 -2.65625 3.015625 -2.5625 2.921875 -2.46875 C 2.84375 -2.390625 2.734375 -2.328125 2.609375 -2.28125 C 2.484375 -2.25 2.34375 -2.21875 2.1875 -2.21875 Z M 2.1875 -2.21875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-13">
<path style="stroke:none;" d="M 3.75 -3.734375 L 3.96875 -4.015625 C 3.78125 -4.203125 3.5625 -4.359375 3.3125 -4.453125 C 3.0625 -4.5625 2.796875 -4.609375 2.46875 -4.609375 C 2.125 -4.609375 1.828125 -4.5625 1.5625 -4.4375 C 1.296875 -4.328125 1.0625 -4.15625 0.890625 -3.953125 C 0.703125 -3.75 0.5625 -3.5 0.46875 -3.203125 C 0.375 -2.921875 0.328125 -2.609375 0.328125 -2.28125 C 0.328125 -1.90625 0.390625 -1.578125 0.484375 -1.28125 C 0.59375 -0.984375 0.734375 -0.75 0.90625 -0.546875 C 1.09375 -0.34375 1.296875 -0.203125 1.546875 -0.09375 C 1.796875 0.015625 2.046875 0.0625 2.34375 0.0625 C 2.65625 0.0625 2.984375 0.015625 3.28125 -0.109375 C 3.5625 -0.21875 3.8125 -0.390625 4.015625 -0.640625 L 3.796875 -0.921875 C 3.765625 -0.984375 3.703125 -1 3.640625 -1 C 3.578125 -1 3.53125 -0.984375 3.46875 -0.9375 C 3.421875 -0.890625 3.359375 -0.84375 3.265625 -0.78125 C 3.1875 -0.71875 3.078125 -0.671875 2.953125 -0.625 C 2.828125 -0.578125 2.671875 -0.5625 2.46875 -0.5625 C 2.28125 -0.5625 2.09375 -0.59375 1.921875 -0.671875 C 1.765625 -0.75 1.625 -0.859375 1.515625 -1 C 1.40625 -1.140625 1.3125 -1.328125 1.25 -1.546875 C 1.1875 -1.75 1.15625 -2 1.15625 -2.28125 C 1.15625 -2.53125 1.1875 -2.78125 1.234375 -2.984375 C 1.296875 -3.203125 1.390625 -3.375 1.5 -3.53125 C 1.609375 -3.671875 1.765625 -3.796875 1.921875 -3.875 C 2.09375 -3.953125 2.296875 -3.984375 2.515625 -3.984375 C 2.6875 -3.984375 2.828125 -3.96875 2.9375 -3.9375 C 3.046875 -3.890625 3.15625 -3.859375 3.234375 -3.8125 C 3.3125 -3.765625 3.375 -3.71875 3.4375 -3.6875 C 3.484375 -3.65625 3.53125 -3.625 3.578125 -3.625 C 3.625 -3.625 3.65625 -3.640625 3.6875 -3.65625 C 3.703125 -3.671875 3.734375 -3.703125 3.75 -3.734375 Z M 3.75 -3.734375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-14">
<path style="stroke:none;" d="M 1.546875 -6.609375 L 0.75 -6.609375 L 0.75 0 L 1.546875 0 Z M 1.546875 -6.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-15">
<path style="stroke:none;" d="M 1.984375 1.34375 L 4.515625 -4.546875 L 3.890625 -4.546875 C 3.828125 -4.546875 3.78125 -4.53125 3.734375 -4.5 C 3.703125 -4.46875 3.671875 -4.421875 3.65625 -4.375 L 2.46875 -1.515625 C 2.4375 -1.453125 2.421875 -1.390625 2.40625 -1.3125 C 2.375 -1.25 2.359375 -1.1875 2.34375 -1.109375 C 2.328125 -1.1875 2.3125 -1.25 2.28125 -1.3125 C 2.265625 -1.390625 2.25 -1.453125 2.21875 -1.515625 L 1 -4.375 C 0.984375 -4.421875 0.953125 -4.453125 0.921875 -4.5 C 0.875 -4.53125 0.828125 -4.546875 0.75 -4.546875 L 0.0625 -4.546875 L 1.9375 -0.265625 L 1.109375 1.53125 L 1.703125 1.53125 C 1.78125 1.53125 1.84375 1.515625 1.890625 1.484375 C 1.921875 1.453125 1.953125 1.40625 1.984375 1.34375 Z M 1.984375 1.34375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-16">
<path style="stroke:none;" d="M 3.25 -3.796875 L 3.4375 -4.078125 C 3.265625 -4.25 3.0625 -4.375 2.8125 -4.46875 C 2.578125 -4.5625 2.3125 -4.609375 2.015625 -4.609375 C 1.765625 -4.609375 1.53125 -4.578125 1.328125 -4.5 C 1.125 -4.4375 0.953125 -4.34375 0.828125 -4.21875 C 0.6875 -4.09375 0.578125 -3.953125 0.5 -3.796875 C 0.4375 -3.640625 0.40625 -3.46875 0.40625 -3.296875 C 0.40625 -3.109375 0.4375 -2.9375 0.5 -2.796875 C 0.5625 -2.65625 0.65625 -2.546875 0.765625 -2.453125 C 0.875 -2.359375 1 -2.28125 1.140625 -2.21875 C 1.28125 -2.171875 1.4375 -2.109375 1.578125 -2.0625 C 1.734375 -2.015625 1.875 -1.96875 2.015625 -1.921875 C 2.15625 -1.890625 2.28125 -1.828125 2.390625 -1.78125 C 2.5 -1.71875 2.59375 -1.640625 2.65625 -1.5625 C 2.71875 -1.484375 2.765625 -1.375 2.765625 -1.25 C 2.765625 -1.140625 2.75 -1.046875 2.703125 -0.96875 C 2.671875 -0.875 2.609375 -0.796875 2.53125 -0.71875 C 2.453125 -0.65625 2.359375 -0.59375 2.25 -0.5625 C 2.125 -0.515625 1.984375 -0.5 1.828125 -0.5 C 1.65625 -0.5 1.5 -0.53125 1.375 -0.5625 C 1.25 -0.609375 1.15625 -0.65625 1.0625 -0.703125 C 0.984375 -0.75 0.90625 -0.796875 0.859375 -0.84375 C 0.796875 -0.890625 0.734375 -0.90625 0.6875 -0.90625 C 0.625 -0.90625 0.578125 -0.890625 0.546875 -0.875 C 0.515625 -0.859375 0.484375 -0.828125 0.46875 -0.78125 L 0.28125 -0.484375 C 0.453125 -0.3125 0.671875 -0.1875 0.9375 -0.078125 C 1.1875 0.015625 1.46875 0.078125 1.796875 0.078125 C 2.078125 0.078125 2.3125 0.03125 2.53125 -0.046875 C 2.734375 -0.109375 2.921875 -0.21875 3.0625 -0.34375 C 3.21875 -0.46875 3.328125 -0.625 3.40625 -0.8125 C 3.46875 -0.984375 3.515625 -1.171875 3.515625 -1.390625 C 3.515625 -1.578125 3.484375 -1.734375 3.40625 -1.859375 C 3.34375 -1.984375 3.25 -2.09375 3.140625 -2.1875 C 3.03125 -2.28125 2.90625 -2.359375 2.765625 -2.40625 C 2.625 -2.46875 2.484375 -2.53125 2.328125 -2.578125 C 2.1875 -2.625 2.046875 -2.671875 1.90625 -2.71875 C 1.765625 -2.765625 1.640625 -2.8125 1.53125 -2.859375 C 1.40625 -2.921875 1.328125 -2.984375 1.25 -3.0625 C 1.1875 -3.140625 1.15625 -3.25 1.15625 -3.359375 C 1.15625 -3.453125 1.171875 -3.53125 1.21875 -3.609375 C 1.25 -3.6875 1.3125 -3.765625 1.390625 -3.828125 C 1.46875 -3.890625 1.5625 -3.9375 1.671875 -3.96875 C 1.78125 -4 1.890625 -4.015625 2.03125 -4.015625 C 2.1875 -4.015625 2.328125 -4 2.4375 -3.96875 C 2.546875 -3.9375 2.640625 -3.890625 2.71875 -3.859375 C 2.8125 -3.8125 2.875 -3.78125 2.9375 -3.75 C 3 -3.71875 3.046875 -3.6875 3.09375 -3.6875 C 3.171875 -3.6875 3.21875 -3.71875 3.25 -3.796875 Z M 3.25 -3.796875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-17">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -2.890625 C 1.578125 -3.203125 1.734375 -3.4375 1.921875 -3.59375 C 2.109375 -3.765625 2.34375 -3.84375 2.625 -3.84375 C 2.78125 -3.84375 2.890625 -3.828125 2.984375 -3.796875 C 3.0625 -3.765625 3.140625 -3.75 3.171875 -3.75 C 3.25 -3.75 3.296875 -3.796875 3.3125 -3.859375 L 3.421875 -4.46875 C 3.328125 -4.515625 3.234375 -4.546875 3.140625 -4.578125 C 3.03125 -4.609375 2.921875 -4.625 2.796875 -4.625 C 2.484375 -4.625 2.21875 -4.53125 1.984375 -4.359375 C 1.765625 -4.171875 1.5625 -3.9375 1.40625 -3.609375 L 1.359375 -4.328125 C 1.34375 -4.40625 1.328125 -4.46875 1.296875 -4.5 C 1.265625 -4.53125 1.203125 -4.546875 1.109375 -4.546875 L 0.65625 -4.546875 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-18">
<path style="stroke:none;" d="M 3.859375 0 L 4.328125 0 L 4.328125 -6.609375 L 3.53125 -6.609375 L 3.53125 -4.078125 C 3.375 -4.25 3.203125 -4.390625 3 -4.484375 C 2.796875 -4.578125 2.5625 -4.625 2.28125 -4.625 C 1.984375 -4.625 1.703125 -4.5625 1.46875 -4.4375 C 1.21875 -4.328125 1.015625 -4.15625 0.84375 -3.9375 C 0.671875 -3.734375 0.546875 -3.484375 0.453125 -3.1875 C 0.375 -2.90625 0.328125 -2.59375 0.328125 -2.25 C 0.328125 -1.875 0.359375 -1.546875 0.4375 -1.25 C 0.53125 -0.96875 0.640625 -0.71875 0.796875 -0.53125 C 0.9375 -0.34375 1.125 -0.1875 1.328125 -0.09375 C 1.546875 0.015625 1.78125 0.0625 2.046875 0.0625 C 2.359375 0.0625 2.65625 -0.015625 2.890625 -0.15625 C 3.140625 -0.296875 3.375 -0.484375 3.5625 -0.71875 L 3.640625 -0.171875 C 3.671875 -0.046875 3.734375 0 3.859375 0 Z M 2.3125 -0.578125 C 2.125 -0.578125 1.953125 -0.609375 1.8125 -0.671875 C 1.671875 -0.734375 1.546875 -0.84375 1.453125 -0.984375 C 1.34375 -1.109375 1.28125 -1.28125 1.21875 -1.5 C 1.171875 -1.703125 1.140625 -1.953125 1.140625 -2.25 C 1.140625 -2.8125 1.265625 -3.25 1.484375 -3.546875 C 1.71875 -3.84375 2.046875 -4 2.46875 -4 C 2.671875 -4 2.875 -3.953125 3.046875 -3.890625 C 3.21875 -3.796875 3.375 -3.65625 3.53125 -3.46875 L 3.53125 -1.265625 C 3.359375 -1.046875 3.1875 -0.890625 2.984375 -0.765625 C 2.796875 -0.640625 2.5625 -0.578125 2.3125 -0.578125 Z M 2.3125 -0.578125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-19">
<path style="stroke:none;" d="M 0.6875 0 L 1.203125 0 C 1.3125 0 1.375 -0.0625 1.40625 -0.171875 L 1.4375 -0.578125 C 1.59375 -0.375 1.78125 -0.21875 1.984375 -0.109375 C 2.1875 0 2.4375 0.0625 2.71875 0.0625 C 3.03125 0.0625 3.3125 0 3.546875 -0.109375 C 3.796875 -0.234375 4 -0.40625 4.171875 -0.625 C 4.34375 -0.828125 4.46875 -1.078125 4.5625 -1.359375 C 4.640625 -1.65625 4.6875 -1.96875 4.6875 -2.296875 C 4.6875 -2.671875 4.65625 -3.015625 4.5625 -3.296875 C 4.484375 -3.59375 4.375 -3.828125 4.21875 -4.03125 C 4.078125 -4.21875 3.890625 -4.375 3.6875 -4.46875 C 3.46875 -4.5625 3.234375 -4.609375 2.96875 -4.609375 C 2.65625 -4.609375 2.375 -4.546875 2.140625 -4.40625 C 1.890625 -4.28125 1.671875 -4.109375 1.484375 -3.890625 L 1.484375 -6.609375 L 0.6875 -6.609375 Z M 2.703125 -3.984375 C 2.890625 -3.984375 3.046875 -3.953125 3.203125 -3.890625 C 3.34375 -3.828125 3.46875 -3.71875 3.5625 -3.59375 C 3.65625 -3.453125 3.734375 -3.28125 3.78125 -3.0625 C 3.84375 -2.859375 3.859375 -2.59375 3.859375 -2.296875 C 3.859375 -1.734375 3.75 -1.3125 3.53125 -1.015625 C 3.296875 -0.703125 2.96875 -0.5625 2.546875 -0.5625 C 2.328125 -0.5625 2.140625 -0.59375 1.96875 -0.671875 C 1.78125 -0.765625 1.625 -0.890625 1.484375 -1.09375 L 1.484375 -3.296875 C 1.65625 -3.515625 1.828125 -3.671875 2.03125 -3.796875 C 2.21875 -3.921875 2.453125 -3.984375 2.703125 -3.984375 Z M 2.703125 -3.984375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-20">
<path style="stroke:none;" d="M 1.484375 -6.609375 L 0.6875 -6.609375 L 0.6875 0 L 1.484375 0 L 1.484375 -2.171875 L 1.703125 -2.171875 C 1.796875 -2.171875 1.859375 -2.15625 1.90625 -2.140625 C 1.953125 -2.125 2 -2.078125 2.046875 -2.015625 L 3.53125 -0.15625 C 3.578125 -0.109375 3.625 -0.0625 3.671875 -0.03125 C 3.71875 -0.015625 3.765625 0 3.84375 0 L 4.5625 0 L 2.78125 -2.25 C 2.734375 -2.296875 2.703125 -2.359375 2.65625 -2.40625 C 2.609375 -2.453125 2.5625 -2.484375 2.515625 -2.53125 C 2.5625 -2.5625 2.609375 -2.59375 2.640625 -2.625 C 2.6875 -2.671875 2.734375 -2.71875 2.765625 -2.765625 L 4.4375 -4.546875 L 3.71875 -4.546875 C 3.640625 -4.546875 3.578125 -4.53125 3.53125 -4.5 C 3.5 -4.46875 3.453125 -4.4375 3.40625 -4.375 L 1.96875 -2.84375 C 1.921875 -2.796875 1.875 -2.765625 1.84375 -2.75 C 1.796875 -2.71875 1.75 -2.71875 1.6875 -2.71875 L 1.484375 -2.71875 Z M 1.484375 -6.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-21">
<path style="stroke:none;" d="M 0.078125 -4.546875 L 1.9375 0 L 2.65625 0 L 4.5 -4.546875 L 3.890625 -4.546875 C 3.828125 -4.546875 3.78125 -4.53125 3.734375 -4.5 C 3.6875 -4.46875 3.65625 -4.421875 3.640625 -4.375 L 2.484375 -1.453125 C 2.4375 -1.34375 2.40625 -1.234375 2.375 -1.125 C 2.34375 -1.015625 2.328125 -0.921875 2.296875 -0.8125 C 2.28125 -0.921875 2.25 -1.015625 2.234375 -1.125 C 2.203125 -1.234375 2.171875 -1.34375 2.140625 -1.453125 L 0.984375 -4.375 C 0.96875 -4.421875 0.9375 -4.46875 0.890625 -4.5 C 0.859375 -4.53125 0.796875 -4.546875 0.734375 -4.546875 Z M 0.078125 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph2-0">
<path style="stroke:none;" d="M 0.953125 -4.359375 L 1.140625 -4.0625 C 1.171875 -4.015625 1.21875 -3.984375 1.28125 -3.984375 C 1.296875 -3.984375 1.34375 -4 1.375 -4.015625 C 1.40625 -4.046875 1.453125 -4.0625 1.5 -4.09375 C 1.546875 -4.125 1.609375 -4.15625 1.6875 -4.171875 C 1.75 -4.1875 1.84375 -4.203125 1.953125 -4.203125 C 2.09375 -4.203125 2.21875 -4.171875 2.3125 -4.09375 C 2.40625 -4.015625 2.4375 -3.90625 2.4375 -3.78125 C 2.4375 -3.671875 2.421875 -3.59375 2.390625 -3.515625 C 2.34375 -3.453125 2.296875 -3.375 2.234375 -3.3125 C 2.171875 -3.265625 2.109375 -3.203125 2.03125 -3.15625 C 1.96875 -3.109375 1.90625 -3.046875 1.84375 -3 C 1.78125 -2.9375 1.734375 -2.875 1.703125 -2.8125 C 1.671875 -2.75 1.65625 -2.671875 1.671875 -2.59375 L 1.71875 -2.140625 L 2.1875 -2.140625 L 2.25 -2.546875 C 2.265625 -2.609375 2.28125 -2.65625 2.328125 -2.703125 C 2.375 -2.75 2.4375 -2.796875 2.484375 -2.84375 C 2.546875 -2.890625 2.609375 -2.953125 2.6875 -3 C 2.75 -3.0625 2.8125 -3.125 2.875 -3.1875 C 2.9375 -3.265625 2.984375 -3.359375 3.015625 -3.46875 C 3.0625 -3.5625 3.078125 -3.6875 3.078125 -3.828125 C 3.078125 -3.96875 3.046875 -4.09375 3 -4.203125 C 2.953125 -4.328125 2.875 -4.421875 2.78125 -4.515625 C 2.6875 -4.59375 2.578125 -4.65625 2.4375 -4.703125 C 2.3125 -4.734375 2.171875 -4.765625 2 -4.765625 C 1.890625 -4.765625 1.78125 -4.75 1.6875 -4.734375 C 1.578125 -4.703125 1.484375 -4.6875 1.390625 -4.640625 C 1.3125 -4.609375 1.234375 -4.5625 1.15625 -4.515625 C 1.078125 -4.46875 1.015625 -4.421875 0.953125 -4.359375 Z M 1.515625 -1.109375 C 1.515625 -1 1.546875 -0.890625 1.625 -0.8125 C 1.71875 -0.734375 1.8125 -0.703125 1.9375 -0.703125 C 1.984375 -0.703125 2.046875 -0.703125 2.09375 -0.71875 C 2.140625 -0.75 2.1875 -0.78125 2.21875 -0.8125 C 2.265625 -0.859375 2.296875 -0.90625 2.3125 -0.953125 C 2.328125 -1 2.34375 -1.0625 2.34375 -1.109375 C 2.34375 -1.171875 2.328125 -1.234375 2.3125 -1.28125 C 2.296875 -1.328125 2.265625 -1.375 2.21875 -1.421875 C 2.1875 -1.453125 2.140625 -1.484375 2.09375 -1.5 C 2.046875 -1.53125 1.984375 -1.546875 1.9375 -1.546875 C 1.8125 -1.546875 1.71875 -1.5 1.625 -1.421875 C 1.546875 -1.34375 1.515625 -1.234375 1.515625 -1.109375 Z M 0.171875 -5.46875 L 0.171875 0 L 3.890625 0 L 3.890625 -5.46875 Z M 0.359375 -0.203125 L 0.359375 -5.265625 L 3.671875 -5.265625 L 3.671875 -0.203125 Z M 0.359375 -0.203125 "/>
</symbol>
<symbol overflow="visible" id="glyph2-1">
<path style="stroke:none;" d="M 5.171875 0 L 2.984375 -5.46875 L 2.234375 -5.46875 L 0.03125 0 L 0.609375 0 C 0.671875 0 0.734375 -0.015625 0.765625 -0.046875 C 0.8125 -0.09375 0.84375 -0.125 0.859375 -0.171875 L 1.375 -1.5 L 3.828125 -1.5 L 4.34375 -0.171875 C 4.359375 -0.125 4.390625 -0.078125 4.4375 -0.046875 C 4.484375 -0.015625 4.53125 0 4.59375 0 Z M 1.578125 -2.03125 L 2.4375 -4.25 C 2.46875 -4.328125 2.484375 -4.40625 2.515625 -4.484375 C 2.546875 -4.578125 2.578125 -4.671875 2.609375 -4.78125 C 2.65625 -4.5625 2.703125 -4.390625 2.765625 -4.265625 L 3.625 -2.03125 Z M 1.578125 -2.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph2-2">
<path style="stroke:none;" d="M 0.671875 0 L 2.609375 0 C 2.90625 0 3.171875 -0.03125 3.421875 -0.109375 C 3.65625 -0.1875 3.859375 -0.296875 4.015625 -0.4375 C 4.1875 -0.5625 4.3125 -0.734375 4.390625 -0.921875 C 4.484375 -1.109375 4.515625 -1.328125 4.515625 -1.5625 C 4.515625 -1.90625 4.421875 -2.171875 4.21875 -2.390625 C 4.015625 -2.59375 3.71875 -2.734375 3.3125 -2.8125 C 3.484375 -2.875 3.640625 -2.9375 3.765625 -3.015625 C 3.890625 -3.109375 4 -3.203125 4.09375 -3.3125 C 4.171875 -3.421875 4.234375 -3.53125 4.28125 -3.65625 C 4.3125 -3.78125 4.34375 -3.90625 4.34375 -4.046875 C 4.34375 -4.265625 4.296875 -4.46875 4.21875 -4.640625 C 4.15625 -4.828125 4.03125 -4.96875 3.875 -5.09375 C 3.71875 -5.21875 3.515625 -5.3125 3.28125 -5.375 C 3.03125 -5.4375 2.75 -5.46875 2.40625 -5.46875 L 0.671875 -5.46875 Z M 1.40625 -2.5 L 2.59375 -2.5 C 2.984375 -2.5 3.296875 -2.421875 3.484375 -2.25 C 3.6875 -2.09375 3.796875 -1.859375 3.796875 -1.578125 C 3.796875 -1.4375 3.765625 -1.296875 3.71875 -1.171875 C 3.671875 -1.0625 3.609375 -0.953125 3.5 -0.859375 C 3.40625 -0.78125 3.28125 -0.703125 3.125 -0.65625 C 2.984375 -0.609375 2.796875 -0.59375 2.59375 -0.59375 L 1.40625 -0.59375 Z M 1.40625 -3.015625 L 1.40625 -4.890625 L 2.40625 -4.890625 C 2.8125 -4.890625 3.125 -4.8125 3.3125 -4.671875 C 3.5 -4.515625 3.609375 -4.28125 3.609375 -3.953125 C 3.609375 -3.828125 3.578125 -3.6875 3.53125 -3.578125 C 3.484375 -3.46875 3.40625 -3.359375 3.3125 -3.28125 C 3.203125 -3.203125 3.078125 -3.140625 2.921875 -3.09375 C 2.78125 -3.046875 2.59375 -3.015625 2.390625 -3.015625 Z M 1.40625 -3.015625 "/>
</symbol>
<symbol overflow="visible" id="glyph2-3">
<path style="stroke:none;" d="M 1.9375 -2.8125 L 0.046875 0 L 0.734375 0 C 0.796875 0 0.84375 -0.015625 0.859375 -0.046875 C 0.890625 -0.078125 0.921875 -0.109375 0.9375 -0.140625 L 2.375 -2.28125 C 2.40625 -2.328125 2.421875 -2.390625 2.4375 -2.4375 L 3.90625 -0.140625 C 3.921875 -0.109375 3.953125 -0.078125 3.984375 -0.046875 C 4.015625 -0.015625 4.0625 0 4.125 0 L 4.859375 0 L 2.96875 -2.84375 L 4.796875 -5.46875 L 4.078125 -5.46875 C 4.046875 -5.46875 4.015625 -5.46875 3.984375 -5.4375 C 3.953125 -5.421875 3.9375 -5.390625 3.90625 -5.359375 L 2.5625 -3.359375 C 2.53125 -3.296875 2.5 -3.234375 2.484375 -3.171875 L 1.046875 -5.375 C 1.03125 -5.40625 1.015625 -5.421875 0.984375 -5.453125 C 0.953125 -5.46875 0.921875 -5.46875 0.875 -5.46875 L 0.125 -5.46875 Z M 1.9375 -2.8125 "/>
</symbol>
<symbol overflow="visible" id="glyph2-4">
<path style="stroke:none;" d="M 2.78125 -2.171875 L 4.78125 -5.46875 L 4.125 -5.46875 C 4.0625 -5.46875 4.015625 -5.453125 3.96875 -5.421875 C 3.9375 -5.390625 3.90625 -5.34375 3.875 -5.296875 L 2.625 -3.171875 C 2.578125 -3.09375 2.53125 -3 2.5 -2.921875 C 2.46875 -2.84375 2.4375 -2.765625 2.40625 -2.6875 C 2.390625 -2.765625 2.359375 -2.84375 2.3125 -2.921875 C 2.28125 -3 2.234375 -3.09375 2.1875 -3.171875 L 0.9375 -5.296875 C 0.90625 -5.359375 0.875 -5.390625 0.84375 -5.421875 C 0.796875 -5.453125 0.75 -5.46875 0.6875 -5.46875 L 0.03125 -5.46875 L 2.03125 -2.171875 L 2.03125 0 L 2.78125 0 Z M 2.78125 -2.171875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-0">
<path style="stroke:none;" d="M 1 -4.546875 L 1.1875 -4.25 C 1.21875 -4.1875 1.265625 -4.15625 1.328125 -4.15625 C 1.359375 -4.15625 1.390625 -4.171875 1.4375 -4.1875 C 1.46875 -4.21875 1.515625 -4.25 1.5625 -4.265625 C 1.625 -4.296875 1.6875 -4.328125 1.75 -4.34375 C 1.828125 -4.375 1.921875 -4.390625 2.03125 -4.390625 C 2.1875 -4.390625 2.3125 -4.34375 2.40625 -4.265625 C 2.5 -4.1875 2.546875 -4.078125 2.546875 -3.9375 C 2.546875 -3.84375 2.53125 -3.75 2.484375 -3.671875 C 2.4375 -3.59375 2.390625 -3.515625 2.328125 -3.46875 C 2.265625 -3.40625 2.203125 -3.34375 2.125 -3.296875 C 2.046875 -3.234375 1.984375 -3.1875 1.921875 -3.125 C 1.859375 -3.0625 1.8125 -3 1.78125 -2.9375 C 1.75 -2.875 1.734375 -2.796875 1.75 -2.703125 L 1.796875 -2.234375 L 2.28125 -2.234375 L 2.34375 -2.65625 C 2.359375 -2.71875 2.390625 -2.765625 2.4375 -2.828125 C 2.484375 -2.875 2.53125 -2.921875 2.59375 -2.96875 C 2.65625 -3.015625 2.734375 -3.078125 2.796875 -3.125 C 2.875 -3.1875 2.9375 -3.25 3 -3.328125 C 3.0625 -3.40625 3.109375 -3.5 3.140625 -3.609375 C 3.1875 -3.71875 3.203125 -3.84375 3.203125 -3.984375 C 3.203125 -4.140625 3.171875 -4.265625 3.125 -4.390625 C 3.078125 -4.515625 3 -4.625 2.90625 -4.703125 C 2.796875 -4.78125 2.6875 -4.859375 2.546875 -4.90625 C 2.40625 -4.9375 2.265625 -4.96875 2.09375 -4.96875 C 1.96875 -4.96875 1.859375 -4.953125 1.75 -4.9375 C 1.640625 -4.90625 1.546875 -4.875 1.453125 -4.84375 C 1.359375 -4.8125 1.28125 -4.765625 1.21875 -4.703125 C 1.125 -4.65625 1.0625 -4.609375 1 -4.546875 Z M 1.578125 -1.15625 C 1.578125 -1.046875 1.625 -0.9375 1.703125 -0.859375 C 1.78125 -0.765625 1.890625 -0.71875 2.015625 -0.71875 C 2.078125 -0.71875 2.125 -0.734375 2.1875 -0.75 C 2.234375 -0.78125 2.28125 -0.8125 2.3125 -0.859375 C 2.359375 -0.890625 2.390625 -0.9375 2.421875 -0.984375 C 2.4375 -1.046875 2.453125 -1.109375 2.453125 -1.15625 C 2.453125 -1.21875 2.4375 -1.28125 2.421875 -1.34375 C 2.390625 -1.390625 2.359375 -1.4375 2.3125 -1.484375 C 2.28125 -1.515625 2.234375 -1.546875 2.1875 -1.5625 C 2.125 -1.59375 2.078125 -1.609375 2.015625 -1.609375 C 1.890625 -1.609375 1.78125 -1.5625 1.703125 -1.484375 C 1.625 -1.390625 1.578125 -1.28125 1.578125 -1.15625 Z M 0.171875 -5.703125 L 0.171875 0 L 4.0625 0 L 4.0625 -5.703125 Z M 0.375 -0.21875 L 0.375 -5.484375 L 3.828125 -5.484375 L 3.828125 -0.21875 Z M 0.375 -0.21875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-1">
<path style="stroke:none;" d="M 4.578125 -5.703125 L 0.109375 -5.703125 L 0.109375 -5.0625 L 1.96875 -5.0625 L 1.96875 0 L 2.734375 0 L 2.734375 -5.0625 L 4.578125 -5.0625 Z M 4.578125 -5.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph3-2">
<path style="stroke:none;" d="M 0.578125 0 L 1.296875 0 L 1.296875 -2.5625 C 1.40625 -2.84375 1.546875 -3.046875 1.703125 -3.203125 C 1.875 -3.34375 2.078125 -3.40625 2.328125 -3.40625 C 2.46875 -3.40625 2.578125 -3.40625 2.65625 -3.375 C 2.71875 -3.34375 2.78125 -3.328125 2.828125 -3.328125 C 2.890625 -3.328125 2.921875 -3.359375 2.9375 -3.4375 L 3.03125 -3.96875 C 2.953125 -4.015625 2.875 -4.046875 2.78125 -4.078125 C 2.6875 -4.09375 2.59375 -4.109375 2.484375 -4.109375 C 2.203125 -4.109375 1.96875 -4.03125 1.765625 -3.875 C 1.5625 -3.71875 1.390625 -3.5 1.25 -3.21875 L 1.203125 -3.84375 C 1.203125 -3.90625 1.171875 -3.96875 1.140625 -4 C 1.125 -4.015625 1.0625 -4.03125 0.984375 -4.03125 L 0.578125 -4.03125 Z M 0.578125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph3-3">
<path style="stroke:none;" d="M 3.546875 0 L 3.546875 -2.578125 C 3.546875 -2.8125 3.515625 -3.015625 3.453125 -3.203125 C 3.390625 -3.390625 3.296875 -3.546875 3.1875 -3.6875 C 3.0625 -3.8125 2.921875 -3.921875 2.734375 -4 C 2.5625 -4.078125 2.359375 -4.109375 2.140625 -4.109375 C 1.828125 -4.109375 1.546875 -4.0625 1.28125 -3.953125 C 1.03125 -3.84375 0.78125 -3.6875 0.5625 -3.46875 L 0.6875 -3.234375 C 0.703125 -3.203125 0.734375 -3.171875 0.765625 -3.140625 C 0.8125 -3.125 0.859375 -3.109375 0.90625 -3.109375 C 0.953125 -3.109375 1.03125 -3.125 1.078125 -3.171875 C 1.140625 -3.21875 1.21875 -3.265625 1.3125 -3.328125 C 1.390625 -3.375 1.5 -3.421875 1.625 -3.46875 C 1.734375 -3.515625 1.875 -3.53125 2.046875 -3.53125 C 2.3125 -3.53125 2.515625 -3.453125 2.640625 -3.296875 C 2.78125 -3.125 2.84375 -2.890625 2.84375 -2.578125 L 2.84375 -2.265625 C 2.390625 -2.25 2 -2.21875 1.6875 -2.140625 C 1.375 -2.0625 1.109375 -1.96875 0.921875 -1.859375 C 0.71875 -1.75 0.578125 -1.625 0.5 -1.46875 C 0.40625 -1.328125 0.359375 -1.171875 0.359375 -1.015625 C 0.359375 -0.828125 0.40625 -0.671875 0.453125 -0.53125 C 0.515625 -0.40625 0.59375 -0.28125 0.703125 -0.203125 C 0.796875 -0.109375 0.921875 -0.046875 1.046875 0 C 1.1875 0.046875 1.34375 0.0625 1.5 0.0625 C 1.65625 0.0625 1.78125 0.046875 1.90625 0.03125 C 2.046875 0 2.15625 -0.046875 2.265625 -0.09375 C 2.375 -0.140625 2.484375 -0.203125 2.59375 -0.28125 C 2.6875 -0.359375 2.796875 -0.453125 2.90625 -0.546875 L 2.984375 -0.171875 C 3 -0.09375 3.015625 -0.046875 3.0625 -0.03125 C 3.109375 -0.015625 3.15625 0 3.234375 0 Z M 1.703125 -0.4375 C 1.609375 -0.4375 1.53125 -0.453125 1.453125 -0.46875 C 1.359375 -0.484375 1.296875 -0.53125 1.234375 -0.578125 C 1.171875 -0.625 1.140625 -0.6875 1.09375 -0.765625 C 1.0625 -0.84375 1.046875 -0.9375 1.046875 -1.046875 C 1.046875 -1.15625 1.078125 -1.25 1.140625 -1.34375 C 1.21875 -1.4375 1.3125 -1.515625 1.453125 -1.578125 C 1.609375 -1.640625 1.78125 -1.703125 2.015625 -1.734375 C 2.25 -1.78125 2.515625 -1.8125 2.84375 -1.8125 L 2.84375 -0.96875 C 2.765625 -0.890625 2.6875 -0.8125 2.609375 -0.75 C 2.515625 -0.6875 2.4375 -0.625 2.34375 -0.578125 C 2.25 -0.53125 2.15625 -0.5 2.046875 -0.46875 C 1.9375 -0.453125 1.828125 -0.4375 1.703125 -0.4375 Z M 1.703125 -0.4375 "/>
</symbol>
<symbol overflow="visible" id="glyph3-4">
<path style="stroke:none;" d="M 0.578125 0 L 1.296875 0 L 1.296875 -2.96875 C 1.453125 -3.140625 1.609375 -3.28125 1.796875 -3.375 C 1.96875 -3.484375 2.171875 -3.53125 2.375 -3.53125 C 2.671875 -3.53125 2.890625 -3.453125 3.015625 -3.28125 C 3.15625 -3.109375 3.234375 -2.875 3.234375 -2.5625 L 3.234375 0 L 3.9375 0 L 3.9375 -2.5625 C 3.9375 -2.796875 3.90625 -3.015625 3.859375 -3.203125 C 3.796875 -3.375 3.703125 -3.546875 3.59375 -3.6875 C 3.484375 -3.8125 3.34375 -3.921875 3.171875 -4 C 3 -4.0625 2.8125 -4.09375 2.59375 -4.09375 C 2.3125 -4.09375 2.0625 -4.046875 1.84375 -3.921875 C 1.625 -3.796875 1.421875 -3.640625 1.25 -3.453125 L 1.203125 -3.890625 C 1.171875 -3.984375 1.109375 -4.03125 1 -4.03125 L 0.578125 -4.03125 Z M 0.578125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph3-5">
<path style="stroke:none;" d="M 2.890625 -3.375 L 3.046875 -3.625 C 2.890625 -3.78125 2.71875 -3.890625 2.5 -3.96875 C 2.296875 -4.0625 2.0625 -4.09375 1.78125 -4.09375 C 1.5625 -4.09375 1.359375 -4.0625 1.171875 -4 C 1 -3.9375 0.859375 -3.859375 0.734375 -3.75 C 0.609375 -3.640625 0.515625 -3.515625 0.453125 -3.375 C 0.390625 -3.234375 0.359375 -3.078125 0.359375 -2.921875 C 0.359375 -2.75 0.375 -2.609375 0.453125 -2.484375 C 0.5 -2.359375 0.578125 -2.265625 0.6875 -2.1875 C 0.78125 -2.09375 0.890625 -2.03125 1.015625 -1.96875 C 1.140625 -1.921875 1.28125 -1.875 1.40625 -1.828125 C 1.53125 -1.78125 1.671875 -1.75 1.796875 -1.71875 C 1.921875 -1.671875 2.03125 -1.625 2.125 -1.578125 C 2.234375 -1.515625 2.296875 -1.46875 2.359375 -1.390625 C 2.421875 -1.3125 2.453125 -1.21875 2.453125 -1.109375 C 2.453125 -1.015625 2.4375 -0.9375 2.40625 -0.859375 C 2.375 -0.78125 2.3125 -0.703125 2.25 -0.640625 C 2.1875 -0.578125 2.09375 -0.53125 2 -0.5 C 1.890625 -0.46875 1.765625 -0.453125 1.625 -0.453125 C 1.46875 -0.453125 1.328125 -0.46875 1.234375 -0.5 C 1.109375 -0.53125 1.03125 -0.578125 0.953125 -0.625 C 0.875 -0.671875 0.8125 -0.71875 0.75 -0.75 C 0.703125 -0.78125 0.65625 -0.8125 0.609375 -0.8125 C 0.5625 -0.8125 0.515625 -0.796875 0.484375 -0.78125 C 0.46875 -0.75 0.4375 -0.734375 0.421875 -0.703125 L 0.25 -0.421875 C 0.40625 -0.28125 0.609375 -0.171875 0.828125 -0.078125 C 1.0625 0.015625 1.3125 0.0625 1.59375 0.0625 C 1.84375 0.0625 2.0625 0.03125 2.25 -0.03125 C 2.4375 -0.109375 2.59375 -0.1875 2.71875 -0.3125 C 2.859375 -0.421875 2.953125 -0.5625 3.015625 -0.71875 C 3.09375 -0.875 3.125 -1.046875 3.125 -1.234375 C 3.125 -1.40625 3.09375 -1.53125 3.03125 -1.65625 C 2.96875 -1.765625 2.890625 -1.859375 2.796875 -1.9375 C 2.6875 -2.03125 2.578125 -2.09375 2.453125 -2.140625 C 2.328125 -2.203125 2.203125 -2.25 2.078125 -2.28125 C 1.9375 -2.328125 1.8125 -2.375 1.6875 -2.421875 C 1.5625 -2.453125 1.453125 -2.5 1.359375 -2.546875 C 1.25 -2.59375 1.171875 -2.65625 1.109375 -2.71875 C 1.0625 -2.796875 1.03125 -2.875 1.03125 -2.984375 C 1.03125 -3.0625 1.046875 -3.140625 1.078125 -3.21875 C 1.109375 -3.28125 1.171875 -3.34375 1.234375 -3.40625 C 1.3125 -3.453125 1.390625 -3.5 1.484375 -3.515625 C 1.578125 -3.546875 1.6875 -3.5625 1.8125 -3.5625 C 1.9375 -3.5625 2.0625 -3.546875 2.15625 -3.515625 C 2.265625 -3.5 2.34375 -3.453125 2.421875 -3.421875 C 2.5 -3.390625 2.5625 -3.359375 2.609375 -3.328125 C 2.65625 -3.296875 2.703125 -3.28125 2.75 -3.28125 C 2.8125 -3.28125 2.859375 -3.3125 2.890625 -3.375 Z M 2.890625 -3.375 "/>
</symbol>
<symbol overflow="visible" id="glyph3-6">
<path style="stroke:none;" d="M 0.734375 0 L 1.453125 0 L 1.453125 -3.4375 L 2.59375 -3.4375 L 2.59375 -3.953125 L 1.4375 -3.953125 L 1.4375 -4.328125 C 1.4375 -4.5 1.453125 -4.640625 1.484375 -4.765625 C 1.53125 -4.875 1.578125 -4.96875 1.65625 -5.046875 C 1.71875 -5.109375 1.8125 -5.171875 1.90625 -5.203125 C 2.015625 -5.234375 2.125 -5.25 2.25 -5.25 L 2.359375 -5.25 C 2.4375 -5.25 2.5 -5.25 2.546875 -5.265625 C 2.59375 -5.28125 2.609375 -5.3125 2.609375 -5.359375 L 2.625 -5.71875 C 2.46875 -5.765625 2.3125 -5.796875 2.125 -5.796875 C 1.921875 -5.796875 1.71875 -5.765625 1.546875 -5.703125 C 1.375 -5.640625 1.234375 -5.53125 1.109375 -5.421875 C 1 -5.296875 0.90625 -5.140625 0.84375 -4.96875 C 0.765625 -4.78125 0.734375 -4.578125 0.734375 -4.34375 L 0.734375 -3.953125 L 0.109375 -3.953125 L 0.109375 -3.671875 C 0.109375 -3.609375 0.125 -3.5625 0.15625 -3.546875 C 0.1875 -3.515625 0.234375 -3.5 0.296875 -3.484375 L 0.734375 -3.4375 Z M 0.734375 0 "/>
</symbol>
<symbol overflow="visible" id="glyph3-7">
<path style="stroke:none;" d="M 2.21875 -4.09375 C 1.921875 -4.09375 1.65625 -4.046875 1.421875 -3.953125 C 1.171875 -3.859375 0.96875 -3.71875 0.8125 -3.53125 C 0.640625 -3.359375 0.515625 -3.140625 0.421875 -2.875 C 0.328125 -2.625 0.28125 -2.328125 0.28125 -2.015625 C 0.28125 -1.703125 0.328125 -1.421875 0.421875 -1.15625 C 0.515625 -0.90625 0.640625 -0.6875 0.8125 -0.5 C 0.96875 -0.328125 1.171875 -0.1875 1.421875 -0.09375 C 1.65625 0.015625 1.921875 0.0625 2.21875 0.0625 C 2.515625 0.0625 2.78125 0.015625 3.015625 -0.09375 C 3.25 -0.1875 3.453125 -0.328125 3.625 -0.5 C 3.78125 -0.6875 3.90625 -0.90625 4 -1.15625 C 4.09375 -1.421875 4.140625 -1.703125 4.140625 -2.015625 C 4.140625 -2.328125 4.09375 -2.625 4 -2.875 C 3.90625 -3.140625 3.78125 -3.359375 3.625 -3.53125 C 3.453125 -3.71875 3.25 -3.859375 3.015625 -3.953125 C 2.78125 -4.046875 2.515625 -4.09375 2.21875 -4.09375 Z M 2.21875 -0.5 C 2.015625 -0.5 1.84375 -0.53125 1.6875 -0.609375 C 1.546875 -0.671875 1.421875 -0.765625 1.3125 -0.90625 C 1.21875 -1.03125 1.140625 -1.1875 1.09375 -1.375 C 1.046875 -1.5625 1.015625 -1.78125 1.015625 -2.015625 C 1.015625 -2.25 1.046875 -2.46875 1.09375 -2.65625 C 1.140625 -2.84375 1.21875 -3.015625 1.3125 -3.140625 C 1.421875 -3.265625 1.546875 -3.375 1.6875 -3.4375 C 1.84375 -3.5 2.015625 -3.546875 2.21875 -3.546875 C 2.609375 -3.546875 2.90625 -3.40625 3.109375 -3.140625 C 3.296875 -2.875 3.40625 -2.5 3.40625 -2.015625 C 3.40625 -1.53125 3.296875 -1.15625 3.109375 -0.90625 C 2.90625 -0.625 2.609375 -0.5 2.21875 -0.5 Z M 2.21875 -0.5 "/>
</symbol>
<symbol overflow="visible" id="glyph3-8">
<path style="stroke:none;" d="M 0.578125 0 L 1.296875 0 L 1.296875 -3.015625 C 1.421875 -3.171875 1.546875 -3.296875 1.703125 -3.390625 C 1.859375 -3.484375 2.015625 -3.53125 2.1875 -3.53125 C 2.4375 -3.53125 2.625 -3.453125 2.765625 -3.296875 C 2.890625 -3.140625 2.953125 -2.890625 2.953125 -2.5625 L 2.953125 0 L 3.671875 0 L 3.671875 -2.5625 C 3.671875 -2.734375 3.6875 -2.875 3.734375 -2.984375 C 3.78125 -3.109375 3.84375 -3.21875 3.921875 -3.296875 C 4 -3.375 4.09375 -3.4375 4.203125 -3.46875 C 4.3125 -3.515625 4.421875 -3.53125 4.53125 -3.53125 C 4.796875 -3.53125 5 -3.453125 5.140625 -3.296875 C 5.28125 -3.125 5.34375 -2.890625 5.34375 -2.5625 L 5.34375 0 L 6.046875 0 L 6.046875 -2.5625 C 6.046875 -2.8125 6.015625 -3.03125 5.953125 -3.21875 C 5.90625 -3.40625 5.8125 -3.5625 5.703125 -3.703125 C 5.578125 -3.828125 5.4375 -3.921875 5.28125 -4 C 5.109375 -4.0625 4.921875 -4.09375 4.703125 -4.09375 C 4.578125 -4.09375 4.4375 -4.078125 4.3125 -4.046875 C 4.1875 -4.015625 4.0625 -3.96875 3.953125 -3.90625 C 3.828125 -3.828125 3.734375 -3.75 3.640625 -3.640625 C 3.546875 -3.53125 3.46875 -3.40625 3.421875 -3.265625 C 3.34375 -3.515625 3.21875 -3.71875 3.046875 -3.875 C 2.890625 -4.03125 2.671875 -4.09375 2.390625 -4.09375 C 2.140625 -4.09375 1.9375 -4.046875 1.75 -3.921875 C 1.5625 -3.8125 1.390625 -3.65625 1.25 -3.46875 L 1.203125 -3.890625 C 1.171875 -3.984375 1.109375 -4.03125 1 -4.03125 L 0.578125 -4.03125 Z M 0.578125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph3-9">
<path style="stroke:none;" d="M 1.375 -4.03125 L 0.65625 -4.03125 L 0.65625 0 L 1.375 0 Z M 1.53125 -5.296875 C 1.53125 -5.375 1.515625 -5.4375 1.484375 -5.5 C 1.453125 -5.5625 1.421875 -5.625 1.375 -5.671875 C 1.328125 -5.703125 1.28125 -5.75 1.21875 -5.78125 C 1.15625 -5.796875 1.09375 -5.8125 1.015625 -5.8125 C 0.953125 -5.8125 0.890625 -5.796875 0.828125 -5.78125 C 0.765625 -5.75 0.71875 -5.703125 0.671875 -5.671875 C 0.625 -5.625 0.578125 -5.5625 0.5625 -5.5 C 0.53125 -5.4375 0.515625 -5.375 0.515625 -5.296875 C 0.515625 -5.234375 0.53125 -5.171875 0.5625 -5.109375 C 0.578125 -5.046875 0.625 -5 0.671875 -4.953125 C 0.71875 -4.90625 0.765625 -4.875 0.828125 -4.84375 C 0.890625 -4.8125 0.953125 -4.796875 1.015625 -4.796875 C 1.09375 -4.796875 1.15625 -4.8125 1.21875 -4.84375 C 1.28125 -4.875 1.328125 -4.90625 1.375 -4.953125 C 1.421875 -5 1.453125 -5.046875 1.484375 -5.109375 C 1.515625 -5.171875 1.53125 -5.234375 1.53125 -5.296875 Z M 1.53125 -5.296875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-10">
<path style="stroke:none;" d="M 1.8125 0.0625 C 1.984375 0.0625 2.171875 0.03125 2.34375 -0.03125 C 2.515625 -0.09375 2.65625 -0.1875 2.78125 -0.296875 L 2.578125 -0.640625 C 2.546875 -0.6875 2.515625 -0.703125 2.46875 -0.703125 C 2.453125 -0.703125 2.4375 -0.703125 2.40625 -0.671875 C 2.375 -0.65625 2.34375 -0.640625 2.296875 -0.609375 C 2.265625 -0.59375 2.21875 -0.5625 2.15625 -0.546875 C 2.109375 -0.53125 2.046875 -0.515625 1.96875 -0.515625 C 1.828125 -0.515625 1.734375 -0.5625 1.640625 -0.640625 C 1.5625 -0.71875 1.515625 -0.84375 1.515625 -1.015625 L 1.515625 -3.4375 L 2.671875 -3.4375 L 2.671875 -3.953125 L 1.515625 -3.953125 L 1.515625 -5.34375 L 1.15625 -5.34375 C 1.125 -5.34375 1.078125 -5.328125 1.046875 -5.3125 C 1.03125 -5.28125 1 -5.25 1 -5.21875 L 0.84375 -3.96875 L 0.171875 -3.875 L 0.171875 -3.59375 C 0.171875 -3.546875 0.1875 -3.5 0.21875 -3.484375 C 0.25 -3.453125 0.28125 -3.4375 0.328125 -3.4375 L 0.8125 -3.4375 L 0.8125 -0.96875 C 0.8125 -0.640625 0.90625 -0.375 1.0625 -0.203125 C 1.25 -0.03125 1.484375 0.0625 1.8125 0.0625 Z M 1.8125 0.0625 "/>
</symbol>
<symbol overflow="visible" id="glyph3-11">
<path style="stroke:none;" d="M 0.578125 1.359375 L 1.296875 1.359375 L 1.296875 -0.421875 C 1.421875 -0.265625 1.578125 -0.15625 1.765625 -0.0625 C 1.9375 0.015625 2.140625 0.0625 2.40625 0.0625 C 2.671875 0.0625 2.90625 0 3.125 -0.109375 C 3.34375 -0.21875 3.53125 -0.359375 3.671875 -0.546875 C 3.828125 -0.734375 3.9375 -0.953125 4.015625 -1.21875 C 4.09375 -1.46875 4.140625 -1.75 4.140625 -2.046875 C 4.140625 -2.375 4.109375 -2.671875 4.03125 -2.9375 C 3.953125 -3.1875 3.859375 -3.40625 3.71875 -3.578125 C 3.59375 -3.75 3.4375 -3.890625 3.25 -3.96875 C 3.0625 -4.0625 2.84375 -4.109375 2.609375 -4.109375 C 2.328125 -4.109375 2.0625 -4.046875 1.84375 -3.921875 C 1.625 -3.796875 1.421875 -3.625 1.25 -3.40625 L 1.203125 -3.890625 C 1.171875 -3.984375 1.109375 -4.03125 1 -4.03125 L 0.578125 -4.03125 Z M 2.375 -3.53125 C 2.546875 -3.53125 2.6875 -3.5 2.8125 -3.453125 C 2.9375 -3.390625 3.046875 -3.3125 3.140625 -3.1875 C 3.21875 -3.0625 3.296875 -2.90625 3.34375 -2.71875 C 3.375 -2.53125 3.40625 -2.3125 3.40625 -2.046875 C 3.40625 -1.546875 3.3125 -1.15625 3.109375 -0.890625 C 2.90625 -0.625 2.609375 -0.5 2.234375 -0.5 C 2.046875 -0.5 1.875 -0.53125 1.71875 -0.609375 C 1.5625 -0.671875 1.421875 -0.796875 1.296875 -0.96875 L 1.296875 -2.921875 C 1.4375 -3.125 1.59375 -3.265625 1.765625 -3.375 C 1.9375 -3.484375 2.140625 -3.53125 2.375 -3.53125 Z M 2.375 -3.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph3-12">
<path style="stroke:none;" d="M 1.375 -4.03125 L 0.65625 -4.03125 L 0.65625 0.296875 C 0.65625 0.515625 0.625 0.671875 0.53125 0.765625 C 0.4375 0.859375 0.296875 0.90625 0.09375 0.90625 C 0.046875 0.90625 0.03125 0.90625 0 0.90625 C -0.03125 0.90625 -0.046875 0.90625 -0.0625 0.90625 C -0.109375 0.90625 -0.140625 0.90625 -0.15625 0.921875 C -0.171875 0.9375 -0.1875 0.953125 -0.1875 0.984375 L -0.21875 1.375 C -0.15625 1.40625 -0.078125 1.421875 -0.015625 1.4375 C 0.0625 1.4375 0.140625 1.453125 0.234375 1.453125 C 0.4375 1.453125 0.609375 1.421875 0.75 1.359375 C 0.890625 1.296875 1.015625 1.21875 1.109375 1.109375 C 1.203125 1.015625 1.265625 0.890625 1.3125 0.75 C 1.34375 0.609375 1.375 0.46875 1.375 0.296875 Z M 1.53125 -5.296875 C 1.53125 -5.375 1.515625 -5.4375 1.484375 -5.5 C 1.453125 -5.5625 1.421875 -5.625 1.375 -5.671875 C 1.328125 -5.703125 1.28125 -5.75 1.21875 -5.78125 C 1.15625 -5.796875 1.09375 -5.8125 1.015625 -5.8125 C 0.953125 -5.8125 0.890625 -5.796875 0.828125 -5.78125 C 0.765625 -5.75 0.71875 -5.703125 0.671875 -5.671875 C 0.625 -5.625 0.578125 -5.5625 0.5625 -5.5 C 0.53125 -5.4375 0.515625 -5.375 0.515625 -5.296875 C 0.515625 -5.234375 0.53125 -5.171875 0.5625 -5.109375 C 0.578125 -5.046875 0.625 -5 0.671875 -4.953125 C 0.71875 -4.90625 0.765625 -4.875 0.828125 -4.84375 C 0.890625 -4.8125 0.953125 -4.796875 1.015625 -4.796875 C 1.09375 -4.796875 1.15625 -4.8125 1.21875 -4.84375 C 1.28125 -4.875 1.328125 -4.90625 1.375 -4.953125 C 1.421875 -5 1.453125 -5.046875 1.484375 -5.109375 C 1.515625 -5.171875 1.53125 -5.234375 1.53125 -5.296875 Z M 1.53125 -5.296875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-13">
<path style="stroke:none;" d="M 2.171875 -4.09375 C 1.890625 -4.09375 1.625 -4.046875 1.390625 -3.9375 C 1.15625 -3.84375 0.953125 -3.703125 0.796875 -3.515625 C 0.640625 -3.34375 0.515625 -3.125 0.421875 -2.890625 C 0.34375 -2.640625 0.296875 -2.375 0.296875 -2.09375 C 0.296875 -1.75 0.34375 -1.4375 0.4375 -1.171875 C 0.53125 -0.90625 0.671875 -0.6875 0.84375 -0.5 C 1.015625 -0.3125 1.21875 -0.171875 1.453125 -0.09375 C 1.6875 0.015625 1.9375 0.0625 2.21875 0.0625 C 2.359375 0.0625 2.515625 0.046875 2.65625 0.015625 C 2.8125 -0.015625 2.953125 -0.046875 3.09375 -0.09375 C 3.234375 -0.140625 3.359375 -0.21875 3.484375 -0.28125 C 3.609375 -0.359375 3.71875 -0.453125 3.796875 -0.5625 L 3.609375 -0.828125 C 3.5625 -0.875 3.53125 -0.890625 3.46875 -0.890625 C 3.421875 -0.890625 3.359375 -0.875 3.3125 -0.828125 C 3.25 -0.78125 3.15625 -0.75 3.078125 -0.703125 C 2.984375 -0.65625 2.875 -0.609375 2.734375 -0.5625 C 2.609375 -0.515625 2.453125 -0.5 2.28125 -0.5 C 2.09375 -0.5 1.921875 -0.53125 1.765625 -0.59375 C 1.609375 -0.65625 1.46875 -0.75 1.359375 -0.875 C 1.25 -1 1.15625 -1.15625 1.09375 -1.34375 C 1.03125 -1.53125 1 -1.765625 1 -2.015625 L 3.6875 -2.015625 C 3.75 -2.015625 3.796875 -2.03125 3.8125 -2.078125 C 3.84375 -2.109375 3.859375 -2.1875 3.859375 -2.296875 C 3.859375 -2.578125 3.8125 -2.84375 3.734375 -3.0625 C 3.640625 -3.28125 3.53125 -3.46875 3.375 -3.625 C 3.234375 -3.78125 3.046875 -3.890625 2.84375 -3.96875 C 2.640625 -4.0625 2.421875 -4.09375 2.171875 -4.09375 Z M 2.203125 -3.578125 C 2.359375 -3.578125 2.5 -3.546875 2.625 -3.5 C 2.75 -3.4375 2.859375 -3.359375 2.953125 -3.265625 C 3.03125 -3.15625 3.109375 -3.046875 3.140625 -2.90625 C 3.1875 -2.765625 3.21875 -2.625 3.21875 -2.453125 L 1.015625 -2.453125 C 1.0625 -2.8125 1.1875 -3.078125 1.390625 -3.28125 C 1.578125 -3.484375 1.859375 -3.578125 2.203125 -3.578125 Z M 2.203125 -3.578125 "/>
</symbol>
<symbol overflow="visible" id="glyph3-14">
<path style="stroke:none;" d="M 3.328125 -3.3125 L 3.515625 -3.578125 C 3.359375 -3.734375 3.15625 -3.875 2.9375 -3.953125 C 2.71875 -4.0625 2.484375 -4.09375 2.203125 -4.09375 C 1.890625 -4.09375 1.625 -4.046875 1.375 -3.9375 C 1.140625 -3.84375 0.953125 -3.703125 0.78125 -3.515625 C 0.625 -3.328125 0.5 -3.109375 0.421875 -2.859375 C 0.328125 -2.59375 0.296875 -2.3125 0.296875 -2.015625 C 0.296875 -1.6875 0.34375 -1.40625 0.4375 -1.140625 C 0.53125 -0.875 0.65625 -0.671875 0.8125 -0.484375 C 0.96875 -0.3125 1.15625 -0.171875 1.375 -0.078125 C 1.59375 0.015625 1.828125 0.0625 2.078125 0.0625 C 2.359375 0.0625 2.640625 0.015625 2.90625 -0.09375 C 3.171875 -0.1875 3.390625 -0.34375 3.5625 -0.5625 L 3.359375 -0.828125 C 3.34375 -0.875 3.296875 -0.890625 3.234375 -0.890625 C 3.1875 -0.890625 3.140625 -0.875 3.09375 -0.828125 C 3.046875 -0.78125 2.984375 -0.75 2.90625 -0.6875 C 2.828125 -0.640625 2.734375 -0.59375 2.625 -0.5625 C 2.515625 -0.515625 2.375 -0.5 2.203125 -0.5 C 2.015625 -0.5 1.859375 -0.53125 1.71875 -0.59375 C 1.5625 -0.65625 1.4375 -0.765625 1.34375 -0.890625 C 1.25 -1.015625 1.15625 -1.171875 1.109375 -1.375 C 1.046875 -1.5625 1.03125 -1.78125 1.03125 -2.015625 C 1.03125 -2.25 1.046875 -2.46875 1.09375 -2.65625 C 1.15625 -2.84375 1.234375 -3 1.328125 -3.140625 C 1.4375 -3.265625 1.5625 -3.375 1.71875 -3.4375 C 1.859375 -3.515625 2.046875 -3.546875 2.234375 -3.546875 C 2.375 -3.546875 2.515625 -3.53125 2.609375 -3.5 C 2.71875 -3.46875 2.796875 -3.421875 2.875 -3.390625 C 2.9375 -3.34375 3 -3.3125 3.046875 -3.28125 C 3.09375 -3.25 3.140625 -3.234375 3.171875 -3.234375 C 3.21875 -3.234375 3.25 -3.234375 3.265625 -3.25 C 3.296875 -3.265625 3.3125 -3.296875 3.328125 -3.3125 Z M 3.328125 -3.3125 "/>
</symbol>
<symbol overflow="visible" id="glyph3-15">
<path style="stroke:none;" d="M 0.078125 -4.03125 L 1.71875 0 L 2.359375 0 L 4 -4.03125 L 3.453125 -4.03125 C 3.40625 -4.03125 3.359375 -4.03125 3.3125 -4 C 3.28125 -3.96875 3.25 -3.9375 3.234375 -3.890625 L 2.203125 -1.296875 C 2.171875 -1.203125 2.140625 -1.09375 2.109375 -1 C 2.09375 -0.90625 2.0625 -0.8125 2.046875 -0.71875 C 2.03125 -0.8125 2 -0.90625 1.984375 -1 C 1.96875 -1.09375 1.9375 -1.203125 1.890625 -1.296875 L 0.875 -3.890625 C 0.859375 -3.921875 0.828125 -3.96875 0.796875 -4 C 0.75 -4.015625 0.703125 -4.03125 0.65625 -4.03125 Z M 0.078125 -4.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph3-16">
<path style="stroke:none;" d="M 0.34375 -0.4375 C 0.34375 -0.359375 0.359375 -0.296875 0.390625 -0.234375 C 0.421875 -0.1875 0.453125 -0.125 0.5 -0.078125 C 0.53125 -0.046875 0.59375 0 0.65625 0.03125 C 0.703125 0.046875 0.78125 0.0625 0.84375 0.0625 C 0.90625 0.0625 0.984375 0.046875 1.046875 0.03125 C 1.09375 0 1.15625 -0.046875 1.203125 -0.078125 C 1.25 -0.125 1.28125 -0.1875 1.3125 -0.234375 C 1.328125 -0.296875 1.34375 -0.359375 1.34375 -0.4375 C 1.34375 -0.5 1.328125 -0.578125 1.3125 -0.640625 C 1.28125 -0.6875 1.25 -0.75 1.203125 -0.796875 C 1.15625 -0.84375 1.09375 -0.875 1.046875 -0.90625 C 0.984375 -0.921875 0.90625 -0.9375 0.84375 -0.9375 C 0.78125 -0.9375 0.703125 -0.921875 0.65625 -0.90625 C 0.59375 -0.875 0.53125 -0.84375 0.5 -0.796875 C 0.453125 -0.75 0.421875 -0.6875 0.390625 -0.640625 C 0.359375 -0.578125 0.34375 -0.5 0.34375 -0.4375 Z M 0.34375 -0.4375 "/>
</symbol>
<symbol overflow="visible" id="glyph3-17">
<path style="stroke:none;" d="M 6 -2.859375 C 6 -3.28125 5.921875 -3.671875 5.796875 -4.03125 C 5.65625 -4.390625 5.46875 -4.6875 5.21875 -4.953125 C 4.96875 -5.21875 4.671875 -5.421875 4.328125 -5.5625 C 3.984375 -5.703125 3.59375 -5.78125 3.171875 -5.78125 C 2.765625 -5.78125 2.375 -5.703125 2.03125 -5.5625 C 1.6875 -5.421875 1.390625 -5.21875 1.140625 -4.953125 C 0.890625 -4.6875 0.703125 -4.390625 0.5625 -4.03125 C 0.4375 -3.671875 0.359375 -3.28125 0.359375 -2.859375 C 0.359375 -2.421875 0.4375 -2.03125 0.5625 -1.671875 C 0.703125 -1.3125 0.890625 -1.015625 1.140625 -0.75 C 1.390625 -0.5 1.6875 -0.296875 2.03125 -0.15625 C 2.375 -0.015625 2.765625 0.0625 3.171875 0.0625 C 3.59375 0.0625 3.984375 -0.015625 4.328125 -0.15625 C 4.671875 -0.296875 4.96875 -0.5 5.21875 -0.75 C 5.46875 -1.015625 5.65625 -1.3125 5.796875 -1.671875 C 5.921875 -2.03125 6 -2.421875 6 -2.859375 Z M 5.203125 -2.859375 C 5.203125 -2.5 5.15625 -2.1875 5.0625 -1.90625 C 4.96875 -1.640625 4.828125 -1.40625 4.65625 -1.203125 C 4.484375 -1.015625 4.265625 -0.859375 4.015625 -0.765625 C 3.765625 -0.65625 3.484375 -0.609375 3.171875 -0.609375 C 2.875 -0.609375 2.59375 -0.65625 2.34375 -0.765625 C 2.09375 -0.859375 1.890625 -1.015625 1.703125 -1.203125 C 1.53125 -1.40625 1.390625 -1.640625 1.296875 -1.90625 C 1.203125 -2.1875 1.15625 -2.5 1.15625 -2.859375 C 1.15625 -3.203125 1.203125 -3.515625 1.296875 -3.796875 C 1.390625 -4.078125 1.53125 -4.3125 1.703125 -4.5 C 1.890625 -4.703125 2.09375 -4.84375 2.34375 -4.953125 C 2.59375 -5.046875 2.875 -5.109375 3.171875 -5.109375 C 3.484375 -5.109375 3.765625 -5.046875 4.015625 -4.953125 C 4.265625 -4.84375 4.484375 -4.703125 4.65625 -4.5 C 4.828125 -4.3125 4.96875 -4.078125 5.0625 -3.796875 C 5.15625 -3.515625 5.203125 -3.203125 5.203125 -2.859375 Z M 5.203125 -2.859375 "/>
</symbol>
<symbol overflow="visible" id="glyph3-18">
<path style="stroke:none;" d="M 1.9375 -4.109375 C 1.71875 -4.109375 1.515625 -4.078125 1.328125 -4.015625 C 1.140625 -3.953125 0.96875 -3.859375 0.84375 -3.75 C 0.703125 -3.640625 0.59375 -3.5 0.53125 -3.34375 C 0.453125 -3.171875 0.40625 -3 0.40625 -2.8125 C 0.40625 -2.5625 0.46875 -2.34375 0.578125 -2.15625 C 0.6875 -1.96875 0.84375 -1.828125 1.046875 -1.71875 C 0.96875 -1.671875 0.890625 -1.625 0.828125 -1.5625 C 0.765625 -1.515625 0.703125 -1.453125 0.65625 -1.390625 C 0.625 -1.328125 0.578125 -1.265625 0.5625 -1.203125 C 0.546875 -1.140625 0.53125 -1.078125 0.53125 -1.03125 C 0.53125 -0.875 0.5625 -0.75 0.640625 -0.671875 C 0.703125 -0.578125 0.796875 -0.5 0.90625 -0.453125 C 0.6875 -0.375 0.515625 -0.265625 0.390625 -0.125 C 0.265625 0.015625 0.203125 0.1875 0.203125 0.390625 C 0.203125 0.53125 0.234375 0.65625 0.3125 0.78125 C 0.375 0.921875 0.484375 1.03125 0.640625 1.125 C 0.78125 1.234375 0.96875 1.3125 1.1875 1.359375 C 1.40625 1.421875 1.671875 1.453125 1.96875 1.453125 C 2.265625 1.453125 2.515625 1.421875 2.75 1.34375 C 3 1.265625 3.1875 1.15625 3.34375 1.03125 C 3.515625 0.90625 3.640625 0.765625 3.71875 0.609375 C 3.8125 0.4375 3.859375 0.28125 3.859375 0.109375 C 3.859375 -0.078125 3.8125 -0.234375 3.734375 -0.34375 C 3.65625 -0.46875 3.5625 -0.5625 3.4375 -0.625 C 3.296875 -0.6875 3.15625 -0.734375 3 -0.765625 C 2.828125 -0.796875 2.671875 -0.828125 2.5 -0.828125 C 2.328125 -0.84375 2.171875 -0.859375 2 -0.859375 C 1.84375 -0.859375 1.703125 -0.875 1.5625 -0.890625 C 1.4375 -0.921875 1.34375 -0.953125 1.265625 -1 C 1.1875 -1.046875 1.140625 -1.125 1.140625 -1.21875 C 1.140625 -1.28125 1.171875 -1.34375 1.21875 -1.40625 C 1.265625 -1.453125 1.328125 -1.515625 1.40625 -1.5625 C 1.578125 -1.53125 1.75 -1.5 1.9375 -1.5 C 2.15625 -1.5 2.359375 -1.53125 2.546875 -1.59375 C 2.734375 -1.65625 2.890625 -1.734375 3.03125 -1.859375 C 3.15625 -1.96875 3.265625 -2.109375 3.34375 -2.265625 C 3.421875 -2.4375 3.453125 -2.609375 3.453125 -2.8125 C 3.453125 -3.015625 3.40625 -3.21875 3.3125 -3.375 L 3.78125 -3.453125 C 3.890625 -3.46875 3.9375 -3.53125 3.9375 -3.609375 L 3.9375 -3.875 L 2.84375 -3.875 C 2.71875 -3.953125 2.578125 -4.015625 2.4375 -4.046875 C 2.28125 -4.078125 2.109375 -4.109375 1.9375 -4.109375 Z M 3.203125 0.21875 C 3.203125 0.328125 3.171875 0.421875 3.109375 0.515625 C 3.0625 0.59375 2.984375 0.671875 2.875 0.734375 C 2.765625 0.796875 2.640625 0.84375 2.484375 0.890625 C 2.34375 0.921875 2.171875 0.9375 1.96875 0.9375 C 1.78125 0.9375 1.609375 0.921875 1.46875 0.890625 C 1.3125 0.859375 1.203125 0.8125 1.109375 0.75 C 1.015625 0.6875 0.9375 0.625 0.890625 0.546875 C 0.84375 0.46875 0.828125 0.390625 0.828125 0.296875 C 0.828125 0.15625 0.875 0.03125 0.96875 -0.078125 C 1.0625 -0.171875 1.171875 -0.265625 1.328125 -0.34375 C 1.46875 -0.3125 1.59375 -0.296875 1.734375 -0.296875 C 1.890625 -0.28125 2.03125 -0.28125 2.15625 -0.265625 C 2.296875 -0.265625 2.4375 -0.25 2.5625 -0.234375 C 2.6875 -0.21875 2.796875 -0.203125 2.890625 -0.171875 C 2.984375 -0.125 3.0625 -0.078125 3.109375 -0.03125 C 3.171875 0.03125 3.203125 0.125 3.203125 0.21875 Z M 1.9375 -1.96875 C 1.796875 -1.96875 1.671875 -2 1.5625 -2.03125 C 1.453125 -2.078125 1.359375 -2.125 1.296875 -2.203125 C 1.21875 -2.265625 1.15625 -2.359375 1.125 -2.453125 C 1.078125 -2.5625 1.0625 -2.671875 1.0625 -2.78125 C 1.0625 -3.03125 1.140625 -3.234375 1.296875 -3.375 C 1.4375 -3.515625 1.65625 -3.59375 1.9375 -3.59375 C 2.234375 -3.59375 2.453125 -3.515625 2.59375 -3.375 C 2.75 -3.234375 2.828125 -3.03125 2.828125 -2.78125 C 2.828125 -2.671875 2.796875 -2.5625 2.765625 -2.453125 C 2.734375 -2.359375 2.671875 -2.265625 2.59375 -2.203125 C 2.515625 -2.125 2.4375 -2.078125 2.3125 -2.03125 C 2.21875 -2 2.078125 -1.96875 1.9375 -1.96875 Z M 1.9375 -1.96875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-19">
<path style="stroke:none;" d="M 1.375 -5.875 L 0.65625 -5.875 L 0.65625 0 L 1.375 0 Z M 1.375 -5.875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-20">
<path style="stroke:none;" d="M 0.578125 0 L 1.296875 0 L 1.296875 -2.96875 C 1.453125 -3.140625 1.609375 -3.28125 1.796875 -3.375 C 1.96875 -3.484375 2.171875 -3.53125 2.375 -3.53125 C 2.671875 -3.53125 2.890625 -3.453125 3.015625 -3.28125 C 3.15625 -3.109375 3.234375 -2.875 3.234375 -2.5625 L 3.234375 0 L 3.9375 0 L 3.9375 -2.5625 C 3.9375 -2.796875 3.90625 -3.015625 3.859375 -3.203125 C 3.796875 -3.375 3.703125 -3.546875 3.59375 -3.6875 C 3.484375 -3.8125 3.34375 -3.921875 3.171875 -4 C 3 -4.0625 2.8125 -4.09375 2.59375 -4.09375 C 2.3125 -4.09375 2.078125 -4.046875 1.859375 -3.9375 C 1.65625 -3.828125 1.46875 -3.671875 1.296875 -3.5 L 1.296875 -5.875 L 0.578125 -5.875 Z M 0.578125 0 "/>
</symbol>
<symbol overflow="visible" id="glyph3-21">
<path style="stroke:none;" d="M 0.40625 -2.6875 L 0.40625 -2.09375 L 2.359375 -2.09375 L 2.359375 -2.6875 Z M 0.40625 -2.6875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-22">
<path style="stroke:none;" d="M 1.3125 -5.875 L 0.609375 -5.875 L 0.609375 0 L 1.3125 0 L 1.3125 -1.921875 L 1.515625 -1.921875 C 1.59375 -1.921875 1.65625 -1.921875 1.703125 -1.90625 C 1.734375 -1.890625 1.78125 -1.84375 1.8125 -1.796875 L 3.140625 -0.140625 C 3.171875 -0.09375 3.21875 -0.0625 3.265625 -0.03125 C 3.296875 -0.015625 3.34375 0 3.40625 0 L 4.046875 0 L 2.46875 -2 C 2.4375 -2.046875 2.40625 -2.09375 2.359375 -2.140625 C 2.328125 -2.171875 2.28125 -2.21875 2.234375 -2.25 C 2.28125 -2.265625 2.3125 -2.296875 2.34375 -2.328125 C 2.390625 -2.375 2.421875 -2.40625 2.46875 -2.453125 L 3.953125 -4.03125 L 3.296875 -4.03125 C 3.234375 -4.03125 3.1875 -4.03125 3.140625 -4 C 3.109375 -3.96875 3.0625 -3.9375 3.03125 -3.890625 L 1.75 -2.53125 C 1.703125 -2.484375 1.671875 -2.453125 1.640625 -2.4375 C 1.59375 -2.421875 1.546875 -2.421875 1.5 -2.421875 L 1.3125 -2.421875 Z M 1.3125 -5.875 "/>
</symbol>
<symbol overflow="visible" id="glyph3-23">
<path style="stroke:none;" d="M 3.421875 0 L 3.84375 0 L 3.84375 -5.875 L 3.140625 -5.875 L 3.140625 -3.625 C 3 -3.78125 2.84375 -3.890625 2.671875 -3.984375 C 2.484375 -4.0625 2.28125 -4.109375 2.03125 -4.109375 C 1.75 -4.109375 1.515625 -4.0625 1.296875 -3.9375 C 1.078125 -3.84375 0.90625 -3.6875 0.75 -3.5 C 0.609375 -3.3125 0.484375 -3.09375 0.40625 -2.84375 C 0.328125 -2.578125 0.28125 -2.296875 0.28125 -2 C 0.28125 -1.671875 0.328125 -1.375 0.390625 -1.109375 C 0.46875 -0.859375 0.5625 -0.640625 0.703125 -0.46875 C 0.828125 -0.296875 1 -0.171875 1.1875 -0.078125 C 1.375 0.015625 1.578125 0.0625 1.8125 0.0625 C 2.09375 0.0625 2.359375 -0.015625 2.578125 -0.140625 C 2.796875 -0.265625 3 -0.421875 3.171875 -0.640625 L 3.234375 -0.140625 C 3.265625 -0.046875 3.328125 0 3.421875 0 Z M 2.046875 -0.515625 C 1.890625 -0.515625 1.734375 -0.546875 1.609375 -0.609375 C 1.484375 -0.65625 1.375 -0.75 1.28125 -0.875 C 1.203125 -0.984375 1.125 -1.140625 1.09375 -1.328125 C 1.046875 -1.515625 1.015625 -1.734375 1.015625 -2 C 1.015625 -2.5 1.125 -2.890625 1.328125 -3.15625 C 1.53125 -3.421875 1.8125 -3.546875 2.1875 -3.546875 C 2.375 -3.546875 2.546875 -3.515625 2.703125 -3.453125 C 2.859375 -3.375 3 -3.25 3.140625 -3.078125 L 3.140625 -1.125 C 2.984375 -0.9375 2.828125 -0.78125 2.65625 -0.671875 C 2.484375 -0.5625 2.28125 -0.515625 2.046875 -0.515625 Z M 2.046875 -0.515625 "/>
</symbol>
<symbol overflow="visible" id="glyph3-24">
<path style="stroke:none;" d="M 0.609375 0 L 1.0625 0 C 1.15625 0 1.234375 -0.046875 1.25 -0.15625 L 1.28125 -0.515625 C 1.421875 -0.34375 1.578125 -0.1875 1.765625 -0.09375 C 1.9375 0 2.15625 0.0625 2.421875 0.0625 C 2.6875 0.0625 2.9375 0 3.15625 -0.109375 C 3.375 -0.21875 3.546875 -0.359375 3.703125 -0.546875 C 3.859375 -0.734375 3.96875 -0.953125 4.046875 -1.21875 C 4.125 -1.46875 4.171875 -1.75 4.171875 -2.046875 C 4.171875 -2.375 4.125 -2.671875 4.0625 -2.9375 C 3.984375 -3.1875 3.890625 -3.40625 3.75 -3.578125 C 3.625 -3.75 3.453125 -3.875 3.265625 -3.96875 C 3.078125 -4.0625 2.875 -4.09375 2.640625 -4.09375 C 2.359375 -4.09375 2.109375 -4.046875 1.890625 -3.921875 C 1.671875 -3.8125 1.484375 -3.65625 1.3125 -3.453125 L 1.3125 -5.875 L 0.609375 -5.875 Z M 2.40625 -3.53125 C 2.5625 -3.53125 2.71875 -3.5 2.84375 -3.453125 C 2.96875 -3.390625 3.078125 -3.3125 3.15625 -3.1875 C 3.25 -3.0625 3.3125 -2.90625 3.359375 -2.71875 C 3.40625 -2.53125 3.4375 -2.3125 3.4375 -2.046875 C 3.4375 -1.546875 3.328125 -1.15625 3.125 -0.890625 C 2.921875 -0.625 2.640625 -0.5 2.265625 -0.5 C 2.078125 -0.5 1.890625 -0.53125 1.75 -0.609375 C 1.578125 -0.671875 1.453125 -0.796875 1.3125 -0.96875 L 1.3125 -2.921875 C 1.46875 -3.125 1.625 -3.265625 1.796875 -3.375 C 1.96875 -3.484375 2.171875 -3.53125 2.40625 -3.53125 Z M 2.40625 -3.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph3-25">
<path style="stroke:none;" d="M 5.640625 -2.859375 C 5.640625 -3.28125 5.578125 -3.671875 5.4375 -4.015625 C 5.296875 -4.375 5.109375 -4.671875 4.859375 -4.921875 C 4.625 -5.171875 4.328125 -5.359375 3.96875 -5.5 C 3.625 -5.640625 3.25 -5.703125 2.828125 -5.703125 L 0.6875 -5.703125 L 0.6875 0 L 2.828125 0 C 3.25 0 3.625 -0.0625 3.96875 -0.203125 C 4.328125 -0.34375 4.625 -0.53125 4.859375 -0.78125 C 5.109375 -1.03125 5.296875 -1.328125 5.4375 -1.6875 C 5.578125 -2.03125 5.640625 -2.421875 5.640625 -2.859375 Z M 4.84375 -2.859375 C 4.84375 -2.5 4.796875 -2.1875 4.703125 -1.90625 C 4.609375 -1.640625 4.46875 -1.40625 4.296875 -1.21875 C 4.125 -1.03125 3.90625 -0.875 3.65625 -0.78125 C 3.40625 -0.671875 3.140625 -0.625 2.828125 -0.625 L 1.46875 -0.625 L 1.46875 -5.078125 L 2.828125 -5.078125 C 3.140625 -5.078125 3.40625 -5.03125 3.65625 -4.9375 C 3.90625 -4.828125 4.125 -4.6875 4.296875 -4.5 C 4.46875 -4.296875 4.609375 -4.0625 4.703125 -3.796875 C 4.796875 -3.515625 4.84375 -3.203125 4.84375 -2.859375 Z M 4.84375 -2.859375 "/>
</symbol>
<symbol overflow="visible" id="glyph3-26">
<path style="stroke:none;" d="M 3.40625 -3.734375 L 3.40625 -4.03125 L 0.40625 -4.03125 L 0.40625 -3.484375 L 2.578125 -3.484375 L 0.375 -0.546875 C 0.34375 -0.5 0.328125 -0.46875 0.296875 -0.421875 C 0.28125 -0.375 0.28125 -0.328125 0.28125 -0.296875 L 0.28125 0 L 3.3125 0 L 3.3125 -0.546875 L 1.109375 -0.546875 L 3.296875 -3.46875 C 3.328125 -3.5 3.34375 -3.546875 3.375 -3.59375 C 3.390625 -3.640625 3.40625 -3.6875 3.40625 -3.734375 Z M 3.40625 -3.734375 "/>
</symbol>
<symbol overflow="visible" id="glyph3-27">
<path style="stroke:none;" d="M 1.203125 -4.03125 L 0.484375 -4.03125 L 0.484375 -1.46875 C 0.484375 -1.234375 0.515625 -1.03125 0.578125 -0.84375 C 0.625 -0.65625 0.71875 -0.484375 0.828125 -0.359375 C 0.9375 -0.21875 1.078125 -0.125 1.25 -0.046875 C 1.421875 0.03125 1.625 0.0625 1.84375 0.0625 C 2.125 0.0625 2.359375 0 2.578125 -0.109375 C 2.8125 -0.234375 3 -0.390625 3.171875 -0.578125 L 3.234375 -0.140625 C 3.265625 -0.046875 3.328125 0 3.421875 0 L 3.84375 0 L 3.84375 -4.03125 L 3.140625 -4.03125 L 3.140625 -1.0625 C 2.984375 -0.890625 2.8125 -0.75 2.625 -0.65625 C 2.453125 -0.546875 2.25 -0.5 2.046875 -0.5 C 1.765625 -0.5 1.546875 -0.578125 1.40625 -0.75 C 1.265625 -0.921875 1.203125 -1.15625 1.203125 -1.46875 Z M 1.203125 -4.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph3-28">
<path style="stroke:none;" d="M 1.765625 1.1875 L 4.015625 -4.03125 L 3.453125 -4.03125 C 3.40625 -4.03125 3.359375 -4.03125 3.328125 -4 C 3.28125 -3.96875 3.265625 -3.9375 3.25 -3.890625 L 2.203125 -1.34375 C 2.171875 -1.296875 2.15625 -1.234375 2.125 -1.171875 C 2.109375 -1.109375 2.09375 -1.046875 2.078125 -0.984375 C 2.0625 -1.046875 2.046875 -1.109375 2.03125 -1.171875 C 2.015625 -1.234375 2 -1.28125 1.96875 -1.34375 L 0.890625 -3.890625 C 0.875 -3.921875 0.84375 -3.953125 0.8125 -4 C 0.78125 -4.015625 0.734375 -4.03125 0.671875 -4.03125 L 0.0625 -4.03125 L 1.71875 -0.234375 L 0.984375 1.359375 L 1.515625 1.359375 C 1.578125 1.359375 1.640625 1.34375 1.671875 1.3125 C 1.71875 1.28125 1.734375 1.25 1.765625 1.1875 Z M 1.765625 1.1875 "/>
</symbol>
<symbol overflow="visible" id="glyph4-0">
<path style="stroke:none;" d=""/>
</symbol>
<symbol overflow="visible" id="glyph4-1">
<path style="stroke:none;" d="M 1.21875 -5.453125 C 1.21875 -5.59375 1.21875 -5.734375 1.0625 -5.734375 C 0.90625 -5.734375 0.90625 -5.59375 0.90625 -5.453125 L 0.90625 1.640625 C 0.90625 1.765625 0.90625 1.90625 1.0625 1.90625 C 1.21875 1.90625 1.21875 1.765625 1.21875 1.640625 Z M 1.21875 -5.453125 "/>
</symbol>
</g>
</defs>
<g id="surface1">
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="83.525" y="91.838"/>
<use xlink:href="#glyph0-2" x="86.874094" y="91.838"/>
<use xlink:href="#glyph0-3" x="91.968643" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-4" x="105.736" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="116.05" y="91.783"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-6" x="114.692" y="91.838"/>
<use xlink:href="#glyph0-2" x="120.75746" y="91.838"/>
<use xlink:href="#glyph0-3" x="125.852009" y="91.838"/>
<use xlink:href="#glyph0-7" x="131.917469" y="91.838"/>
<use xlink:href="#glyph0-8" x="135.986563" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-9" x="149.405" y="91.838"/>
<use xlink:href="#glyph0-8" x="155.503187" y="91.838"/>
<use xlink:href="#glyph0-10" x="161.219555" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-11" x="174.987" y="91.838"/>
<use xlink:href="#glyph0-12" x="181.161551" y="91.838"/>
<use xlink:href="#glyph0-13" x="183.95428" y="91.838"/>
<use xlink:href="#glyph0-14" x="190.01974" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-15" x="203.296" y="91.838"/>
<use xlink:href="#glyph0-7" x="208.030549" y="91.838"/>
<use xlink:href="#glyph0-6" x="212.099644" y="91.838"/>
<use xlink:href="#glyph0-16" x="218.165103" y="91.838"/>
<use xlink:href="#glyph0-10" x="222.561471" y="91.838"/>
<use xlink:href="#glyph0-17" x="228.62693" y="91.838"/>
<use xlink:href="#glyph0-8" x="231.41966" y="91.838"/>
<use xlink:href="#glyph0-16" x="237.136028" y="91.838"/>
<use xlink:href="#glyph0-8" x="241.532396" y="91.838"/>
<use xlink:href="#glyph0-10" x="247.248764" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-9" x="261.015" y="91.838"/>
<use xlink:href="#glyph0-8" x="267.113187" y="91.838"/>
<use xlink:href="#glyph0-10" x="272.829555" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-17" x="286.597" y="91.838"/>
<use xlink:href="#glyph0-2" x="289.38973" y="91.838"/>
<use xlink:href="#glyph0-3" x="294.484279" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-14" x="309.478" y="91.838"/>
<use xlink:href="#glyph0-8" x="315.05255" y="91.838"/>
<use xlink:href="#glyph0-15" x="320.768918" y="91.838"/>
<use xlink:href="#glyph0-7" x="325.503468" y="91.838"/>
<use xlink:href="#glyph0-8" x="329.572562" y="91.838"/>
<use xlink:href="#glyph0-16" x="335.288931" y="91.838"/>
<use xlink:href="#glyph0-10" x="339.685298" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-14" x="354.679" y="91.838"/>
<use xlink:href="#glyph0-8" x="360.25355" y="91.838"/>
<use xlink:href="#glyph0-18" x="365.969919" y="91.838"/>
<use xlink:href="#glyph0-13" x="372.068105" y="91.838"/>
<use xlink:href="#glyph0-2" x="378.133565" y="91.838"/>
<use xlink:href="#glyph0-3" x="383.228115" y="91.838"/>
<use xlink:href="#glyph0-7" x="389.293574" y="91.838"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-3" x="401.064" y="91.838"/>
<use xlink:href="#glyph0-19" x="407.12946" y="91.838"/>
<use xlink:href="#glyph0-18" x="412.660373" y="91.838"/>
<use xlink:href="#glyph0-8" x="418.75856" y="91.838"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="89.403" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-2" x="108.128" y="108.108"/>
<use xlink:href="#glyph1-3" x="114.996262" y="108.108"/>
<use xlink:href="#glyph1-4" x="119.542227" y="108.108"/>
<use xlink:href="#glyph1-5" x="124.527546" y="108.108"/>
<use xlink:href="#glyph1-6" x="127.872013" y="108.108"/>
<use xlink:href="#glyph1-5" x="130.983354" y="108.108"/>
<use xlink:href="#glyph1-7" x="134.327821" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-5" x="151.832" y="108.108"/>
<use xlink:href="#glyph1-8" x="155.176467" y="108.108"/>
<use xlink:href="#glyph1-9" x="160.161786" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-10" x="175.025" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-11" x="180.351" y="108.108"/>
<use xlink:href="#glyph1-12" x="182.646398" y="108.108"/>
<use xlink:href="#glyph1-8" x="187.228229" y="108.108"/>
<use xlink:href="#glyph1-5" x="192.213547" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-13" x="215.856" y="108.108"/>
<use xlink:href="#glyph1-3" x="220.043309" y="108.108"/>
<use xlink:href="#glyph1-4" x="224.589274" y="108.108"/>
<use xlink:href="#glyph1-13" x="229.574592" y="108.108"/>
<use xlink:href="#glyph1-9" x="233.761901" y="108.108"/>
<use xlink:href="#glyph1-14" x="238.460294" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-5" x="261.846" y="108.108"/>
<use xlink:href="#glyph1-8" x="265.190467" y="108.108"/>
<use xlink:href="#glyph1-3" x="270.175786" y="108.108"/>
<use xlink:href="#glyph1-5" x="274.72175" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="292.198" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-15" x="308.252" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="312.726234" y="108.108"/>
<use xlink:href="#glyph1-16" x="317.424627" y="108.108"/>
<use xlink:href="#glyph1-5" x="321.316045" y="108.108"/>
<use xlink:href="#glyph1-9" x="324.660512" y="108.108"/>
<use xlink:href="#glyph1-17" x="329.358906" y="108.108"/>
<use xlink:href="#glyph1-18" x="332.972365" y="108.108"/>
<use xlink:href="#glyph1-3" x="337.984582" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-15" x="342.387085" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-19" x="359.46" y="108.108"/>
<use xlink:href="#glyph1-7" x="364.472218" y="108.108"/>
<use xlink:href="#glyph1-7" x="369.457536" y="108.108"/>
<use xlink:href="#glyph1-20" x="374.442854" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="378.872256" y="108.108"/>
<use xlink:href="#glyph1-18" x="383.57065" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-8" x="403.49" y="108.108"/>
<use xlink:href="#glyph1-3" x="408.475318" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-21" x="412.877821" y="108.108"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="417.352054" y="108.108"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 32.98375 -30.367375 L 32.98375 -97.265813 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 123.71875 80.597656 L 125.792969 76.453125 L 123.71875 78.007812 L 121.648438 76.453125 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 28.999375 -99.855656 L 26.597031 -88.523625 C 26.272813 -87.000188 24.749375 -85.765813 23.194688 -85.765813 L 5.850938 -85.765813 C 4.29625 -85.765813 2.772813 -87.000188 2.448594 -88.523625 L 0.581406 -97.324406 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 90.78125 80.597656 L 93.667969 76.972656 L 91.316406 78.066406 L 89.613281 76.113281 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 36.972031 -99.855656 L 39.362656 -66.019719 C 39.690781 -61.359563 43.745469 -57.586125 48.413438 -57.586125 L 126.128281 -57.586125 C 130.79625 -57.586125 134.850938 -61.359563 135.179063 -66.019719 L 137.39 -97.273625 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 228.304688 80.597656 L 230.082031 76.320312 L 228.125 78.015625 L 225.945312 76.609375 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 88.5775 -99.855656 L 86.175156 -88.523625 C 85.850938 -87.000188 84.3275 -85.765813 82.772813 -85.765813 L 73.417344 -85.765813 C 71.862656 -85.765813 70.339219 -87.000188 70.015 -88.523625 L 68.147813 -97.324406 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 158.347656 80.597656 L 161.234375 76.972656 L 158.882812 78.066406 L 157.179688 76.113281 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(3.529358%,63.920593%,83.529663%);stroke-opacity:1;stroke-miterlimit:10;" d="M 91.565781 -99.855656 L 93.960313 -46.855656 C 94.288438 -39.543156 100.487656 -33.617375 107.804063 -33.617375 L 305.800156 -33.617375 C 313.120469 -33.617375 319.315781 -39.543156 319.647812 -46.855656 L 321.92125 -97.269719 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(3.529358%,63.920593%,83.529663%);fill-opacity:1;" d="M 412.773438 80.597656 L 414.65625 76.363281 L 412.65625 78.011719 L 410.515625 76.550781 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-1" x="294.939" y="11.461"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 133.585313 -99.855656 L 131.182969 -88.523625 C 130.85875 -87.000188 129.335313 -85.765813 127.780625 -85.765813 L 100.362656 -85.765813 C 98.807969 -85.765813 97.284531 -87.000188 96.960313 -88.523625 L 95.093125 -97.324406 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 185.292969 80.597656 L 188.179688 76.972656 L 185.828125 78.066406 L 184.125 76.113281 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-2" x="202.334" y="63.61"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(3.529358%,63.920593%,83.529663%);stroke-opacity:1;stroke-miterlimit:10;" d="M 279.304062 -99.855656 L 276.909531 -73.336125 C 276.581406 -69.691594 273.350937 -66.738469 269.690781 -66.738469 L 188.835313 -66.738469 C 185.179063 -66.738469 181.944688 -69.691594 181.616563 -73.336125 L 179.456406 -97.277531 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(3.529358%,63.920593%,83.529663%);fill-opacity:1;" d="M 269.957031 80.597656 L 272.394531 76.65625 L 270.191406 78.019531 L 268.265625 76.285156 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-3" x="317.54" y="44.581"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 276.315781 -99.855656 L 273.913437 -88.523625 C 273.589219 -87.000188 272.065781 -85.765813 270.507187 -85.765813 L 242.690781 -85.765813 C 241.132188 -85.765813 239.60875 -87.000188 239.284531 -88.523625 L 237.42125 -97.324406 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 327.617188 80.597656 L 330.503906 76.972656 L 328.15625 78.066406 L 326.449219 76.113281 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 318.054062 -99.855656 L 315.659531 -66.019719 C 315.331406 -61.359563 311.280625 -57.586125 306.60875 -57.586125 L 214.284531 -57.586125 C 209.616563 -57.586125 205.561875 -61.359563 205.23375 -66.019719 L 203.022813 -97.273625 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 293.578125 80.597656 L 295.933594 76.609375 L 293.757812 78.015625 L 291.800781 76.320312 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 315.065781 -99.855656 L 312.659531 -88.523625 C 312.339219 -87.000188 310.815781 -85.765813 309.257187 -85.765813 L 289.097031 -85.765813 C 287.538437 -85.765813 286.015 -87.000188 285.694687 -88.523625 L 283.8275 -97.324406 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 374.023438 80.597656 L 376.914062 76.972656 L 374.5625 78.066406 L 372.855469 76.113281 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-4" x="387.507" y="63.61"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 336.468125 -105.8205 C 362.839219 -151.492375 362.839219 -195.379094 336.823594 -240.437688 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style="fill:none;stroke-width:0.6376;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -1.55501 2.073297 C -1.424526 1.294334 -0.000814476 0.128925 0.389052 -0.00119941 C 0.000822228 -0.130915 -1.426063 -1.296423 -1.553994 -2.071704 " transform="matrix(-0.50157,0.86877,0.86877,0.50157,427.55946,221.17823)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-1" x="451.01" y="127.985"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-2" x="455.074751" y="127.985"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-3" x="458.135269" y="127.985"/>
<use xlink:href="#glyph3-4" x="462.17611" y="127.985"/>
<use xlink:href="#glyph3-5" x="466.607486" y="127.985"/>
<use xlink:href="#glyph3-6" x="470.066509" y="127.985"/>
<use xlink:href="#glyph3-7" x="472.752433" y="127.985"/>
<use xlink:href="#glyph3-2" x="477.183808" y="127.985"/>
<use xlink:href="#glyph3-8" x="480.395759" y="127.985"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-9" x="489.593254" y="127.985"/>
<use xlink:href="#glyph3-4" x="491.6336" y="127.985"/>
<use xlink:href="#glyph3-10" x="496.064975" y="127.985"/>
<use xlink:href="#glyph3-7" x="499.037823" y="127.985"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-11" x="451.01" y="137.45"/>
<use xlink:href="#glyph3-2" x="455.409495" y="137.45"/>
<use xlink:href="#glyph3-7" x="458.621445" y="137.45"/>
<use xlink:href="#glyph3-12" x="463.052821" y="137.45"/>
<use xlink:href="#glyph3-13" x="465.077226" y="137.45"/>
<use xlink:href="#glyph3-14" x="469.253559" y="137.45"/>
<use xlink:href="#glyph3-10" x="472.975596" y="137.45"/>
<use xlink:href="#glyph3-9" x="475.948443" y="137.45"/>
<use xlink:href="#glyph3-15" x="477.988788" y="137.45"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-13" x="481.965868" y="137.45"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-10" x="488.796244" y="137.45"/>
<use xlink:href="#glyph3-2" x="491.769091" y="137.45"/>
<use xlink:href="#glyph3-13" x="494.981042" y="137.45"/>
<use xlink:href="#glyph3-13" x="499.157374" y="137.45"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-10" x="505.99572" y="137.45"/>
<use xlink:href="#glyph3-7" x="508.968567" y="137.45"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-10" x="451.01" y="146.914"/>
<use xlink:href="#glyph3-2" x="453.982847" y="146.914"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-3" x="457.043366" y="146.914"/>
<use xlink:href="#glyph3-9" x="461.084206" y="146.914"/>
<use xlink:href="#glyph3-4" x="463.124552" y="146.914"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-11" x="470.209971" y="146.914"/>
<use xlink:href="#glyph3-3" x="474.609466" y="146.914"/>
<use xlink:href="#glyph3-2" x="478.650307" y="146.914"/>
<use xlink:href="#glyph3-5" x="481.862257" y="146.914"/>
<use xlink:href="#glyph3-13" x="485.321281" y="146.914"/>
<use xlink:href="#glyph3-2" x="489.497613" y="146.914"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-16" x="492.183537" y="146.914"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-17" x="451.01" y="156.379"/>
<use xlink:href="#glyph3-2" x="457.37014" y="156.379"/>
<use xlink:href="#glyph3-9" x="460.58209" y="156.379"/>
<use xlink:href="#glyph3-18" x="462.622436" y="156.379"/>
<use xlink:href="#glyph3-9" x="466.695157" y="156.379"/>
<use xlink:href="#glyph3-4" x="468.735502" y="156.379"/>
<use xlink:href="#glyph3-3" x="473.166878" y="156.379"/>
<use xlink:href="#glyph3-19" x="477.207719" y="156.379"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-3" x="481.902108" y="156.379"/>
<use xlink:href="#glyph3-10" x="485.942948" y="156.379"/>
<use xlink:href="#glyph3-10" x="488.915796" y="156.379"/>
<use xlink:href="#glyph3-3" x="491.888643" y="156.379"/>
<use xlink:href="#glyph3-14" x="495.929484" y="156.379"/>
<use xlink:href="#glyph3-20" x="499.65152" y="156.379"/>
<use xlink:href="#glyph3-21" x="504.082896" y="156.379"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-8" x="451.01" y="165.843"/>
<use xlink:href="#glyph3-13" x="457.553452" y="165.843"/>
<use xlink:href="#glyph3-4" x="461.729785" y="165.843"/>
<use xlink:href="#glyph3-10" x="466.16116" y="165.843"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-5" x="471.788051" y="165.843"/>
<use xlink:href="#glyph3-9" x="475.247074" y="165.843"/>
<use xlink:href="#glyph3-10" x="477.28742" y="165.843"/>
<use xlink:href="#glyph3-13" x="480.260267" y="165.843"/>
<use xlink:href="#glyph3-5" x="484.436599" y="165.843"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-3" x="490.557636" y="165.843"/>
<use xlink:href="#glyph3-2" x="494.598477" y="165.843"/>
<use xlink:href="#glyph3-13" x="497.810427" y="165.843"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-8" x="451.01" y="175.308"/>
<use xlink:href="#glyph3-3" x="457.553452" y="175.308"/>
<use xlink:href="#glyph3-2" x="461.594293" y="175.308"/>
<use xlink:href="#glyph3-22" x="464.806243" y="175.308"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-13" x="468.743473" y="175.308"/>
<use xlink:href="#glyph3-23" x="472.919805" y="175.308"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-7" x="480.029134" y="175.308"/>
<use xlink:href="#glyph3-4" x="484.46051" y="175.308"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-10" x="491.553899" y="175.308"/>
<use xlink:href="#glyph3-20" x="494.526746" y="175.308"/>
<use xlink:href="#glyph3-13" x="498.958122" y="175.308"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-13" x="451.01" y="184.772"/>
<use xlink:href="#glyph3-23" x="455.186332" y="184.772"/>
<use xlink:href="#glyph3-18" x="459.641618" y="184.772"/>
<use xlink:href="#glyph3-13" x="463.714339" y="184.772"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-19" x="470.544715" y="184.772"/>
<use xlink:href="#glyph3-3" x="472.585061" y="184.772"/>
<use xlink:href="#glyph3-24" x="476.625901" y="184.772"/>
<use xlink:href="#glyph3-13" x="481.081187" y="184.772"/>
<use xlink:href="#glyph3-19" x="485.25752" y="184.772"/>
<use xlink:href="#glyph3-16" x="487.297865" y="184.772"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -10.289687 -106.433781 C -36.301406 -151.492375 -36.301406 -195.379094 -9.934219 -241.050969 " transform="matrix(1,0,0,-1,90.735,-19.258)"/>
<path style="fill:none;stroke-width:0.6376;stroke-linecap:round;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -1.554457 2.070069 C -1.425919 1.294477 0.00116414 0.131016 0.387658 -0.00105583 C -0.000571425 -0.130772 -1.424085 -1.294332 -1.555387 -2.07156 " transform="matrix(0.50157,-0.86877,-0.86877,-0.50157,80.44527,87.1761)"/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-25" x="3.088" y="132.718"/>
<use xlink:href="#glyph3-13" x="9.089485" y="132.718"/>
<use xlink:href="#glyph3-21" x="13.265818" y="132.718"/>
<use xlink:href="#glyph3-11" x="16.031442" y="132.718"/>
<use xlink:href="#glyph3-2" x="20.430938" y="132.718"/>
<use xlink:href="#glyph3-7" x="23.642888" y="132.718"/>
<use xlink:href="#glyph3-12" x="28.074263" y="132.718"/>
<use xlink:href="#glyph3-13" x="30.098669" y="132.718"/>
<use xlink:href="#glyph3-14" x="34.275001" y="132.718"/>
<use xlink:href="#glyph3-10" x="37.997038" y="132.718"/>
<use xlink:href="#glyph3-9" x="40.969885" y="132.718"/>
<use xlink:href="#glyph3-15" x="43.010231" y="132.718"/>
<use xlink:href="#glyph3-9" x="47.090922" y="132.718"/>
<use xlink:href="#glyph3-26" x="49.131268" y="132.718"/>
<use xlink:href="#glyph3-13" x="52.813454" y="132.718"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-11" x="8.194" y="142.182"/>
<use xlink:href="#glyph3-3" x="12.593495" y="142.182"/>
<use xlink:href="#glyph3-2" x="16.634336" y="142.182"/>
<use xlink:href="#glyph3-5" x="19.846286" y="142.182"/>
<use xlink:href="#glyph3-13" x="23.30531" y="142.182"/>
<use xlink:href="#glyph3-2" x="27.481642" y="142.182"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-7" x="33.347636" y="142.182"/>
<use xlink:href="#glyph3-27" x="37.779011" y="142.182"/>
<use xlink:href="#glyph3-10" x="42.210387" y="142.182"/>
<use xlink:href="#glyph3-11" x="45.183234" y="142.182"/>
<use xlink:href="#glyph3-27" x="49.582729" y="142.182"/>
<use xlink:href="#glyph3-10" x="54.014105" y="142.182"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-24" x="13.176" y="151.647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-28" x="17.527675" y="151.647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-3" x="24.262409" y="151.647"/>
<use xlink:href="#glyph3-10" x="28.30325" y="151.647"/>
<use xlink:href="#glyph3-10" x="31.276097" y="151.647"/>
<use xlink:href="#glyph3-3" x="34.248944" y="151.647"/>
<use xlink:href="#glyph3-14" x="38.289785" y="151.647"/>
<use xlink:href="#glyph3-20" x="42.011822" y="151.647"/>
<use xlink:href="#glyph3-9" x="46.443197" y="151.647"/>
<use xlink:href="#glyph3-4" x="48.483543" y="151.647"/>
<use xlink:href="#glyph3-18" x="52.914919" y="151.647"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-23" x="4.409" y="161.111"/>
<use xlink:href="#glyph3-13" x="8.864286" y="161.111"/>
<use xlink:href="#glyph3-14" x="13.040618" y="161.111"/>
<use xlink:href="#glyph3-7" x="16.762655" y="161.111"/>
<use xlink:href="#glyph3-2" x="21.194031" y="161.111"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-3" x="24.254549" y="161.111"/>
<use xlink:href="#glyph3-10" x="28.29539" y="161.111"/>
<use xlink:href="#glyph3-13" x="31.268237" y="161.111"/>
<use xlink:href="#glyph3-23" x="35.444569" y="161.111"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-3" x="42.553899" y="161.111"/>
<use xlink:href="#glyph3-2" x="46.594739" y="161.111"/>
<use xlink:href="#glyph3-14" x="49.80669" y="161.111"/>
<use xlink:href="#glyph3-5" x="53.528726" y="161.111"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-10" x="11.38" y="170.576"/>
<use xlink:href="#glyph3-7" x="14.352847" y="170.576"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-10" x="21.438266" y="170.576"/>
<use xlink:href="#glyph3-20" x="24.411113" y="170.576"/>
<use xlink:href="#glyph3-13" x="28.842489" y="170.576"/>
<use xlink:href="#glyph3-9" x="33.018821" y="170.576"/>
<use xlink:href="#glyph3-2" x="35.059167" y="170.576"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-4" x="40.933131" y="170.576"/>
<use xlink:href="#glyph3-7" x="45.364506" y="170.576"/>
<use xlink:href="#glyph3-4" x="49.795882" y="170.576"/>
<use xlink:href="#glyph3-21" x="54.227258" y="170.576"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-11" x="0.408" y="180.04"/>
<use xlink:href="#glyph3-2" x="4.807495" y="180.04"/>
<use xlink:href="#glyph3-7" x="8.019445" y="180.04"/>
<use xlink:href="#glyph3-12" x="12.450821" y="180.04"/>
<use xlink:href="#glyph3-13" x="14.475226" y="180.04"/>
<use xlink:href="#glyph3-14" x="18.651559" y="180.04"/>
<use xlink:href="#glyph3-10" x="22.373596" y="180.04"/>
<use xlink:href="#glyph3-9" x="25.346443" y="180.04"/>
<use xlink:href="#glyph3-15" x="27.386788" y="180.04"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-13" x="31.363868" y="180.04"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph3-20" x="38.194244" y="180.04"/>
<use xlink:href="#glyph3-13" x="42.62562" y="180.04"/>
<use xlink:href="#glyph3-3" x="46.801952" y="180.04"/>
<use xlink:href="#glyph3-23" x="50.842793" y="180.04"/>
<use xlink:href="#glyph3-16" x="55.298079" y="180.04"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="83.525" y="231.314"/>
<use xlink:href="#glyph0-2" x="86.874094" y="231.314"/>
<use xlink:href="#glyph0-3" x="91.968643" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-4" x="105.736" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-5" x="116.05" y="231.26"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-6" x="114.692" y="231.314"/>
<use xlink:href="#glyph0-2" x="120.75746" y="231.314"/>
<use xlink:href="#glyph0-3" x="125.852009" y="231.314"/>
<use xlink:href="#glyph0-7" x="131.917469" y="231.314"/>
<use xlink:href="#glyph0-8" x="135.986563" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-9" x="149.405" y="231.314"/>
<use xlink:href="#glyph0-8" x="155.503187" y="231.314"/>
<use xlink:href="#glyph0-10" x="161.219555" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-11" x="174.987" y="231.314"/>
<use xlink:href="#glyph0-12" x="181.161551" y="231.314"/>
<use xlink:href="#glyph0-13" x="183.95428" y="231.314"/>
<use xlink:href="#glyph0-14" x="190.01974" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-15" x="203.296" y="231.314"/>
<use xlink:href="#glyph0-7" x="208.030549" y="231.314"/>
<use xlink:href="#glyph0-6" x="212.099644" y="231.314"/>
<use xlink:href="#glyph0-16" x="218.165103" y="231.314"/>
<use xlink:href="#glyph0-10" x="222.561471" y="231.314"/>
<use xlink:href="#glyph0-17" x="228.62693" y="231.314"/>
<use xlink:href="#glyph0-8" x="231.41966" y="231.314"/>
<use xlink:href="#glyph0-16" x="237.136028" y="231.314"/>
<use xlink:href="#glyph0-8" x="241.532396" y="231.314"/>
<use xlink:href="#glyph0-10" x="247.248764" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-9" x="261.015" y="231.314"/>
<use xlink:href="#glyph0-8" x="267.113187" y="231.314"/>
<use xlink:href="#glyph0-10" x="272.829555" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-17" x="286.597" y="231.314"/>
<use xlink:href="#glyph0-2" x="289.38973" y="231.314"/>
<use xlink:href="#glyph0-3" x="294.484279" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-14" x="309.478" y="231.314"/>
<use xlink:href="#glyph0-8" x="315.05255" y="231.314"/>
<use xlink:href="#glyph0-15" x="320.768918" y="231.314"/>
<use xlink:href="#glyph0-7" x="325.503468" y="231.314"/>
<use xlink:href="#glyph0-8" x="329.572562" y="231.314"/>
<use xlink:href="#glyph0-16" x="335.288931" y="231.314"/>
<use xlink:href="#glyph0-10" x="339.685298" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-14" x="354.679" y="231.314"/>
<use xlink:href="#glyph0-8" x="360.25355" y="231.314"/>
<use xlink:href="#glyph0-18" x="365.969919" y="231.314"/>
<use xlink:href="#glyph0-13" x="372.068105" y="231.314"/>
<use xlink:href="#glyph0-2" x="378.133565" y="231.314"/>
<use xlink:href="#glyph0-3" x="383.228115" y="231.314"/>
<use xlink:href="#glyph0-7" x="389.293574" y="231.314"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-3" x="401.064" y="231.314"/>
<use xlink:href="#glyph0-19" x="407.12946" y="231.314"/>
<use xlink:href="#glyph0-18" x="412.660373" y="231.314"/>
<use xlink:href="#glyph0-8" x="418.75856" y="231.314"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="89.403" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-2" x="108.127" y="247.585"/>
<use xlink:href="#glyph1-3" x="114.995262" y="247.585"/>
<use xlink:href="#glyph1-4" x="119.541227" y="247.585"/>
<use xlink:href="#glyph1-5" x="124.526546" y="247.585"/>
<use xlink:href="#glyph1-6" x="127.871013" y="247.585"/>
<use xlink:href="#glyph1-5" x="130.982354" y="247.585"/>
<use xlink:href="#glyph1-7" x="134.326821" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-5" x="151.831" y="247.585"/>
<use xlink:href="#glyph1-8" x="155.175467" y="247.585"/>
<use xlink:href="#glyph1-9" x="160.160786" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-10" x="175.024" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-11" x="180.35" y="247.585"/>
<use xlink:href="#glyph1-12" x="182.645398" y="247.585"/>
<use xlink:href="#glyph1-8" x="187.227229" y="247.585"/>
<use xlink:href="#glyph1-5" x="192.212547" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-13" x="215.855" y="247.585"/>
<use xlink:href="#glyph1-3" x="220.042309" y="247.585"/>
<use xlink:href="#glyph1-4" x="224.588274" y="247.585"/>
<use xlink:href="#glyph1-13" x="229.573592" y="247.585"/>
<use xlink:href="#glyph1-9" x="233.760901" y="247.585"/>
<use xlink:href="#glyph1-14" x="238.459294" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-5" x="261.845" y="247.585"/>
<use xlink:href="#glyph1-8" x="265.189467" y="247.585"/>
<use xlink:href="#glyph1-3" x="270.174786" y="247.585"/>
<use xlink:href="#glyph1-5" x="274.72075" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="292.197" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-15" x="308.251" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="312.725234" y="247.585"/>
<use xlink:href="#glyph1-16" x="317.423627" y="247.585"/>
<use xlink:href="#glyph1-5" x="321.315045" y="247.585"/>
<use xlink:href="#glyph1-9" x="324.659512" y="247.585"/>
<use xlink:href="#glyph1-17" x="329.357906" y="247.585"/>
<use xlink:href="#glyph1-18" x="332.971365" y="247.585"/>
<use xlink:href="#glyph1-3" x="337.983582" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-15" x="342.386085" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-19" x="359.459" y="247.585"/>
<use xlink:href="#glyph1-7" x="364.471218" y="247.585"/>
<use xlink:href="#glyph1-7" x="369.456536" y="247.585"/>
<use xlink:href="#glyph1-20" x="374.441854" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="378.871256" y="247.585"/>
<use xlink:href="#glyph1-18" x="383.56965" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-8" x="403.489" y="247.585"/>
<use xlink:href="#glyph1-3" x="408.474318" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-21" x="412.876821" y="247.585"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="417.351054" y="247.585"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 32.98375 -156.294938 L 32.98375 -223.197281 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 123.71875 220.078125 L 125.792969 215.933594 L 123.71875 217.488281 L 121.648438 215.933594 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 28.999375 -225.787125 L 26.597031 -214.455094 C 26.272813 -212.931656 24.749375 -211.697281 23.194688 -211.697281 L 5.850938 -211.697281 C 4.29625 -211.697281 2.772813 -212.931656 2.448594 -214.455094 L 0.581406 -223.251969 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 90.78125 220.078125 L 93.667969 216.453125 L 91.316406 217.542969 L 89.613281 215.589844 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 36.972031 -225.787125 L 39.362656 -191.947281 C 39.690781 -187.291031 43.745469 -183.513688 48.413438 -183.513688 L 126.128281 -183.513688 C 130.79625 -183.513688 134.850938 -187.291031 135.179063 -191.947281 L 137.39 -223.201188 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 228.304688 220.078125 L 230.082031 215.796875 L 228.125 217.492188 L 225.945312 216.089844 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 88.5775 -225.787125 L 86.175156 -214.455094 C 85.850938 -212.931656 84.3275 -211.697281 82.772813 -211.697281 L 73.417344 -211.697281 C 71.862656 -211.697281 70.339219 -212.931656 70.015 -214.455094 L 68.147813 -223.251969 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 158.347656 220.078125 L 161.234375 216.453125 L 158.882812 217.542969 L 157.179688 215.589844 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(3.529358%,63.920593%,83.529663%);stroke-opacity:1;stroke-miterlimit:10;" d="M 141.557969 -225.787125 L 143.948594 -170.576188 C 144.276719 -162.959 150.722031 -156.787125 158.347031 -156.787125 L 305.249375 -156.787125 C 312.870469 -156.787125 319.315781 -162.959 319.647812 -170.576188 L 321.925156 -223.197281 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(3.529358%,63.920593%,83.529663%);fill-opacity:1;" d="M 412.773438 220.078125 L 414.664062 215.847656 L 412.660156 217.488281 L 410.523438 216.027344 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-1" x="316.402" y="148.178"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph4-1" x="321.5946" y="148.178"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-2" x="323.7163" y="148.178"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 133.585313 -225.787125 L 131.182969 -214.455094 C 130.85875 -212.931656 129.335313 -211.697281 127.780625 -211.697281 L 100.362656 -211.697281 C 98.807969 -211.697281 97.284531 -212.931656 96.960313 -214.455094 L 95.093125 -223.251969 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 185.292969 220.078125 L 188.179688 216.453125 L 185.828125 217.542969 L 184.125 215.589844 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-2" x="202.334" y="203.086"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(3.529358%,63.920593%,83.529663%);stroke-opacity:1;stroke-miterlimit:10;" d="M 318.054062 -225.787125 L 315.663437 -190.443375 C 315.331406 -185.572281 311.112656 -181.626969 306.23375 -181.626969 L 191.042344 -181.626969 C 186.167344 -181.626969 181.944688 -185.572281 181.616563 -190.443375 L 179.397813 -223.201188 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(3.529358%,63.920593%,83.529663%);fill-opacity:1;" d="M 269.957031 220.078125 L 272.304688 216.082031 L 270.132812 217.492188 L 268.167969 215.800781 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-3" x="333.453" y="173.017"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph4-1" x="338.3628" y="173.017"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-4" x="340.4838" y="173.017"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 276.315781 -225.787125 L 273.913437 -214.455094 C 273.589219 -212.931656 272.065781 -211.697281 270.507187 -211.697281 L 242.690781 -211.697281 C 241.132188 -211.697281 239.60875 -212.931656 239.284531 -214.455094 L 237.42125 -223.251969 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 327.617188 220.078125 L 330.503906 216.453125 L 328.15625 217.542969 L 326.449219 215.589844 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 315.065781 -225.787125 L 312.67125 -199.263688 C 312.343125 -195.619156 309.10875 -192.666031 305.4525 -192.666031 L 212.4525 -192.666031 C 208.79625 -192.666031 205.561875 -195.619156 205.23375 -199.263688 L 203.073594 -223.205094 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 293.578125 220.078125 L 296.011719 216.136719 L 293.808594 217.496094 L 291.886719 215.765625 "/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:round;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 312.0775 -225.787125 L 309.67125 -214.455094 C 309.350937 -212.931656 307.8275 -211.697281 306.268906 -211.697281 L 289.097031 -211.697281 C 287.538437 -211.697281 286.015 -212.931656 285.694687 -214.455094 L 283.8275 -223.251969 " transform="matrix(1,0,0,-1,90.735,-5.709)"/>
<path style=" stroke:none;fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;" d="M 374.023438 220.078125 L 376.914062 216.453125 L 374.5625 217.542969 L 372.855469 215.589844 "/>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph2-4" x="386.012" y="203.086"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View File

@ -0,0 +1,319 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="304pt" height="74pt" viewBox="0 0 304 74" version="1.1">
<defs>
<g>
<symbol overflow="visible" id="glyph0-0">
<path style="stroke:none;" d="M 1.359375 -6.21875 L 1.625 -5.8125 C 1.65625 -5.71875 1.734375 -5.6875 1.828125 -5.6875 C 1.859375 -5.6875 1.90625 -5.703125 1.953125 -5.734375 C 2 -5.765625 2.078125 -5.8125 2.140625 -5.84375 C 2.21875 -5.890625 2.296875 -5.921875 2.40625 -5.953125 C 2.515625 -5.984375 2.640625 -6 2.78125 -6 C 2.984375 -6 3.15625 -5.953125 3.296875 -5.84375 C 3.421875 -5.734375 3.484375 -5.578125 3.484375 -5.40625 C 3.484375 -5.25 3.46875 -5.125 3.40625 -5.015625 C 3.34375 -4.921875 3.265625 -4.828125 3.1875 -4.734375 C 3.09375 -4.65625 3 -4.578125 2.90625 -4.5 C 2.796875 -4.4375 2.71875 -4.359375 2.625 -4.28125 C 2.546875 -4.203125 2.484375 -4.109375 2.4375 -4.03125 C 2.390625 -3.921875 2.375 -3.828125 2.390625 -3.703125 L 2.453125 -3.0625 L 3.125 -3.0625 L 3.21875 -3.625 C 3.234375 -3.71875 3.265625 -3.796875 3.328125 -3.859375 C 3.390625 -3.921875 3.46875 -3.984375 3.5625 -4.0625 C 3.640625 -4.140625 3.734375 -4.203125 3.828125 -4.28125 C 3.9375 -4.359375 4.03125 -4.453125 4.09375 -4.5625 C 4.1875 -4.671875 4.25 -4.796875 4.3125 -4.9375 C 4.359375 -5.09375 4.390625 -5.25 4.390625 -5.453125 C 4.390625 -5.65625 4.359375 -5.84375 4.28125 -6.015625 C 4.203125 -6.171875 4.09375 -6.3125 3.96875 -6.4375 C 3.828125 -6.546875 3.671875 -6.640625 3.484375 -6.703125 C 3.296875 -6.765625 3.09375 -6.796875 2.859375 -6.796875 C 2.6875 -6.796875 2.546875 -6.78125 2.40625 -6.75 C 2.25 -6.71875 2.125 -6.6875 2 -6.625 C 1.875 -6.578125 1.75 -6.515625 1.65625 -6.453125 C 1.546875 -6.375 1.453125 -6.296875 1.359375 -6.21875 Z M 2.15625 -1.59375 C 2.15625 -1.421875 2.21875 -1.28125 2.328125 -1.171875 C 2.4375 -1.046875 2.578125 -1 2.765625 -1 C 2.84375 -1 2.921875 -1.015625 2.984375 -1.03125 C 3.0625 -1.0625 3.125 -1.109375 3.171875 -1.171875 C 3.234375 -1.21875 3.265625 -1.28125 3.296875 -1.359375 C 3.328125 -1.421875 3.34375 -1.515625 3.34375 -1.59375 C 3.34375 -1.671875 3.328125 -1.75 3.296875 -1.828125 C 3.265625 -1.90625 3.234375 -1.96875 3.171875 -2.015625 C 3.125 -2.078125 3.0625 -2.125 2.984375 -2.15625 C 2.921875 -2.1875 2.84375 -2.203125 2.765625 -2.203125 C 2.578125 -2.203125 2.4375 -2.140625 2.328125 -2.015625 C 2.21875 -1.90625 2.15625 -1.765625 2.15625 -1.59375 Z M 0.25 -7.8125 L 0.25 0 L 5.5625 0 L 5.5625 -7.8125 Z M 0.515625 -0.296875 L 0.515625 -7.515625 L 5.25 -7.515625 L 5.25 -0.296875 Z M 0.515625 -0.296875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-1">
<path style="stroke:none;" d="M 6.265625 -7.8125 L 0.15625 -7.8125 L 0.15625 -6.921875 L 2.6875 -6.921875 L 2.6875 0 L 3.75 0 L 3.75 -6.921875 L 6.265625 -6.921875 Z M 6.265625 -7.8125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-2">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.171875 -5.609375 2.84375 -5.53125 2.546875 -5.390625 C 2.265625 -5.234375 2 -5.03125 1.765625 -4.78125 L 1.765625 -8.03125 L 0.796875 -8.03125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-3">
<path style="stroke:none;" d="M 2.984375 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.90625 -5.40625 C 1.578125 -5.265625 1.3125 -5.078125 1.09375 -4.828125 C 0.859375 -4.578125 0.703125 -4.28125 0.578125 -3.953125 C 0.46875 -3.625 0.40625 -3.265625 0.40625 -2.875 C 0.40625 -2.40625 0.46875 -1.96875 0.59375 -1.609375 C 0.734375 -1.25 0.921875 -0.9375 1.140625 -0.6875 C 1.390625 -0.4375 1.65625 -0.25 1.984375 -0.125 C 2.296875 0.015625 2.65625 0.078125 3.03125 0.078125 C 3.234375 0.078125 3.4375 0.0625 3.640625 0.015625 C 3.84375 -0.015625 4.046875 -0.0625 4.234375 -0.125 C 4.421875 -0.203125 4.609375 -0.28125 4.765625 -0.390625 C 4.9375 -0.5 5.078125 -0.625 5.203125 -0.78125 L 4.921875 -1.125 C 4.890625 -1.1875 4.828125 -1.21875 4.75 -1.21875 C 4.6875 -1.21875 4.609375 -1.1875 4.53125 -1.140625 C 4.4375 -1.078125 4.328125 -1.015625 4.203125 -0.953125 C 4.078125 -0.890625 3.921875 -0.828125 3.75 -0.78125 C 3.578125 -0.71875 3.359375 -0.6875 3.125 -0.6875 C 2.859375 -0.6875 2.625 -0.734375 2.40625 -0.8125 C 2.203125 -0.90625 2.015625 -1.03125 1.859375 -1.203125 C 1.71875 -1.375 1.59375 -1.59375 1.5 -1.84375 C 1.421875 -2.109375 1.375 -2.40625 1.359375 -2.765625 L 5.03125 -2.765625 C 5.125 -2.765625 5.1875 -2.78125 5.21875 -2.828125 C 5.25 -2.890625 5.265625 -2.984375 5.265625 -3.140625 C 5.265625 -3.53125 5.21875 -3.875 5.109375 -4.1875 C 4.984375 -4.5 4.828125 -4.75 4.625 -4.96875 C 4.421875 -5.171875 4.171875 -5.328125 3.90625 -5.4375 C 3.625 -5.5625 3.3125 -5.609375 2.984375 -5.609375 Z M 3 -4.890625 C 3.234375 -4.890625 3.421875 -4.859375 3.59375 -4.78125 C 3.765625 -4.71875 3.921875 -4.609375 4.03125 -4.46875 C 4.15625 -4.328125 4.25 -4.171875 4.3125 -3.984375 C 4.375 -3.796875 4.40625 -3.59375 4.40625 -3.359375 L 1.390625 -3.359375 C 1.46875 -3.84375 1.625 -4.21875 1.890625 -4.5 C 2.171875 -4.765625 2.53125 -4.890625 3 -4.890625 Z M 3 -4.890625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-4">
<path style="stroke:none;" d="M 0.078125 -5.53125 L 1.859375 0 L 2.59375 0 C 2.703125 0 2.78125 -0.0625 2.8125 -0.1875 L 4.0625 -3.921875 C 4.078125 -4.015625 4.109375 -4.09375 4.125 -4.1875 C 4.140625 -4.265625 4.171875 -4.359375 4.1875 -4.4375 C 4.203125 -4.359375 4.21875 -4.265625 4.234375 -4.1875 C 4.25 -4.09375 4.28125 -4.015625 4.3125 -3.9375 L 5.53125 -0.1875 C 5.5625 -0.0625 5.640625 0 5.71875 0 L 6.5 0 L 8.28125 -5.53125 L 7.546875 -5.53125 C 7.484375 -5.53125 7.421875 -5.5 7.375 -5.46875 C 7.328125 -5.4375 7.28125 -5.375 7.265625 -5.328125 L 6.1875 -1.765625 C 6.15625 -1.65625 6.125 -1.53125 6.09375 -1.40625 C 6.0625 -1.265625 6.046875 -1.140625 6.03125 -1.03125 C 6 -1.140625 5.96875 -1.265625 5.9375 -1.390625 C 5.90625 -1.515625 5.875 -1.640625 5.828125 -1.765625 L 4.6875 -5.34375 C 4.671875 -5.40625 4.640625 -5.4375 4.59375 -5.484375 C 4.546875 -5.515625 4.484375 -5.53125 4.40625 -5.53125 L 3.984375 -5.53125 C 3.921875 -5.53125 3.859375 -5.515625 3.8125 -5.484375 C 3.78125 -5.4375 3.734375 -5.40625 3.71875 -5.34375 L 2.5625 -1.765625 C 2.515625 -1.640625 2.484375 -1.515625 2.4375 -1.390625 C 2.40625 -1.265625 2.375 -1.140625 2.34375 -1.015625 C 2.328125 -1.140625 2.3125 -1.265625 2.28125 -1.390625 C 2.25 -1.515625 2.21875 -1.640625 2.203125 -1.765625 L 1.140625 -5.328125 C 1.125 -5.375 1.078125 -5.421875 1.03125 -5.46875 C 0.984375 -5.5 0.921875 -5.53125 0.84375 -5.53125 Z M 0.078125 -5.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-5">
<path style="stroke:none;" d="M 3.03125 -5.609375 C 2.625 -5.609375 2.265625 -5.546875 1.9375 -5.40625 C 1.609375 -5.265625 1.34375 -5.078125 1.109375 -4.84375 C 0.875 -4.59375 0.703125 -4.296875 0.578125 -3.9375 C 0.453125 -3.59375 0.390625 -3.203125 0.390625 -2.765625 C 0.390625 -2.328125 0.453125 -1.9375 0.578125 -1.59375 C 0.703125 -1.234375 0.875 -0.9375 1.109375 -0.6875 C 1.34375 -0.453125 1.609375 -0.25 1.9375 -0.125 C 2.265625 0.015625 2.625 0.078125 3.03125 0.078125 C 3.4375 0.078125 3.796875 0.015625 4.125 -0.125 C 4.453125 -0.25 4.734375 -0.453125 4.953125 -0.6875 C 5.1875 -0.9375 5.359375 -1.234375 5.46875 -1.59375 C 5.59375 -1.9375 5.65625 -2.328125 5.65625 -2.765625 C 5.65625 -3.203125 5.59375 -3.59375 5.46875 -3.9375 C 5.359375 -4.296875 5.1875 -4.59375 4.953125 -4.84375 C 4.734375 -5.078125 4.453125 -5.265625 4.125 -5.40625 C 3.796875 -5.546875 3.4375 -5.609375 3.03125 -5.609375 Z M 3.03125 -0.6875 C 2.75 -0.6875 2.515625 -0.734375 2.3125 -0.828125 C 2.109375 -0.921875 1.9375 -1.046875 1.796875 -1.234375 C 1.671875 -1.40625 1.5625 -1.625 1.5 -1.875 C 1.421875 -2.140625 1.390625 -2.4375 1.390625 -2.765625 C 1.390625 -3.09375 1.421875 -3.375 1.5 -3.640625 C 1.5625 -3.90625 1.671875 -4.109375 1.796875 -4.296875 C 1.9375 -4.484375 2.109375 -4.609375 2.3125 -4.703125 C 2.515625 -4.796875 2.75 -4.84375 3.03125 -4.84375 C 3.578125 -4.84375 3.984375 -4.65625 4.25 -4.296875 C 4.515625 -3.9375 4.65625 -3.421875 4.65625 -2.765625 C 4.65625 -2.109375 4.515625 -1.59375 4.25 -1.234375 C 3.984375 -0.859375 3.578125 -0.6875 3.03125 -0.6875 Z M 3.03125 -0.6875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-6">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.109375 C 1.9375 -4.34375 2.125 -4.515625 2.328125 -4.640625 C 2.53125 -4.765625 2.765625 -4.84375 3 -4.84375 C 3.34375 -4.84375 3.59375 -4.734375 3.78125 -4.515625 C 3.953125 -4.296875 4.046875 -3.953125 4.046875 -3.515625 L 4.046875 0 L 5.015625 0 L 5.015625 -3.515625 C 5.015625 -3.734375 5.046875 -3.921875 5.109375 -4.09375 C 5.171875 -4.265625 5.265625 -4.390625 5.375 -4.5 C 5.484375 -4.609375 5.609375 -4.6875 5.75 -4.75 C 5.890625 -4.8125 6.046875 -4.84375 6.203125 -4.84375 C 6.5625 -4.84375 6.84375 -4.71875 7.03125 -4.5 C 7.21875 -4.28125 7.3125 -3.953125 7.3125 -3.515625 L 7.3125 0 L 8.28125 0 L 8.28125 -3.515625 C 8.28125 -3.84375 8.234375 -4.15625 8.15625 -4.40625 C 8.078125 -4.671875 7.953125 -4.890625 7.796875 -5.0625 C 7.640625 -5.25 7.4375 -5.375 7.21875 -5.46875 C 6.984375 -5.5625 6.734375 -5.609375 6.4375 -5.609375 C 6.265625 -5.609375 6.078125 -5.59375 5.90625 -5.546875 C 5.71875 -5.5 5.5625 -5.4375 5.40625 -5.34375 C 5.25 -5.25 5.109375 -5.125 4.984375 -4.984375 C 4.859375 -4.828125 4.75 -4.65625 4.671875 -4.453125 C 4.578125 -4.8125 4.40625 -5.09375 4.171875 -5.296875 C 3.953125 -5.5 3.640625 -5.609375 3.265625 -5.609375 C 2.9375 -5.609375 2.640625 -5.53125 2.390625 -5.375 C 2.140625 -5.21875 1.90625 -5 1.703125 -4.75 L 1.640625 -5.328125 C 1.59375 -5.453125 1.515625 -5.53125 1.375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-7">
<path style="stroke:none;" d="M 4.859375 0 L 4.859375 -3.53125 C 4.859375 -3.84375 4.8125 -4.125 4.734375 -4.390625 C 4.640625 -4.640625 4.515625 -4.859375 4.359375 -5.046875 C 4.1875 -5.21875 3.984375 -5.359375 3.75 -5.46875 C 3.515625 -5.578125 3.234375 -5.625 2.921875 -5.625 C 2.5 -5.625 2.109375 -5.546875 1.75 -5.40625 C 1.40625 -5.25 1.078125 -5.03125 0.765625 -4.75 L 0.9375 -4.4375 C 0.96875 -4.390625 1.015625 -4.34375 1.0625 -4.3125 C 1.109375 -4.265625 1.171875 -4.25 1.234375 -4.25 C 1.3125 -4.25 1.40625 -4.28125 1.484375 -4.34375 C 1.578125 -4.40625 1.671875 -4.46875 1.78125 -4.546875 C 1.90625 -4.625 2.046875 -4.6875 2.21875 -4.75 C 2.375 -4.8125 2.578125 -4.84375 2.8125 -4.84375 C 3.171875 -4.84375 3.4375 -4.734375 3.625 -4.5 C 3.8125 -4.28125 3.90625 -3.96875 3.90625 -3.53125 L 3.90625 -3.109375 C 3.265625 -3.09375 2.75 -3.03125 2.3125 -2.9375 C 1.875 -2.828125 1.53125 -2.703125 1.265625 -2.546875 C 1 -2.390625 0.796875 -2.21875 0.6875 -2 C 0.5625 -1.8125 0.5 -1.59375 0.5 -1.375 C 0.5 -1.125 0.546875 -0.90625 0.625 -0.734375 C 0.703125 -0.546875 0.8125 -0.390625 0.953125 -0.265625 C 1.09375 -0.15625 1.25 -0.0625 1.4375 0 C 1.625 0.046875 1.828125 0.09375 2.046875 0.09375 C 2.25 0.09375 2.453125 0.078125 2.625 0.03125 C 2.796875 0 2.953125 -0.046875 3.109375 -0.125 C 3.265625 -0.203125 3.40625 -0.28125 3.546875 -0.390625 C 3.6875 -0.484375 3.828125 -0.609375 3.96875 -0.734375 L 4.078125 -0.234375 C 4.09375 -0.140625 4.140625 -0.078125 4.1875 -0.046875 C 4.25 -0.015625 4.328125 0 4.421875 0 Z M 2.328125 -0.59375 C 2.203125 -0.59375 2.09375 -0.609375 1.984375 -0.640625 C 1.875 -0.671875 1.78125 -0.71875 1.703125 -0.78125 C 1.609375 -0.859375 1.546875 -0.9375 1.5 -1.046875 C 1.453125 -1.15625 1.4375 -1.28125 1.4375 -1.421875 C 1.4375 -1.578125 1.484375 -1.71875 1.578125 -1.84375 C 1.65625 -1.96875 1.796875 -2.0625 2 -2.15625 C 2.1875 -2.25 2.453125 -2.328125 2.765625 -2.375 C 3.0625 -2.4375 3.453125 -2.46875 3.90625 -2.484375 L 3.90625 -1.34375 C 3.796875 -1.21875 3.671875 -1.125 3.5625 -1.03125 C 3.453125 -0.9375 3.328125 -0.859375 3.203125 -0.796875 C 3.078125 -0.734375 2.9375 -0.6875 2.796875 -0.640625 C 2.65625 -0.609375 2.5 -0.59375 2.328125 -0.59375 Z M 2.328125 -0.59375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-8">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -4.0625 C 1.984375 -4.296875 2.203125 -4.5 2.453125 -4.625 C 2.703125 -4.765625 2.96875 -4.84375 3.265625 -4.84375 C 3.65625 -4.84375 3.953125 -4.71875 4.140625 -4.5 C 4.328125 -4.265625 4.421875 -3.9375 4.421875 -3.515625 L 4.421875 0 L 5.390625 0 L 5.390625 -3.515625 C 5.390625 -3.828125 5.359375 -4.109375 5.265625 -4.375 C 5.1875 -4.625 5.078125 -4.859375 4.921875 -5.03125 C 4.765625 -5.21875 4.578125 -5.359375 4.34375 -5.46875 C 4.109375 -5.5625 3.84375 -5.609375 3.546875 -5.609375 C 3.15625 -5.609375 2.8125 -5.53125 2.515625 -5.359375 C 2.21875 -5.203125 1.953125 -4.984375 1.71875 -4.71875 L 1.640625 -5.328125 C 1.59375 -5.453125 1.515625 -5.53125 1.375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-9">
<path style="stroke:none;" d="M 3.953125 -4.609375 L 4.171875 -4.96875 C 3.96875 -5.171875 3.71875 -5.328125 3.421875 -5.4375 C 3.140625 -5.546875 2.8125 -5.609375 2.453125 -5.609375 C 2.140625 -5.609375 1.859375 -5.5625 1.609375 -5.484375 C 1.375 -5.390625 1.171875 -5.28125 1 -5.125 C 0.828125 -4.984375 0.703125 -4.8125 0.609375 -4.609375 C 0.53125 -4.421875 0.484375 -4.21875 0.484375 -4.015625 C 0.484375 -3.78125 0.53125 -3.578125 0.609375 -3.40625 C 0.6875 -3.234375 0.796875 -3.109375 0.9375 -2.984375 C 1.0625 -2.875 1.21875 -2.78125 1.390625 -2.703125 C 1.5625 -2.640625 1.75 -2.5625 1.921875 -2.515625 C 2.109375 -2.453125 2.28125 -2.390625 2.453125 -2.34375 C 2.625 -2.296875 2.78125 -2.21875 2.90625 -2.15625 C 3.046875 -2.078125 3.15625 -2 3.234375 -1.890625 C 3.3125 -1.796875 3.359375 -1.671875 3.359375 -1.515625 C 3.359375 -1.390625 3.34375 -1.28125 3.296875 -1.171875 C 3.25 -1.0625 3.171875 -0.96875 3.078125 -0.890625 C 2.984375 -0.796875 2.875 -0.734375 2.71875 -0.6875 C 2.578125 -0.625 2.421875 -0.609375 2.234375 -0.609375 C 2 -0.609375 1.828125 -0.640625 1.671875 -0.6875 C 1.53125 -0.734375 1.40625 -0.796875 1.296875 -0.859375 C 1.203125 -0.921875 1.109375 -0.96875 1.03125 -1.03125 C 0.96875 -1.078125 0.890625 -1.09375 0.828125 -1.09375 C 0.765625 -1.09375 0.703125 -1.09375 0.671875 -1.0625 C 0.625 -1.03125 0.59375 -1 0.5625 -0.953125 L 0.34375 -0.578125 C 0.5625 -0.390625 0.828125 -0.234375 1.140625 -0.09375 C 1.4375 0.015625 1.796875 0.09375 2.1875 0.09375 C 2.515625 0.09375 2.8125 0.046875 3.078125 -0.046875 C 3.328125 -0.140625 3.546875 -0.265625 3.734375 -0.421875 C 3.90625 -0.578125 4.046875 -0.765625 4.140625 -0.984375 C 4.21875 -1.203125 4.265625 -1.4375 4.265625 -1.6875 C 4.265625 -1.90625 4.234375 -2.109375 4.140625 -2.25 C 4.0625 -2.421875 3.953125 -2.546875 3.828125 -2.65625 C 3.6875 -2.765625 3.53125 -2.859375 3.359375 -2.9375 C 3.203125 -3 3.015625 -3.078125 2.828125 -3.125 C 2.65625 -3.203125 2.484375 -3.25 2.3125 -3.296875 C 2.140625 -3.359375 1.984375 -3.40625 1.859375 -3.484375 C 1.71875 -3.5625 1.609375 -3.640625 1.53125 -3.734375 C 1.453125 -3.828125 1.40625 -3.9375 1.40625 -4.078125 C 1.40625 -4.203125 1.421875 -4.296875 1.484375 -4.390625 C 1.53125 -4.5 1.609375 -4.578125 1.6875 -4.65625 C 1.78125 -4.71875 1.890625 -4.78125 2.03125 -4.828125 C 2.15625 -4.859375 2.3125 -4.890625 2.46875 -4.890625 C 2.65625 -4.890625 2.828125 -4.859375 2.96875 -4.828125 C 3.09375 -4.78125 3.21875 -4.734375 3.3125 -4.6875 C 3.421875 -4.640625 3.5 -4.59375 3.578125 -4.546875 C 3.640625 -4.515625 3.703125 -4.5 3.75 -4.5 C 3.84375 -4.5 3.921875 -4.53125 3.953125 -4.609375 Z M 3.953125 -4.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-10">
<path style="stroke:none;" d="M 0.828125 0 L 1.453125 0 C 1.59375 0 1.671875 -0.078125 1.703125 -0.203125 L 1.75 -0.703125 C 1.9375 -0.46875 2.15625 -0.265625 2.40625 -0.125 C 2.65625 0 2.96875 0.078125 3.3125 0.078125 C 3.6875 0.078125 4.015625 0 4.3125 -0.140625 C 4.609375 -0.296875 4.859375 -0.484375 5.078125 -0.75 C 5.265625 -1 5.4375 -1.3125 5.546875 -1.65625 C 5.65625 -2.015625 5.703125 -2.390625 5.703125 -2.796875 C 5.703125 -3.25 5.65625 -3.65625 5.5625 -4.015625 C 5.453125 -4.359375 5.3125 -4.65625 5.140625 -4.890625 C 4.953125 -5.125 4.734375 -5.3125 4.484375 -5.4375 C 4.21875 -5.546875 3.9375 -5.609375 3.609375 -5.609375 C 3.234375 -5.609375 2.890625 -5.53125 2.59375 -5.359375 C 2.296875 -5.203125 2.03125 -5 1.8125 -4.734375 L 1.8125 -8.03125 L 0.828125 -8.03125 Z M 3.296875 -4.84375 C 3.515625 -4.84375 3.71875 -4.796875 3.890625 -4.71875 C 4.0625 -4.640625 4.203125 -4.53125 4.328125 -4.359375 C 4.453125 -4.1875 4.546875 -3.984375 4.609375 -3.71875 C 4.671875 -3.46875 4.703125 -3.15625 4.703125 -2.796875 C 4.703125 -2.109375 4.5625 -1.59375 4.28125 -1.234375 C 4.015625 -0.859375 3.609375 -0.671875 3.09375 -0.671875 C 2.828125 -0.671875 2.59375 -0.71875 2.390625 -0.828125 C 2.171875 -0.921875 1.984375 -1.09375 1.8125 -1.328125 L 1.8125 -4 C 2 -4.265625 2.21875 -4.46875 2.46875 -4.625 C 2.703125 -4.765625 2.984375 -4.84375 3.296875 -4.84375 Z M 3.296875 -4.84375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-11">
<path style="stroke:none;" d="M 1.640625 -5.53125 L 0.671875 -5.53125 L 0.671875 -2 C 0.671875 -1.6875 0.703125 -1.40625 0.78125 -1.140625 C 0.859375 -0.890625 0.96875 -0.671875 1.140625 -0.484375 C 1.296875 -0.3125 1.484375 -0.15625 1.71875 -0.0625 C 1.953125 0.03125 2.21875 0.09375 2.515625 0.09375 C 2.90625 0.09375 3.234375 0 3.546875 -0.15625 C 3.84375 -0.3125 4.109375 -0.53125 4.34375 -0.796875 L 4.421875 -0.203125 C 4.453125 -0.0625 4.546875 0 4.6875 0 L 5.265625 0 L 5.265625 -5.53125 L 4.296875 -5.53125 L 4.296875 -1.453125 C 4.078125 -1.203125 3.84375 -1.03125 3.59375 -0.890625 C 3.34375 -0.75 3.078125 -0.6875 2.796875 -0.6875 C 2.40625 -0.6875 2.109375 -0.796875 1.921875 -1.03125 C 1.734375 -1.265625 1.640625 -1.578125 1.640625 -2 Z M 1.640625 -5.53125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-12">
<path style="stroke:none;" d="M 2.65625 -5.609375 C 2.34375 -5.609375 2.078125 -5.578125 1.8125 -5.484375 C 1.5625 -5.40625 1.34375 -5.296875 1.15625 -5.140625 C 0.96875 -4.984375 0.8125 -4.796875 0.71875 -4.5625 C 0.609375 -4.359375 0.5625 -4.109375 0.5625 -3.84375 C 0.5625 -3.5 0.640625 -3.203125 0.796875 -2.953125 C 0.953125 -2.703125 1.15625 -2.5 1.4375 -2.34375 C 1.3125 -2.28125 1.21875 -2.21875 1.125 -2.140625 C 1.046875 -2.0625 0.96875 -1.984375 0.90625 -1.90625 C 0.84375 -1.828125 0.796875 -1.734375 0.78125 -1.640625 C 0.75 -1.5625 0.734375 -1.484375 0.734375 -1.40625 C 0.734375 -1.203125 0.78125 -1.03125 0.875 -0.921875 C 0.953125 -0.796875 1.078125 -0.6875 1.25 -0.625 C 0.9375 -0.5 0.703125 -0.359375 0.53125 -0.15625 C 0.359375 0.015625 0.265625 0.25 0.265625 0.53125 C 0.265625 0.71875 0.328125 0.90625 0.421875 1.078125 C 0.53125 1.265625 0.671875 1.40625 0.875 1.546875 C 1.078125 1.6875 1.328125 1.78125 1.625 1.875 C 1.9375 1.953125 2.28125 1.984375 2.6875 1.984375 C 3.09375 1.984375 3.453125 1.9375 3.78125 1.828125 C 4.09375 1.734375 4.359375 1.59375 4.59375 1.421875 C 4.8125 1.25 4.984375 1.046875 5.09375 0.828125 C 5.21875 0.609375 5.265625 0.375 5.265625 0.140625 C 5.265625 -0.109375 5.21875 -0.328125 5.109375 -0.484375 C 5.015625 -0.640625 4.875 -0.765625 4.6875 -0.859375 C 4.515625 -0.953125 4.328125 -1.015625 4.09375 -1.046875 C 3.875 -1.09375 3.65625 -1.125 3.421875 -1.140625 C 3.1875 -1.15625 2.96875 -1.171875 2.75 -1.171875 C 2.515625 -1.171875 2.328125 -1.203125 2.15625 -1.234375 C 1.96875 -1.25 1.828125 -1.296875 1.734375 -1.375 C 1.625 -1.4375 1.578125 -1.53125 1.578125 -1.671875 C 1.578125 -1.75 1.609375 -1.828125 1.65625 -1.90625 C 1.71875 -2 1.8125 -2.078125 1.921875 -2.15625 C 2.15625 -2.09375 2.40625 -2.0625 2.65625 -2.0625 C 2.953125 -2.0625 3.234375 -2.09375 3.484375 -2.1875 C 3.734375 -2.265625 3.953125 -2.390625 4.140625 -2.546875 C 4.328125 -2.703125 4.46875 -2.890625 4.5625 -3.109375 C 4.671875 -3.328125 4.734375 -3.578125 4.734375 -3.84375 C 4.734375 -4.125 4.671875 -4.390625 4.546875 -4.625 L 5.171875 -4.71875 C 5.328125 -4.75 5.40625 -4.828125 5.40625 -4.953125 L 5.40625 -5.3125 L 3.90625 -5.3125 C 3.734375 -5.40625 3.546875 -5.484375 3.328125 -5.546875 C 3.125 -5.59375 2.890625 -5.609375 2.65625 -5.609375 Z M 4.375 0.296875 C 4.375 0.453125 4.34375 0.578125 4.265625 0.703125 C 4.1875 0.8125 4.078125 0.921875 3.9375 1.015625 C 3.796875 1.09375 3.609375 1.15625 3.40625 1.203125 C 3.203125 1.265625 2.96875 1.28125 2.703125 1.28125 C 2.4375 1.28125 2.203125 1.265625 2 1.203125 C 1.8125 1.171875 1.640625 1.109375 1.515625 1.03125 C 1.375 0.953125 1.28125 0.859375 1.21875 0.75 C 1.15625 0.640625 1.125 0.53125 1.125 0.40625 C 1.125 0.203125 1.1875 0.03125 1.3125 -0.109375 C 1.4375 -0.25 1.609375 -0.359375 1.828125 -0.46875 C 2 -0.4375 2.1875 -0.421875 2.390625 -0.40625 C 2.578125 -0.390625 2.765625 -0.375 2.96875 -0.375 C 3.15625 -0.359375 3.328125 -0.34375 3.5 -0.328125 C 3.671875 -0.3125 3.828125 -0.265625 3.953125 -0.234375 C 4.078125 -0.1875 4.1875 -0.109375 4.265625 -0.03125 C 4.34375 0.046875 4.375 0.15625 4.375 0.296875 Z M 2.65625 -2.703125 C 2.46875 -2.703125 2.296875 -2.71875 2.140625 -2.78125 C 2 -2.828125 1.875 -2.90625 1.765625 -3.015625 C 1.65625 -3.109375 1.59375 -3.234375 1.53125 -3.359375 C 1.484375 -3.5 1.453125 -3.640625 1.453125 -3.8125 C 1.453125 -4.15625 1.5625 -4.421875 1.765625 -4.625 C 1.96875 -4.828125 2.265625 -4.921875 2.65625 -4.921875 C 3.046875 -4.921875 3.34375 -4.828125 3.5625 -4.625 C 3.75 -4.421875 3.859375 -4.15625 3.859375 -3.8125 C 3.859375 -3.640625 3.828125 -3.5 3.78125 -3.359375 C 3.734375 -3.234375 3.65625 -3.109375 3.5625 -3.015625 C 3.453125 -2.90625 3.328125 -2.828125 3.171875 -2.78125 C 3.03125 -2.71875 2.859375 -2.703125 2.65625 -2.703125 Z M 2.65625 -2.703125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-13">
<path style="stroke:none;" d="M 2.46875 0.09375 C 2.71875 0.09375 2.96875 0.046875 3.203125 -0.046875 C 3.4375 -0.140625 3.640625 -0.25 3.8125 -0.421875 L 3.515625 -0.875 C 3.484375 -0.9375 3.4375 -0.96875 3.390625 -0.96875 C 3.359375 -0.96875 3.328125 -0.953125 3.28125 -0.921875 C 3.25 -0.90625 3.203125 -0.875 3.140625 -0.84375 C 3.09375 -0.8125 3.03125 -0.78125 2.953125 -0.75 C 2.875 -0.71875 2.796875 -0.703125 2.6875 -0.703125 C 2.515625 -0.703125 2.359375 -0.765625 2.25 -0.875 C 2.140625 -1 2.078125 -1.15625 2.078125 -1.390625 L 2.078125 -4.71875 L 3.671875 -4.71875 L 3.671875 -5.421875 L 2.078125 -5.421875 L 2.078125 -7.3125 L 1.59375 -7.3125 C 1.53125 -7.3125 1.484375 -7.296875 1.4375 -7.265625 C 1.40625 -7.234375 1.375 -7.1875 1.375 -7.125 L 1.140625 -5.421875 L 0.234375 -5.3125 L 0.234375 -4.921875 C 0.234375 -4.859375 0.265625 -4.796875 0.296875 -4.765625 C 0.34375 -4.734375 0.390625 -4.71875 0.453125 -4.71875 L 1.109375 -4.71875 L 1.109375 -1.328125 C 1.109375 -0.875 1.234375 -0.53125 1.46875 -0.28125 C 1.703125 -0.03125 2.03125 0.09375 2.46875 0.09375 Z M 2.46875 0.09375 "/>
</symbol>
<symbol overflow="visible" id="glyph0-14">
<path style="stroke:none;" d="M 1.875 -5.53125 L 0.90625 -5.53125 L 0.90625 0 L 1.875 0 Z M 2.09375 -7.265625 C 2.09375 -7.34375 2.078125 -7.4375 2.046875 -7.53125 C 2 -7.609375 1.953125 -7.6875 1.890625 -7.75 C 1.828125 -7.8125 1.75 -7.859375 1.65625 -7.90625 C 1.578125 -7.9375 1.484375 -7.953125 1.390625 -7.953125 C 1.296875 -7.953125 1.203125 -7.9375 1.140625 -7.90625 C 1.046875 -7.859375 0.96875 -7.8125 0.921875 -7.75 C 0.84375 -7.6875 0.796875 -7.609375 0.765625 -7.53125 C 0.71875 -7.4375 0.703125 -7.34375 0.703125 -7.265625 C 0.703125 -7.171875 0.71875 -7.078125 0.765625 -6.984375 C 0.796875 -6.921875 0.84375 -6.84375 0.921875 -6.765625 C 0.96875 -6.71875 1.046875 -6.65625 1.140625 -6.625 C 1.203125 -6.59375 1.296875 -6.578125 1.390625 -6.578125 C 1.484375 -6.578125 1.578125 -6.59375 1.65625 -6.625 C 1.75 -6.65625 1.828125 -6.71875 1.890625 -6.765625 C 1.953125 -6.84375 2 -6.921875 2.046875 -6.984375 C 2.078125 -7.078125 2.09375 -7.171875 2.09375 -7.265625 Z M 2.09375 -7.265625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-15">
<path style="stroke:none;" d="M 4.5625 -4.546875 L 4.828125 -4.890625 C 4.59375 -5.125 4.328125 -5.296875 4.03125 -5.421875 C 3.734375 -5.546875 3.390625 -5.609375 3 -5.609375 C 2.578125 -5.609375 2.21875 -5.546875 1.890625 -5.40625 C 1.578125 -5.25 1.296875 -5.0625 1.078125 -4.8125 C 0.859375 -4.546875 0.6875 -4.25 0.578125 -3.90625 C 0.453125 -3.5625 0.40625 -3.171875 0.40625 -2.765625 C 0.40625 -2.3125 0.46875 -1.90625 0.59375 -1.5625 C 0.71875 -1.203125 0.890625 -0.90625 1.109375 -0.671875 C 1.328125 -0.421875 1.578125 -0.234375 1.875 -0.109375 C 2.171875 0.015625 2.5 0.078125 2.84375 0.078125 C 3.234375 0.078125 3.625 0.015625 3.984375 -0.125 C 4.34375 -0.265625 4.640625 -0.484375 4.875 -0.78125 L 4.609375 -1.125 C 4.5625 -1.1875 4.5 -1.21875 4.421875 -1.21875 C 4.359375 -1.21875 4.296875 -1.1875 4.21875 -1.140625 C 4.15625 -1.078125 4.078125 -1.015625 3.96875 -0.953125 C 3.875 -0.875 3.75 -0.8125 3.59375 -0.765625 C 3.4375 -0.703125 3.25 -0.671875 3.015625 -0.671875 C 2.765625 -0.671875 2.546875 -0.71875 2.34375 -0.8125 C 2.140625 -0.90625 1.96875 -1.046875 1.84375 -1.21875 C 1.703125 -1.390625 1.59375 -1.609375 1.515625 -1.875 C 1.4375 -2.125 1.40625 -2.4375 1.40625 -2.765625 C 1.40625 -3.09375 1.4375 -3.375 1.5 -3.625 C 1.578125 -3.890625 1.6875 -4.109375 1.828125 -4.296875 C 1.96875 -4.46875 2.140625 -4.609375 2.34375 -4.71875 C 2.546875 -4.796875 2.796875 -4.859375 3.0625 -4.859375 C 3.265625 -4.859375 3.4375 -4.828125 3.578125 -4.78125 C 3.71875 -4.734375 3.828125 -4.6875 3.9375 -4.640625 C 4.03125 -4.578125 4.109375 -4.53125 4.171875 -4.484375 C 4.234375 -4.4375 4.296875 -4.421875 4.359375 -4.421875 C 4.40625 -4.421875 4.453125 -4.421875 4.484375 -4.453125 C 4.5 -4.46875 4.53125 -4.5 4.5625 -4.546875 Z M 4.5625 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph0-16">
<path style="stroke:none;" d="M 1.8125 -8.03125 L 0.828125 -8.03125 L 0.828125 0 L 1.8125 0 L 1.8125 -2.640625 L 2.078125 -2.640625 C 2.1875 -2.640625 2.265625 -2.625 2.328125 -2.609375 C 2.375 -2.578125 2.4375 -2.53125 2.484375 -2.453125 L 4.296875 -0.1875 C 4.359375 -0.125 4.40625 -0.078125 4.453125 -0.046875 C 4.515625 -0.015625 4.59375 0 4.671875 0 L 5.546875 0 L 3.375 -2.71875 C 3.328125 -2.796875 3.28125 -2.859375 3.234375 -2.921875 C 3.171875 -2.984375 3.125 -3.03125 3.046875 -3.0625 C 3.109375 -3.109375 3.171875 -3.140625 3.21875 -3.203125 C 3.265625 -3.25 3.328125 -3.296875 3.375 -3.359375 L 5.40625 -5.53125 L 4.515625 -5.53125 C 4.421875 -5.53125 4.359375 -5.5 4.296875 -5.46875 C 4.25 -5.4375 4.1875 -5.390625 4.140625 -5.328125 L 2.390625 -3.453125 C 2.328125 -3.390625 2.28125 -3.359375 2.234375 -3.34375 C 2.1875 -3.3125 2.125 -3.296875 2.0625 -3.296875 L 1.8125 -3.296875 Z M 1.8125 -8.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-17">
<path style="stroke:none;" d="M 0.796875 0 L 1.765625 0 L 1.765625 -3.515625 C 1.921875 -3.890625 2.109375 -4.171875 2.328125 -4.375 C 2.5625 -4.5625 2.84375 -4.671875 3.1875 -4.671875 C 3.375 -4.671875 3.515625 -4.65625 3.625 -4.609375 C 3.734375 -4.578125 3.8125 -4.5625 3.859375 -4.5625 C 3.953125 -4.5625 4 -4.609375 4.03125 -4.703125 L 4.15625 -5.421875 C 4.046875 -5.484375 3.9375 -5.53125 3.8125 -5.578125 C 3.6875 -5.609375 3.546875 -5.625 3.390625 -5.625 C 3.015625 -5.625 2.6875 -5.515625 2.421875 -5.296875 C 2.140625 -5.078125 1.90625 -4.78125 1.71875 -4.390625 L 1.65625 -5.25 C 1.640625 -5.359375 1.609375 -5.421875 1.578125 -5.46875 C 1.53125 -5.5 1.453125 -5.53125 1.359375 -5.53125 L 0.796875 -5.53125 Z M 0.796875 0 "/>
</symbol>
<symbol overflow="visible" id="glyph0-18">
<path style="stroke:none;" d="M 7.71875 -3.90625 C 7.71875 -4.484375 7.625 -5.015625 7.4375 -5.5 C 7.265625 -5.984375 7 -6.390625 6.65625 -6.734375 C 6.3125 -7.078125 5.921875 -7.34375 5.4375 -7.53125 C 4.96875 -7.71875 4.4375 -7.8125 3.875 -7.8125 L 0.953125 -7.8125 L 0.953125 0 L 3.875 0 C 4.4375 0 4.96875 -0.09375 5.4375 -0.28125 C 5.921875 -0.46875 6.3125 -0.734375 6.65625 -1.078125 C 7 -1.421875 7.265625 -1.828125 7.4375 -2.3125 C 7.625 -2.78125 7.71875 -3.328125 7.71875 -3.90625 Z M 6.640625 -3.90625 C 6.640625 -3.421875 6.578125 -3 6.4375 -2.625 C 6.3125 -2.234375 6.125 -1.921875 5.890625 -1.65625 C 5.640625 -1.40625 5.359375 -1.203125 5.015625 -1.0625 C 4.671875 -0.921875 4.296875 -0.859375 3.875 -0.859375 L 2.015625 -0.859375 L 2.015625 -6.953125 L 3.875 -6.953125 C 4.296875 -6.953125 4.671875 -6.890625 5.015625 -6.75 C 5.359375 -6.609375 5.640625 -6.40625 5.890625 -6.15625 C 6.125 -5.890625 6.3125 -5.5625 6.4375 -5.1875 C 6.578125 -4.8125 6.640625 -4.390625 6.640625 -3.90625 Z M 6.640625 -3.90625 "/>
</symbol>
<symbol overflow="visible" id="glyph0-19">
<path style="stroke:none;" d="M 5.765625 -7.8125 L 0.953125 -7.8125 L 0.953125 0 L 2.015625 0 L 2.015625 -3.359375 L 5.21875 -3.359375 L 5.21875 -4.21875 L 2.015625 -4.21875 L 2.015625 -6.953125 L 5.765625 -6.953125 Z M 5.765625 -7.8125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-20">
<path style="stroke:none;" d="M 0.953125 0 L 3.71875 0 C 4.15625 0 4.53125 -0.046875 4.875 -0.15625 C 5.21875 -0.265625 5.5 -0.421875 5.734375 -0.609375 C 5.984375 -0.8125 6.15625 -1.046875 6.265625 -1.3125 C 6.390625 -1.59375 6.453125 -1.890625 6.453125 -2.21875 C 6.453125 -2.703125 6.3125 -3.109375 6.015625 -3.40625 C 5.734375 -3.703125 5.296875 -3.90625 4.734375 -4.015625 C 4.96875 -4.09375 5.1875 -4.1875 5.375 -4.3125 C 5.5625 -4.4375 5.703125 -4.5625 5.828125 -4.71875 C 5.953125 -4.875 6.046875 -5.03125 6.109375 -5.21875 C 6.15625 -5.40625 6.1875 -5.578125 6.1875 -5.78125 C 6.1875 -6.09375 6.140625 -6.375 6.03125 -6.625 C 5.921875 -6.875 5.765625 -7.09375 5.546875 -7.265625 C 5.3125 -7.4375 5.03125 -7.578125 4.671875 -7.671875 C 4.328125 -7.765625 3.921875 -7.8125 3.4375 -7.8125 L 0.953125 -7.8125 Z M 2 -3.5625 L 3.6875 -3.5625 C 4.265625 -3.5625 4.703125 -3.453125 4.984375 -3.203125 C 5.265625 -2.984375 5.421875 -2.65625 5.421875 -2.25 C 5.421875 -2.046875 5.375 -1.859375 5.3125 -1.671875 C 5.25 -1.515625 5.140625 -1.359375 5 -1.234375 C 4.875 -1.109375 4.6875 -1.015625 4.46875 -0.9375 C 4.265625 -0.875 4 -0.84375 3.703125 -0.84375 L 2 -0.84375 Z M 2 -4.3125 L 2 -6.984375 L 3.4375 -6.984375 C 4.03125 -6.984375 4.453125 -6.875 4.734375 -6.65625 C 5 -6.453125 5.140625 -6.109375 5.140625 -5.65625 C 5.140625 -5.453125 5.109375 -5.265625 5.03125 -5.109375 C 4.96875 -4.9375 4.859375 -4.796875 4.71875 -4.6875 C 4.578125 -4.5625 4.390625 -4.484375 4.171875 -4.40625 C 3.953125 -4.34375 3.703125 -4.3125 3.40625 -4.3125 Z M 2 -4.3125 "/>
</symbol>
<symbol overflow="visible" id="glyph0-21">
<path style="stroke:none;" d="M 1.015625 0 L 1.984375 0 L 1.984375 -4.71875 L 3.5625 -4.71875 L 3.5625 -5.421875 L 1.953125 -5.421875 L 1.953125 -5.921875 C 1.953125 -6.15625 1.984375 -6.359375 2.046875 -6.515625 C 2.09375 -6.671875 2.171875 -6.8125 2.265625 -6.90625 C 2.359375 -7 2.46875 -7.078125 2.625 -7.109375 C 2.75 -7.15625 2.90625 -7.1875 3.0625 -7.1875 L 3.234375 -7.1875 C 3.34375 -7.1875 3.421875 -7.1875 3.484375 -7.203125 C 3.546875 -7.21875 3.578125 -7.265625 3.578125 -7.328125 L 3.59375 -7.8125 C 3.390625 -7.890625 3.15625 -7.921875 2.90625 -7.921875 C 2.625 -7.921875 2.359375 -7.890625 2.125 -7.796875 C 1.890625 -7.703125 1.703125 -7.578125 1.53125 -7.421875 C 1.359375 -7.234375 1.234375 -7.03125 1.140625 -6.796875 C 1.0625 -6.546875 1.015625 -6.265625 1.015625 -5.953125 L 1.015625 -5.421875 L 0.140625 -5.421875 L 0.140625 -5.015625 C 0.140625 -4.953125 0.15625 -4.890625 0.21875 -4.859375 C 0.265625 -4.8125 0.328125 -4.78125 0.40625 -4.765625 L 1.015625 -4.6875 Z M 1.015625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-0">
<path style="stroke:none;" d="M 1.125 -5.109375 L 1.328125 -4.78125 C 1.375 -4.703125 1.421875 -4.671875 1.5 -4.671875 C 1.53125 -4.671875 1.5625 -4.6875 1.609375 -4.71875 C 1.65625 -4.75 1.703125 -4.78125 1.765625 -4.8125 C 1.828125 -4.84375 1.890625 -4.875 1.984375 -4.890625 C 2.0625 -4.921875 2.171875 -4.9375 2.28125 -4.9375 C 2.453125 -4.9375 2.59375 -4.890625 2.703125 -4.796875 C 2.8125 -4.71875 2.875 -4.59375 2.875 -4.4375 C 2.875 -4.3125 2.84375 -4.21875 2.796875 -4.125 C 2.75 -4.046875 2.6875 -3.96875 2.625 -3.890625 C 2.546875 -3.828125 2.46875 -3.765625 2.390625 -3.703125 C 2.3125 -3.640625 2.234375 -3.578125 2.15625 -3.515625 C 2.09375 -3.453125 2.046875 -3.375 2 -3.3125 C 1.96875 -3.234375 1.953125 -3.140625 1.96875 -3.046875 L 2.015625 -2.515625 L 2.5625 -2.515625 L 2.640625 -2.984375 C 2.65625 -3.046875 2.6875 -3.109375 2.734375 -3.171875 C 2.796875 -3.234375 2.859375 -3.28125 2.921875 -3.34375 C 3 -3.40625 3.078125 -3.453125 3.15625 -3.53125 C 3.234375 -3.59375 3.3125 -3.65625 3.375 -3.75 C 3.4375 -3.84375 3.5 -3.9375 3.546875 -4.0625 C 3.59375 -4.1875 3.609375 -4.328125 3.609375 -4.484375 C 3.609375 -4.65625 3.578125 -4.8125 3.515625 -4.9375 C 3.453125 -5.078125 3.375 -5.203125 3.265625 -5.296875 C 3.15625 -5.390625 3.015625 -5.46875 2.875 -5.515625 C 2.71875 -5.5625 2.546875 -5.59375 2.359375 -5.59375 C 2.21875 -5.59375 2.09375 -5.578125 1.96875 -5.546875 C 1.859375 -5.53125 1.75 -5.5 1.640625 -5.453125 C 1.53125 -5.40625 1.4375 -5.359375 1.359375 -5.296875 C 1.28125 -5.25 1.203125 -5.1875 1.125 -5.109375 Z M 1.78125 -1.3125 C 1.78125 -1.171875 1.828125 -1.046875 1.921875 -0.953125 C 2.015625 -0.859375 2.125 -0.8125 2.265625 -0.8125 C 2.34375 -0.8125 2.40625 -0.828125 2.453125 -0.859375 C 2.515625 -0.875 2.5625 -0.921875 2.609375 -0.953125 C 2.65625 -1 2.6875 -1.0625 2.71875 -1.109375 C 2.734375 -1.171875 2.75 -1.234375 2.75 -1.3125 C 2.75 -1.375 2.734375 -1.4375 2.71875 -1.5 C 2.6875 -1.5625 2.65625 -1.625 2.609375 -1.65625 C 2.5625 -1.703125 2.515625 -1.75 2.453125 -1.765625 C 2.40625 -1.796875 2.34375 -1.8125 2.265625 -1.8125 C 2.125 -1.8125 2.015625 -1.765625 1.921875 -1.65625 C 1.828125 -1.5625 1.78125 -1.453125 1.78125 -1.3125 Z M 0.203125 -6.421875 L 0.203125 0 L 4.5625 0 L 4.5625 -6.421875 Z M 0.421875 -0.234375 L 0.421875 -6.171875 L 4.3125 -6.171875 L 4.3125 -0.234375 Z M 0.421875 -0.234375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-1">
<path style="stroke:none;" d="M 2.03125 0.078125 C 2.234375 0.078125 2.4375 0.03125 2.625 -0.03125 C 2.828125 -0.109375 2.984375 -0.203125 3.125 -0.34375 L 2.890625 -0.71875 C 2.859375 -0.765625 2.828125 -0.796875 2.78125 -0.796875 C 2.765625 -0.796875 2.734375 -0.796875 2.703125 -0.765625 C 2.671875 -0.75 2.625 -0.71875 2.59375 -0.6875 C 2.546875 -0.65625 2.484375 -0.640625 2.4375 -0.625 C 2.375 -0.59375 2.296875 -0.578125 2.203125 -0.578125 C 2.0625 -0.578125 1.953125 -0.625 1.859375 -0.71875 C 1.765625 -0.8125 1.71875 -0.953125 1.71875 -1.140625 L 1.71875 -3.875 L 3.015625 -3.875 L 3.015625 -4.453125 L 1.71875 -4.453125 L 1.71875 -6.015625 L 1.3125 -6.015625 C 1.265625 -6.015625 1.21875 -6 1.1875 -5.96875 C 1.15625 -5.953125 1.125 -5.90625 1.125 -5.859375 L 0.9375 -4.46875 L 0.203125 -4.375 L 0.203125 -4.046875 C 0.203125 -3.984375 0.21875 -3.953125 0.25 -3.921875 C 0.28125 -3.890625 0.3125 -3.875 0.375 -3.875 L 0.921875 -3.875 L 0.921875 -1.09375 C 0.921875 -0.71875 1.015625 -0.4375 1.203125 -0.234375 C 1.40625 -0.03125 1.671875 0.078125 2.03125 0.078125 Z M 2.03125 0.078125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-2">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -3.34375 C 1.625 -3.53125 1.8125 -3.6875 2.015625 -3.8125 C 2.21875 -3.921875 2.4375 -3.984375 2.6875 -3.984375 C 3 -3.984375 3.25 -3.890625 3.40625 -3.6875 C 3.5625 -3.5 3.640625 -3.234375 3.640625 -2.890625 L 3.640625 0 L 4.4375 0 L 4.4375 -2.890625 C 4.4375 -3.140625 4.40625 -3.390625 4.34375 -3.59375 C 4.265625 -3.8125 4.171875 -3.984375 4.046875 -4.140625 C 3.921875 -4.296875 3.765625 -4.40625 3.5625 -4.5 C 3.375 -4.578125 3.15625 -4.609375 2.921875 -4.609375 C 2.609375 -4.609375 2.34375 -4.546875 2.09375 -4.4375 C 1.859375 -4.3125 1.640625 -4.140625 1.453125 -3.9375 L 1.453125 -6.609375 L 0.65625 -6.609375 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-3">
<path style="stroke:none;" d="M 2.453125 -4.609375 C 2.125 -4.609375 1.828125 -4.5625 1.5625 -4.4375 C 1.296875 -4.328125 1.078125 -4.171875 0.890625 -3.96875 C 0.71875 -3.765625 0.578125 -3.53125 0.46875 -3.25 C 0.375 -2.984375 0.328125 -2.6875 0.328125 -2.359375 C 0.328125 -1.96875 0.390625 -1.625 0.5 -1.328125 C 0.59375 -1.015625 0.75 -0.765625 0.9375 -0.5625 C 1.140625 -0.359375 1.359375 -0.203125 1.625 -0.09375 C 1.890625 0.015625 2.1875 0.0625 2.5 0.0625 C 2.65625 0.0625 2.828125 0.046875 3 0.015625 C 3.15625 -0.015625 3.328125 -0.046875 3.484375 -0.109375 C 3.640625 -0.171875 3.78125 -0.234375 3.921875 -0.328125 C 4.0625 -0.40625 4.171875 -0.515625 4.28125 -0.640625 L 4.046875 -0.921875 C 4.015625 -0.984375 3.96875 -1 3.90625 -1 C 3.859375 -1 3.796875 -0.984375 3.71875 -0.9375 C 3.65625 -0.890625 3.5625 -0.84375 3.453125 -0.78125 C 3.359375 -0.734375 3.234375 -0.6875 3.078125 -0.640625 C 2.9375 -0.59375 2.765625 -0.5625 2.5625 -0.5625 C 2.34375 -0.5625 2.15625 -0.59375 1.984375 -0.671875 C 1.8125 -0.734375 1.65625 -0.84375 1.53125 -0.984375 C 1.40625 -1.125 1.3125 -1.3125 1.234375 -1.515625 C 1.171875 -1.734375 1.125 -1.984375 1.125 -2.265625 L 4.140625 -2.265625 C 4.21875 -2.265625 4.265625 -2.296875 4.296875 -2.328125 C 4.328125 -2.375 4.34375 -2.453125 4.34375 -2.578125 C 4.34375 -2.90625 4.28125 -3.1875 4.203125 -3.4375 C 4.09375 -3.703125 3.96875 -3.90625 3.796875 -4.078125 C 3.640625 -4.25 3.4375 -4.390625 3.203125 -4.46875 C 2.984375 -4.5625 2.71875 -4.609375 2.453125 -4.609375 Z M 2.46875 -4.03125 C 2.65625 -4.03125 2.8125 -4 2.953125 -3.9375 C 3.09375 -3.875 3.21875 -3.78125 3.3125 -3.671875 C 3.421875 -3.5625 3.5 -3.4375 3.546875 -3.28125 C 3.59375 -3.125 3.625 -2.953125 3.625 -2.765625 L 1.140625 -2.765625 C 1.203125 -3.15625 1.34375 -3.46875 1.5625 -3.6875 C 1.78125 -3.921875 2.078125 -4.03125 2.46875 -4.03125 Z M 2.46875 -4.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-4">
<path style="stroke:none;" d="M 0.0625 -4.546875 L 1.53125 0 L 2.140625 0 C 2.21875 0 2.28125 -0.046875 2.3125 -0.15625 L 3.34375 -3.234375 C 3.359375 -3.296875 3.375 -3.375 3.390625 -3.4375 C 3.40625 -3.515625 3.421875 -3.578125 3.4375 -3.65625 C 3.453125 -3.578125 3.46875 -3.515625 3.484375 -3.4375 C 3.5 -3.375 3.515625 -3.296875 3.546875 -3.234375 L 4.546875 -0.15625 C 4.578125 -0.046875 4.625 0 4.703125 0 L 5.34375 0 L 6.8125 -4.546875 L 6.203125 -4.546875 C 6.15625 -4.546875 6.109375 -4.53125 6.0625 -4.5 C 6.015625 -4.46875 5.984375 -4.421875 5.984375 -4.375 L 5.09375 -1.453125 C 5.0625 -1.359375 5.03125 -1.265625 5.015625 -1.15625 C 4.984375 -1.046875 4.96875 -0.9375 4.953125 -0.84375 C 4.9375 -0.9375 4.90625 -1.046875 4.875 -1.140625 C 4.859375 -1.25 4.828125 -1.34375 4.796875 -1.453125 L 3.859375 -4.390625 C 3.84375 -4.4375 3.8125 -4.46875 3.78125 -4.5 C 3.734375 -4.53125 3.6875 -4.546875 3.625 -4.546875 L 3.28125 -4.546875 C 3.21875 -4.546875 3.171875 -4.53125 3.140625 -4.5 C 3.109375 -4.46875 3.078125 -4.4375 3.0625 -4.390625 L 2.109375 -1.453125 C 2.078125 -1.34375 2.046875 -1.234375 2.015625 -1.140625 C 1.984375 -1.046875 1.953125 -0.9375 1.921875 -0.84375 C 1.921875 -0.9375 1.890625 -1.046875 1.875 -1.140625 C 1.859375 -1.234375 1.828125 -1.34375 1.8125 -1.453125 L 0.9375 -4.375 C 0.921875 -4.421875 0.890625 -4.46875 0.859375 -4.5 C 0.8125 -4.53125 0.765625 -4.546875 0.6875 -4.546875 Z M 0.0625 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-5">
<path style="stroke:none;" d="M 2.5 -4.609375 C 2.15625 -4.609375 1.859375 -4.5625 1.59375 -4.453125 C 1.328125 -4.34375 1.09375 -4.171875 0.90625 -3.984375 C 0.71875 -3.78125 0.578125 -3.53125 0.46875 -3.234375 C 0.375 -2.953125 0.328125 -2.625 0.328125 -2.28125 C 0.328125 -1.921875 0.375 -1.59375 0.46875 -1.3125 C 0.578125 -1.015625 0.71875 -0.765625 0.90625 -0.5625 C 1.09375 -0.375 1.328125 -0.203125 1.59375 -0.09375 C 1.859375 0.015625 2.15625 0.0625 2.5 0.0625 C 2.828125 0.0625 3.125 0.015625 3.390625 -0.09375 C 3.65625 -0.203125 3.890625 -0.375 4.078125 -0.5625 C 4.265625 -0.765625 4.40625 -1.015625 4.5 -1.3125 C 4.609375 -1.59375 4.65625 -1.921875 4.65625 -2.28125 C 4.65625 -2.625 4.609375 -2.953125 4.5 -3.234375 C 4.40625 -3.53125 4.265625 -3.78125 4.078125 -3.984375 C 3.890625 -4.171875 3.65625 -4.34375 3.390625 -4.453125 C 3.125 -4.5625 2.828125 -4.609375 2.5 -4.609375 Z M 2.5 -0.5625 C 2.265625 -0.5625 2.0625 -0.59375 1.90625 -0.671875 C 1.734375 -0.75 1.59375 -0.859375 1.484375 -1.015625 C 1.375 -1.15625 1.28125 -1.34375 1.234375 -1.546875 C 1.171875 -1.765625 1.140625 -2 1.140625 -2.265625 C 1.140625 -2.53125 1.171875 -2.78125 1.234375 -3 C 1.28125 -3.203125 1.375 -3.390625 1.484375 -3.53125 C 1.59375 -3.6875 1.734375 -3.796875 1.90625 -3.875 C 2.0625 -3.953125 2.265625 -3.984375 2.5 -3.984375 C 2.9375 -3.984375 3.28125 -3.828125 3.5 -3.53125 C 3.71875 -3.234375 3.828125 -2.8125 3.828125 -2.265625 C 3.828125 -1.734375 3.71875 -1.3125 3.5 -1.015625 C 3.28125 -0.703125 2.9375 -0.5625 2.5 -0.5625 Z M 2.5 -0.5625 "/>
</symbol>
<symbol overflow="visible" id="glyph1-6">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -3.390625 C 1.59375 -3.5625 1.75 -3.71875 1.921875 -3.828125 C 2.078125 -3.921875 2.265625 -3.984375 2.46875 -3.984375 C 2.75 -3.984375 2.953125 -3.890625 3.109375 -3.703125 C 3.25 -3.53125 3.328125 -3.25 3.328125 -2.890625 L 3.328125 0 L 4.125 0 L 4.125 -2.890625 C 4.125 -3.078125 4.15625 -3.234375 4.203125 -3.359375 C 4.25 -3.5 4.328125 -3.609375 4.421875 -3.703125 C 4.5 -3.796875 4.609375 -3.859375 4.734375 -3.90625 C 4.84375 -3.953125 4.96875 -3.984375 5.109375 -3.984375 C 5.40625 -3.984375 5.625 -3.890625 5.78125 -3.703125 C 5.9375 -3.515625 6.015625 -3.25 6.015625 -2.890625 L 6.015625 0 L 6.8125 0 L 6.8125 -2.890625 C 6.8125 -3.171875 6.78125 -3.40625 6.703125 -3.625 C 6.640625 -3.84375 6.53125 -4.015625 6.40625 -4.171875 C 6.28125 -4.3125 6.125 -4.421875 5.9375 -4.5 C 5.75 -4.578125 5.53125 -4.609375 5.296875 -4.609375 C 5.140625 -4.609375 5 -4.59375 4.859375 -4.5625 C 4.703125 -4.53125 4.578125 -4.46875 4.4375 -4.390625 C 4.3125 -4.3125 4.203125 -4.21875 4.09375 -4.09375 C 3.984375 -3.96875 3.90625 -3.828125 3.84375 -3.671875 C 3.765625 -3.953125 3.625 -4.1875 3.4375 -4.359375 C 3.25 -4.53125 3 -4.609375 2.6875 -4.609375 C 2.421875 -4.609375 2.171875 -4.546875 1.96875 -4.421875 C 1.765625 -4.28125 1.5625 -4.109375 1.40625 -3.90625 L 1.34375 -4.375 C 1.3125 -4.484375 1.234375 -4.546875 1.125 -4.546875 L 0.65625 -4.546875 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-7">
<path style="stroke:none;" d="M 3.984375 0 L 3.984375 -2.90625 C 3.984375 -3.15625 3.953125 -3.390625 3.890625 -3.609375 C 3.828125 -3.8125 3.71875 -4 3.578125 -4.140625 C 3.453125 -4.296875 3.28125 -4.40625 3.078125 -4.5 C 2.890625 -4.578125 2.65625 -4.625 2.40625 -4.625 C 2.046875 -4.625 1.734375 -4.5625 1.4375 -4.4375 C 1.15625 -4.328125 0.890625 -4.140625 0.625 -3.90625 L 0.78125 -3.640625 C 0.796875 -3.609375 0.828125 -3.5625 0.875 -3.546875 C 0.921875 -3.515625 0.953125 -3.5 1.015625 -3.5 C 1.078125 -3.5 1.15625 -3.53125 1.21875 -3.5625 C 1.296875 -3.625 1.375 -3.671875 1.46875 -3.734375 C 1.5625 -3.796875 1.6875 -3.859375 1.828125 -3.90625 C 1.953125 -3.953125 2.109375 -3.984375 2.3125 -3.984375 C 2.609375 -3.984375 2.828125 -3.890625 2.984375 -3.703125 C 3.125 -3.53125 3.203125 -3.265625 3.203125 -2.90625 L 3.203125 -2.546875 C 2.6875 -2.53125 2.25 -2.5 1.90625 -2.40625 C 1.546875 -2.328125 1.25 -2.21875 1.046875 -2.09375 C 0.8125 -1.96875 0.65625 -1.828125 0.5625 -1.65625 C 0.46875 -1.484375 0.40625 -1.3125 0.40625 -1.140625 C 0.40625 -0.921875 0.453125 -0.75 0.515625 -0.59375 C 0.578125 -0.453125 0.671875 -0.328125 0.78125 -0.21875 C 0.890625 -0.125 1.03125 -0.046875 1.1875 0 C 1.34375 0.046875 1.5 0.078125 1.6875 0.078125 C 1.859375 0.078125 2.015625 0.0625 2.15625 0.03125 C 2.296875 0 2.4375 -0.046875 2.5625 -0.109375 C 2.6875 -0.15625 2.796875 -0.234375 2.921875 -0.328125 C 3.03125 -0.40625 3.140625 -0.5 3.265625 -0.609375 L 3.359375 -0.1875 C 3.375 -0.109375 3.40625 -0.0625 3.453125 -0.03125 C 3.5 -0.015625 3.5625 0 3.640625 0 Z M 1.921875 -0.484375 C 1.8125 -0.484375 1.71875 -0.5 1.625 -0.53125 C 1.53125 -0.546875 1.46875 -0.59375 1.390625 -0.640625 C 1.328125 -0.703125 1.28125 -0.78125 1.234375 -0.859375 C 1.203125 -0.953125 1.171875 -1.046875 1.171875 -1.171875 C 1.171875 -1.296875 1.21875 -1.40625 1.296875 -1.515625 C 1.359375 -1.609375 1.484375 -1.703125 1.640625 -1.78125 C 1.796875 -1.859375 2.015625 -1.90625 2.265625 -1.953125 C 2.53125 -2 2.84375 -2.03125 3.203125 -2.046875 L 3.203125 -1.09375 C 3.109375 -1 3.015625 -0.921875 2.9375 -0.84375 C 2.828125 -0.765625 2.734375 -0.703125 2.640625 -0.65625 C 2.53125 -0.59375 2.421875 -0.5625 2.3125 -0.53125 C 2.1875 -0.5 2.0625 -0.484375 1.921875 -0.484375 Z M 1.921875 -0.484375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-8">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -3.34375 C 1.625 -3.53125 1.8125 -3.6875 2.015625 -3.8125 C 2.21875 -3.921875 2.4375 -3.984375 2.6875 -3.984375 C 3 -3.984375 3.25 -3.890625 3.40625 -3.6875 C 3.5625 -3.5 3.640625 -3.234375 3.640625 -2.890625 L 3.640625 0 L 4.4375 0 L 4.4375 -2.890625 C 4.4375 -3.140625 4.40625 -3.390625 4.34375 -3.59375 C 4.265625 -3.8125 4.171875 -3.984375 4.046875 -4.140625 C 3.921875 -4.296875 3.765625 -4.40625 3.5625 -4.5 C 3.375 -4.578125 3.15625 -4.609375 2.921875 -4.609375 C 2.59375 -4.609375 2.3125 -4.546875 2.078125 -4.40625 C 1.828125 -4.28125 1.609375 -4.109375 1.40625 -3.890625 L 1.34375 -4.375 C 1.3125 -4.484375 1.234375 -4.546875 1.125 -4.546875 L 0.65625 -4.546875 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-9">
<path style="stroke:none;" d="M 3.25 -3.796875 L 3.4375 -4.078125 C 3.265625 -4.25 3.0625 -4.375 2.8125 -4.46875 C 2.578125 -4.5625 2.3125 -4.609375 2.015625 -4.609375 C 1.765625 -4.609375 1.53125 -4.578125 1.328125 -4.5 C 1.125 -4.4375 0.953125 -4.34375 0.828125 -4.21875 C 0.6875 -4.09375 0.578125 -3.953125 0.5 -3.796875 C 0.4375 -3.640625 0.40625 -3.46875 0.40625 -3.296875 C 0.40625 -3.109375 0.4375 -2.9375 0.5 -2.796875 C 0.5625 -2.65625 0.65625 -2.546875 0.765625 -2.453125 C 0.875 -2.359375 1 -2.28125 1.140625 -2.21875 C 1.28125 -2.171875 1.4375 -2.109375 1.578125 -2.0625 C 1.734375 -2.015625 1.875 -1.96875 2.015625 -1.921875 C 2.15625 -1.890625 2.28125 -1.828125 2.390625 -1.78125 C 2.5 -1.71875 2.59375 -1.640625 2.65625 -1.5625 C 2.71875 -1.484375 2.765625 -1.375 2.765625 -1.25 C 2.765625 -1.140625 2.75 -1.046875 2.703125 -0.96875 C 2.671875 -0.875 2.609375 -0.796875 2.53125 -0.71875 C 2.453125 -0.65625 2.359375 -0.59375 2.25 -0.5625 C 2.125 -0.515625 1.984375 -0.5 1.828125 -0.5 C 1.65625 -0.5 1.5 -0.53125 1.375 -0.5625 C 1.25 -0.609375 1.15625 -0.65625 1.0625 -0.703125 C 0.984375 -0.75 0.90625 -0.796875 0.859375 -0.84375 C 0.796875 -0.890625 0.734375 -0.90625 0.6875 -0.90625 C 0.625 -0.90625 0.578125 -0.890625 0.546875 -0.875 C 0.515625 -0.859375 0.484375 -0.828125 0.46875 -0.78125 L 0.28125 -0.484375 C 0.453125 -0.3125 0.671875 -0.1875 0.9375 -0.078125 C 1.1875 0.015625 1.46875 0.078125 1.796875 0.078125 C 2.078125 0.078125 2.3125 0.03125 2.53125 -0.046875 C 2.734375 -0.109375 2.921875 -0.21875 3.0625 -0.34375 C 3.21875 -0.46875 3.328125 -0.625 3.40625 -0.8125 C 3.46875 -0.984375 3.515625 -1.171875 3.515625 -1.390625 C 3.515625 -1.578125 3.484375 -1.734375 3.40625 -1.859375 C 3.34375 -1.984375 3.25 -2.09375 3.140625 -2.1875 C 3.03125 -2.28125 2.90625 -2.359375 2.765625 -2.40625 C 2.625 -2.46875 2.484375 -2.53125 2.328125 -2.578125 C 2.1875 -2.625 2.046875 -2.671875 1.90625 -2.71875 C 1.765625 -2.765625 1.640625 -2.8125 1.53125 -2.859375 C 1.40625 -2.921875 1.328125 -2.984375 1.25 -3.0625 C 1.1875 -3.140625 1.15625 -3.25 1.15625 -3.359375 C 1.15625 -3.453125 1.171875 -3.53125 1.21875 -3.609375 C 1.25 -3.6875 1.3125 -3.765625 1.390625 -3.828125 C 1.46875 -3.890625 1.5625 -3.9375 1.671875 -3.96875 C 1.78125 -4 1.890625 -4.015625 2.03125 -4.015625 C 2.1875 -4.015625 2.328125 -4 2.4375 -3.96875 C 2.546875 -3.9375 2.640625 -3.890625 2.71875 -3.859375 C 2.8125 -3.8125 2.875 -3.78125 2.9375 -3.75 C 3 -3.71875 3.046875 -3.6875 3.09375 -3.6875 C 3.171875 -3.6875 3.21875 -3.71875 3.25 -3.796875 Z M 3.25 -3.796875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-10">
<path style="stroke:none;" d="M 1.546875 -4.546875 L 0.75 -4.546875 L 0.75 0 L 1.546875 0 Z M 1.71875 -5.96875 C 1.71875 -6.046875 1.703125 -6.125 1.671875 -6.1875 C 1.640625 -6.265625 1.59375 -6.328125 1.546875 -6.375 C 1.5 -6.421875 1.4375 -6.46875 1.375 -6.5 C 1.296875 -6.53125 1.21875 -6.546875 1.140625 -6.546875 C 1.078125 -6.546875 1 -6.53125 0.9375 -6.5 C 0.859375 -6.46875 0.796875 -6.421875 0.75 -6.375 C 0.703125 -6.328125 0.65625 -6.265625 0.625 -6.1875 C 0.59375 -6.125 0.578125 -6.046875 0.578125 -5.96875 C 0.578125 -5.890625 0.59375 -5.828125 0.625 -5.75 C 0.65625 -5.6875 0.703125 -5.625 0.75 -5.5625 C 0.796875 -5.515625 0.859375 -5.484375 0.9375 -5.453125 C 1 -5.421875 1.078125 -5.40625 1.140625 -5.40625 C 1.21875 -5.40625 1.296875 -5.421875 1.375 -5.453125 C 1.4375 -5.484375 1.5 -5.515625 1.546875 -5.5625 C 1.59375 -5.625 1.640625 -5.6875 1.671875 -5.75 C 1.703125 -5.828125 1.71875 -5.890625 1.71875 -5.96875 Z M 1.71875 -5.96875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-11">
<path style="stroke:none;" d="M 3.75 -3.734375 L 3.96875 -4.015625 C 3.78125 -4.203125 3.5625 -4.359375 3.3125 -4.453125 C 3.0625 -4.5625 2.796875 -4.609375 2.46875 -4.609375 C 2.125 -4.609375 1.828125 -4.5625 1.5625 -4.4375 C 1.296875 -4.328125 1.0625 -4.15625 0.890625 -3.953125 C 0.703125 -3.75 0.5625 -3.5 0.46875 -3.203125 C 0.375 -2.921875 0.328125 -2.609375 0.328125 -2.28125 C 0.328125 -1.90625 0.390625 -1.578125 0.484375 -1.28125 C 0.59375 -0.984375 0.734375 -0.75 0.90625 -0.546875 C 1.09375 -0.34375 1.296875 -0.203125 1.546875 -0.09375 C 1.796875 0.015625 2.046875 0.0625 2.34375 0.0625 C 2.65625 0.0625 2.984375 0.015625 3.28125 -0.109375 C 3.5625 -0.21875 3.8125 -0.390625 4.015625 -0.640625 L 3.796875 -0.921875 C 3.765625 -0.984375 3.703125 -1 3.640625 -1 C 3.578125 -1 3.53125 -0.984375 3.46875 -0.9375 C 3.421875 -0.890625 3.359375 -0.84375 3.265625 -0.78125 C 3.1875 -0.71875 3.078125 -0.671875 2.953125 -0.625 C 2.828125 -0.578125 2.671875 -0.5625 2.46875 -0.5625 C 2.28125 -0.5625 2.09375 -0.59375 1.921875 -0.671875 C 1.765625 -0.75 1.625 -0.859375 1.515625 -1 C 1.40625 -1.140625 1.3125 -1.328125 1.25 -1.546875 C 1.1875 -1.75 1.15625 -2 1.15625 -2.28125 C 1.15625 -2.53125 1.1875 -2.78125 1.234375 -2.984375 C 1.296875 -3.203125 1.390625 -3.375 1.5 -3.53125 C 1.609375 -3.671875 1.765625 -3.796875 1.921875 -3.875 C 2.09375 -3.953125 2.296875 -3.984375 2.515625 -3.984375 C 2.6875 -3.984375 2.828125 -3.96875 2.9375 -3.9375 C 3.046875 -3.890625 3.15625 -3.859375 3.234375 -3.8125 C 3.3125 -3.765625 3.375 -3.71875 3.4375 -3.6875 C 3.484375 -3.65625 3.53125 -3.625 3.578125 -3.625 C 3.625 -3.625 3.65625 -3.640625 3.6875 -3.65625 C 3.703125 -3.671875 3.734375 -3.703125 3.75 -3.734375 Z M 3.75 -3.734375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-12">
<path style="stroke:none;" d="M 1.484375 -6.609375 L 0.6875 -6.609375 L 0.6875 0 L 1.484375 0 L 1.484375 -2.171875 L 1.703125 -2.171875 C 1.796875 -2.171875 1.859375 -2.15625 1.90625 -2.140625 C 1.953125 -2.125 2 -2.078125 2.046875 -2.015625 L 3.53125 -0.15625 C 3.578125 -0.109375 3.625 -0.0625 3.671875 -0.03125 C 3.71875 -0.015625 3.765625 0 3.84375 0 L 4.5625 0 L 2.78125 -2.25 C 2.734375 -2.296875 2.703125 -2.359375 2.65625 -2.40625 C 2.609375 -2.453125 2.5625 -2.484375 2.515625 -2.53125 C 2.5625 -2.5625 2.609375 -2.59375 2.640625 -2.625 C 2.6875 -2.671875 2.734375 -2.71875 2.765625 -2.765625 L 4.4375 -4.546875 L 3.71875 -4.546875 C 3.640625 -4.546875 3.578125 -4.53125 3.53125 -4.5 C 3.5 -4.46875 3.453125 -4.4375 3.40625 -4.375 L 1.96875 -2.84375 C 1.921875 -2.796875 1.875 -2.765625 1.84375 -2.75 C 1.796875 -2.71875 1.75 -2.71875 1.6875 -2.71875 L 1.484375 -2.71875 Z M 1.484375 -6.609375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-13">
<path style="stroke:none;" d="M 0.453125 -3.03125 L 0.453125 -2.34375 L 2.65625 -2.34375 L 2.65625 -3.03125 Z M 0.453125 -3.03125 "/>
</symbol>
<symbol overflow="visible" id="glyph1-14">
<path style="stroke:none;" d="M 0.65625 0 L 1.453125 0 L 1.453125 -2.890625 C 1.578125 -3.203125 1.734375 -3.4375 1.921875 -3.59375 C 2.109375 -3.765625 2.34375 -3.84375 2.625 -3.84375 C 2.78125 -3.84375 2.890625 -3.828125 2.984375 -3.796875 C 3.0625 -3.765625 3.140625 -3.75 3.171875 -3.75 C 3.25 -3.75 3.296875 -3.796875 3.3125 -3.859375 L 3.421875 -4.46875 C 3.328125 -4.515625 3.234375 -4.546875 3.140625 -4.578125 C 3.03125 -4.609375 2.921875 -4.625 2.796875 -4.625 C 2.484375 -4.625 2.21875 -4.53125 1.984375 -4.359375 C 1.765625 -4.171875 1.5625 -3.9375 1.40625 -3.609375 L 1.359375 -4.328125 C 1.34375 -4.40625 1.328125 -4.46875 1.296875 -4.5 C 1.265625 -4.53125 1.203125 -4.546875 1.109375 -4.546875 L 0.65625 -4.546875 Z M 0.65625 0 "/>
</symbol>
<symbol overflow="visible" id="glyph1-15">
<path style="stroke:none;" d="M 0.6875 0 L 1.203125 0 C 1.3125 0 1.375 -0.0625 1.40625 -0.171875 L 1.4375 -0.578125 C 1.59375 -0.375 1.78125 -0.21875 1.984375 -0.109375 C 2.1875 0 2.4375 0.0625 2.71875 0.0625 C 3.03125 0.0625 3.3125 0 3.546875 -0.109375 C 3.796875 -0.234375 4 -0.40625 4.171875 -0.625 C 4.34375 -0.828125 4.46875 -1.078125 4.5625 -1.359375 C 4.640625 -1.65625 4.6875 -1.96875 4.6875 -2.296875 C 4.6875 -2.671875 4.65625 -3.015625 4.5625 -3.296875 C 4.484375 -3.59375 4.375 -3.828125 4.21875 -4.03125 C 4.078125 -4.21875 3.890625 -4.375 3.6875 -4.46875 C 3.46875 -4.5625 3.234375 -4.609375 2.96875 -4.609375 C 2.65625 -4.609375 2.375 -4.546875 2.140625 -4.40625 C 1.890625 -4.28125 1.671875 -4.109375 1.484375 -3.890625 L 1.484375 -6.609375 L 0.6875 -6.609375 Z M 2.703125 -3.984375 C 2.890625 -3.984375 3.046875 -3.953125 3.203125 -3.890625 C 3.34375 -3.828125 3.46875 -3.71875 3.5625 -3.59375 C 3.65625 -3.453125 3.734375 -3.28125 3.78125 -3.0625 C 3.84375 -2.859375 3.859375 -2.59375 3.859375 -2.296875 C 3.859375 -1.734375 3.75 -1.3125 3.53125 -1.015625 C 3.296875 -0.703125 2.96875 -0.5625 2.546875 -0.5625 C 2.328125 -0.5625 2.140625 -0.59375 1.96875 -0.671875 C 1.78125 -0.765625 1.625 -0.890625 1.484375 -1.09375 L 1.484375 -3.296875 C 1.65625 -3.515625 1.828125 -3.671875 2.03125 -3.796875 C 2.21875 -3.921875 2.453125 -3.984375 2.703125 -3.984375 Z M 2.703125 -3.984375 "/>
</symbol>
<symbol overflow="visible" id="glyph1-16">
<path style="stroke:none;" d="M 1.34375 -4.546875 L 0.546875 -4.546875 L 0.546875 -1.640625 C 0.546875 -1.390625 0.578125 -1.15625 0.640625 -0.9375 C 0.703125 -0.734375 0.796875 -0.546875 0.9375 -0.40625 C 1.0625 -0.25 1.21875 -0.140625 1.40625 -0.046875 C 1.59375 0.03125 1.828125 0.078125 2.0625 0.078125 C 2.390625 0.078125 2.65625 0 2.90625 -0.125 C 3.15625 -0.265625 3.375 -0.4375 3.578125 -0.65625 L 3.640625 -0.171875 C 3.671875 -0.046875 3.734375 0 3.859375 0 L 4.328125 0 L 4.328125 -4.546875 L 3.53125 -4.546875 L 3.53125 -1.1875 C 3.359375 -1 3.171875 -0.84375 2.953125 -0.734375 C 2.75 -0.625 2.53125 -0.5625 2.296875 -0.5625 C 1.984375 -0.5625 1.734375 -0.65625 1.578125 -0.84375 C 1.421875 -1.03125 1.34375 -1.296875 1.34375 -1.640625 Z M 1.34375 -4.546875 "/>
</symbol>
<symbol overflow="visible" id="glyph1-17">
<path style="stroke:none;" d="M 2.1875 -4.625 C 1.9375 -4.625 1.703125 -4.578125 1.484375 -4.515625 C 1.28125 -4.453125 1.09375 -4.34375 0.953125 -4.21875 C 0.796875 -4.09375 0.671875 -3.9375 0.59375 -3.765625 C 0.5 -3.578125 0.46875 -3.375 0.46875 -3.15625 C 0.46875 -2.875 0.53125 -2.640625 0.65625 -2.4375 C 0.78125 -2.21875 0.953125 -2.046875 1.171875 -1.921875 C 1.078125 -1.875 1 -1.828125 0.921875 -1.765625 C 0.859375 -1.703125 0.796875 -1.625 0.75 -1.5625 C 0.703125 -1.5 0.65625 -1.421875 0.640625 -1.359375 C 0.609375 -1.28125 0.59375 -1.21875 0.59375 -1.15625 C 0.59375 -0.984375 0.640625 -0.859375 0.71875 -0.75 C 0.796875 -0.65625 0.890625 -0.5625 1.015625 -0.515625 C 0.78125 -0.421875 0.578125 -0.296875 0.4375 -0.140625 C 0.296875 0.015625 0.21875 0.203125 0.21875 0.4375 C 0.21875 0.59375 0.265625 0.75 0.34375 0.890625 C 0.4375 1.03125 0.546875 1.15625 0.71875 1.28125 C 0.890625 1.390625 1.09375 1.46875 1.34375 1.53125 C 1.59375 1.609375 1.875 1.640625 2.203125 1.640625 C 2.546875 1.640625 2.84375 1.59375 3.109375 1.5 C 3.375 1.421875 3.59375 1.3125 3.765625 1.171875 C 3.953125 1.03125 4.09375 0.859375 4.1875 0.6875 C 4.28125 0.5 4.34375 0.3125 4.34375 0.109375 C 4.34375 -0.09375 4.296875 -0.265625 4.203125 -0.390625 C 4.125 -0.53125 4 -0.625 3.859375 -0.703125 C 3.71875 -0.78125 3.5625 -0.828125 3.375 -0.859375 C 3.1875 -0.890625 3 -0.921875 2.8125 -0.9375 C 2.625 -0.953125 2.4375 -0.953125 2.25 -0.96875 C 2.078125 -0.96875 1.90625 -0.984375 1.765625 -1.015625 C 1.625 -1.03125 1.5 -1.078125 1.421875 -1.125 C 1.34375 -1.1875 1.296875 -1.265625 1.296875 -1.375 C 1.296875 -1.4375 1.3125 -1.5 1.359375 -1.578125 C 1.421875 -1.640625 1.484375 -1.703125 1.578125 -1.765625 C 1.765625 -1.71875 1.96875 -1.6875 2.1875 -1.6875 C 2.4375 -1.6875 2.65625 -1.71875 2.875 -1.796875 C 3.078125 -1.859375 3.25 -1.953125 3.40625 -2.09375 C 3.5625 -2.21875 3.671875 -2.375 3.765625 -2.5625 C 3.84375 -2.734375 3.890625 -2.9375 3.890625 -3.15625 C 3.890625 -3.390625 3.84375 -3.609375 3.734375 -3.8125 L 4.25 -3.875 C 4.375 -3.90625 4.4375 -3.96875 4.4375 -4.0625 L 4.4375 -4.359375 L 3.203125 -4.359375 C 3.0625 -4.453125 2.90625 -4.515625 2.734375 -4.5625 C 2.5625 -4.59375 2.375 -4.625 2.1875 -4.625 Z M 3.59375 0.25 C 3.59375 0.375 3.5625 0.46875 3.5 0.578125 C 3.4375 0.671875 3.359375 0.765625 3.234375 0.828125 C 3.109375 0.90625 2.96875 0.953125 2.796875 1 C 2.625 1.03125 2.4375 1.046875 2.21875 1.046875 C 2 1.046875 1.8125 1.03125 1.65625 1 C 1.484375 0.953125 1.34375 0.90625 1.234375 0.84375 C 1.140625 0.78125 1.046875 0.703125 1 0.625 C 0.953125 0.53125 0.921875 0.4375 0.921875 0.328125 C 0.921875 0.171875 0.984375 0.03125 1.078125 -0.078125 C 1.1875 -0.203125 1.328125 -0.296875 1.5 -0.375 C 1.640625 -0.359375 1.796875 -0.34375 1.953125 -0.328125 C 2.125 -0.328125 2.28125 -0.3125 2.4375 -0.3125 C 2.59375 -0.296875 2.734375 -0.28125 2.875 -0.265625 C 3.015625 -0.25 3.140625 -0.21875 3.25 -0.1875 C 3.359375 -0.140625 3.4375 -0.09375 3.5 -0.03125 C 3.5625 0.046875 3.59375 0.140625 3.59375 0.25 Z M 2.1875 -2.21875 C 2.03125 -2.21875 1.890625 -2.25 1.765625 -2.28125 C 1.640625 -2.328125 1.53125 -2.390625 1.453125 -2.46875 C 1.375 -2.5625 1.3125 -2.65625 1.265625 -2.765625 C 1.21875 -2.875 1.203125 -3 1.203125 -3.140625 C 1.203125 -3.40625 1.28125 -3.625 1.453125 -3.796875 C 1.625 -3.96875 1.859375 -4.046875 2.1875 -4.046875 C 2.5 -4.046875 2.75 -3.96875 2.921875 -3.796875 C 3.09375 -3.625 3.171875 -3.40625 3.171875 -3.140625 C 3.171875 -3 3.15625 -2.875 3.109375 -2.765625 C 3.078125 -2.65625 3.015625 -2.5625 2.921875 -2.46875 C 2.84375 -2.390625 2.734375 -2.328125 2.609375 -2.28125 C 2.484375 -2.25 2.34375 -2.21875 2.1875 -2.21875 Z M 2.1875 -2.21875 "/>
</symbol>
</g>
</defs>
<g id="surface1">
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-1" x="0.348" y="8.057"/>
<use xlink:href="#glyph0-2" x="6.784369" y="8.057"/>
<use xlink:href="#glyph0-3" x="12.849829" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-4" x="28.02" y="8.057"/>
<use xlink:href="#glyph0-5" x="36.376371" y="8.057"/>
<use xlink:href="#glyph0-6" x="42.44183" y="8.057"/>
<use xlink:href="#glyph0-7" x="51.398201" y="8.057"/>
<use xlink:href="#glyph0-8" x="56.929115" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-2" x="72.448" y="8.057"/>
<use xlink:href="#glyph0-7" x="78.51346" y="8.057"/>
<use xlink:href="#glyph0-9" x="84.044373" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-10" x="98.232" y="8.057"/>
<use xlink:href="#glyph0-5" x="104.330187" y="8.057"/>
<use xlink:href="#glyph0-11" x="110.395647" y="8.057"/>
<use xlink:href="#glyph0-12" x="116.461106" y="8.057"/>
<use xlink:href="#glyph0-2" x="122.035656" y="8.057"/>
<use xlink:href="#glyph0-13" x="128.101116" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-7" x="141.624" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-13" x="156.609" y="8.057"/>
<use xlink:href="#glyph0-14" x="160.678094" y="8.057"/>
<use xlink:href="#glyph0-15" x="163.470824" y="8.057"/>
<use xlink:href="#glyph0-16" x="168.565374" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-3" x="173.954469" y="8.057"/>
<use xlink:href="#glyph0-13" x="179.670837" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-7" x="193.193" y="8.057"/>
<use xlink:href="#glyph0-13" x="198.723914" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-13" x="212.247" y="8.057"/>
<use xlink:href="#glyph0-2" x="216.316094" y="8.057"/>
<use xlink:href="#glyph0-3" x="222.381554" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-13" x="237.551" y="8.057"/>
<use xlink:href="#glyph0-17" x="241.620094" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-7" x="245.809189" y="8.057"/>
<use xlink:href="#glyph0-14" x="251.340102" y="8.057"/>
<use xlink:href="#glyph0-8" x="254.132832" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-9" x="269.652" y="8.057"/>
<use xlink:href="#glyph0-13" x="274.386549" y="8.057"/>
<use xlink:href="#glyph0-7" x="278.455644" y="8.057"/>
<use xlink:href="#glyph0-13" x="283.986557" y="8.057"/>
<use xlink:href="#glyph0-14" x="288.055652" y="8.057"/>
<use xlink:href="#glyph0-5" x="290.848381" y="8.057"/>
<use xlink:href="#glyph0-8" x="296.913841" y="8.057"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-18" x="0.007" y="54.988"/>
<use xlink:href="#glyph0-14" x="8.221552" y="54.988"/>
<use xlink:href="#glyph0-3" x="11.014282" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-19" x="29.741" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-17" x="35.588278" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-7" x="39.777372" y="54.988"/>
<use xlink:href="#glyph0-11" x="45.308286" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-2" x="64.384" y="54.988"/>
<use xlink:href="#glyph0-7" x="70.44946" y="54.988"/>
<use xlink:href="#glyph0-13" x="75.980373" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-3" x="89.503" y="54.988"/>
<use xlink:href="#glyph0-14" x="95.219368" y="54.988"/>
<use xlink:href="#glyph0-8" x="98.012098" y="54.988"/>
<use xlink:href="#glyph0-3" x="104.077558" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-19" x="119.248" y="54.988"/>
<use xlink:href="#glyph0-7" x="125.422551" y="54.988"/>
<use xlink:href="#glyph0-2" x="130.953464" y="54.988"/>
<use xlink:href="#glyph0-17" x="137.018924" y="54.988"/>
<use xlink:href="#glyph0-16" x="141.415291" y="54.988"/>
<use xlink:href="#glyph0-7" x="147.13166" y="54.988"/>
<use xlink:href="#glyph0-17" x="152.662573" y="54.988"/>
<use xlink:href="#glyph0-13" x="157.058941" y="54.988"/>
<use xlink:href="#glyph0-3" x="161.128035" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-7" x="181.069" y="54.988"/>
<use xlink:href="#glyph0-6" x="186.599914" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-20" x="213.386" y="54.988"/>
<use xlink:href="#glyph0-7" x="220.444188" y="54.988"/>
<use xlink:href="#glyph0-2" x="225.975101" y="54.988"/>
<use xlink:href="#glyph0-8" x="232.040561" y="54.988"/>
<use xlink:href="#glyph0-2" x="238.106021" y="54.988"/>
<use xlink:href="#glyph0-5" x="244.17148" y="54.988"/>
<use xlink:href="#glyph0-21" x="250.23694" y="54.988"/>
</g>
<g style="fill:rgb(0%,0%,0%);fill-opacity:1;">
<use xlink:href="#glyph0-12" x="266.972" y="54.988"/>
<use xlink:href="#glyph0-3" x="272.54655" y="54.988"/>
<use xlink:href="#glyph0-16" x="278.262919" y="54.988"/>
<use xlink:href="#glyph0-7" x="283.979287" y="54.988"/>
<use xlink:href="#glyph0-11" x="289.510201" y="54.988"/>
<use xlink:href="#glyph0-21" x="295.57566" y="54.988"/>
<use xlink:href="#glyph0-13" x="299.252027" y="54.988"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="1.854" y="72.096"/>
<use xlink:href="#glyph1-2" x="5.198467" y="72.096"/>
<use xlink:href="#glyph1-3" x="10.183786" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-4" x="26.184" y="72.096"/>
<use xlink:href="#glyph1-5" x="33.052262" y="72.096"/>
<use xlink:href="#glyph1-6" x="38.037581" y="72.096"/>
<use xlink:href="#glyph1-7" x="45.398995" y="72.096"/>
<use xlink:href="#glyph1-8" x="49.94496" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-2" x="65.505" y="72.096"/>
<use xlink:href="#glyph1-7" x="70.490318" y="72.096"/>
<use xlink:href="#glyph1-9" x="75.036283" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-7" x="97.375" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="131.896" y="72.096"/>
<use xlink:href="#glyph1-10" x="135.240467" y="72.096"/>
<use xlink:href="#glyph1-11" x="137.535866" y="72.096"/>
<use xlink:href="#glyph1-12" x="141.723174" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-3" x="146.152576" y="72.096"/>
<use xlink:href="#glyph1-1" x="150.85097" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-7" x="176.297" y="72.096"/>
<use xlink:href="#glyph1-1" x="180.842965" y="72.096"/>
<use xlink:href="#glyph1-13" x="184.187432" y="72.096"/>
<use xlink:href="#glyph1-1" x="187.298773" y="72.096"/>
<use xlink:href="#glyph1-2" x="190.64324" y="72.096"/>
<use xlink:href="#glyph1-3" x="195.628558" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-1" x="209.781" y="72.096"/>
<use xlink:href="#glyph1-14" x="213.125467" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-7" x="216.568565" y="72.096"/>
<use xlink:href="#glyph1-10" x="221.11453" y="72.096"/>
<use xlink:href="#glyph1-8" x="223.409928" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-9" x="230.125762" y="72.096"/>
<use xlink:href="#glyph1-1" x="234.017179" y="72.096"/>
<use xlink:href="#glyph1-7" x="237.361646" y="72.096"/>
<use xlink:href="#glyph1-1" x="241.907611" y="72.096"/>
<use xlink:href="#glyph1-10" x="245.252078" y="72.096"/>
<use xlink:href="#glyph1-5" x="247.547477" y="72.096"/>
<use xlink:href="#glyph1-8" x="252.532795" y="72.096"/>
</g>
<g style="fill:rgb(50%,50%,50%);fill-opacity:1;">
<use xlink:href="#glyph1-15" x="271.199" y="72.096"/>
<use xlink:href="#glyph1-5" x="276.211218" y="72.096"/>
<use xlink:href="#glyph1-16" x="281.196536" y="72.096"/>
<use xlink:href="#glyph1-17" x="286.181854" y="72.096"/>
<use xlink:href="#glyph1-2" x="290.763685" y="72.096"/>
<use xlink:href="#glyph1-1" x="295.749003" y="72.096"/>
</g>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -72.628844 -8.822281 L -77.871031 -38.111344 " transform="matrix(1,0,0,-1,151.664,5.041)"/>
<path style="fill:none;stroke-width:0.79701;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M -36.460875 -8.822281 L 133.484437 -38.111344 " transform="matrix(1,0,0,-1,151.664,5.041)"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

View File

@ -0,0 +1,157 @@
include ../_includes/_mixins
+lead In v0.100.3, we quietly rolled out support for GIL-free multi-threading for spaCy's syntactic dependency parsing and named entity recognition models. Because these models take up a lot of memory, we've wanted to release the global interpretter lock (GIL) around them for a long time. When we finally did, it seemed a little too good to be true, so we delayed celebration &mdash; and then quickly moved on to other things. It's now past time for a write-up.
p This is mostly an implementation post, but to me, implementation is the pain and the product is the pleasure. So, let's start with the pay-off. The pay-off is the #[code .pipe()] method, which adds #[em data-streaming] capabilities to spaCy:
+code('python', 'Stream Parsing').
import spacy
nlp = spacy.load('de')
for doc in nlp.pipe(texts, n_threads=16, batch_size=10000):
analyse_text(doc)
p The #[code .pipe()] method accepts an iterator (above, #[code texts]), and produces an iterator. Internally, a buffer is accumulated (given by the #[code batch_size] argument, and multiple threads are allowed to work on the batch simultaneously. Once the batch is complete, the processed documents are yielded from the iterator.
+aside("Iterators") #[a(href="http://rare-technologies.com/data-streaming-in-python-generators-iterators-iterables/") My favourite post] on the Zen of Python iterators was written by Radim, the creator of #[a(href="http://radimrehurek.com/gensim/") Gensim]. I was on board with generators before, but I hadn't really thought about the simplicity of minibatching.
p Each document is processed independently, so if your batch size is large enough, and OpenMP is enabled, you should be able to work all your cores with only one copy of the spaCy models in memory. spaCy is designed for web-scale data processing &mdash; we want you to be able to perform sophisticated linguistic analysis on whole dumps of the Common Crawl. With effective shared memory parallelism, those jobs are many times cheaper.
+table(["Method", "Number threads", "Seconds (lower is better)"])
+row
+cell Loop
+cell 1
+cell 691s
+row
+cell Pipe
+cell 1
+cell 678s
+row
+cell Pipe
+cell 2
+cell 432s
+row
+cell Pipe
+cell 4
+cell 312s
caption.
Seconds to parse 20,000 documents, with 1, 2 or 4 threads. The #[em loop] condition uses the #[code doc = nlp(text)] function, instead of the #[code .pipe] method, to show the overhead incurred from the minibatched stream processing (within measurement error).
+h3("implementation") Python, Cython and the Global Interpretter Lock
p Endless ink has been spilled about the CPython #[a(href="https://wiki.python.org/moin/GlobalInterpreterLock") Global Interpretter Lock (GIL)]. It isn't a problem for most code, but for spaCy, it really is. Computers may be fast and getting faster, but the internet is big and getting bigger. We have a lot fo text to process, and we'd like to use our machines efficiently.
p Python maintains reference counts in a global data structure. When you create or delete a Python object, its reference count has to change. However, the data structure holding the reference counts is not thread-safe. To change the reference counts, you therefore need to acquire the global interpretter lock.
p One way around the GIL is therefore to avoid the need for Python variables. This is what I've done with spaCy. More specifically, spaCy is a Python library, but it's not actually written in Python. It's implemented in Cython, and transpiled into a C++ extension module.
p In ordinary Python code, you can have a list of numbers like this:
+code('my_list.py', 'Python list').
my_list = [0, 1, 2]
p In Cython, you can write exactly the same code, but the code is not interpreted by Python directly. Instead, it's transpiled into C or C++ code, which calls the Python C-API. Here's some of the resulting code:
+code('my_list.pyx', 'Transpiled C').
__pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
__Pyx_GOTREF(__pyx_t_1);
__Pyx_INCREF(__pyx_int_0);
__Pyx_GIVEREF(__pyx_int_0);
PyList_SET_ITEM(__pyx_t_1, 0, __pyx_int_0);
__Pyx_INCREF(__pyx_int_1);
__Pyx_GIVEREF(__pyx_int_1);
PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_1);
__Pyx_INCREF(__pyx_int_2);
__Pyx_GIVEREF(__pyx_int_2);
PyList_SET_ITEM(__pyx_t_1, 2, __pyx_int_2)
p You can't call any of those functions if you're not holding the GIL. But you can call plain old C and C++ functions, such as #[code malloc()] and #[code free]:
+code('my_array.pyx', 'C in Cython').
from libc.stlib cimport malloc, free
my_arr = &lt;int*&gt;malloc(sizeof(int) * 3)
my_arr[0] = 1
my_arr[1] = 2
my_arr[2] = 3
do_stuff(my_arr)
free(my_arr)
p The Cython #[code nogil] keyword allows you to declare that a function is safe to call even if you're not already holding the GIL. You can read more about releasing the GIL with Cython #[a(href="http://docs.cython.org/src/userguide/parallelism.html") here].
p The disadvantages of writing with #[code nogil] semantics are obvious &mdash; you're limited to writing #[a(href="https://spacy.io/blog/writing-c-in-cython") C with (arguably) nicer syntax]. If you've never tried it, I think it's an interesting exercise to do without the Python semantics. It does make you appreciate what the language is providing. Probably the thing I miss most are the exceptions and the lists. The Python unicode object is also very useful.
+h3("parser-pipe") Implementation of the Parser.pipe method
p Here's the implementation of the Parser.pipe method in spaCy. This method does the following:
+list
+item Buffers the texts into temporary work arrays
+item Releases the GIL
+item Iterates over the work arrays in an OpenMP #[code prange] loop
+item Calls the #[code Parser.parseC()] method for each unit of work (each document)
+code('python', 'Parser.pipe').
def pipe(self, stream, int batch_size=1000, int n_threads=2):
cdef Pool mem = Pool()
cdef TokenC** doc_ptr = &lt;TokenC**&gt;mem.alloc(batch_size, sizeof(TokenC*))
cdef int* lengths = &lt;int*&gt;mem.alloc(batch_size, sizeof(int))
cdef Doc doc
cdef int i
cdef int nr_class = self.moves.n_moves
cdef int nr_feat = self.model.nr_feat
cdef int status
queue = []
for doc in stream:
doc_ptr[len(queue)] = doc.c
lengths[len(queue)] = doc.length
queue.append(doc)
if len(queue) == batch_size:
with nogil:
for i in cython.parallel.prange(batch_size, num_threads=n_threads):
status = self.parseC(doc_ptr[i], lengths[i], nr_feat, nr_class)
if status != 0:
with gil:
sent_str = queue[i].text
raise ValueError("Error parsing doc: %s" % sent_str)
PyErr_CheckSignals()
for doc in queue:
self.moves.finalize_doc(doc)
yield doc
queue = []
batch_size = len(queue)
with nogil:
for i in cython.parallel.prange(batch_size, num_threads=n_threads):
status = self.parseC(doc_ptr[i], lengths[i], nr_feat, nr_class)
if status != 0:
with gil:
sent_str = queue[i].text
raise ValueError("Error parsing doc: %s" % sent_str)
PyErr_CheckSignals()
for doc in queue:
self.moves.finalize_doc(doc)
yield doc
p The actual mechanics of the multi-threading are super simple, because NLP is (often) embarrassingly parallel &mdash; every document is parsed independently, so we just need to make a #[code prange] loop over a stream of texts. The #[code prange] function is an auto-magical work-sharing loop, that manages the OpenMP semantics for you. You still need to reason about false-sharing, thread safety, etc &mdash; all the parts that make writing multi-threaded code fundamentally challenging. But, at least the calling syntax is clean, and a few incidental details are taken care of for you.
+h3('the-hard-part') The hard part
p I couldn't tell you that multi-threading the parser was easy. At least, not with a straight face. I've never written a significant Java program, but I imagine writing multi-threaded Java is significantly easier. Using Cython, the task was at least possible. But it definitely wasn't easy.
p If you count my time in academia, I've been writing statistical parsers in Cython for a five or six years now, and I've always wanted to release the GIL around the parsing loop. By late 2015 I had the machine learning, hash table, outer parsing loop, and most of the feature extraction as #[code nogil] functions. But the #[a(href="https://github.com/spacy-io/spaCy/blob/0.100.2/spacy/syntax/stateclass.pxd#L10") state object] had a complicated interface, and was implemented as a #[code cdef class]. I couldn't create this object or store it in a container without acquiring the GIL.
p The break-through came when I figured out an undocumented way to write a C++ class in Cython. This allowed me to hollow out the existing #[code cdef class] that controlled the parser state. I proxied its interface to the inner C++ class, method by method. This way I could keep the code working, and make sure I didn't introduce any subtle bugs into the feature calculation.
p You can see the inner class #[a(href="https://github.com/spacy-io/spaCy/blob/master/spacy/syntax/_state.pxd") here]. If you navigate around the git history of this file, you can see the patches where I implemented the #[code .pipe] method.
+h3('conclusion') Conclusion
p Natural language processing (NLP) programs have some peculiar performance characterstics. The algorithms and data structures involved are often rather complicated, and the numeric calculations being performed are often quite trivial.
p spaCy's parser and named entity recognition system have to make two or three predictions on each word of the input document, using a linear model. All of the complexity is in the feature extraction and state management code, and the computational bottle-neck ends up being #[a(href="https://github.com/spacy-io/thinc/blob/master/thinc/linear/avgtron.pyx#L128") retrieval of the weights data] from main memory.
p When we finally switch over to a neural network model, the considerations will be a little bit different. It's possible to implement the parser such that you're stepping forward through multiple sentences at once. However, that has its own challenges. I think it's both easier and more effective to parallelise the outer loop, so I expect the work put into the current implementation will serve us well.

View File

@ -0,0 +1,166 @@
include ../_includes/_mixins
+lead If you were doing text analytics in 2015, you were probably using #[a(href="https://en.wikipedia.org/wiki/Word2vec" target="_blank") word2vec]. Sense2vec #[a(href="http://arxiv.org/abs/1511.06388" target="_blank") (Trask et. al, 2015)] is a new twist on word2vec that lets you learn more interesting, detailed and context-sensitive word vectors. This post motivates the idea, explains our implementation, and comes with an #[a(href="https://sense2vec.spacy.io" target="_blank") interactive demo] that we've found surprisingly #[a(href="https://sense2vec.spacy.io/?crack|NOUN" target="_blank") addictive].
+h2("word2vec") Polysemy: the problem with word2vec
p When humans write dictionaries and thesauruses, we define concepts in relation to other concepts. For automatic natural language processing, it's often more effective to use dictionaries that define concepts in terms of their usage statistics. The word2vec family of models are the most popular way of creating these dictionaries. Given a large sample of text, word2vec gives you a dictionary where each definition is just a row of, say, 300 floating-point numbers. To find out whether two entries in the dictionary are similar, you ask how similar their definitions are &ndash; a well-defined mathematical operation.
p The problem with word2vec is the #[em word] part. Consider a word like #[em duck]. No individual usage of the word #[em duck] refers to the concept "a waterfowl, or the action of crouching". But that's the concept that word2vec is trying to model &ndash; because it smooshes all senses of the words together. #[a(href="http://arxiv.org/abs/1511.05392" target="_blank") Nalisnick and Ravi (2015)] noticed this problem, and suggested that we should allow word vectors to grow arbitrarily, so that we can do a better job of modelling complicated concepts. This seems like a nice approach for subtle sense distinctions, but for cases like #[em duck] it's not so satisfying. What we want to do is have different vectors for the different senses. We also want a simple way of knowing which meaning a given usage refers to. For this, we need to analyse tokens in context. This is where #[a(href=url target="_blank") spaCy] comes in.
+h2("sense2vec") Sense2vec: Using NLP annotations for more precise vectors
p The idea behind sense2vec is super simple. If the problem is that #[em duck] as in #[em waterfowl] and #[em duck] as in #[em crouch] are different concepts, the straight-forward solution is to just have two entries, #[a(href="https://sense2vec.spacy.io/?duck|NOUN" target="_blank") duck#[sub N]] and #[a(href="https://sense2vec.spacy.io/?duck|VERB" target="_blank") duck#[sub V]]. We've wanted to try this #[a(href="https://github.com/" + profiles.github + "/spaCy/issues/58" target="_blank") for some time]. So when #[a(href="http://arxiv.org/pdf/1511.06388.pdf" target="_blank") Trask et al (2015)] published a nice set of experiments showing that the idea worked well, we were easy to convince.
p We follow Trask et al in adding part-of-speech tags and named entity labels to the tokens. Additionally, we merge named entities and base noun phrases into single tokens, so that they receive a single vector. We're very pleased with the results from this, even though we consider the current version an early draft. There's a lot more that can be done with the idea. Multi-word verbs such as #[em get up] and #[em give back] and even #[em take a walk] or #[em make a decision] would be great extensions. We also don't do anything currently to trim back phrases that are compositional &ndash; phrases which really are two words.
p Here's how the current pre-processing function looks, at the time of writing. The rest of the code can be found on #[a(href="https://github.com/" + profiles.github + "/sense2vec/" target="_blank") GitHub].
+code("python", "merge_text.py").
def transform_texts(texts):
# Load the annotation models
nlp = English()
# Stream texts through the models. We accumulate a buffer and release
# the GIL around the parser, for efficient multi-threading.
for doc in nlp.pipe(texts, n_threads=4):
# Iterate over base NPs, e.g. "all their good ideas"
for np in doc.noun_chunks:
# Only keep adjectives and nouns, e.g. "good ideas"
while len(np) &gt; 1 and np[0].dep_ not in ('amod', 'compound'):
np = np[1:]
if len(np) &gt; 1:
# Merge the tokens, e.g. good_ideas
np.merge(np.root.tag_, np.text, np.root.ent_type_)
# Iterate over named entities
for ent in doc.ents:
if len(ent) &gt; 1:
# Merge them into single tokens
ent.merge(ent.root.tag_, ent.text, ent.label_)
token_strings = []
for token in tokens:
text = token.text.replace(' ', '_')
tag = token.ent_type_ or token.pos_
token_strings.append('%s|%s' % (text, tag))
yield ' '.join(token_strings)
p Even with all this additional processing, we can still train massive models without difficulty. Because spaCy is written in #[a(href="/blog/writing-c-in-cython" target="_blank") Cython], we can #[a(href="http://docs.cython.org/src/userguide/parallelism.html" target="_blank") release the GIL] around the syntactic parser, allowing efficient multi-threading. With 4 threads, throughput is over 100,000 words per second.
p After pre-processing the text, the vectors can be trained as normal, using #[a(href="https://code.google.com/archive/p/word2vec/" target="_blank") the original C code], #[a(href="https://radimrehurek.com/gensim/" target="_blank") Gensim], or a related technique like #[a(href="http://nlp.stanford.edu/projects/glove/" target="_blank") GloVe]. So long as it expects the tokens to be whitespace delimited, and sentences to be separated by new lines, there should be no problem. The only caveat is that the tool should not try to employ its own tokenization &ndash; otherwise it might split off our tags.
p We used Gensim, and trained the model using the Skip-Gram with Negative Sampling algorithm, using a frequency threshold of 10 and 5 iterations. After training, we applied a further frequency threshold of 50, to reduce the run-time memory requirements.
+h2("examples") Example queries
p As soon as we started playing with these vectors, we found all sorts of interesting things.Here are some of our first impressions.
h3 1. The vector space seems like it'll give a good way to show compositionality:
p A phrase is #[em compositional] to the extent that its meaning is the sum of its parts. The word vectors give us good insight into this. The model knows that #[em fair game] is not a type of game, while #[em multiplayer game] is:
+code.
&gt;&gt;&gt; model.similarity('fair_game|NOUN', 'game|NOUN')
0.034977455677555599
&gt;&gt;&gt; model.similarity('multiplayer_game|NOUN', 'game|NOUN')
0.54464530644393849
p Similarly, it knows that #[em class action] is only very weakly a type of action, but a #[em class action lawsuit] is definitely a type of lawsuit:
+code.
&gt;&gt;&gt; model.similarity('class_action|NOUN', 'action|NOUN')
0.14957825452335169
&gt;&gt;&gt; model.similarity('class_action_lawsuit|NOUN', 'lawsuit|NOUN')
0.69595765453644187
p Personally, I like the queries where you can see a little of the Reddit shining through (which might not be safe for every workplace). For instance, Reddit understands that a #[a(href="https://sense2vec.spacy.io/?garter_snake|NOUN" target="_blank") garter snake] is a type of snake, while a #[a(href="https://sense2vec.spacy.io/?trouser_snake|NOUN" target="_blank") trouser snake] is something else entirely.
h3 2. Similarity between entities can be kind of fun.
p Here's what Reddit thinks of Donald Trump:
+code.
&gt;&gt;&gt; model.most_similar(['Donald_Trump|PERSON'])
(u'Sarah_Palin|PERSON', 0.854670465),
(u'Mitt_Romney|PERSON', 0.8245523572),
(u'Barrack_Obama|PERSON', 0.808201313),
(u'Bill_Clinton|PERSON', 0.8045649529),
(u'Oprah|GPE', 0.8042222261),
(u'Paris_Hilton|ORG', 0.7962667942),
(u'Oprah_Winfrey|PERSON', 0.7941152453),
(u'Stephen_Colbert|PERSON', 0.7926792502),
(u'Herman_Cain|PERSON', 0.7869615555),
(u'Michael_Moore|PERSON', 0.7835546732)]
p The model is returning entities discussed in similar contexts. It's interesting to see that the word vectors correctly pick out the idea of Trump as a political figure but also a reality star. The comparison with #[a(href="https://en.wikipedia.org/wiki/Michael_Moore" target="_blank") Michael Moore] really tickles me. I doubt there are many people who are fans of both. If I had to pick an odd-one-out, I'd definitely choose Oprah. That comparison resonates much less with me.
p The entry #[code Oprah|GPE] is also quite interesting. Nobody is living in the United States of Oprah just yet, which is what the tag #[code GPE] (geopolitican entity) would imply. The distributional similarity model has correctly learned that #[code Oprah|GPE] is closely related to #[code Oprah_Winfrey|PERSON]. This seems like a promising way to mine for errors made by the named entity recogniser, which could lead to improvements.
p Word2vec has always worked well on named entities. I find the #[a(href="https://sense2vec.spacy.io/?Autechre|PERSON" target="_blank") music region of the vector space] particularly satisfying. It reminds me of the way I used to get music recommendations: by paying attention to the bands frequently mentioned alongside ones I already like. Of course, now we have much more powerful recommendation models, that look at the listening behaviour of millions of people. But to me there's something oddly intuitive about many of the band similarities our sense2vec model is returning.
p Of course, the model is far from perfect, and when it produces weird results, it doesn't always pay to think too hard about them. One of our early models "uncovered" a hidden link between Carrot Top and Kate Mara:
+code.
&gt;&gt;&gt; model.most_similar(['Carrot_Top|PERSON'])
[(u'Kate_Mara|PERSON', 0.5347248911857605),
(u'Andy_Samberg|PERSON', 0.5336876511573792),
(u'Ryan_Gosling|PERSON', 0.5287898182868958),
(u'Emma_Stone|PERSON', 0.5243821740150452),
(u'Charlie_Sheen|PERSON', 0.5209298133850098),
(u'Joseph_Gordon_Levitt|PERSON', 0.5196050405502319),
(u'Jonah_Hill|PERSON', 0.5151286125183105),
(u'Zooey_Deschanel|PERSON', 0.514430582523346),
(u'Gerard_Butler|PERSON', 0.5115377902984619),
(u'Ellen_Page|PERSON', 0.5094753503799438)]
p I really spent too long thinking about this. It just didn't make any sense. Even though it was trivial, it was so bizarre it was almost upsetting. And then it hit me: is this not the nature of all things Carrot Top? Perhaps there was a deeper logic to this. It required further study. But when we ran the model on more data, and it was gone and soon forgotten. Just like Carrot Top.
h3 3. Reddit talks about food a lot, and those regions of the vector space seem very well defined:
+code.
&gt;&gt;&gt; model.most_similar(['onion_rings|NOUN'])
[(u'hashbrowns|NOUN', 0.8040812611579895),
(u'hot_dogs|NOUN', 0.7978234887123108),
(u'chicken_wings|NOUN', 0.793393611907959),
(u'sandwiches|NOUN', 0.7903584241867065),
(u'fries|NOUN', 0.7885469198226929),
(u'tater_tots|NOUN', 0.7821801900863647),
(u'bagels|NOUN', 0.7788236141204834),
(u'chicken_nuggets|NOUN', 0.7787706255912781),
(u'coleslaw|NOUN', 0.7771176099777222),
(u'nachos|NOUN', 0.7755396366119385)]
p Some of Reddit's ideas about food are kind of...interesting. It seems to think bacon and brocoll are very similar:
+code.
&gt;&gt;&gt; model.similarity('bacon|NOUN', 'broccoli|NOUN')
0.83276615202851845
p Reddit also thinks hot dogs are practically salad:
+code.
&gt;&gt;&gt; model.similarity('hot_dogs|NOUN', 'salad|NOUN')
0.76765100035460465
&gt;&gt;&gt; model.similarity('hot_dogs|NOUN', 'entrails|NOUN')
0.28360725445449464
p Just keep telling yourself that Reddit.
+divider("Appendix")
+h2("demo-usage") Using the demo
p Search for a word or phrase to explore related concepts. If you want to get fancy, you can try adding a tag to your query, like so: #[code query phrase|NOUN]. If you leave the tag out, we search for the most common one associated with the word. The tags are predicted by a statistical model that looks at the surrounding context of each example of the word.
+grid("wrap")
+grid-col("half", "padding")
+label Part-of-speech tags
p #[code ADJ] #[code ADP] #[code ADV] #[code AUX] #[code CONJ] #[code DET] #[code INTJ] #[code NOUN] #[code NUM] #[code PART] #[code PRON] #[code PROPN] #[code PUNCT] #[code SCONJ] #[code SYM] #[code VERB] #[code X]
+grid-col("half", "padding")
+label Named entities
p #[code NORP] #[code FACILITY] #[code ORG] #[code GPE] #[code LOC] #[code PRODUCT] #[code EVENT] #[code WORK_OF_ART] #[code LANGUAGE]
p For instance, if you enter #[code serve], we check how often many examples we have of #[code serve|VERB], #[code serve|NOUN], #[code serve|ADJ] etc. Since #[code serve|VERB] is the most common, we show results for that query. But if you type #[code serve|NOUN], you can see results for thatinstead. Because #[code serve|NOUN] is strongly associated with tennis, while usages of the verb are much more general, the results for the two queries are quite different.
p We apply a similar frequency-based procedure to support case sensitivity. If your query is lower case and has no tag, we assume it is case insensitive, and look for the most frequent tagged and cased version. If your query includes at least one upper-case letter, or if you specify a tag, we assume you want the query to be case-sensitive.

View File

@ -0,0 +1,55 @@
include ../_includes/_mixins
+lead Yesterday, Google open sourced their Tensorflow-based dependency parsing library, SyntaxNet. The library gives access to a line of neural network parsing models published by Google researchers over the last two years. I've been following this work closely since it was published, and have been looking forward to the software being published. This post tries to provide some context around the release &mdash; what's new here, and how important is it?
p #[a(href="http://googleresearch.blogspot.de/2016/05/announcing-syntaxnet-worlds-most.html") SyntaxNet] provides an important module in a #[a(href="https://en.wikipedia.org/wiki/Natural_language_processing") natural language processing (NLP)] pipeline such as #[a(href="https://spacy.io" target="_blank") spaCy]. If you zoom out of NLP a little, the technology trend you see is all about extending the range of work computers can take on. Until recently, you couldn't write software to control a car, and you couldn't write software to tweak #[a(href="https://foxtype.com") the tone of your emails], analyse #[a(href="https://wonderflo.co") customer feedback] or monitor global news for #[a(href="http://cytora.com/") significant business risks]. Admittedly, none of those capabilities are a self-driving car. But just wait. Language is at the heart of human endeavour. Our total mastery of moving stuff around has long been inevitable, but the potential upside of NLP technologies is so good that it's hard to predict.
+aside("NLP's killer app") Google search is an NLP application, so in some ways its weird to talk about #[em waiting] for NLP to change the world. It already did. But I definitely think there's still much more to come.
p Within this larger value chain, SyntaxNet is a fairly low-level technology. It's like an improved drill bit. By itself, it doesn't give you any oil &mdash; and oil, by itself, doesn't give you any energy or plastics, and energy and plastics by themselves don't give you any work or any products. But if the bottle-neck in that whole value chain was in the efficiency of oil extraction, and your drill bit improves that substantially, the low-level technology can prove #[a(href="https://en.wikipedia.org/wiki/Hughes_Tool_Company") pretty important].
p I think that syntactic parsing is a bottle-neck technology in NLP, and that the last 4 or 5 years of improvements to this technology will have outsize impacts. Now, you could argue that I think that because this is the problem I've been working on for all my adult life, and the technology that I left academia to #[a(href="https://spacy.io/blog/introducing-spacy") take commercial]. All I can say is that this reverses causation: it's my belief in the problem's importance that's caused my investment in it, not the other way around.
p Okay, so I think the #[em problem] is important. But how big a step forward is SyntaxNet? If you've been using the neural network model in #[a(href="http://stanfordnlp.github.io/CoreNLP/") Stanford CoreNLP], you're using an algorithm that's almost identical in design, but not in detail. The #[a(href="https://aclweb.org/anthology/D/D15/D15-1162.pdf") parsing model] used by spaCy is also similar. Conceptually, the contribution of the SyntaxNet work is pretty subtle. It's mostly about careful experimentation, tuning, and refinement. However, if Google didn't do this work, it's possible that nobody else would have. The neural network models that make SyntaxNet tick have also opened up a rich landscape of sexier ideas, and researchers are busily exploring them. There's a bias towards ideas that make researchers look (and feel!) clever. Probably, we would have ended up with parsing models that were just as accurate, but with incorrect assumptions about which aspects of the system design were important to accuracy, leading to slower progress in the future.
+aside("Research notes") #[a(href="http://www.petrovi.de/data/acl15.pdf") The first SyntaxNet paper] was published about six months after the description of #[a(href="http://cs.stanford.edu/people/danqi/papers/emnlp2014.pdf") the CoreNLP model]. Mostly, they used a larger network, a better activation function, and a different optimisation method. They also applied a somewhat hacky approach to beam-search, which #[a(href="http://arxiv.org/pdf/1603.06042v1.pdf") their more recent work] replaced with a more principled approach. A parallel line of work that achieves equivalent accuracy using #[a(href="http://www.cs.cmu.edu/~lingwang/papers/acl2015.pdf") LSTM] models instead of feed-forward networks was published at the same time as the first SyntaxNet paper.
+h2("dependency-parsing") What SyntaxNet does
p A #[a(href="http://googleresearch.blogspot.de/2013/05/syntactic-ngrams-over-time.html" target="_blank") syntactic parser] describes a sentences grammatical structure, to help another application reason about it. Natural languages introduce many unexpected ambiguities, which our world-knowledge immediately filters out. A favourite example:
+example They ate the pizza with anchovies
+image("anchovies.png", "Eat-with pizza-with ambiguity")
p A correct parse would link “with” to “pizza”, while an incorrect parse would link “with” to “eat”:
+displacy("pizza-with-anchovies-bad")
+displacy("pizza-with-anchovies-good")
p You can explore the technology visually with our #[a(href="https://spacy.io/demos/displacy/") displaCy demo], or see a terse example of a #[a(href="https://spacy.io/docs/tutorials/syntax-search") rule-based approach] to computing with the parse tree. The tree of word-word relationships can also be used to recognise simple phrases, which makes it easy to extend "bag-of-words" technologies such as word2vec. For instance, we parsed every comment posted to Reddit in 2015, and used word2vec on the phrases, entities and words. This produces a nice #[a(href="https://spacy.io/demos/sense2vec") conceptual map] that's more useful than a model strictly limited to whitespace-delimited words.
p SyntaxNet is a library for training and running syntactic dependency parsing models. One model that it provides offers a particularly good speed/accuracy trade-off. In keeping with the fashion of the moment, they've called this model Parsey McParseface. Hopefully, they can maintain this sort of meme-based naming system. I think it'll be a good way to keep the timeline clear. Memes get old fast, and so does NLP technology.
+h2("advance") How big is the advance?
p Despite the "most accurate in the world" billing, Parsey McParseface is really only inches ahead of #[a(href="http://arxiv.org/pdf/1603.04351v1.pdf") equivalent recent research], that uses a more complicated neural network architecture, but with more limited parameter tuning. So, similar technologies are out there in academia. On the other hand, if what you care about is actually #[em doing] things, those technologies haven't been available yet.
+aside("Why doesn't spaCy use a neural network?") I've been working on a neural network model for spaCy on and off since the first SyntaxNet paper was published last year. However, we want to keep spaCy easy to install, we want it to be fast on a CPU, and we want it to stay multi-threaded. This has turned out to be a tricky mix of requirements to deliver.
p On the time-honoured benchmark for this task, Parsey McParseface achieves over 94% accuracy, at around 600 words per second. On the same task, spaCy achieves 92.4%, at around 15,000 words per second. The extra accuracy might not sound like much, but for applications, it's likely to be pretty significant.
p For any predictive system, often the important consideration is the difference to a baseline predictor, rather than the absolute accuracy. A model that predicts that the weather will be the same as yesterday will often be accurate, but it's not adding any value. The thing about dependency parsing is that about 80% of the dependencies are very easy and unambiguous, which means that a system that only predicts those dependencies correctly is injecting very little extra information, that wasn't trivially available by just looking at each word and its neighbours.
p In summary, I think Parsey McParseface is a very nice milestone on a larger trend. The thing that's really significant is how quickly the speed and accuracy of natural language processing technologies is advancing. I think there are lots of ideas that didn't work yesterday, that are suddenly becoming very viable.
+h2("whats-next") What's next?
p One of the things I'm most excited about is that there's a very clear way forward, given the design of the Parsey McParseface model. It's one of those things where you can say, "Okay, if this works, that's great news". This type of parser, pioneered by #[a(href="https://www.semanticscholar.org/author/Joakim-Nivre/1720988") Joakim Nivre] in 2004, reads the sentence one word at a time, and maintains only a handful of competing representations. You can slot in any state representation, any set of actions, and any probability model into this architecture. For instance, if you're parsing the output of a speech recognition system, you could have the parser refine the speech recogniser's guess at the words, based on the syntactic context. If you're populating a knowledge base, you can extend the state representation to include your target semantics, and learn it jointly with the syntax.
p Joint models and semi-supervised learning have always been the "motherhood and apple pie" of natural language understanding research. There was never any doubt that these things were good &mdash; but without a concrete proposal, they're just platitudes. It was always clear that chopping the task of understanding a sentence up into lots of subproblems, and having a pipeline of distinct models, was an unsatisfying solution. It was also obvious that a natural language understanding system should be able to make use of the vast quantities of unannotated text available. I think a transition-based neural network model gives a convincing answer to both questions. You can learn any structure you like this way, and the more text you see, the more you learn, without adding any new parameters to the model.
p Obviously, we want to build a bridge between Parsey McParseface and spaCy, so that you can use the more accurate model with the sweeter spaCy API. However, for any individual use-case, there's always a lot of tuning to do to make these technologies really perform. In particular, every application sees a different type of text. Accuracy goes up substantially if the statistical model is tuned to the domain. For instance, in well edited text such as a financial report, you want the model to consider capitalisation as a decisive indicator &mdash; but if you're parsing tweets, capitalisation is almost meaningless.
p Our plan is to solve this problem by providing a range of pre-trained models, adapted to different languages and genres. We also have some ideas we're really excited about, to help each user train their own custom model, as painlessly as possible. We think that in NLP, the algorithms are racing ahead, while the data is lagging behind. We want to fix that. If you can't wait for the result, I hope you'll #[a(href="mailto:contact@spacy.io") get in touch].

26
website/demos/_data.json Normal file
View File

@ -0,0 +1,26 @@
{
"index": {
"title": "Demos",
"demos": {
"displacy": {
"title": "displaCy: Dependency Parse Tree Visualization with CSS and JavaScript",
"description": "displaCy lets you peek inside spaCy's syntactic parser, as it reads a sentence word-by-word. By repeatedly choosing from a small set of actions, it links the words together according to their syntactic structure.",
"image": {
"file": "displacy.jpg"
}
},
"sense2vec": {
"title": "Semantic Analysis of the Reddit Hivemind",
"description": "Our neural network read every comment posted to Reddit from 2015. We combined word2vec with sophisticated natural language processing, to give you a little look into the Reddit hivemind. Type a phrase, and see what Reddit associates it with.",
"image": {
"file": "sense2vec.jpg"
},
"links": {
"blogpost": "https://spacy.io/blog/sense2vec-with-spacy",
"github": "https://github.com/spacy-io/sense2vec"
}
}
}
}
}

18
website/demos/index.jade Normal file
View File

@ -0,0 +1,18 @@
include ../_includes/_mixins
//- Demos
//- ============================================================================
+grid('padding')
each demo, slug in demos
+grid-col('half', 'space-between')
.teaser
a(href='https://' + slug + '.spacy.io' target='_blank')
.image-ratio: img(src='/demos/img/' + demo.image.file)
+h2
a.block(href='https://' + slug + '.spacy.io' target='_blank')=demo.title
p=demo.description
!=partial('../_includes/_newsletter', { divider: 'top' })

View File

@ -29,11 +29,15 @@
lang = "en"
class German(Language):
<<<<<<< HEAD
lang = "de"
+section("english-init")
+h(3, "english-init")
| #[+tag method] English.__init__
=======
lang = 'de'
>>>>>>> v1.0.0-rc1
p
| Load the pipeline. Each component can be passed

View File

@ -267,6 +267,10 @@
+h(3, "token-navigating") Navigating the Parse Tree
+table(["Name", "Description"])
+row
+cell dep / dep_
+cell.
The syntactic relation type, aka the dependency label, connecting the word to its head.
+row
+cell dep / dep_
+cell.

View File

@ -1,3 +1,4 @@
<<<<<<< HEAD
//- ----------------------------------
//- 💫 QUICKSTART > GETTING STARTED
//- ----------------------------------
@ -8,19 +9,36 @@
+section("install-spacy")
+h(3, "install-spacy")
=======
//- Docs > Quickstart > Getting started
//- ============================================================================
+section('getting-started')
+h2('getting-started')
| Getting started
+section('install-spacy')
+h3('install-spacy')
>>>>>>> v1.0.0-rc1
| Install spaCy
p.
spaCy is compatible with 64-bit CPython 2.6+/3.3+ and runs on Unix/Linux,
OS X and Windows. Source and binary packages are available via
<<<<<<< HEAD
#[+a("https://pypi.python.org/pypi/spacy") pip] and
#[+a("https://anaconda.org/spacy/spacy") conda]. If there are
=======
#[a(href='https://pypi.python.org/pypi/spacy' target='_blank') pip] and
#[a(href='https://anaconda.org/spacy/spacy' target='_blank') conda]. If there are
>>>>>>> v1.0.0-rc1
no binary packages for your platform available please make sure that you have
a working build enviroment set up. See
notes on #[a(href="/docs#install-source-ubuntu") Ubuntu],
#[a(href="/docs#install-source-osx") OS X] and
#[a(href="/docs#install-source-windows") Windows] for details.
<<<<<<< HEAD
+code("bash", "conda").
conda config --add channels spacy # only needed once
conda install spacy
@ -68,6 +86,131 @@
+section("install-upgrade")
+h(3, "install-upgrade")
| Upgrading spaCy
=======
+code('bash', 'conda').
conda config --add channels spacy # only needed once
conda install spacy
p.
When using pip it is generally recommended to install packages in a
#[a(href='https://virtualenv.readthedocs.org/en/latest/' target='_blank') virtualenv]
to avoid modifying system state:
+code('bash', 'pip').
# make sure you are using a recent pip/virtualenv version
python -m pip install -U pip virtualenv
virtualenv .env
source .env/bin/activate
pip install spacy
p.
Python packaging is awkward at the best of times, and it's particularly
tricky with C extensions, built via Cython, requiring large data files.
So, please report issues as you encounter them.
+section('install-model')
+h3('install-model')
| Install model
p.
After installation you need to download a language model.
Currently only models for English and German, named #[code en] and #[code de], are available. Please get in touch with us if you need support for a particular language.
+code('bash').
sputnik --name spacy --repository-url http://index.spacy.io install en==1.1.0
p.
Then check whether the model was successfully installed:
+code('bash').
python -c "import spacy; spacy.load('en'); print('OK')"
p.
The download command fetches and installs about 500 MB of data which it installs
within the #[code spacy] package directory.
+section('install-upgrade')
+h3('install-upgrade')
| Upgrading spaCy
p.
To upgrade spaCy to the latest release:
+code('bash', 'conda').
conda update spacy
+code('bash', 'pip').
pip install -U spacy
p.
Sometimes new releases require a new language model. Then you will have to upgrade to
a new model, too. You can also force re-downloading and installing a new language model:
+code('bash').
python -m spacy.en.download --force
+section('install-source')
+h3('install-source')
| Compile from source
p.
The other way to install spaCy is to clone its
#[a(href="https://github.com/spacy-io/spaCy") GitHub repository] and
build it from source. That is the common way if you want to make changes
to the code base.
p.
You'll need to make sure that you have a development enviroment consisting
of a Python distribution including header files, a compiler, pip,
virtualenv and git installed. The compiler
part is the trickiest. How to do that depends on your system. See
notes on #[a(href="/docs#install-source-ubuntu") Ubuntu],
#[a(href="/docs#install-source-osx") OS X] and
#[a(href="/docs#install-source-windows") Windows] for details.
+code('bash').
# make sure you are using recent pip/virtualenv versions
python -m pip install -U pip virtualenv
# find git install instructions at https://git-scm.com/downloads
git clone https://github.com/spacy-io/spaCy.git
cd spaCy
virtualenv .env && source .env/bin/activate
pip install -r requirements.txt
pip install -e .
p.
Compared to regular install via #[code pip] and #[code conda]
#[a(href="https://github.com/spacy-io/spaCy/blob/master/requirements.txt") requirements.txt]
additionally installs developer dependencies such as #[code cython].
+h4('install-source-ubuntu')
| Ubuntu
p.
Install system-level dependencies via #[code apt-get]:
+code('bash').
sudo apt-get install build-essential python-dev git
+h4('install-source-osx')
| OS X
p.
Install a recent version of XCode, including the so-called "Command Line Tools". OS X
ships with Python and git preinstalled.
+h4('install-source-windows')
| Windows
p.
Install a version of Visual Studio Express or higher that matches the version that was
used to compile your Python interpreter. For official distributions
these are VS 2008 (Python 2.7), VS 2010 (Python 3.4) and VS 2015 (Python 3.5).
>>>>>>> v1.0.0-rc1
p.
To upgrade spaCy to the latest release:
@ -79,6 +222,7 @@
pip install -U spacy
p.
<<<<<<< HEAD
Sometimes new releases require a new language model. Then you will have to upgrade to
a new model, too. You can also force re-downloading and installing a new language model:
@ -174,4 +318,31 @@
# make sure you are using recent pytest version
python -m pip install -U pytest
=======
If you're stuck using a system with an old version of Python, and you
don't have root access, we've prepared a bootstrap script to help you
compile a local Python install. Run:
+code('bash').
curl https://raw.githubusercontent.com/spacy-io/gist/master/bootstrap_python_env.sh | bash && source .env/bin/activate
+section('run-tests')
+h3('run-tests')
| Run tests
p.
spaCy comes with an extensive test suite. First, find out where spaCy is installed:
+code('bash').
python -c "import os; import spacy; print(os.path.dirname(spacy.__file__))"
p.
Then run #[code pytest] on that directory. The flags #[code --vectors],
#[code --slow] and #[code --model] are optional and enable additional tests:
+code('bash').
# make sure you are using recent pytest version
python -m pip install -U pytest
>>>>>>> v1.0.0-rc1
python -m pytest &lt;spacy-directory&gt; --vectors --model --slow

View File

@ -8,6 +8,21 @@ include ../_includes/_mixins
- var link_int = 'http://docs.python.org/library/functions.html#int'
- var link_unicode = 'http://docs.python.org/library/functions.html#unicode'
<<<<<<< HEAD
=======
//- Docs
//- ============================================================================
//+infobox('Update March, 2016').
// We know change can be jarring, especially when you've got a deadline. So to
// ease the transition to the new documentation style, we've kept
// #[a(href='/docs/legacy' target='_blank') the old docs] online too.
// If you have any problems, you can let us know on the
// #[a(href='https://github.com/' + profiles.github + '/spaCy' target='_blank') spaCy issue tracker]
// or the #[a(href='https://reddit.com/r/' + profiles.reddit target='_blank') Reddit user group].
>>>>>>> v1.0.0-rc1
include _quickstart-install
include _quickstart-examples

View File

@ -1,8 +1,14 @@
include ../../_includes/_mixins
<<<<<<< HEAD
p.u-text-large spaCy assumes by default that your data is raw text. However, sometimes your data is partially annotated, e.g. with pre-existing tokenization, part-of-speech tags, etc. This tutorial explains how to use these annotations in spaCy.
+h(2, "quick-reference") Quick Reference
=======
+lead spaCy assumes by default that your data is raw text. However, sometimes your data is partially annotated, e.g. with pre-existing tokenization, part-of-speech tags, etc. This tutorial explains how to use these annotations in spaCy.
+h2 Quick Reference
>>>>>>> v1.0.0-rc1
+table(['Description', 'Usage'], 'code')
+row
@ -11,7 +17,11 @@ p.u-text-large spaCy assumes by default that your data is raw text. However, som
+row
+cell Use pre-existing tokenization (deprecated)
+cell #[code.lang-python doc = nlp.tokenizer.tokens_from_list([u'A', u'token', u'!'])]
<<<<<<< HEAD
=======
>>>>>>> v1.0.0-rc1
+row
+cell Assign pre-existing tags
+cell #[code.lang-python nlp.tagger.tag_from_strings(doc, ['DT', 'NN'])]
@ -22,7 +32,11 @@ p.u-text-large spaCy assumes by default that your data is raw text. However, som
+cell Assign dependency parse annotations from an array
+cell #[code.lang-python doc.from_array([HEAD, DEP], values)]
<<<<<<< HEAD
+h(2, "examples") Examples
=======
+h2 Examples
>>>>>>> v1.0.0-rc1
+code('python', 'Tokenization').
import spacy
@ -111,7 +125,15 @@ p.u-text-large spaCy assumes by default that your data is raw text. However, som
columns = [ENT_TYPE, ENT_IOB]
values = ndarray(shape=(len(columns), len(doc)), dtype='int32')
<<<<<<< HEAD
# IOB values are 0=missing, 1=I, 2=O, 3=B
values[0] = [1, 1, 1, 3, 1]
values[1] = [0, 0, 0, PERSON, 0]
doc.from_array(columns, values)
=======
# IOB values are 0=missing, 1=I, 2=O, 3=B
values[0] = [1, 1, 1, 3, 1]
values[1] = [0, 0, 0, PERSON, 0]
doc.from_array(columns, values)
>>>>>>> v1.0.0-rc1

30
website/feed.xml.jade Normal file
View File

@ -0,0 +1,30 @@
include _includes/_mixins
//- ----------------------------------------------------------------------------
//- Blog Feed
//- ----------------------------------------------------------------------------
doctype xml
rss(version='2.0', xmlns:atom='http://www.w3.org/2005/Atom')
channel
title= title
link= url
description= description
atom:link(href='#{ url }/feed.xml', rel='self', type='application/rss+xml')
for post, slug in public.blog._data
if post.published != false && slug != 'index'
item
title=post.title
description
| <![CDATA[
if post.image
p: img(src=url + '/blog/img/' + post.image.file)
!=partial('blog/' + slug)
| ]]>
if post.date
pubDate=convertPubDate(post.date)
link #{ url }/blog/#{ slug }
guid(isPermaLink='true') #{ url }/blog/#{ slug }

View File

@ -1,6 +1,13 @@
<<<<<<< HEAD
//- ----------------------------------
//- 💫 LANDING PAGE
//- ----------------------------------
=======
include _includes/_mixins
- var logos = [ ['chartbeat', 'https://chartbeat.com'], ['socrata', 'https://www.socrata.com'], ['chattermill', 'https://chattermill.io'], ['cytora', 'http://www.cytora.com'], ['signaln', 'http://signaln.com'], ['duedil', 'https://www.duedil.com/'], ['spyjack', 'https://spyjack.io'], ['keyreply', 'https://keyreply.com/'], ['dato', 'https://dato.com'], [ 'kip', 'http://kipthis.com'], ['wonderflow', 'http://www.wonderflow.co'], ['foxtype', 'https://foxtype.com'], ['synapsify', 'http://www.gosynapsify.com'], ['stitchfix', 'https://www.stitchfix.com/'], ['wayblazer', 'http://wayblazer.com'] ]
>>>>>>> v1.0.0-rc1
include _includes/_mixins
@ -10,6 +17,7 @@ header.o-header.u-pattern
| Natural Language#[br]
| Processing
<<<<<<< HEAD
.o-block-small.u-text-medium.u-text-strong.u-text-shadow
| Thousands of researchers are trying to make#[br]
| computers understand text. They're succeeding.#[br]
@ -126,6 +134,142 @@ main.o-main
sup #[+a("http://aclweb.org/anthology/P/P15/P15-1038.pdf") [1]], #[+a("https://aclweb.org/anthology/D/D15/D15-1162.pdf") [2]], #[+a("http://homes.cs.washington.edu/~lsz/papers/llz-naacl16.pdf") [3]]
+grid-col("half").u-padding
=======
+lead.header-text
strong
| Thousands of researchers are trying to make#[br]
| computers understand text. They're succeeding.#[br]
| We help you get their work out of papers and#[br]
| into production.#[br]
+button('secondary')(href='/docs/#getting-started') Install spaCy
+divider('bar')
| #[a(href='https://github.com/' + profiles.github + '/spaCy/releases' target='_blank'): #[strong Latest Release:] v#{spacy_version}]
| #[a(href='https://github.com/' + profiles.github + '/spaCy' target='_blank'): +icon('github', 'secondary') #[strong #{spacy_stars}+ stars] on GitHub]
| #[a(href='https://www.reddit.com/r/' + profiles.reddit target='_blank'): +icon('reddit', 'secondary') #[strong User Group] on Reddit]
main.main
+grid('padding', 'space-between')
+grid-col('half')
+h2 Built for Production
p.text-big.
Most AI software is built for research. Over the last ten years,
we've used a lot of that software, and built some of it ourselves,
especially for natural language processing (NLP).
But the faster the research has moved, the more impatient we've
become. We want to see advanced NLP technologies get out into
great products, as the basis of great businesses. We built spaCy
to make that happen.
+h2 Easy and Powerful
p.text-big.
For any NLP task, there are always lots of competing algorithms.
We don't believe in implementing them all and letting you choose.
Instead, we just implement one &ndash; the best one.
When better algorithms are developed, we can update the library without
breaking your code or bloating the API. This approach makes spaCy
both #[strong easier] and #[strong more powerful] than a pluggable
architecture. spaCy also features a #[strong unique whole-document design].
Where other NLP libraries rely on sentence detection as
a pre-process, spaCy reads the whole document at once, making it much more
robust to informal and poorly formatted text.
+h2 Permissive open-source license (MIT)
p.text-big.
We think spaCy is valuable software, so we made it free, to raise
its value even higher.
Making spaCy open-source puts us on the same side &ndash;
we can tell you everything about how it works, and let
you run it however you like. We think the software would be much
less valuable as a service, which could disappear at any point.
+grid-col('half', 'valign-bottom')
+code-demo('lightning_tour.py').block.
# pip install spacy && python -m spacy.en.download
import spacy
# Load English tokenizer, tagger, parser, NER and word vectors
nlp = spacy.load('en')
# Process a document, of any size
text = open('war_and_peace.txt').read()
doc = nlp(text)
from spacy.attrs import *
# All strings mapped to integers, for easy export to numpy
np_array = doc.to_array([LOWER, POS, ENT_TYPE, IS_ALPHA])
from reddit_corpus import RedditComments
reddit = RedditComments('/path/to/reddit/corpus')
# Parse a stream of documents, with multi-threading (no GIL!)
# Processes over 100,000 tokens per second.
for doc in nlp.pipe(reddit.texts, batch_size=10000, n_threads=4):
# Multi-word expressions, such as names, dates etc
# can be merged into single tokens
for ent in doc.ents:
ent.merge(ent.root.tag_, ent.text, ent.ent_type_)
# Efficient, lossless serialization --- all annotations
# saved, same size as uncompressed text
byte_string = doc.to_bytes()
+h2.text-center
+label('strong') spaCy is trusted by
+grid('align-center')
+grid-col('two-thirds')
+grid('align-center', 'valign-center', 'padding')
each logo in logos
a(href=logo[1] target='_blank')
img(src='assets/img/logos/' + logo[0] + '.png').logo--small
+divider
+grid
+grid-col('half', 'valign-center', 'align-center')
.image-container
img(src='assets/img/spacy_screen.png' style='display: block')
+grid-col('half')
+h2
+label('strong') About spaCy
.h2 What we do
p.text-big spaCy helps you write programs that do clever things with text. You give it a string of characters, it gives you an object that provides multiple useful views of its meaning and linguistic structure. Specifically, spaCy features a high performance tokenizer, part-of-speech tagger, named entity recognizer and syntactic dependency parser, with built-in support for word vectors. All of the functionality is united behind a clean high-level Python API, that makes it easy to use the different annotations together.
p.text-big To make spaCy as fast and easy to install as we could, we built it #[strong from the ground up] from custom components, with #[strong custom implementations], and sometimes #[strong custom algorithms]. It's written in clean but efficient Cython code, which allows us to manage both low level details and the high-level Python API in a single codebase.
+divider
+h2.text-center
+label('strong') What our users say...
+grid('padding')
+grid-col('third', 'valign-center')
<blockquote class="twitter-tweet" data-cards="hidden" data-lang="en"><p lang="en" dir="ltr">&quot;Dead Code Should be Buried&quot; <a href="http://t.co/AxfZRRz8nB">http://t.co/AxfZRRz8nB</a> by <a href="https://twitter.com/honnibal">@honnibal</a> on NLP tools &amp; new Python library spaCy <a href="http://t.co/C9f798R3aO">http://t.co/C9f798R3aO</a> looks nice!</p>&mdash; Andrej Karpathy (@karpathy) <a href="https://twitter.com/karpathy/status/640098689894232064">September 5, 2015</a></blockquote>
+grid-col('third', 'valign-center')
<blockquote class="twitter-tweet" data-cards="hidden" data-lang="en"><p lang="en" dir="ltr">spaCy seems pretty exciting to me - and it is clear that NLTK has not kept up with <a href="https://twitter.com/hashtag/NLP?src=hash">#NLP</a>. <a href="http://t.co/mUPFUMLrbo">http://t.co/mUPFUMLrbo</a> <a href="https://twitter.com/hashtag/python?src=hash">#python</a> <a href="https://twitter.com/hashtag/datascience?src=hash">#datascience</a></p>&mdash; Alex Engler (@AlexCEngler) <a href="https://twitter.com/AlexCEngler/status/648537133544833025">September 28, 2015</a></blockquote>
+grid-col('third', 'valign-center')
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">I wish I&#39;d known about nlp.pipe about two weeks ago. Nice feature in <a href="https://twitter.com/Spacy">@spacy</a> to parallelize your NLP pipeline.</p>&mdash; Matti Lyra (@mattilyra) <a href="https://twitter.com/mattilyra/status/704753660329369600">March 1, 2016</a></blockquote>
+divider
+grid('padding', 'valign-center')
+grid-col('half')
+h2
.label-strong Benchmarks
.h2 State-of-the-art speed and accuracy
p.text-big spaCy is committed to rigorous evaluation under standard methodology. Two peer-reviewed papers in 2015 confirm that it offers the #[strong fastest syntactic parser in the world] and that #[strong its accuracy is within 1% of the best] available. The few systems that are more accurate are 20&times; slower or more.
p.text-big The first of the evaluations was published by #[strong Yahoo! Labs] and #[strong Emory University], as part of a survey of current parsing technologies #[a(href="http://aclweb.org/anthology/P/P15/P15-1038.pdf" target="_blank") (Choi et al., 2015)]. Their results and subsequent discussions helped us develop a novel psychologically-motivated technique to improve spaCy's accuracy, which we published in joint work with Macquarie University #[a(href="https://aclweb.org/anthology/D/D15/D15-1162.pdf" target="_blank") (Honnibal and Johnson, 2015)].
+grid-col('half')
>>>>>>> v1.0.0-rc1
+table(["System", "Language", "Accuracy", "Speed (WPS)"])
+row
+cell