Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • daconcea/fidle
  • bossardl/fidle
  • Julie.Remenant/fidle
  • abijolao/fidle
  • monsimau/fidle
  • karkars/fidle
  • guilgautier/fidle
  • cailletr/fidle
  • talks/fidle
9 results
Show changes
Showing
with 924 additions and 0 deletions
# ------------------------------------------------------------------
# _____ _ _ _
# | ___(_) __| | | ___
# | |_ | |/ _` | |/ _ \
# | _| | | (_| | | __/
# |_| |_|\__,_|_|\___|
# ------------------------------------------------------------------
# Formation Introduction au Deep Learning (FIDLE)
# CNRS/SARI/DEVLOG 2020 - S. Arias, E. Maldonado, JL. Parouty
# ------------------------------------------------------------------
# by JL Parouty (feb 2020), based on David Foster examples.
import numpy as np
import math
import tensorflow as tf
import tensorflow.keras as keras
from tensorflow.keras import backend as K
from tensorflow.keras.layers import Input, Conv2D, Flatten, Dense, Conv2DTranspose, Reshape, Lambda
from tensorflow.keras.layers import Activation, BatchNormalization, LeakyReLU, Dropout
from tensorflow.keras.models import Model
from tensorflow.keras.callbacks import ModelCheckpoint, TensorBoard
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.utils import plot_model
from modules.callbacks import ImagesCallback
from modules.data_generator import DataGenerator
import os, json, time, datetime
class VariationalAutoencoder():
version = '1.28'
def __init__(self, input_shape=None, encoder_layers=None, decoder_layers=None, z_dim=None, run_tag='000', verbose=0):
self.name = 'Variational AutoEncoder'
self.input_shape = list(input_shape)
self.encoder_layers = encoder_layers
self.decoder_layers = decoder_layers
self.z_dim = z_dim
self.run_tag = str(run_tag)
self.verbose = verbose
self.run_directory = f'./run/{run_tag}'
# ---- Create run directories
for d in ('','/models','/figs','/logs','/images'):
os.makedirs(self.run_directory+d, mode=0o750, exist_ok=True)
# ==== Encoder ================================================================
# ---- Input layer
encoder_input = Input(shape=self.input_shape, name='encoder_input')
x = encoder_input
# ---- Add next layers
i=1
for l_config in encoder_layers:
l_type = l_config['type']
l_params = l_config.copy()
l_params.pop('type')
if l_type=='Conv2D':
layer = Conv2D(**l_params)
if l_type=='Dropout':
layer = Dropout(**l_params)
x = layer(x)
i+=1
# ---- Flatten
shape_before_flattening = K.int_shape(x)[1:]
x = Flatten()(x)
# ---- mu <-> log_var
self.mu = Dense(self.z_dim, name='mu')(x)
self.log_var = Dense(self.z_dim, name='log_var')(x)
self.encoder_mu_log_var = Model(encoder_input, (self.mu, self.log_var))
# ---- output layer
def sampling(args):
mu, log_var = args
epsilon = K.random_normal(shape=K.shape(mu), mean=0., stddev=1.)
return mu + K.exp(log_var / 2) * epsilon
encoder_output = Lambda(sampling, name='encoder_output')([self.mu, self.log_var])
self.encoder = Model(encoder_input, encoder_output)
# ==== Decoder ================================================================
# ---- Input layer
decoder_input = Input(shape=(self.z_dim,), name='decoder_input')
# ---- First dense layer
x = Dense(np.prod(shape_before_flattening))(decoder_input)
x = Reshape(shape_before_flattening)(x)
# ---- Add next layers
i=1
for l_config in decoder_layers:
l_type = l_config['type']
l_params = l_config.copy()
l_params.pop('type')
if l_type=='Conv2DTranspose':
layer = Conv2DTranspose(**l_params)
if l_type=='Dropout':
layer = Dropout(**l_params)
x = layer(x)
i+=1
decoder_output = x
self.decoder = Model(decoder_input, decoder_output)
# ==== Encoder-Decoder ========================================================
model_input = encoder_input
model_output = self.decoder(encoder_output)
self.model = Model(model_input, model_output)
# ==== Verbosity ==============================================================
print('Model initialized.')
print(f'Outputs will be in : {self.run_directory}')
if verbose>0 :
print('\n','-'*10,'Encoder','-'*50,'\n')
self.encoder.summary()
print('\n','-'*10,'Encoder','-'*50,'\n')
self.decoder.summary()
self.plot_model()
def compile(self, optimizer='adam', r_loss_factor='1000'):
self.r_loss_factor = r_loss_factor
def vae_r_loss(y_true, y_pred):
r_loss = K.mean(K.square(y_true - y_pred), axis = [1,2,3])
return r_loss_factor * r_loss
def vae_kl_loss(y_true, y_pred):
kl_loss = -0.5 * K.sum(1 + self.log_var - K.square(self.mu) - K.exp(self.log_var), axis = 1)
return kl_loss
def vae_loss(y_true, y_pred):
r_loss = vae_r_loss(y_true, y_pred)
kl_loss = vae_kl_loss(y_true, y_pred)
return r_loss + kl_loss
self.model.compile(optimizer=optimizer,
loss = vae_loss,
metrics = [vae_r_loss, vae_kl_loss],
experimental_run_tf_function=False)
print('Compiled.')
def train(self,
x_train=None,
x_test=None,
data_generator=None,
batch_size=32,
epochs=20,
initial_epoch=0,
k_size=1
):
# ---- Data given or via generator
mode_data = (data_generator is None)
# ---- Size of the dataset we are going to use
# k_size ==1 : mean 100%
# Unused with data generator
#
if mode_data:
n_train = int(x_train.shape[0] * k_size)
n_test = int(x_test.shape[0] * k_size)
# ---- Callback : Images
filename = self.run_directory+"/images/image-{epoch:03d}-{i:02d}.jpg"
callbacks_images = ImagesCallback(filename, z_dim=self.z_dim, decoder=self.decoder)
# ---- Callback : Checkpoint
filename = self.run_directory+"/models/model-{epoch:03d}.h5"
callback_chkpts = ModelCheckpoint(filename, save_freq='epoch' ,verbose=0)
# ---- Callback : Best model
filename = self.run_directory+"/models/best_model.h5"
callback_bestmodel = ModelCheckpoint(filename, save_best_only=True, mode='min',monitor='val_loss',verbose=0)
# ---- Callback tensorboard
dirname = self.run_directory+"/logs"
callback_tensorboard = TensorBoard(log_dir=dirname, histogram_freq=1)
callbacks_list = [callbacks_images, callback_chkpts, callback_bestmodel, callback_tensorboard]
# callbacks_list = [callback_chkpts, callback_bestmodel, callback_tensorboard]
# ---- Let's go...
start_time = time.time()
if mode_data:
#
# ---- With pure data (x_train) -----------------------------------------
#
self.history = self.model.fit(x_train[:n_train], x_train[:n_train],
batch_size = batch_size,
shuffle = True,
epochs = epochs,
initial_epoch = initial_epoch,
callbacks = callbacks_list,
validation_data = (x_test[:n_test], x_test[:n_test])
)
#
else:
# ---- With Data Generator ----------------------------------------------
#
self.history = self.model.fit(data_generator,
shuffle = True,
epochs = epochs,
initial_epoch = initial_epoch,
callbacks = callbacks_list,
validation_data = (x_test, x_test)
)
end_time = time.time()
dt = end_time-start_time
dth = str(datetime.timedelta(seconds=int(dt)))
self.duration = dt
print(f'\nTrain duration : {dt:.2f} sec. - {dth:}')
def plot_model(self):
d=self.run_directory+'/figs'
plot_model(self.model, to_file=f'{d}/model.png', show_shapes = True, show_layer_names = True, expand_nested=True)
plot_model(self.encoder, to_file=f'{d}/encoder.png', show_shapes = True, show_layer_names = True)
plot_model(self.decoder, to_file=f'{d}/decoder.png', show_shapes = True, show_layer_names = True)
def save(self,config='vae_config.json', model='model.h5', force=False):
# ---- Check if the place is still used
if os.path.isfile(self.run_directory+'/models/best_model.h5') and not force:
print('\n*** Oops. There are already stuff in the target folder !\n')
assert False, f'Tag directory {self.run_directory} is not empty...'
# ---- Save config in json
if config!=None:
to_save = ['input_shape', 'encoder_layers', 'decoder_layers', 'z_dim', 'run_tag', 'verbose']
data = { i:self.__dict__[i] for i in to_save }
filename = self.run_directory+'/models/'+config
with open(filename, 'w') as outfile:
json.dump(data, outfile)
print(f'Config saved in : {filename}')
# ---- Save model
if model!=None:
filename = self.run_directory+'/models/'+model
self.model.save(filename)
print(f'Model saved in : {filename}')
def load_weights(self,model='model.h5'):
filename = self.run_directory+'/models/'+model
self.model.load_weights(filename)
print(f'Weights loaded from : {filename}')
@classmethod
def load(cls, run_tag='000', config='vae_config.json', weights='model.h5'):
# ---- Instantiate a new vae
filename = f'./run/{run_tag}/models/{config}'
with open(filename, 'r') as infile:
params=json.load(infile)
vae=cls( **params)
# ---- weights==None, just return it
if weights==None: return vae
# ---- weights!=None, get weights
vae.load_weights(weights)
return vae
@classmethod
def about(cls):
print('\nFIDLE 2020 - Variational AutoEncoder (VAE)')
print('TensorFlow version :',tf.__version__)
print('VAE version :', cls.version)
\ No newline at end of file
name: fidle
channels:
- defaults
dependencies:
- _libgcc_mutex=0.1=main
- _tflow_select=2.1.0=gpu
- absl-py=0.9.0=py37_0
- astor=0.8.0=py37_0
- attrs=19.3.0=py_0
- backcall=0.1.0=py37_0
- blas=1.0=mkl
- bleach=3.1.0=py37_0
- blosc=1.16.3=hd408876_0
- bzip2=1.0.8=h7b6447c_0
- c-ares=1.15.0=h7b6447c_1001
- ca-certificates=2020.1.1=0
- cairo=1.14.12=h8948797_3
- certifi=2019.11.28=py37_0
- cloudpickle=1.3.0=py_0
- cudatoolkit=10.0.130=0
- cudnn=7.6.5=cuda10.0_0
- cupti=10.0.130=0
- cycler=0.10.0=py37_0
- cytoolz=0.10.1=py37h7b6447c_0
- dask-core=2.10.1=py_0
- dbus=1.13.12=h746ee38_0
- decorator=4.4.1=py_0
- defusedxml=0.6.0=py_0
- entrypoints=0.3=py37_0
- expat=2.2.6=he6710b0_0
- fontconfig=2.13.0=h9420a91_0
- freetype=2.9.1=h8a8886c_1
- fribidi=1.0.5=h7b6447c_0
- gast=0.2.2=py37_0
- glib=2.63.1=h5a9c865_0
- gmp=6.1.2=h6c8ec71_1
- google-pasta=0.1.8=py_0
- graphite2=1.3.13=h23475e2_0
- graphviz=2.40.1=h21bd128_2
- grpcio=1.16.1=py37hf8bcb03_1
- gst-plugins-base=1.14.0=hbbd80ab_1
- gstreamer=1.14.0=hb453b48_1
- h5py=2.10.0=py37h7918eee_0
- harfbuzz=1.8.8=hffaf4a1_0
- hdf5=1.10.4=hb1b8bf9_0
- icu=58.2=h9c2bf20_1
- imageio=2.6.1=py37_0
- importlib_metadata=1.5.0=py37_0
- intel-openmp=2020.0=166
- ipykernel=5.1.4=py37h39e3cac_0
- ipython=7.12.0=py37h5ca1d4c_0
- ipython_genutils=0.2.0=py37_0
- jedi=0.16.0=py37_0
- jinja2=2.11.1=py_0
- joblib=0.14.1=py_0
- jpeg=9b=h024ee3a_2
- json5=0.9.1=py_0
- jsonschema=3.2.0=py37_0
- jupyter_client=5.3.4=py37_0
- jupyter_core=4.6.1=py37_0
- jupyterlab=1.2.6=pyhf63ae98_0
- jupyterlab_server=1.0.6=py_0
- keras-applications=1.0.8=py_0
- keras-preprocessing=1.1.0=py_1
- kiwisolver=1.1.0=py37he6710b0_0
- ld_impl_linux-64=2.33.1=h53a641e_7
- libedit=3.1.20181209=hc058e9b_0
- libffi=3.2.1=hd88cf55_4
- libgcc-ng=9.1.0=hdf63c60_0
- libgfortran-ng=7.3.0=hdf63c60_0
- libpng=1.6.37=hbc83047_0
- libprotobuf=3.11.3=hd408876_0
- libsodium=1.0.16=h1bed415_0
- libstdcxx-ng=9.1.0=hdf63c60_0
- libtiff=4.1.0=h2733197_0
- libuuid=1.0.3=h1bed415_2
- libxcb=1.13=h1bed415_1
- libxml2=2.9.9=hea5a465_1
- lz4-c=1.8.1.2=h14c3975_0
- lzo=2.10=h49e0be7_2
- markdown=3.1.1=py37_0
- markupsafe=1.1.1=py37h7b6447c_0
- matplotlib=3.1.3=py37_0
- matplotlib-base=3.1.3=py37hef1b27d_0
- mistune=0.8.4=py37h7b6447c_0
- mkl=2020.0=166
- mkl-service=2.3.0=py37he904b0f_0
- mkl_fft=1.0.15=py37ha843d7b_0
- mkl_random=1.1.0=py37hd6b4f25_0
- mock=4.0.1=py_0
- more-itertools=8.2.0=py_0
- nbconvert=5.6.1=py37_0
- nbformat=5.0.4=py_0
- ncurses=6.1=he6710b0_1
- networkx=2.4=py_0
- notebook=6.0.3=py37_0
- numexpr=2.7.1=py37h423224d_0
- numpy=1.18.1=py37h4f9e942_0
- numpy-base=1.18.1=py37hde5b4d6_1
- olefile=0.46=py37_0
- openssl=1.1.1d=h7b6447c_4
- opt_einsum=3.1.0=py_0
- pandas=1.0.1=py37h0573a6f_0
- pandoc=2.2.3.2=0
- pandocfilters=1.4.2=py37_1
- pango=1.42.4=h049681c_0
- parso=0.6.1=py_0
- patsy=0.5.1=py37_0
- pcre=8.43=he6710b0_0
- pexpect=4.8.0=py37_0
- pickleshare=0.7.5=py37_0
- pillow=7.0.0=py37hb39fc2d_0
- pip=20.0.2=py37_1
- pixman=0.38.0=h7b6447c_0
- prometheus_client=0.7.1=py_0
- prompt_toolkit=3.0.3=py_0
- protobuf=3.11.3=py37he6710b0_0
- ptyprocess=0.6.0=py37_0
- pydot=1.4.1=py37_0
- pygments=2.5.2=py_0
- pyparsing=2.4.6=py_0
- pyqt=5.9.2=py37h05f1152_2
- pyrsistent=0.15.7=py37h7b6447c_0
- pytables=3.6.1=py37h71ec239_0
- python=3.7.6=h0371630_2
- python-dateutil=2.8.1=py_0
- pytz=2019.3=py_0
- pywavelets=1.1.1=py37h7b6447c_0
- pyzmq=18.1.1=py37he6710b0_0
- qt=5.9.7=h5867ecd_1
- readline=7.0=h7b6447c_5
- scikit-image=0.16.2=py37h0573a6f_0
- scikit-learn=0.22.1=py37hd81dba3_0
- scipy=1.4.1=py37h0b6359f_0
- seaborn=0.10.0=py_0
- send2trash=1.5.0=py37_0
- setuptools=45.2.0=py37_0
- sip=4.19.8=py37hf484d3e_0
- six=1.14.0=py37_0
- snappy=1.1.7=hbae5bb6_3
- sqlite=3.31.1=h7b6447c_0
- statsmodels=0.11.0=py37h7b6447c_0
- tensorboard=2.0.0=pyhb38c66f_1
- tensorflow=2.0.0=gpu_py37h768510d_0
- tensorflow-base=2.0.0=gpu_py37h0ec5d1f_0
- tensorflow-estimator=2.0.0=pyh2649769_0
- tensorflow-gpu=2.0.0=h0d30ee6_0
- termcolor=1.1.0=py37_1
- terminado=0.8.3=py37_0
- testpath=0.4.4=py_0
- tk=8.6.8=hbc83047_0
- toolz=0.10.0=py_0
- tornado=6.0.3=py37h7b6447c_3
- traitlets=4.3.3=py37_0
- wcwidth=0.1.8=py_0
- webencodings=0.5.1=py37_1
- werkzeug=0.16.0=py_0
- wheel=0.34.2=py37_0
- wrapt=1.11.2=py37h7b6447c_0
- xz=5.2.4=h14c3975_4
- zeromq=4.3.1=he6710b0_3
- zipp=2.2.0=py_0
- zlib=1.2.11=h7b6447c_3
- zstd=1.3.7=h0b5b093_0
VERSION='0.1a'
\ No newline at end of file
<style>
div.warn {
background-color: #fcf2f2;
border-color: #dFb5b4;
border-left: 5px solid #dfb5b4;
padding: 0.5em;
font-weight: bold;
font-size: 1.1em;;
}
div.nota {
background-color: #DAFFDE;
border-left: 5px solid #92CC99;
padding: 0.5em;
}
</style>
fidle/img/00-Fidle-header-01.jpg

73.6 KiB

fidle/img/00-Fidle-header-01.png

10 KiB

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 319.4819 36.2319"><title>00-Fidle-header-01</title><g id="Calque_2" data-name="Calque 2"><g id="Calque_4" data-name="Calque 4"><path d="M19.6212,13.4825a5.49,5.49,0,0,0,2.2409-.7517,2.75,2.75,0,0,1,1.0037-.3925A6.2169,6.2169,0,0,0,20.4184,5.353a7.2454,7.2454,0,0,0-5.0435-.8518,10.436,10.436,0,0,0-4.3281,2.2353c-.4328.3626-5.581,5.2428-7.7283,4.27C1.8658,10.3486,4.46,7.9537,3.27,5.7652a.0949.0949,0,0,0-.1584-.0105c-.6056.817-1.1976,1.7975-2.0041,1.3573A3.7988,3.7988,0,0,1,.1729,5.89.0941.0941,0,0,0,0,5.9434a9.9185,9.9185,0,0,0,2.4932,6.0532,15.0278,15.0278,0,0,0,10.339,5.3173c2.27.2261,7.6543-.49,9.8054-4.36a5.4574,5.4574,0,0,0-.5189.2577,6.04,6.04,0,0,1-2.448.8142c-.0748.0069-.1491.01-.2234.01a4.3218,4.3218,0,0,1-2.44-.9782.4573.4573,0,1,1,.3495-.4436l-.0023.0218A3.5637,3.5637,0,0,0,19.6212,13.4825ZM12.76,15.5084a8.3323,8.3323,0,0,1-1.9609.3562c-.4428,0-.627-.1255-.7147-.314-.2306-.4961.6005-1.2133,1.3378-1.7279a.2726.2726,0,0,1,.312.4472,4.4932,4.4932,0,0,0-1.1262,1.0351,5.352,5.352,0,0,0,2.0105-.3235.2728.2728,0,0,1,.1415.5269ZM19.0763,8.863a1.0412,1.0412,0,0,1,1.0109,1.0032.68.68,0,1,0-.6023.9942.7023.7023,0,0,0,.1263-.0126.9691.9691,0,0,1-.5349.1646,1.0763,1.0763,0,0,1,0-2.1494ZM15.5649,1.8843a.5453.5453,0,0,0,.2143.7407c.2638.1453.82-.1708,1.1567.3.1751.2449-.3665-1.11-.63-1.2554A.5449.5449,0,0,0,15.5649,1.8843Zm2.7777.0584c-.68.3984-.8055,2.0455-.63,1.8007a3.1,3.1,0,0,1,1.1567-.8456.5453.5453,0,0,0-.5264-.9551ZM17.6534.1266c-.3475.402-.11,1.4443-.0473,1.2532a2.216,2.216,0,0,1,.5595-.7875.3573.3573,0,0,0-.0087-.505A.3538.3538,0,0,0,17.6534.1266Z" style="fill:#e12229"/><path d="M1.2153,20.5943H4.63v.41H1.6972v2.7481H4.3837v.41H1.6972v3.3428H1.2153Z" style="fill:#808285"/><path d="M6.4355,20.5943v6.9111H5.9536V20.5943Z" style="fill:#808285"/><path d="M8.1171,20.6865a11.3714,11.3714,0,0,1,1.7637-.1435,3.7468,3.7468,0,0,1,2.7891.9433,3.269,3.269,0,0,1,.8613,2.3892,3.8066,3.8066,0,0,1-.9024,2.625A3.97,3.97,0,0,1,9.645,27.5567a14.7357,14.7357,0,0,1-1.5279-.0616Zm.482,6.4087a8.7069,8.7069,0,0,0,1.1176.0513,2.96,2.96,0,0,0,3.312-3.24c.01-1.7535-.9638-2.9532-3.1787-2.9532a7.3291,7.3291,0,0,0-1.2509.1026Z" style="fill:#808285"/><path d="M14.7524,20.5943h.4819v6.5009h3.0864v.41H14.7524Z" style="fill:#808285"/><path d="M22.5976,24.07H19.829v3.0249h3.0967v.41H19.3471V20.5943h3.4146v.41H19.829V23.66h2.7686Z" style="fill:#808285"/><path d="M39.1845,4.6616h5.874v1.26H40.6752V9.9678h4.064V11.21h-4.064v5.4126H39.1845Z"/><path d="M53.5209,12.2749c0,3.2119-2.0053,4.5249-3.8506,4.5249-2.0942,0-3.727-1.6147-3.727-4.4184,0-2.9458,1.7568-4.5254,3.8511-4.5254C51.977,7.856,53.5209,9.542,53.5209,12.2749Zm-6.0512.0708c0,1.7393.8339,3.3184,2.2714,3.3184,1.4019,0,2.254-1.5972,2.254-3.354,0-1.42-.586-3.3-2.254-3.3C48.1083,9.01,47.47,10.8018,47.47,12.3457Z"/><path d="M55.3456,10.5713c0-.9229-.0356-1.7749-.0708-2.5376h1.3306l.0532,1.5791h.0537A2.4529,2.4529,0,0,1,58.93,7.856a2.6759,2.6759,0,0,1,.3906.0356V9.3467a1.864,1.864,0,0,0-.4614-.0357,2.0646,2.0646,0,0,0-1.9521,1.9346,3.2178,3.2178,0,0,0-.0708.7451v4.6319H55.3456Z"/><path d="M60.7211,10.3228c0-.9229-.0356-1.58-.0708-2.2891h1.313l.0889,1.2954h.0351A2.6985,2.6985,0,0,1,64.5541,7.856a2.3122,2.3122,0,0,1,2.2364,1.5971h.0351a3.1057,3.1057,0,0,1,.9405-1.0649,2.577,2.577,0,0,1,1.6684-.5322c1.1533,0,2.6084.7807,2.6084,3.5136v5.253H70.57V11.6182c0-1.5083-.4791-2.52-1.6685-2.52a1.8267,1.8267,0,0,0-1.668,1.3667,2.683,2.683,0,0,0-.1064.7807v5.377H65.6547V11.3345c0-1.2422-.48-2.2363-1.6152-2.2363a1.917,1.917,0,0,0-1.7388,1.5083,2.6343,2.6343,0,0,0-.1064.7631v5.253H60.7211Z"/><path d="M78.747,16.6226l-.1245-1.0293h-.0532a2.7825,2.7825,0,0,1-2.36,1.2065A2.36,2.36,0,0,1,73.76,14.3335c0-2.0942,1.81-3.1767,4.72-3.1592v-.2129c0-.8339-.2305-1.9873-1.792-1.97a3.6276,3.6276,0,0,0-1.9878.5859l-.3369-1.0292a5.0217,5.0217,0,0,1,2.5908-.6924c2.36,0,3.0166,1.5971,3.0166,3.39V14.6a14.2132,14.2132,0,0,0,.1245,2.023Zm-.2485-4.4009c-1.3843-.0181-3.23.23-3.23,1.9521a1.314,1.314,0,0,0,1.331,1.49A1.8735,1.8735,0,0,0,78.4453,14.28a1.5848,1.5848,0,0,0,.0532-.4971Z"/><path d="M84.0322,5.62V8.0337h2.0586V9.187H84.0322v4.7559c0,1.0825.32,1.5972,1.0825,1.5972a3.0043,3.0043,0,0,0,.7988-.0889l.0708,1.1357a3.3086,3.3086,0,0,1-1.2778.1953,2.044,2.044,0,0,1-1.5791-.6211,3.1748,3.1748,0,0,1-.5855-2.2006V9.187H81.2993V8.0337h1.2426V6.0283Z"/><path d="M89.3369,5.6734a.894.894,0,0,1-.9405.94.8716.8716,0,0,1-.8872-.94.9142.9142,0,1,1,1.8277,0Zm-1.668,10.9492V8.0337h1.5083v8.5889Z"/><path d="M98.581,12.2749c0,3.2119-2.0054,4.5249-3.8506,4.5249-2.0942,0-3.727-1.6147-3.727-4.4184,0-2.9458,1.7568-4.5254,3.851-4.5254C97.037,7.856,98.581,9.542,98.581,12.2749Zm-6.0513.0708c0,1.7393.834,3.3184,2.2715,3.3184,1.4019,0,2.2539-1.5972,2.2539-3.354,0-1.42-.5859-3.3-2.2539-3.3C93.1684,9.01,92.53,10.8018,92.53,12.3457Z"/><path d="M100.4062,10.3228c0-.9229-.0357-1.58-.0708-2.2891h1.3306l.0712,1.2954h.0533a2.8836,2.8836,0,0,1,2.5732-1.4731c1.189,0,2.7329.7632,2.7329,3.46v5.3062h-1.4907V11.4942c0-1.2779-.4258-2.396-1.7393-2.396a1.9932,1.9932,0,0,0-1.8632,1.5439,2.9542,2.9542,0,0,0-.0889.7456v5.2349h-1.5083Z"/><path d="M114.4921,4.6616v11.961h-1.4907V4.6616Z"/><path d="M117.0815,10.3228c0-.9229-.0357-1.58-.0708-2.2891h1.3305l.0713,1.2954h.0533A2.8835,2.8835,0,0,1,121.039,7.856c1.189,0,2.7329.7632,2.7329,3.46v5.3062h-1.4907V11.4942c0-1.2779-.4263-2.396-1.7393-2.396a1.9934,1.9934,0,0,0-1.8633,1.5439,2.9592,2.9592,0,0,0-.0888.7456v5.2349h-1.5083Z"/><path d="M127.8857,5.62V8.0337h2.0586V9.187h-2.0586v4.7559c0,1.0825.32,1.5972,1.0825,1.5972a3.0043,3.0043,0,0,0,.7988-.0889l.0708,1.1357a3.3083,3.3083,0,0,1-1.2778.1953,2.044,2.044,0,0,1-1.5791-.6211,3.1748,3.1748,0,0,1-.5855-2.2006V9.187h-1.2426V8.0337h1.2426V6.0283Z"/><path d="M131.5224,10.5713c0-.9229-.0356-1.7749-.0708-2.5376h1.3306l.0532,1.5791h.0537a2.4529,2.4529,0,0,1,2.2178-1.7568,2.6759,2.6759,0,0,1,.3906.0356V9.3467a1.864,1.864,0,0,0-.4614-.0357,2.0648,2.0648,0,0,0-1.9522,1.9346,3.2233,3.2233,0,0,0-.0708.7451v4.6319h-1.4907Z"/><path d="M143.73,12.2749c0,3.2119-2.0054,4.5249-3.8506,4.5249-2.0942,0-3.727-1.6147-3.727-4.4184,0-2.9458,1.7568-4.5254,3.8511-4.5254C142.186,7.856,143.73,9.542,143.73,12.2749Zm-6.0513.0708c0,1.7393.834,3.3184,2.2715,3.3184,1.4019,0,2.2539-1.5972,2.2539-3.354,0-1.42-.5859-3.3-2.2539-3.3C138.3173,9.01,137.6786,10.8018,137.6786,12.3457Z"/><path d="M152.2988,4.1118V14.4575c0,.71.0351,1.5972.0708,2.1651h-1.3311l-.0708-1.3662h-.0532A2.7766,2.7766,0,0,1,148.3412,16.8c-1.8989,0-3.3364-1.7036-3.3364-4.3652,0-2.9282,1.6328-4.5786,3.4785-4.5786a2.4975,2.4975,0,0,1,2.2891,1.2246h.0356V4.1118Zm-1.4908,7.3467a4.0769,4.0769,0,0,0-.0532-.6387,2.0659,2.0659,0,0,0-1.97-1.7568c-1.4732,0-2.2539,1.4727-2.2539,3.3008,0,1.7744.7451,3.2119,2.2182,3.2119a2.0694,2.0694,0,0,0,1.9874-1.7393,2.4325,2.4325,0,0,0,.0712-.6386Z"/><path d="M161.24,14.28c0,.9048.0356,1.668.0713,2.3423h-1.3135l-.0889-1.26h-.0351a2.896,2.896,0,0,1-2.5376,1.437c-1.4024,0-2.6978-.8691-2.6978-3.62V8.0337h1.4907v4.8975c0,1.5439.4258,2.6264,1.6861,2.6264a1.9727,1.9727,0,0,0,1.81-1.3486,2.6964,2.6964,0,0,0,.1241-.7983V8.0337H161.24Z"/><path d="M169.1869,16.3384a5.0911,5.0911,0,0,1-2.165.4438c-2.36,0-3.94-1.686-3.94-4.3652a4.2057,4.2057,0,0,1,4.2592-4.543,4.4515,4.4515,0,0,1,1.8809.39l-.3369,1.1714a3.42,3.42,0,0,0-1.5615-.355c-1.7925,0-2.7154,1.5259-2.7154,3.2651,0,2.0054,1.1182,3.2119,2.6973,3.2119a3.8408,3.8408,0,0,0,1.6328-.355Z"/><path d="M172.8754,5.62V8.0337h2.0586V9.187h-2.0586v4.7559c0,1.0825.32,1.5972,1.0825,1.5972a3.0052,3.0052,0,0,0,.7989-.0889l.0708,1.1357a3.31,3.31,0,0,1-1.2774.1953,2.0446,2.0446,0,0,1-1.58-.6211,3.1748,3.1748,0,0,1-.5854-2.2006V9.187H170.143V8.0337h1.2422V6.0283Z"/><path d="M178.18,5.6734a.894.894,0,0,1-.94.94.8716.8716,0,0,1-.8872-.94.9142.9142,0,1,1,1.8276,0Zm-1.6679,10.9492V8.0337H178.02v8.5889Z"/><path d="M187.4238,12.2749c0,3.2119-2.0054,4.5249-3.8506,4.5249-2.0943,0-3.7271-1.6147-3.7271-4.4184,0-2.9458,1.7569-4.5254,3.8511-4.5254C185.88,7.856,187.4238,9.542,187.4238,12.2749Zm-6.0513.0708c0,1.7393.834,3.3184,2.2715,3.3184,1.4018,0,2.2539-1.5972,2.2539-3.354,0-1.42-.586-3.3-2.2539-3.3C182.0112,9.01,181.3725,10.8018,181.3725,12.3457Z"/><path d="M189.249,10.3228c0-.9229-.0357-1.58-.0708-2.2891h1.3305l.0713,1.2954h.0532a2.8837,2.8837,0,0,1,2.5733-1.4731c1.1889,0,2.7329.7632,2.7329,3.46v5.3062h-1.4907V11.4942c0-1.2779-.4258-2.396-1.7393-2.396a1.9934,1.9934,0,0,0-1.8633,1.5439,2.9592,2.9592,0,0,0-.0888.7456v5.2349H189.249Z"/><path d="M206.14,16.6226l-.1245-1.0293h-.0532a2.7825,2.7825,0,0,1-2.36,1.2065,2.36,2.36,0,0,1-2.4487-2.4663c0-2.0942,1.81-3.1767,4.72-3.1592v-.2129c0-.8339-.23-1.9873-1.792-1.97a3.6273,3.6273,0,0,0-1.9878.5859l-.3369-1.0292a5.0217,5.0217,0,0,1,2.5908-.6924c2.36,0,3.0166,1.5971,3.0166,3.39V14.6a14.2132,14.2132,0,0,0,.1245,2.023Zm-.2485-4.4009c-1.3843-.0181-3.23.23-3.23,1.9521a1.314,1.314,0,0,0,1.331,1.49,1.8733,1.8733,0,0,0,1.8457-1.3838,1.5819,1.5819,0,0,0,.0533-.4971Z"/><path d="M216.27,14.28c0,.9048.0356,1.668.0713,2.3423h-1.3135l-.0889-1.26h-.0351a2.896,2.896,0,0,1-2.5376,1.437c-1.4024,0-2.6978-.8691-2.6978-3.62V8.0337h1.4907v4.8975c0,1.5439.4258,2.6264,1.6861,2.6264a1.9728,1.9728,0,0,0,1.81-1.3486,2.6966,2.6966,0,0,0,.124-.7983V8.0337H216.27Z"/><path d="M222.21,4.8213a16.8353,16.8353,0,0,1,2.8574-.248,5.9357,5.9357,0,0,1,4.2236,1.3305,5.6509,5.6509,0,0,1,1.668,4.4546,6.55,6.55,0,0,1-1.6328,4.7734,6.464,6.464,0,0,1-4.6846,1.58,19.1885,19.1885,0,0,1-2.4316-.1245Zm1.4907,10.6123a8.7023,8.7023,0,0,0,1.2422.0708c2.7686,0,4.4546-1.6147,4.4546-5.0928.0176-2.8925-1.3843-4.6318-4.2417-4.6318a7.5156,7.5156,0,0,0-1.4551.124Z"/><path d="M233.76,12.5586c.0352,2.2715,1.2773,3.0523,2.6616,3.0523a5.0482,5.0482,0,0,0,2.0943-.4083l.2661,1.0826a6.2362,6.2362,0,0,1-2.5733.497c-2.4668,0-3.9043-1.7392-3.9043-4.33,0-2.6441,1.4375-4.5962,3.709-4.5962,2.4844,0,3.1944,2.2715,3.1944,3.9575a7.0326,7.0326,0,0,1-.0357.7451Zm4.01-1.0825c.018-1.2066-.479-2.52-1.899-2.52-1.3838,0-1.9873,1.4018-2.0937,2.52Z"/><path d="M241.92,12.5586c.0352,2.2715,1.2774,3.0523,2.6617,3.0523a5.0477,5.0477,0,0,0,2.0942-.4083l.2661,1.0826a6.2357,6.2357,0,0,1-2.5732.497c-2.4668,0-3.9043-1.7392-3.9043-4.33,0-2.6441,1.4375-4.5962,3.709-4.5962,2.4843,0,3.1943,2.2715,3.1943,3.9575a7.0657,7.0657,0,0,1-.0356.7451Zm4.01-1.0825c.0181-1.2066-.479-2.52-1.8989-2.52-1.3838,0-1.9873,1.4018-2.0938,2.52Z"/><path d="M249.1752,10.8018c0-1.1709-.0356-2.023-.0708-2.7681h1.3487l.0708,1.3486h.0356a2.9639,2.9639,0,0,1,2.68-1.5263c1.8989,0,3.3008,1.7036,3.3008,4.3833,0,3.1235-1.7217,4.5605-3.5318,4.5605a2.5779,2.5779,0,0,1-2.3066-1.2422h-.0356v4.543h-1.4908Zm1.4908,2.4311a2.5684,2.5684,0,0,0,.0708.6568,2.0816,2.0816,0,0,0,2.0053,1.7212c1.5083,0,2.2715-1.42,2.2715-3.3184,0-1.7393-.7451-3.2119-2.2358-3.2119a2.2068,2.2068,0,0,0-2.023,1.81,2.64,2.64,0,0,0-.0888.6387Z"/><path d="M261.9125,4.6616h1.4908V15.3628h4.5961v1.26h-6.0869Z"/><path d="M270.1806,12.5586c.0352,2.2715,1.2773,3.0523,2.6616,3.0523a5.0482,5.0482,0,0,0,2.0943-.4083l.2661,1.0826a6.2362,6.2362,0,0,1-2.5733.497c-2.4668,0-3.9043-1.7392-3.9043-4.33,0-2.6441,1.4375-4.5962,3.709-4.5962,2.4844,0,3.1944,2.2715,3.1944,3.9575a7.0326,7.0326,0,0,1-.0357.7451Zm4.01-1.0825c.018-1.2066-.479-2.52-1.899-2.52-1.3838,0-1.9873,1.4018-2.0937,2.52Z"/><path d="M281.8012,16.6226l-.1245-1.0293h-.0532a2.7825,2.7825,0,0,1-2.36,1.2065,2.36,2.36,0,0,1-2.4487-2.4663c0-2.0942,1.81-3.1767,4.72-3.1592v-.2129c0-.8339-.2305-1.9873-1.792-1.97a3.6276,3.6276,0,0,0-1.9878.5859l-.3369-1.0292a5.0217,5.0217,0,0,1,2.5908-.6924c2.36,0,3.0166,1.5971,3.0166,3.39V14.6a14.2132,14.2132,0,0,0,.1245,2.023Zm-.2485-4.4009c-1.3843-.0181-3.23.23-3.23,1.9521a1.314,1.314,0,0,0,1.331,1.49,1.8733,1.8733,0,0,0,1.8457-1.3838,1.5819,1.5819,0,0,0,.0533-.4971Z"/><path d="M285.3652,10.5713c0-.9229-.0357-1.7749-.0708-2.5376h1.3305l.0533,1.5791h.0537A2.4527,2.4527,0,0,1,288.95,7.856a2.6786,2.6786,0,0,1,.3907.0356V9.3467a1.8644,1.8644,0,0,0-.4615-.0357,2.0646,2.0646,0,0,0-1.9521,1.9346,3.2233,3.2233,0,0,0-.0708.7451v4.6319h-1.4907Z"/><path d="M290.7407,10.3228c0-.9229-.0357-1.58-.0708-2.2891H292l.0713,1.2954h.0532a2.8837,2.8837,0,0,1,2.5733-1.4731c1.1889,0,2.7329.7632,2.7329,3.46v5.3062H295.94V11.4942c0-1.2779-.4263-2.396-1.7393-2.396a1.9934,1.9934,0,0,0-1.8633,1.5439,2.9592,2.9592,0,0,0-.0888.7456v5.2349h-1.5083Z"/><path d="M301.456,5.6734a.894.894,0,0,1-.94.94.8716.8716,0,0,1-.8872-.94.9142.9142,0,1,1,1.8276,0Zm-1.668,10.9492V8.0337h1.5083v8.5889Z"/><path d="M303.6733,10.3228c0-.9229-.0357-1.58-.0708-2.2891h1.33l.0713,1.2954h.0533a2.8835,2.8835,0,0,1,2.5732-1.4731c1.189,0,2.7329.7632,2.7329,3.46v5.3062H308.873V11.4942c0-1.2779-.4263-2.396-1.7393-2.396a1.9934,1.9934,0,0,0-1.8633,1.5439,2.9592,2.9592,0,0,0-.0888.7456v5.2349h-1.5083Z"/><path d="M319.4819,8.0337c-.0357.603-.0708,1.3306-.0708,2.4487V15.416c0,2.0762-.3731,3.1587-1.1006,3.8687a4.0969,4.0969,0,0,1-2.8745.9936,4.9764,4.9764,0,0,1-2.5733-.6211l.355-1.1538a4.4965,4.4965,0,0,0,2.2534.586c1.4375,0,2.4668-.7808,2.4668-2.8926v-.9229h-.0356a2.65,2.65,0,0,1-2.4131,1.313c-1.9522,0-3.3189-1.7744-3.3189-4.2055,0-2.9815,1.7569-4.5254,3.5318-4.5254a2.5523,2.5523,0,0,1,2.36,1.3667h.0357l.0532-1.189ZM317.92,11.2813a2.8123,2.8123,0,0,0-.0712-.6748,2.0058,2.0058,0,0,0-1.9165-1.5435c-1.3311,0-2.2359,1.2773-2.2359,3.2471,0,1.8281.7984,3.1235,2.2183,3.1235a1.9791,1.9791,0,0,0,1.8989-1.5083,3.0974,3.0974,0,0,0,.1064-.7988Z"/><line x1="30.9665" y1="4.4557" x2="30.9665" y2="27.3725" style="fill:#58595b"/><path d="M39.5317,26.3086a1.7032,1.7032,0,0,0,.9038.273A.9567.9567,0,0,0,41.5,25.6084c0-.5254-.28-.8408-.8613-1.1069-.5884-.2451-1.1138-.6372-1.1138-1.3028a1.1968,1.1968,0,0,1,1.2886-1.1836,1.5059,1.5059,0,0,1,.84.21l-.1259.2729a1.3163,1.3163,0,0,0-.7422-.21.846.846,0,0,0-.9385.84c0,.5391.3008.7915.8965,1.0713.707.3506,1.0786.7217,1.0786,1.3731a1.2716,1.2716,0,0,1-1.4009,1.2885,1.85,1.85,0,0,1-1.0088-.2871Z"/><path d="M45.2382,25.0967c0,1.2471-.7495,1.772-1.4287,1.772-.7495,0-1.373-.6231-1.373-1.73,0-1.1768.68-1.772,1.4218-1.772C44.65,23.3672,45.2382,24.0044,45.2382,25.0967Zm-2.4721.0283c0,.75.4062,1.4707,1.0644,1.4707s1.0786-.7212,1.0786-1.4917c0-.5884-.2734-1.4639-1.0649-1.4639C43.0742,23.64,42.7661,24.4526,42.7661,25.125Z"/><path d="M46.0273,24.3755c0-.3081-.0137-.6445-.0279-.9385h.3013l.0142.6446h.0137a.9865.9865,0,0,1,.89-.7144.5785.5785,0,0,1,.1118.0068v.3223a.6493.6493,0,0,0-.126-.0073c-.455,0-.7631.4136-.8335.9106a2.2678,2.2678,0,0,0-.021.3081v1.8911h-.3222Z"/><path d="M49.5566,26.7988l-.0425-.4482h-.021a1.08,1.08,0,0,1-.9385.5181.88.88,0,0,1-.9175-.9244c0-.7841.6656-1.2255,1.8492-1.2187v-.0981c0-.4063-.07-.9874-.7774-.9874a1.3173,1.3173,0,0,0-.7353.2242l-.0982-.2383a1.6034,1.6034,0,0,1,.8824-.2588c.8125,0,1.0507.5879,1.0507,1.2534v1.3936a5.7536,5.7536,0,0,0,.042.7846Zm-.07-1.8c-.5884-.0141-1.5059.07-1.5059.9034a.6064.6064,0,0,0,.6094.6933.8715.8715,0,0,0,.8686-.6655.7406.7406,0,0,0,.0279-.2031Z"/><path d="M50.6894,23.437l.77,2.15c.0913.2588.168.5249.2241.7422h.0142c.063-.21.147-.4761.2309-.7563l.7217-2.1363h.3428l-.8472,2.3184a5.9218,5.9218,0,0,1-1.0576,2.1782,2.1343,2.1343,0,0,1-.56.3921l-.126-.273a1.7412,1.7412,0,0,0,.5605-.4135,2.848,2.848,0,0,0,.49-.7915.5422.5422,0,0,0,.042-.1607.501.501,0,0,0-.0352-.14l-1.1138-3.11Z"/><path d="M55.22,26.7988l-.0425-.4482h-.021a1.08,1.08,0,0,1-.9385.5181.88.88,0,0,1-.9175-.9244c0-.7841.6656-1.2255,1.8492-1.2187v-.0981c0-.4063-.07-.9874-.7774-.9874a1.3173,1.3173,0,0,0-.7353.2242l-.0982-.2383a1.6033,1.6033,0,0,1,.8823-.2588c.8125,0,1.0508.5879,1.0508,1.2534v1.3936a5.7536,5.7536,0,0,0,.042.7846Zm-.07-1.8c-.5884-.0141-1.5059.07-1.5059.9034a.6064.6064,0,0,0,.6094.6933.8715.8715,0,0,0,.8686-.6655.7406.7406,0,0,0,.0279-.2031Z"/><path d="M58.4179,25.1528l-.5185,1.646H57.57l1.5268-4.7207h.3154l1.5269,4.7207h-.33l-.5322-1.646Zm1.5689-.2729-.49-1.499a7.9831,7.9831,0,0,1-.2383-.91h-.021c-.0629.3081-.14.5879-.2309.9033L58.5087,24.88Z"/><path d="M61.63,24.3755c0-.3081-.0137-.6445-.0278-.9385h.3012l.0142.6446h.0137a.9865.9865,0,0,1,.89-.7144.578.578,0,0,1,.1118.0068v.3223a.6482.6482,0,0,0-.1259-.0073c-.4551,0-.7632.4136-.8335.9106a2.2518,2.2518,0,0,0-.021.3081v1.8911H61.63Z"/><path d="M63.9824,22.5054a.2576.2576,0,0,1-.2662.28.2536.2536,0,0,1-.2451-.28.2624.2624,0,0,1,.252-.28A.26.26,0,0,1,63.9824,22.5054Zm-.42,4.2934V23.437h.3223v3.3618Z"/><path d="M66.5805,26.7988l-.042-.4482H66.517a1.08,1.08,0,0,1-.9384.5181.88.88,0,0,1-.9175-.9244c0-.7841.6655-1.2255,1.8491-1.2187v-.0981c0-.4063-.07-.9874-.7774-.9874a1.3175,1.3175,0,0,0-.7353.2242l-.0981-.2383a1.6028,1.6028,0,0,1,.8823-.2588c.8125,0,1.0508.5879,1.0508,1.2534v1.3936a5.7538,5.7538,0,0,0,.0419.7846Zm-.07-1.8c-.5884-.0141-1.5059.07-1.5059.9034a.6064.6064,0,0,0,.6094.6933.8712.8712,0,0,0,.8687-.6655.74.74,0,0,0,.0278-.2031Z"/><path d="M67.706,26.3716a1.321,1.321,0,0,0,.6792.2173.6363.6363,0,0,0,.7217-.6377c0-.3428-.1822-.5532-.63-.7632-.4976-.231-.8057-.5112-.8057-.9316a.9042.9042,0,0,1,.9737-.8892,1.1913,1.1913,0,0,1,.6865.2031l-.1333.2661a.96.96,0,0,0-.5952-.1963.5632.5632,0,0,0-.6094.5674c0,.3291.1963.4761.6162.6866.4766.2168.8193.49.8193,1.0083a.9566.9566,0,0,1-1.0644.9594,1.3761,1.3761,0,0,1-.7773-.2241Z"/><path d="M69.7993,27.6812a9.6153,9.6153,0,0,0,.3637-1.4849l.4273-.07a8.7994,8.7994,0,0,1-.5391,1.52Z"/><path d="M74.7841,24.4526H73.0893v2.066h1.9048v.28H72.767V22.0781h2.1221v.28h-1.8v1.814h1.6948Z"/><path d="M75.707,24.3755c0-.3081-.0137-.6445-.0279-.9385H75.98l.0142.6446h.0136a.9865.9865,0,0,1,.89-.7144.5785.5785,0,0,1,.1118.0068v.3223a.65.65,0,0,0-.126-.0073c-.4551,0-.7632.4136-.8335.9106a2.2678,2.2678,0,0,0-.021.3081v1.8911H75.707Z"/><path d="M78.059,22.5054a.2576.2576,0,0,1-.2661.28.2535.2535,0,0,1-.2451-.28.2624.2624,0,0,1,.2519-.28A.26.26,0,0,1,78.059,22.5054Zm-.42,4.2934V23.437h.3223v3.3618Z"/><path d="M81.0771,26.6655a1.81,1.81,0,0,1-.8472.1963,1.5145,1.5145,0,0,1-1.4712-1.7158,1.6208,1.6208,0,0,1,1.5762-1.7788,1.5149,1.5149,0,0,1,.7563.1821l-.1123.273a1.3787,1.3787,0,0,0-.686-.1753c-.8125,0-1.2046.7217-1.2046,1.4848,0,.89.49,1.45,1.19,1.45a1.5933,1.5933,0,0,0,.7144-.168Z"/><path d="M86.8461,24.5508c-.0425-.7144-.0981-1.541-.0844-2.0732h-.0279c-.1469.5253-.3222,1.0717-.5674,1.7651l-.9033,2.5561H85.06l-.8477-2.48c-.2519-.7353-.434-1.3027-.56-1.8417h-.021c-.0073.5673-.042,1.3515-.0913,2.1362l-.126,2.185h-.3223l.3155-4.7207h.3711l.9106,2.6338c.2031.6162.3569,1.0713.4829,1.5547h.021c.1123-.4692.2661-.9106.4834-1.5478l.9248-2.6407H87l.2945,4.7207h-.3223Z"/><path d="M89.9037,26.7988l-.0419-.4482H89.84a1.08,1.08,0,0,1-.9385.5181.88.88,0,0,1-.9175-.9244c0-.7841.6655-1.2255,1.8491-1.2187v-.0981c0-.4063-.07-.9874-.7773-.9874a1.3176,1.3176,0,0,0-.7354.2242l-.0981-.2383a1.6031,1.6031,0,0,1,.8823-.2588c.8125,0,1.0508.5879,1.0508,1.2534v1.3936a5.7376,5.7376,0,0,0,.042.7846Zm-.07-1.8c-.5883-.0141-1.5058.07-1.5058.9034a.6064.6064,0,0,0,.6093.6933.8712.8712,0,0,0,.8687-.6655.74.74,0,0,0,.0278-.2031Z"/><path d="M91.162,21.8613h.3223v4.9375H91.162Z"/><path d="M94.9648,21.8613v4.188c0,.2173.0137.5464.0278.75h-.2939l-.021-.5815h-.021a1.1046,1.1046,0,0,1-1.0508.6514c-.7212,0-1.2959-.6372-1.2959-1.7017,0-1.1484.63-1.8,1.352-1.8a1.0329,1.0329,0,0,1,.9595.5459h.0142V21.8613Zm-.3291,2.8853a2.1051,2.1051,0,0,0-.021-.2871A.9719.9719,0,0,0,93.69,23.64c-.6724,0-1.05.6656-1.05,1.4991,0,.7563.3218,1.4565,1.0224,1.4565a.9824.9824,0,0,0,.9454-.84,1.07,1.07,0,0,0,.0283-.2661Z"/><path d="M98.5488,25.0967c0,1.2471-.7495,1.772-1.4287,1.772-.75,0-1.3731-.6231-1.3731-1.73,0-1.1768.68-1.772,1.4219-1.772C97.96,23.3672,98.5488,24.0044,98.5488,25.0967Zm-2.4722.0283c0,.75.4062,1.4707,1.0645,1.4707S98.22,25.8745,98.22,25.104c0-.5884-.2735-1.4639-1.065-1.4639C96.3847,23.64,96.0766,24.4526,96.0766,25.125Z"/><path d="M99.3383,24.2354c0-.3433-.0137-.5391-.0278-.7984h.3013l.021.5464h.0141a1.1256,1.1256,0,0,1,1.0293-.6162c.3364,0,1.0508.189,1.0508,1.3237v2.1079h-.3223V24.7466c0-.5742-.1889-1.1-.8193-1.1a.9326.9326,0,0,0-.8828.75.966.966,0,0,0-.042.2944v2.1079h-.3223Z"/><path d="M104.4,26.7988l-.0425-.4482h-.0209a1.08,1.08,0,0,1-.9385.5181.88.88,0,0,1-.9175-.9244c0-.7841.6655-1.2255,1.8491-1.2187v-.0981c0-.4063-.07-.9874-.7773-.9874a1.3176,1.3176,0,0,0-.7354.2242l-.0981-.2383a1.6031,1.6031,0,0,1,.8823-.2588c.8125,0,1.0508.5879,1.0508,1.2534v1.3936a5.7376,5.7376,0,0,0,.042.7846Zm-.07-1.8c-.5884-.0141-1.5058.07-1.5058.9034a.6064.6064,0,0,0,.6093.6933.8717.8717,0,0,0,.8687-.6655.74.74,0,0,0,.0278-.2031Z"/><path d="M108.0688,21.8613v4.188c0,.2173.0137.5464.0278.75h-.2939l-.021-.5815h-.021a1.1046,1.1046,0,0,1-1.0508.6514c-.7212,0-1.2959-.6372-1.2959-1.7017,0-1.1484.63-1.8,1.3521-1.8a1.0329,1.0329,0,0,1,.9594.5459h.0142V21.8613Zm-.3291,2.8853a2.0309,2.0309,0,0,0-.0215-.2871.9713.9713,0,0,0-.9243-.8194c-.6724,0-1.05.6656-1.05,1.4991,0,.7563.3218,1.4565,1.0225,1.4565a.9824.9824,0,0,0,.9453-.84,1.07,1.07,0,0,0,.0283-.2661Z"/><path d="M111.6528,25.0967c0,1.2471-.7495,1.772-1.4287,1.772-.75,0-1.3731-.6231-1.3731-1.73,0-1.1768.68-1.772,1.4219-1.772C111.0644,23.3672,111.6528,24.0044,111.6528,25.0967Zm-2.4722.0283c0,.75.4058,1.4707,1.0645,1.4707s1.0786-.7212,1.0786-1.4917c0-.5884-.2735-1.4639-1.0645-1.4639C109.4887,23.64,109.1806,24.4526,109.1806,25.125Z"/><path d="M111.9316,27.6812a9.6038,9.6038,0,0,0,.3637-1.4849l.4273-.07a8.7994,8.7994,0,0,1-.5391,1.52Z"/><path d="M115.768,22.0781h.3223v3.334c0,1.1-.5044,1.4566-1.1768,1.4566a1.5443,1.5443,0,0,1-.49-.084l.063-.273a1.0852,1.0852,0,0,0,.4131.0772c.5605,0,.8686-.2525.8686-1.2329Z"/><path d="M117.1879,25.0547c0,1.1626.5532,1.5269,1.149,1.5269a1.5524,1.5524,0,0,0,.8051-.1748l.084.2519a1.8851,1.8851,0,0,1-.9311.2031c-.8965,0-1.4292-.7-1.4292-1.6948,0-1.1064.5673-1.8,1.3588-1.8.9737,0,1.1695.9663,1.1695,1.4844a1.7348,1.7348,0,0,1-.0069.2031Zm1.87-.2588c.0069-.5747-.2309-1.1558-.8754-1.1558-.6373,0-.9244.63-.98,1.1558Z"/><path d="M121.83,26.7988l-.0425-.4482h-.021a1.08,1.08,0,0,1-.9384.5181.88.88,0,0,1-.9175-.9244c0-.7841.6655-1.2255,1.8491-1.2187v-.0981c0-.4063-.07-.9874-.7773-.9874a1.3176,1.3176,0,0,0-.7354.2242l-.0981-.2383a1.6028,1.6028,0,0,1,.8823-.2588c.8125,0,1.0508.5879,1.0508,1.2534v1.3936a5.7376,5.7376,0,0,0,.042.7846Zm-.07-1.8c-.5884-.0141-1.5059.07-1.5059.9034a.6064.6064,0,0,0,.6094.6933.8717.8717,0,0,0,.8687-.6655.74.74,0,0,0,.0278-.2031Z"/><path d="M123.0888,24.2354c0-.3433-.0137-.5391-.0278-.7984h.3012l.021.5464h.0142a1.1256,1.1256,0,0,1,1.0293-.6162c.3364,0,1.0508.189,1.0508,1.3237v2.1079h-.3223V24.7466c0-.5742-.189-1.1-.8193-1.1a.9326.9326,0,0,0-.8828.75.966.966,0,0,0-.042.2944v2.1079h-.3223Z"/><path d="M127.8422,24.7818v.28h-1.6528v-.28Z"/><path d="M128.5839,22.0781h.3223v4.4478h1.8911v.2729h-2.2134Z"/><path d="M133.6391,25.9722c0,.3222.0142.5815.0278.8266h-.2939l-.0283-.5254h-.0137a1.1574,1.1574,0,0,1-1.0156.5953c-.4624,0-1.03-.28-1.03-1.4078V23.437h.3222v1.9541c0,.6934.1822,1.1978.7847,1.1978a.9653.9653,0,0,0,.8755-.6514,1.4313,1.4313,0,0,0,.0488-.3574V23.437h.3223Z"/><path d="M136.7465,26.6655a1.81,1.81,0,0,1-.8471.1963,1.5145,1.5145,0,0,1-1.4712-1.7158,1.6208,1.6208,0,0,1,1.5761-1.7788,1.5153,1.5153,0,0,1,.7564.1821l-.1123.273a1.3794,1.3794,0,0,0-.6861-.1753c-.8125,0-1.2045.7217-1.2045,1.4848,0,.89.49,1.45,1.19,1.45a1.5925,1.5925,0,0,0,.7143-.168Z"/><path d="M138.88,22.1343a4.5191,4.5191,0,0,1,.9033-.0908,1.567,1.567,0,0,1,1.1416.3847,1.24,1.24,0,0,1,.3506.9317,1.3833,1.3833,0,0,1-.2944.9175,1.6368,1.6368,0,0,1-1.2954.54,2.0535,2.0535,0,0,1-.4834-.042v2.0239H138.88Zm.3223,2.3535a1.6865,1.6865,0,0,0,.49.0557,1.1055,1.1055,0,0,0,1.2539-1.1626c0-.6792-.4414-1.0576-1.1767-1.0576a2.5523,2.5523,0,0,0-.5674.0493Z"/><path d="M143.5229,26.7988l-.042-.4482h-.0215a1.08,1.08,0,0,1-.9385.5181.88.88,0,0,1-.9174-.9244c0-.7841.6655-1.2255,1.8491-1.2187v-.0981c0-.4063-.07-.9874-.7774-.9874a1.3173,1.3173,0,0,0-.7353.2242l-.0982-.2383a1.6034,1.6034,0,0,1,.8824-.2588c.8125,0,1.0507.5879,1.0507,1.2534v1.3936a5.7536,5.7536,0,0,0,.042.7846Zm-.07-1.8c-.5884-.0141-1.5059.07-1.5059.9034a.6064.6064,0,0,0,.6094.6933.871.871,0,0,0,.8686-.6655.7406.7406,0,0,0,.0279-.2031Z"/><path d="M144.7812,24.3755c0-.3081-.0137-.6445-.0278-.9385h.3012l.0142.6446h.0137a.9865.9865,0,0,1,.89-.7144.578.578,0,0,1,.1118.0068v.3223a.6488.6488,0,0,0-.126-.0073c-.455,0-.7631.4136-.8335.9106a2.268,2.268,0,0,0-.0209.3081v1.8911h-.3223Z"/><path d="M149.144,25.0967c0,1.2471-.75,1.772-1.4287,1.772-.75,0-1.3731-.6231-1.3731-1.73,0-1.1768.68-1.772,1.4219-1.772C148.5556,23.3672,149.144,24.0044,149.144,25.0967Zm-2.4722.0283c0,.75.4058,1.4707,1.0645,1.4707s1.0786-.7212,1.0786-1.4917c0-.5884-.2735-1.4639-1.0645-1.4639C146.98,23.64,146.6718,24.4526,146.6718,25.125Z"/><path d="M152.2656,25.9722c0,.3222.0141.5815.0278.8266h-.294l-.0283-.5254h-.0136a1.1575,1.1575,0,0,1-1.0157.5953c-.4624,0-1.03-.28-1.03-1.4078V23.437h.3223v1.9541c0,.6934.1821,1.1978.7847,1.1978a.9654.9654,0,0,0,.8755-.6514,1.4313,1.4313,0,0,0,.0488-.3574V23.437h.3223Z"/><path d="M153.7485,22.4917v.9453h.8618v.2661h-.8618v2.22c0,.434.1333.6655.4482.6655a.9507.9507,0,0,0,.33-.0493l.042.2524a1.0879,1.0879,0,0,1-.42.07.6636.6636,0,0,1-.5391-.2241,1.2232,1.2232,0,0,1-.1894-.7915V23.7031h-.5181V23.437h.5181v-.8335Z"/><path d="M155.2739,23.437l.77,2.15c.0913.2588.1679.5249.2241.7422h.0142c.0629-.21.1469-.4761.2309-.7563l.7217-2.1363h.3428l-.8472,2.3184a5.9218,5.9218,0,0,1-1.0576,2.1782,2.1326,2.1326,0,0,1-.5606.3921l-.1259-.273a1.7423,1.7423,0,0,0,.5605-.4135,2.85,2.85,0,0,0,.49-.7915.539.539,0,0,0,.042-.1607.5.5,0,0,0-.0351-.14l-1.1138-3.11Z"/><path d="M160.9238,24.7818v.28h-1.6529v-.28Z"/><path d="M165.88,26.6587a2.5779,2.5779,0,0,1-1.0854.2031c-1.0225,0-2.003-.6865-2.003-2.3882a2.1666,2.1666,0,0,1,2.1363-2.4585,2.0588,2.0588,0,0,1,.9311.1753l-.105.28a1.9019,1.9019,0,0,0-.84-.1753c-1.0366,0-1.7861.7354-1.7861,2.1641,0,1.394.6933,2.1221,1.7583,2.1221a2.1036,2.1036,0,0,0,.9033-.189Z"/><path d="M166.6142,26.7988V22.0781h.3081l1.5762,2.6827c.3359.5952.602,1.0927.8193,1.583l.0137-.0074c-.0488-.7143-.0557-1.2324-.0557-1.9887v-2.27h.315v4.7207h-.3081l-1.5621-2.6894a14.8094,14.8094,0,0,1-.8261-1.583l-.0142.0073c.042.6231.042,1.1343.042,1.9961v2.269Z"/><path d="M170.6528,22.1411a4.1559,4.1559,0,0,1,.9033-.0976,1.572,1.572,0,0,1,1.17.3779,1.216,1.216,0,0,1,.3223.8545,1.2421,1.2421,0,0,1-.8828,1.2329v.0137c.3784.1123.6025.4692.7143,1.0434a6.0279,6.0279,0,0,0,.3223,1.2329h-.336a6.8731,6.8731,0,0,1-.2871-1.1626c-.1333-.6792-.4135-.98-1.0087-1.0014h-.5953v2.164h-.3222Zm.3222,2.2344h.6026a1.0323,1.0323,0,0,0,1.1416-1.0435c0-.6933-.4483-1.0156-1.1768-1.0156a2.4091,2.4091,0,0,0-.5674.0562Z"/><path d="M173.7607,26.3086a1.7032,1.7032,0,0,0,.9038.273.9567.9567,0,0,0,1.0644-.9732c0-.5254-.28-.8408-.8613-1.1069-.5884-.2451-1.1138-.6372-1.1138-1.3028a1.1968,1.1968,0,0,1,1.2886-1.1836,1.5066,1.5066,0,0,1,.84.21l-.126.2729a1.3163,1.3163,0,0,0-.7422-.21.846.846,0,0,0-.9385.84c0,.5391.3013.7915.8965,1.0713.707.3506,1.0786.7217,1.0786,1.3731a1.2716,1.2716,0,0,1-1.4009,1.2885,1.85,1.85,0,0,1-1.0088-.2871Z"/><path d="M176.3574,27.0791l1.9892-5.0708h.3218l-2.0029,5.0708Z"/><path d="M179.06,26.3086a1.7035,1.7035,0,0,0,.9038.273.9568.9568,0,0,0,1.0645-.9732c0-.5254-.28-.8408-.8614-1.1069-.5883-.2451-1.1137-.6372-1.1137-1.3028a1.1968,1.1968,0,0,1,1.2885-1.1836,1.5066,1.5066,0,0,1,.84.21l-.126.2729a1.3163,1.3163,0,0,0-.7422-.21.846.846,0,0,0-.9385.84c0,.5391.3013.7915.8965,1.0713.7071.3506,1.0786.7217,1.0786,1.3731a1.2715,1.2715,0,0,1-1.4008,1.2885,1.85,1.85,0,0,1-1.0088-.2871Z"/><path d="M182.7138,25.1528l-.5185,1.646h-.3292l1.5269-4.7207h.3154l1.5269,4.7207h-.33l-.5322-1.646Zm1.5689-.2729-.49-1.499a7.9831,7.9831,0,0,1-.2383-.91h-.021c-.0629.3081-.14.5879-.2309.9033l-.4976,1.5059Z"/><path d="M185.94,22.1411a4.1559,4.1559,0,0,1,.9033-.0976,1.5728,1.5728,0,0,1,1.17.3779,1.216,1.216,0,0,1,.3223.8545,1.2421,1.2421,0,0,1-.8828,1.2329v.0137c.3784.1123.6025.4692.7143,1.0434a6.0279,6.0279,0,0,0,.3223,1.2329h-.336a6.9252,6.9252,0,0,1-.2871-1.1626c-.1333-.6792-.4135-.98-1.0088-1.0014h-.5952v2.164H185.94Zm.3222,2.2344h.6021a1.0324,1.0324,0,0,0,1.1421-1.0435c0-.6933-.4483-1.0156-1.1768-1.0156a2.4091,2.4091,0,0,0-.5674.0562Z"/><path d="M189.5107,22.0781v4.7207h-.3223V22.0781Z"/><path d="M190.0424,27.0791l1.9893-5.0708h.3218l-2.003,5.0708Z"/><path d="M192.8842,22.1411a5.6723,5.6723,0,0,1,1.0225-.0976,2.2048,2.2048,0,0,1,1.625.5459,2.3036,2.3036,0,0,1,.6094,1.7231,2.6818,2.6818,0,0,1-.5884,1.8491,2.3064,2.3064,0,0,1-1.7862.6724,7.2309,7.2309,0,0,1-.8823-.042Zm.3223,4.3848a5.0466,5.0466,0,0,0,.6025.0278c1.2676,0,1.9956-.7212,1.9956-2.2134a1.7565,1.7565,0,0,0-1.9116-2.017,4.1658,4.1658,0,0,0-.6865.0561Z"/><path d="M198.9472,24.4526h-1.6948v2.066h1.9048v.28H196.93V22.0781h2.1221v.28h-1.8v1.814h1.6948Z"/><path d="M200.9282,26.7988l-1.4219-4.7207h.3359l.7427,2.4654c.1958.6445.3853,1.289.5039,1.8423h.021a18.4779,18.4779,0,0,1,.5327-1.8423l.8052-2.4654h.3364l-1.5552,4.7207Z"/><path d="M203.3212,22.0781h.3223v4.4478h1.8911v.2729h-2.2134Z"/><path d="M209.28,24.4033c0,1.6953-.8891,2.4654-1.8628,2.4654-.9946,0-1.8-.833-1.8-2.3951,0-1.604.8335-2.4653,1.87-2.4653C208.4955,22.0083,209.28,22.8486,209.28,24.4033Zm-3.3266.0635c0,1.0151.49,2.1289,1.4917,2.1289,1.0088,0,1.499-1.0854,1.499-2.1782,0-.9663-.4414-2.1362-1.4917-2.1362C206.3945,22.2813,205.9531,23.416,205.9531,24.4668Z"/><path d="M213.0805,26.6167a3.1243,3.1243,0,0,1-1.19.231,1.9629,1.9629,0,0,1-1.4781-.5743,2.5344,2.5344,0,0,1-.6162-1.8,2.1931,2.1931,0,0,1,2.2129-2.4443,2.35,2.35,0,0,1,.9595.189l-.105.2734a1.9674,1.9674,0,0,0-.8681-.1753c-1.086,0-1.8633.7354-1.8633,2.1153,0,1.4287.7353,2.1289,1.8071,2.1289a1.8881,1.8881,0,0,0,.8125-.1329V24.7256h-.98V24.46h1.31Z"/><path d="M299.4156,24.5166a2.34,2.34,0,0,1-.3314,1.1954,2.3729,2.3729,0,0,1-.8906.8814,2.5139,2.5139,0,0,1-1.2323.3241,2.4774,2.4774,0,0,1-2.1333-1.2055,2.4051,2.4051,0,0,1,0-2.4009,2.4778,2.4778,0,0,1,2.1333-1.2056,2.514,2.514,0,0,1,1.2323.3242,2.4238,2.4238,0,0,1,1.222,2.0869Z" style="fill:#fff;fill-rule:evenodd"/><path d="M296.93,21.8421a2.7039,2.7039,0,0,1,1.9469.78,2.5739,2.5739,0,0,1,.59.8611,2.8679,2.8679,0,0,1,.1968,1.0333,2.5113,2.5113,0,0,1-.7767,1.864,2.7866,2.7866,0,0,1-1.9572.8,2.7706,2.7706,0,0,1-1.0356-.2026,2.8242,2.8242,0,0,1-.8906-.5875,2.6813,2.6813,0,0,1-.59-.8611,2.6075,2.6075,0,0,1-.2071-1.0131,2.62,2.62,0,0,1,.8077-1.8944,2.6158,2.6158,0,0,1,1.9158-.78Zm.01.4863a2.1413,2.1413,0,0,0-1.5741.6382,2.2164,2.2164,0,0,0-.4971.7092,2.1379,2.1379,0,0,0-.1657.8408,2.0414,2.0414,0,0,0,.1657.8206,2.11,2.11,0,0,0,.4971.7091,2.2379,2.2379,0,0,0,.7249.4762,2.1827,2.1827,0,0,0,.8492.162,2.22,2.22,0,0,0,.8491-.162,2.5124,2.5124,0,0,0,.7456-.4762,2.0468,2.0468,0,0,0,.6317-1.53,2.0674,2.0674,0,0,0-.1657-.8408,2.151,2.151,0,0,0-.4763-.7092,2.1985,2.1985,0,0,0-1.5844-.6382Zm-.0311,1.7425-.3728.1823a.3138.3138,0,0,0-.1346-.1621.3867.3867,0,0,0-.1657-.0506c-.2382,0-.3625.1519-.3625.4761a.5374.5374,0,0,0,.0932.3343.3058.3058,0,0,0,.2693.1317.3447.3447,0,0,0,.3417-.2229l.3314.1621a.7164.7164,0,0,1-.3.3039.7261.7261,0,0,1-.4142.1115.8075.8075,0,0,1-.59-.2128.85.85,0,0,1-.2278-.6078.8329.8329,0,0,1,.2278-.6078.7813.7813,0,0,1,.58-.2229.7608.7608,0,0,1,.7249.385Zm1.5741,0-.3625.1823a.3634.3634,0,0,0-.3107-.2127c-.2381,0-.3624.1519-.3624.4761a.5374.5374,0,0,0,.0932.3343.3055.3055,0,0,0,.2692.1317.3538.3538,0,0,0,.3418-.2229l.3417.1621a.8043.8043,0,0,1-.3107.3039.7257.7257,0,0,1-.4142.1115.7462.7462,0,0,1-.8077-.8206.7933.7933,0,0,1,.2278-.6078.86.86,0,0,1,1.2945.1621Z" style="fill-rule:evenodd"/><path d="M305.7222,24.5369a2.2338,2.2338,0,0,1-.321,1.1751,2.394,2.394,0,0,1-.88.8712,2.5353,2.5353,0,0,1-1.2116.3141,2.4653,2.4653,0,0,1-1.2012-.3141,2.4207,2.4207,0,0,1-.8906-.8712,2.3109,2.3109,0,0,1,0-2.35,2.4207,2.4207,0,0,1,.8906-.8712,2.4664,2.4664,0,0,1,1.2012-.3141,2.5364,2.5364,0,0,1,1.2116.3141,2.394,2.394,0,0,1,.88.8712,2.2339,2.2339,0,0,1,.321,1.1752Z" style="fill:#fff;fill-rule:evenodd"/><path d="M303.299,21.8421a2.6954,2.6954,0,0,1,1.9365.77,2.57,2.57,0,0,1,.7974,1.9045,2.4417,2.4417,0,0,1-.7871,1.864,2.6916,2.6916,0,0,1-1.9468.8,2.6591,2.6591,0,0,1-1.9262-.79,2.5074,2.5074,0,0,1-.8077-1.8742,2.5891,2.5891,0,0,1,.8077-1.9045,2.6884,2.6884,0,0,1,1.9262-.77Zm0,.4863a2.1579,2.1579,0,0,0-1.5741.6382,2.1228,2.1228,0,0,0-.6628,1.55,2.0626,2.0626,0,0,0,.6628,1.53,2.1609,2.1609,0,0,0,1.5741.6484,2.2346,2.2346,0,0,0,1.5947-.6585,1.9734,1.9734,0,0,0,.6421-1.53,2.0814,2.0814,0,0,0-.6524-1.54,2.1817,2.1817,0,0,0-1.5844-.6382Zm.7352,1.52v1.0941h-.3107v1.2967h-.8491V24.9421h-.3107V23.848a.1659.1659,0,0,1,.0518-.1216.1732.1732,0,0,1,.1242-.0506h1.1185a.1732.1732,0,0,1,.1242.0506.1659.1659,0,0,1,.0518.1216Zm-1.1184-.6889a.3832.3832,0,1,1,.3832.3748.3364.3364,0,0,1-.3832-.3748Z" style="fill-rule:evenodd"/><path d="M312.0909,24.5065a2.4053,2.4053,0,0,1-.3313,1.2055,2.43,2.43,0,0,1-.9113.8814,2.4875,2.4875,0,0,1-3.3656-.8814,2.4044,2.4044,0,0,1-.3314-1.2055,2.35,2.35,0,0,1,.3314-1.2056,2.4947,2.4947,0,0,1,3.3656-.8813,2.4294,2.4294,0,0,1,.9113.8813,2.3506,2.3506,0,0,1,.3313,1.2056Z" style="fill:#fff;fill-rule:evenodd"/><path d="M311.6042,22.6121a2.8071,2.8071,0,0,0-3.8627,0,2.59,2.59,0,0,0-.8077,1.9045,2.54,2.54,0,0,0,.8077,1.8742,2.6593,2.6593,0,0,0,1.9262.79,2.7648,2.7648,0,0,0,1.9572-.79,2.5238,2.5238,0,0,0,.7767-1.8742,2.57,2.57,0,0,0-.7974-1.9045Zm-.3417,3.4241a2.2174,2.2174,0,0,1-1.5948.6585,2.1844,2.1844,0,0,1-1.5741-.6484,2.0684,2.0684,0,0,1-.6627-1.54,2.313,2.313,0,0,1,.1139-.7092l.7249.3141h-.0518v.3242h.2589c0,.04-.01.081-.01.1317v.0709h-.2485v.3242h.3a1.2447,1.2447,0,0,0,.2589.5774,1.3542,1.3542,0,0,0,1.1081.5065,1.6053,1.6053,0,0,0,.7145-.1621l-.1035-.4964a1.5167,1.5167,0,0,1-.5282.1115.8223.8223,0,0,1-.59-.2229.8116.8116,0,0,1-.1449-.314h.9941l1.4084.6078a1.7712,1.7712,0,0,1-.3728.466Zm-1.7708-1.398h0Zm.8491-.2026h.0414v-.3242h-.7766l-.3107-.1317a.38.38,0,0,1,.0932-.152.6984.6984,0,0,1,.5592-.2431,1.5282,1.5282,0,0,1,.5074.1013l.1347-.5065a1.8267,1.8267,0,0,0-.6939-.1317,1.4134,1.4134,0,0,0-1.0563.4558c-.0517.0608-.1035.1419-.1553.2128l-.8906-.385a2.03,2.03,0,0,1,.3-.3647,2.1673,2.1673,0,0,1,1.5741-.6483,2.1905,2.1905,0,0,1,1.5844.6483,2.0557,2.0557,0,0,1,.6524,1.55,2.5764,2.5764,0,0,1-.0621.5673l-1.5016-.6483Z" style="fill-rule:evenodd"/><path d="M318.5115,24.4963a2.3507,2.3507,0,0,1-.3314,1.2056,2.4563,2.4563,0,0,1-.9113.8915,2.505,2.505,0,0,1-2.4647,0,2.4563,2.4563,0,0,1-.9113-.8915,2.3507,2.3507,0,0,1-.3314-1.2056,2.3868,2.3868,0,0,1,1.2427-2.097,2.5043,2.5043,0,0,1,2.4647,0,2.3868,2.3868,0,0,1,1.2427,2.097Z" style="fill:#fff;fill-rule:evenodd"/><path d="M316.0261,21.8421a2.6629,2.6629,0,0,1,1.9365.78,2.6493,2.6493,0,0,1,.0207,3.7686,2.73,2.73,0,0,1-1.9572.79,2.6527,2.6527,0,0,1-1.9158-.79,2.5074,2.5074,0,0,1-.8077-1.8742,2.567,2.567,0,0,1,.8077-1.8944,2.6494,2.6494,0,0,1,1.9158-.78Zm.01.4863A2.2213,2.2213,0,0,0,313.8,24.5166a2.0469,2.0469,0,0,0,.6628,1.53,2.1443,2.1443,0,0,0,1.5741.6484,2.194,2.194,0,0,0,1.5844-.6585,1.9817,1.9817,0,0,0,.642-1.52,2.0712,2.0712,0,0,0-.6524-1.55,2.1413,2.1413,0,0,0-1.574-.6382Zm1.0252,1.55v.466h-1.978v-.466Zm0,.8611v.4559h-1.978V24.74Z" style="fill-rule:evenodd"/><line x1="0.9591" y1="36.1069" x2="318.4111" y2="36.1069" style="fill:none;stroke:#e6e7e8;stroke-miterlimit:10;stroke-width:0.25px"/></g></g></svg>
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56.6098 67.4017"><title>00-Fidle-logo-00</title><g id="Calque_2" data-name="Calque 2"><g id="Calque_4" data-name="Calque 4"><path d="M47.9919,32.977a13.424,13.424,0,0,0,5.4811-1.8386,6.7273,6.7273,0,0,1,2.455-.96,15.2069,15.2069,0,0,0-5.9862-17.0857A17.7216,17.7216,0,0,0,37.6058,11.01c-4.3345.7164-8.8269,3.996-10.5862,5.4673C25.961,17.3639,13.369,29.3005,8.1168,26.9216c-3.5532-1.61,2.7909-7.4675-.1189-12.82a.2323.2323,0,0,0-.3874-.0258c-1.4813,1.9984-2.9293,4.3968-4.9019,3.32-.8812-.4812-1.6744-2.0178-2.2858-2.99A.23.23,0,0,0,0,14.5371,24.26,24.26,0,0,0,6.0983,29.3426c4.5289,5.4189,12.465,11.7291,25.2885,13.0059,5.5522.5529,18.7217-1.1976,23.9833-10.6647a13.2741,13.2741,0,0,0-1.2693.63,14.7716,14.7716,0,0,1-5.9875,1.9915c-.1831.0169-.3649.0245-.5466.0245a10.5714,10.5714,0,0,1-5.9687-2.3927,1.1184,1.1184,0,1,1,.8549-1.0851c0,.0183-.0044.0353-.0057.0535C43.53,31.7328,45.7847,33.1928,47.9919,32.977ZM31.2094,37.9323a20.3764,20.3764,0,0,1-4.7961.8712c-1.0832.0006-1.5335-.307-1.748-.768-.5643-1.2134,1.4687-2.9677,3.272-4.2263A.6668.6668,0,1,1,28.7,34.903a10.991,10.991,0,0,0-2.7544,2.5318c.3523.0761,1.4964.1245,4.9176-.7913a.6672.6672,0,0,1,.3459,1.2888Zm15.45-16.2541a2.5468,2.5468,0,0,1,2.4726,2.4538,1.6639,1.6639,0,1,0-1.4731,2.4317,1.7278,1.7278,0,0,0,.3088-.0308,2.37,2.37,0,0,1-1.3083.4025,2.6324,2.6324,0,0,1,0-5.2572ZM38.0706,4.6089a1.3336,1.3336,0,0,0,.524,1.8116c.6453.3553,2.0046-.4177,2.8292.7346.4284.5988-.8963-2.7147-1.5417-3.0708A1.3328,1.3328,0,0,0,38.0706,4.6089Zm6.7939.1428c-1.6619.9743-1.97,5.0031-1.5417,4.4043A7.584,7.584,0,0,1,46.152,7.0878a1.3337,1.3337,0,0,0-1.2875-2.3361ZM43.1787.31c-.85.9831-.2679,3.5325-.1157,3.0651a5.4212,5.4212,0,0,1,1.3687-1.926A.8741.8741,0,0,0,44.41.2135.8656.8656,0,0,0,43.1787.31Z" style="fill:#e12229"/><path d="M2.9731,50.3685h8.3535v1.0034H4.1518v6.7232h6.5728v1.0034H4.1518v8.1777H2.9731Z" style="fill:#808285"/><path d="M15.7407,50.3685V67.2762H14.562V50.3685Z" style="fill:#808285"/><path d="M19.8549,50.5946a27.8016,27.8016,0,0,1,4.3145-.3516c3.0855,0,5.4185.8282,6.8232,2.3081A7.9974,7.9974,0,0,1,33.1,58.3959a9.3118,9.3118,0,0,1-2.2076,6.4218c-1.5053,1.6309-4.039,2.584-7.3,2.584a36.0492,36.0492,0,0,1-3.7378-.15Zm1.1788,15.6782a21.3406,21.3406,0,0,0,2.7343.1255c5.4185,0,8.1026-3.0352,8.1026-7.9272.0254-4.29-2.3579-7.2247-7.7764-7.2247a17.9379,17.9379,0,0,0-3.0605.251Z" style="fill:#808285"/><path d="M36.0844,50.3685h1.1788V66.2728h7.5507v1.0034H36.0844Z" style="fill:#808285"/><path d="M55.2744,58.8724H48.5009v7.4h7.5762v1.0034H47.3222V50.3685h8.3535v1.0034H48.5009V57.869h6.7735Z" style="fill:#808285"/></g></g></svg>
\ No newline at end of file
fidle/img/00-Fidle-logo-00_m.png

4.54 KiB

fidle/img/00-Fidle-logo-00_s.png

2.29 KiB

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 140.2164 40.848"><title>00-Fidle-logo-01</title><g id="Calque_2" data-name="Calque 2"><g id="Calque_4" data-name="Calque 4"><path d="M46.1913,31.74a12.9222,12.9222,0,0,0,5.2755-1.77,6.4763,6.4763,0,0,1,2.3629-.9239,14.6364,14.6364,0,0,0-5.7616-16.4446,17.0565,17.0565,0,0,0-11.8732-2.0051c-4.1719.69-8.4957,3.8461-10.189,5.2622-1.0189.8536-13.1385,12.3424-18.1936,10.0527-3.42-1.5492,2.6862-7.1873-.1144-12.3393a.2236.2236,0,0,0-.373-.0248c-1.4257,1.9233-2.8193,4.2317-4.7179,3.1953-.8482-.4632-1.6116-1.9422-2.2-2.8775A.2216.2216,0,0,0,0,13.9917,23.35,23.35,0,0,0,5.87,28.2417a35.3776,35.3776,0,0,0,24.34,12.518c5.3439.5321,18.0193-1.1527,23.0835-10.2646a12.7681,12.7681,0,0,0-1.2217.6066,14.2177,14.2177,0,0,1-5.7629,1.9167c-.1761.0163-.3511.0236-.5261.0236a10.1733,10.1733,0,0,1-5.7446-2.303,1.0764,1.0764,0,1,1,.8227-1.0443c0,.0176-.0042.0339-.0054.0515C41.8966,30.5423,44.0669,31.9474,46.1913,31.74ZM30.0385,36.5091a19.6093,19.6093,0,0,1-4.6162.8385c-1.0425.0006-1.476-.2954-1.6824-.7392-.5431-1.1678,1.4136-2.8563,3.1493-4.0677a.6418.6418,0,1,1,.7343,1.0528,10.5781,10.5781,0,0,0-2.651,2.4368c.339.0732,1.44.12,4.733-.7616a.6422.6422,0,0,1,.333,1.24Zm14.87-15.6442a2.4512,2.4512,0,0,1,2.38,2.3617,1.6015,1.6015,0,1,0-1.4179,2.34,1.6573,1.6573,0,0,0,.2973-.03,2.28,2.28,0,0,1-1.2593.3875,2.5337,2.5337,0,0,1,0-5.06ZM36.6423,4.436A1.2835,1.2835,0,0,0,37.1466,6.18c.6211.342,1.9294-.402,2.7231.7071.4122.5763-.8627-2.6129-1.4839-2.9556A1.2827,1.2827,0,0,0,36.6423,4.436Zm6.5389.1374c-1.5995.9378-1.8961,4.8154-1.4838,4.2391a7.2989,7.2989,0,0,1,2.7231-1.9906,1.2837,1.2837,0,0,0-1.2393-2.2485ZM41.5587.2981c-.8179.9462-.2579,3.4-.1114,2.95a5.2169,5.2169,0,0,1,1.3174-1.8537A.8415.8415,0,0,0,42.7441.2054.8332.8332,0,0,0,41.5587.2981Z" style="fill:#e12229"/><path d="M65.6671,13.7493H77.3946V15.158H67.3223v9.4379h9.2271v1.4087H67.3223v11.481H65.6671Z" style="fill:#808285"/><path d="M83.5909,13.7493V37.4856H81.9356V13.7493Z" style="fill:#808285"/><path d="M89.3658,14.0662a39.0353,39.0353,0,0,1,6.0576-.4932c4.3316,0,7.607,1.1621,9.5791,3.24a11.2256,11.2256,0,0,1,2.958,8.2056,13.0738,13.0738,0,0,1-3.0991,9.0156c-2.1128,2.2891-5.67,3.6275-10.248,3.6275a50.7148,50.7148,0,0,1-5.2476-.2115Zm1.6553,22.0107a29.8576,29.8576,0,0,0,3.8388.1763c7.607,0,11.375-4.2617,11.375-11.1289.0352-6.022-3.31-10.1426-10.9174-10.1426a25.2377,25.2377,0,0,0-4.2964.352Z" style="fill:#808285"/><path d="M112.15,13.7493h1.6553V36.0769h10.6006v1.4087H112.15Z" style="fill:#808285"/><path d="M139.0894,25.6877h-9.5088V36.0769h10.6358v1.4087h-12.291V13.7493h11.7275V15.158H129.5806v9.1211h9.5088Z" style="fill:#808285"/></g></g></svg>
\ No newline at end of file
fidle/img/00-Fidle-logo-01_m.png

1.99 KiB

fidle/img/00-Fidle-logo-01_s.png

1.09 KiB

fidle/img/00-Fidle-titre-01.png

24.4 KiB

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 343.3548 80.1648"><title>00-Fidle-titre-01</title><g id="Calque_2" data-name="Calque 2"><g id="Calque_4" data-name="Calque 4"><path d="M80.4129,3.657h4.3535v.8755h-3.31V7.219h3.0581v.8633H81.4564v3.6582H80.4129Z"/><path d="M91.1019,8.79a2.8367,2.8367,0,0,1-2.89,3.082A2.76,2.76,0,0,1,85.429,8.886a2.8343,2.8343,0,0,1,2.8784-3.082A2.7484,2.7484,0,0,1,91.1019,8.79Zm-4.6055.06c0,1.2714.7319,2.2309,1.7632,2.2309,1.0073,0,1.7632-.9473,1.7632-2.2549,0-.9834-.4917-2.23-1.7393-2.23S86.4964,7.7468,86.4964,8.85Z"/><path d="M92.4368,7.7468c0-.6836-.0122-1.2715-.0478-1.811h.9233l.0362,1.1392h.0478a1.7414,1.7414,0,0,1,1.6069-1.271,1.15,1.15,0,0,1,.3.0356v.9956a1.5954,1.5954,0,0,0-.36-.0361,1.4811,1.4811,0,0,0-1.4156,1.3554,2.98,2.98,0,0,0-.0478.4917v3.0943H92.4368Z"/><path d="M96.4085,7.5066c0-.6-.0122-1.0913-.0478-1.5708h.9233l.0479.9355h.0361A2.0009,2.0009,0,0,1,99.1912,5.804a1.7161,1.7161,0,0,1,1.6431,1.163h.0239a2.3871,2.3871,0,0,1,.6475-.7553,1.9781,1.9781,0,0,1,1.2832-.4077c.7676,0,1.9072.5034,1.9072,2.5185v3.418h-1.0317V8.4543c0-1.1152-.4077-1.7871-1.2593-1.7871a1.3662,1.3662,0,0,0-1.2471.9595,1.7454,1.7454,0,0,0-.084.5278v3.586h-1.0312V8.2625c0-.9234-.4082-1.5953-1.2114-1.5953a1.4429,1.4429,0,0,0-1.3077,1.0557,1.4635,1.4635,0,0,0-.0839.5156v3.502H96.4085Z"/><path d="M109.6312,11.7405l-.084-.7315h-.0361a2.162,2.162,0,0,1-1.7749.8633,1.6538,1.6538,0,0,1-1.775-1.667c0-1.4033,1.2471-2.1709,3.49-2.1587v-.12a1.1966,1.1966,0,0,0-1.3193-1.3432,2.8923,2.8923,0,0,0-1.5108.4316l-.24-.6953a3.6031,3.6031,0,0,1,1.9072-.5156c1.7749,0,2.2066,1.2109,2.2066,2.3745v2.1709a8.15,8.15,0,0,0,.0961,1.3911Zm-.1558-2.9624c-1.1514-.0239-2.459.18-2.459,1.3071a.9345.9345,0,0,0,.9956,1.0078,1.445,1.445,0,0,0,1.4034-.9717,1.1138,1.1138,0,0,0,.06-.3359Z"/><path d="M113.4241,4.2688v1.667h1.5113V6.739h-1.5113v3.13c0,.72.2037,1.1274.7915,1.1274a2.3641,2.3641,0,0,0,.6114-.0717l.0483.7915a2.5858,2.5858,0,0,1-.9355.144,1.4648,1.4648,0,0,1-1.14-.4438,2.1515,2.1515,0,0,1-.4077-1.5113V6.739h-.8994V5.9358h.8994V4.5447Z"/><path d="M117.3,4.3044a.6536.6536,0,0,1-1.3071,0,.6433.6433,0,0,1,.66-.66A.6266.6266,0,0,1,117.3,4.3044Zm-1.1753,7.4361V5.9358h1.0557v5.8047Z"/><path d="M124.1854,8.79a2.8367,2.8367,0,0,1-2.89,3.082,2.76,2.76,0,0,1-2.7827-2.9863,2.8343,2.8343,0,0,1,2.8784-3.082A2.7484,2.7484,0,0,1,124.1854,8.79Zm-4.6055.06c0,1.2714.7319,2.2309,1.7632,2.2309,1.0073,0,1.7632-.9473,1.7632-2.2549,0-.9834-.4917-2.23-1.7393-2.23S119.58,7.7468,119.58,8.85Z"/><path d="M125.52,7.5066c0-.6-.0117-1.0913-.0478-1.5708h.9355l.06.9595h.0244a2.1341,2.1341,0,0,1,1.919-1.0913c.8032,0,2.0507.4795,2.0507,2.47v3.4663h-1.0556V8.3943c0-.9356-.3477-1.7149-1.3433-1.7149a1.4994,1.4994,0,0,0-1.415,1.0791,1.5207,1.5207,0,0,0-.0718.4917v3.49H125.52Z"/><path d="M83.1717,16.3289V35.4373H80.7054V16.3289Z"/><path d="M87.6785,25.4294c0-1.4174-.0288-2.58-.1137-3.7138h2.2114l.1421,2.268h.0566a5.0457,5.0457,0,0,1,4.5362-2.58c1.8994,0,4.8476,1.1342,4.8476,5.84v8.1934H96.8641v-7.91c0-2.2114-.8223-4.0542-3.1753-4.0542a3.5446,3.5446,0,0,0-3.3457,2.5513,3.5922,3.5922,0,0,0-.17,1.1626v8.25H87.6785Z"/><path d="M106.3026,17.7747v3.9409h3.5722V23.615h-3.5722v7.3994c0,1.7012.4819,2.665,1.8711,2.665a5.55,5.55,0,0,0,1.4458-.17l.1137,1.8711a6.11,6.11,0,0,1-2.2114.34,3.4564,3.4564,0,0,1-2.6934-1.0494,5.082,5.082,0,0,1-.9638-3.5722V23.615h-2.1265V21.7156h2.1265V18.427Z"/><path d="M112.68,25.9963c0-1.6157-.0283-3.0048-.1138-4.2807h2.1831l.085,2.6933h.1138a4.1165,4.1165,0,0,1,3.7988-3.0053,2.6989,2.6989,0,0,1,.7085.0849v2.3531a3.7451,3.7451,0,0,0-.85-.085A3.5,3.5,0,0,0,115.26,26.96a7.0263,7.0263,0,0,0-.1133,1.1626v7.3145H112.68Z"/><path d="M134.0838,28.4631c0,5.0747-3.5156,7.2862-6.8325,7.2862-3.7139,0-6.5776-2.7217-6.5776-7.06,0-4.5928,3.0053-7.2861,6.8042-7.2861C131.4188,21.4036,134.0838,24.2668,134.0838,28.4631Zm-10.8867.1416c0,3.0054,1.7295,5.2735,4.1675,5.2735,2.3813,0,4.1674-2.24,4.1674-5.33,0-2.3247-1.1621-5.2734-4.1108-5.2734S123.1971,25.9963,123.1971,28.6047Z"/><path d="M149.0789,15.3084V31.8933c0,1.2193.0283,2.6084.1133,3.544h-2.24l-.1133-2.3814h-.0567a5.0765,5.0765,0,0,1-4.6782,2.6934c-3.3169,0-5.8686-2.8067-5.8686-6.9746-.0284-4.5645,2.8071-7.3711,6.1523-7.3711a4.5871,4.5871,0,0,1,4.1392,2.0981h.0566V15.3084Zm-2.4951,11.9921a4.4023,4.4023,0,0,0-.1133-1.0488A3.6693,3.6693,0,0,0,142.87,23.36c-2.58,0-4.1108,2.2681-4.1108,5.3018,0,2.7783,1.3608,5.0747,4.0542,5.0747a3.75,3.75,0,0,0,3.6572-2.9766,4.3384,4.3384,0,0,0,.1133-1.0776Z"/><path d="M164.6981,31.6951c0,1.4175.0283,2.665.1132,3.7422H162.6l-.1416-2.24h-.0566a5.1641,5.1641,0,0,1-4.5362,2.5518c-2.1547,0-4.7348-1.1909-4.7348-6.0108V21.7156h2.4951v7.5981c0,2.6079.7939,4.3657,3.062,4.3657a3.6066,3.6066,0,0,0,3.2886-2.268,3.6533,3.6533,0,0,0,.2265-1.2759v-8.42h2.4952Z"/><path d="M178.6155,34.927a9.1854,9.1854,0,0,1-3.9409.794c-4.1391,0-6.8325-2.8072-6.8325-7.003a6.9724,6.9724,0,0,1,7.3716-7.2861,8.3342,8.3342,0,0,1,3.4585.709l-.5669,1.9277a5.783,5.783,0,0,0-2.8916-.6523c-3.147,0-4.8482,2.3252-4.8482,5.1884,0,3.1753,2.0411,5.1314,4.7627,5.1314a7.0916,7.0916,0,0,0,3.0621-.68Z"/><path d="M184.9075,17.7747v3.9409H188.48V23.615h-3.5723v7.3994c0,1.7012.482,2.665,1.8711,2.665a5.5565,5.5565,0,0,0,1.4463-.17l.1133,1.8711a6.1106,6.1106,0,0,1-2.2114.34,3.4562,3.4562,0,0,1-2.6934-1.0494,5.0815,5.0815,0,0,1-.9639-3.5722V23.615h-2.1264V21.7156H182.47V18.427Z"/><path d="M194.0633,17.86a1.5452,1.5452,0,0,1-3.09,0,1.52,1.52,0,0,1,1.559-1.5591A1.481,1.481,0,0,1,194.0633,17.86ZM191.285,35.4373V21.7156H193.78V35.4373Z"/><path d="M210.3353,28.4631c0,5.0747-3.5157,7.2862-6.8325,7.2862-3.7139,0-6.5777-2.7217-6.5777-7.06,0-4.5928,3.0054-7.2861,6.8042-7.2861C207.67,21.4036,210.3353,24.2668,210.3353,28.4631Zm-10.8867.1416c0,3.0054,1.7294,5.2735,4.1674,5.2735,2.3814,0,4.1675-2.24,4.1675-5.33,0-2.3247-1.1621-5.2734-4.1108-5.2734S199.4486,25.9963,199.4486,28.6047Z"/><path d="M213.48,25.4294c0-1.4174-.0288-2.58-.1138-3.7138h2.2114l.1421,2.268h.0567a5.0455,5.0455,0,0,1,4.5361-2.58c1.8994,0,4.8477,1.1342,4.8477,5.84v8.1934h-2.4947v-7.91c0-2.2114-.8222-4.0542-3.1753-4.0542a3.5446,3.5446,0,0,0-3.3457,2.5513,3.5949,3.5949,0,0,0-.17,1.1626v8.25H213.48Z"/><path d="M236.3245,35.3064l-.084-.7314h-.0361a2.1621,2.1621,0,0,1-1.7749.8632,1.6537,1.6537,0,0,1-1.7749-1.667c0-1.4033,1.2471-2.1709,3.49-2.1586v-.12a1.1967,1.1967,0,0,0-1.3194-1.3432,2.8922,2.8922,0,0,0-1.5107.4316l-.24-.6953a3.6032,3.6032,0,0,1,1.9073-.5156c1.7749,0,2.2065,1.2109,2.2065,2.3745v2.1709a8.1393,8.1393,0,0,0,.0962,1.3911Zm-.1557-2.9624c-1.1514-.0239-2.459.18-2.459,1.3071a.9344.9344,0,0,0,.9956,1.0078,1.4447,1.4447,0,0,0,1.4033-.9716,1.112,1.112,0,0,0,.06-.336Z"/><path d="M243.7513,33.7234c0,.6.0117,1.1274.0478,1.583h-.9355l-.06-.9473H242.78a2.1844,2.1844,0,0,1-1.9189,1.0791c-.9112,0-2.003-.5034-2.003-2.5424V29.5017h1.0557v3.2144c0,1.103.3359,1.8466,1.2954,1.8466a1.4839,1.4839,0,0,0,1.4868-1.499v-3.562h1.0557Z"/><path d="M80.9622,41.8367a54.6064,54.6064,0,0,1,8.1128-.6143c5.482,0,9.3848,1.272,11.9722,3.6841,2.6313,2.4116,4.166,5.8325,4.166,10.6123,0,4.8242-1.4912,8.771-4.2539,11.49-2.7627,2.7627-7.3232,4.254-13.0684,4.254a61.5851,61.5851,0,0,1-6.9287-.3511Zm3.815,26.1367a24.1078,24.1078,0,0,0,3.8593.2192c8.1568,0,12.586-4.56,12.586-12.542.0439-6.9731-3.9029-11.4023-11.9722-11.4023a21.6824,21.6824,0,0,0-4.4731.395Z" style="fill:#e12229"/><path d="M112.3631,61.0881c.0879,5.2188,3.4209,7.3677,7.28,7.3677a13.9592,13.9592,0,0,0,5.8765-1.0962l.6577,2.7627a17.1944,17.1944,0,0,1-7.0606,1.3154c-6.5342,0-10.437-4.2978-10.437-10.7s3.7715-11.4458,9.9546-11.4458c6.9292,0,8.771,6.0957,8.771,9.9985a14.5269,14.5269,0,0,1-.1318,1.7978Zm11.3145-2.7627c.0439-2.4555-1.0088-6.271-5.35-6.271-3.9034,0-5.6133,3.5962-5.9205,6.271Z" style="fill:#e12229"/><path d="M134.3353,61.0881c.0879,5.2188,3.42,7.3677,7.28,7.3677a13.9583,13.9583,0,0,0,5.8764-1.0962l.6577,2.7627a17.1938,17.1938,0,0,1-7.0605,1.3154c-6.5342,0-10.437-4.2978-10.437-10.7s3.7715-11.4458,9.9546-11.4458c6.9292,0,8.771,6.0957,8.771,9.9985a14.5029,14.5029,0,0,1-.1319,1.7978ZM145.65,58.3254c.044-2.4555-1.0088-6.271-5.35-6.271-3.9033,0-5.6133,3.5962-5.92,6.271Z" style="fill:#e12229"/><path d="M154.1585,56.7029c0-2.7188-.0874-4.9116-.1753-6.9287h3.4644l.1753,3.64h.0879a8.3443,8.3443,0,0,1,7.5429-4.122c5.1309,0,8.99,4.3413,8.99,10.788,0,7.63-4.6485,11.4019-9.6475,11.4019a7.443,7.443,0,0,1-6.5342-3.333h-.0879V79.6824h-3.8154Zm3.8154,5.6572a8.72,8.72,0,0,0,.1753,1.5786,5.9547,5.9547,0,0,0,5.7891,4.5171c4.0781,0,6.4463-3.333,6.4463-8.2007,0-4.2539-2.2363-7.8935-6.315-7.8935a6.1579,6.1579,0,0,0-5.8325,4.78,6.25,6.25,0,0,0-.2632,1.5786Z" style="fill:#e12229"/><path d="M188.5418,41.4417h3.815V67.7981h12.63v3.2012H188.5418Z" style="fill:#e12229"/><path d="M210.6453,61.0881c.0879,5.2188,3.4209,7.3677,7.28,7.3677a13.9592,13.9592,0,0,0,5.8765-1.0962l.6577,2.7627a17.1944,17.1944,0,0,1-7.0606,1.3154c-6.5341,0-10.437-4.2978-10.437-10.7s3.7715-11.4458,9.9546-11.4458c6.9292,0,8.771,6.0957,8.771,9.9985a14.5269,14.5269,0,0,1-.1318,1.7978ZM221.96,58.3254c.0439-2.4555-1.0088-6.271-5.35-6.271-3.9033,0-5.6133,3.5962-5.92,6.271Z" style="fill:#e12229"/><path d="M242.2215,70.9993l-.3071-2.6753h-.1314a7.9054,7.9054,0,0,1-6.49,3.1577c-4.2979,0-6.4907-3.0259-6.4907-6.0957,0-5.1309,4.561-7.9375,12.7617-7.8936V57.054c0-1.7544-.4824-4.9117-4.8237-4.9117a10.575,10.575,0,0,0-5.5259,1.5787l-.877-2.5435a13.1724,13.1724,0,0,1,6.9727-1.8857c6.49,0,8.0693,4.4292,8.0693,8.6831v7.9375a29.8785,29.8785,0,0,0,.3506,5.0869Zm-.57-10.8321c-4.21-.0874-8.99.6582-8.99,4.78a3.415,3.415,0,0,0,3.64,3.6836,5.28,5.28,0,0,0,5.1309-3.5522,4.0186,4.0186,0,0,0,.2192-1.2276Z" style="fill:#e12229"/><path d="M251.6077,56.3958c0-2.5-.0434-4.6485-.1753-6.6216h3.377l.1313,4.166h.1753a6.3682,6.3682,0,0,1,5.8765-4.6484,4.1855,4.1855,0,0,1,1.0962.1313v3.64a5.7817,5.7817,0,0,0-1.3154-.1318c-2.7188,0-4.6485,2.061-5.1748,4.9556a10.8951,10.8951,0,0,0-.1753,1.7978V70.9993h-3.8155Z" style="fill:#e12229"/><path d="M266.1243,55.5188c0-2.1924-.0434-3.9907-.1753-5.7446H269.37l.2192,3.5083h.0879a7.8048,7.8048,0,0,1,7.0166-3.9907c2.9385,0,7.499,1.7539,7.499,9.0336V70.9993h-3.8589V58.7639c0-3.42-1.272-6.271-4.9116-6.271a5.4823,5.4823,0,0,0-5.1748,3.9468,5.5386,5.5386,0,0,0-.2632,1.7983V70.9993h-3.8594Z" style="fill:#e12229"/><path d="M294.763,43.81a2.39,2.39,0,0,1-4.78,0,2.3514,2.3514,0,0,1,2.4121-2.4116A2.29,2.29,0,0,1,294.763,43.81Zm-4.2978,27.19V49.7742h3.8593V70.9993Z" style="fill:#e12229"/><path d="M300.7274,55.5188c0-2.1924-.044-3.9907-.1753-5.7446h3.42l.22,3.5083h.0874a7.8048,7.8048,0,0,1,7.0166-3.9907c2.9385,0,7.499,1.7539,7.499,9.0336V70.9993h-3.8589V58.7639c0-3.42-1.2719-6.271-4.9116-6.271A5.4823,5.4823,0,0,0,304.85,56.44a5.5386,5.5386,0,0,0-.2632,1.7983V70.9993h-3.8593Z" style="fill:#e12229"/><path d="M343.3548,49.7742c-.0874,1.5346-.1753,3.2451-.1753,5.8325V67.9294c0,4.8677-.9648,7.85-3.0259,9.6919-2.061,1.9292-5.0434,2.5435-7.7182,2.5435a13.7015,13.7015,0,0,1-7.0606-1.7544l.9649-2.938a11.9683,11.9683,0,0,0,6.227,1.6665c3.9468,0,6.8413-2.061,6.8413-7.4116V67.36H339.32a7.5769,7.5769,0,0,1-6.7534,3.5518c-5.2622,0-9.0337-4.4727-9.0337-10.3491,0-7.1924,4.6924-11.27,9.56-11.27a7.06,7.06,0,0,1,6.6221,3.6835h.0874l.1757-3.2011Zm-3.9907,8.376a5.501,5.501,0,0,0-.2193-1.7544,5.5591,5.5591,0,0,0-5.394-4.0782c-3.6836,0-6.3149,3.1138-6.3149,8.0254,0,4.166,2.1049,7.63,6.271,7.63a5.6425,5.6425,0,0,0,5.35-3.9468,6.7119,6.7119,0,0,0,.3067-2.061Z" style="fill:#e12229"/><path d="M47.9919,36.84a13.4225,13.4225,0,0,0,5.4811-1.8386,6.7273,6.7273,0,0,1,2.455-.96,15.2069,15.2069,0,0,0-5.9862-17.0857,17.7222,17.7222,0,0,0-12.336-2.0832c-4.3345.7164-8.8269,3.996-10.5862,5.4673C25.961,21.2266,13.369,33.1632,8.1168,30.7843c-3.5532-1.61,2.7909-7.4675-.1189-12.82a.2323.2323,0,0,0-.3874-.0258c-1.4813,1.9984-2.9293,4.3968-4.9019,3.32-.8812-.4812-1.6744-2.0178-2.2858-2.99A.23.23,0,0,0,0,18.4,24.26,24.26,0,0,0,6.0983,33.2053c4.5289,5.4189,12.465,11.7291,25.2885,13.0059,5.5522.5529,18.7217-1.1976,23.9833-10.6647a13.2978,13.2978,0,0,0-1.2693.63,14.7716,14.7716,0,0,1-5.9875,1.9915c-.1831.0169-.3649.0245-.5466.0245A10.5707,10.5707,0,0,1,41.598,35.8a1.1184,1.1184,0,1,1,.8549-1.0851c0,.0183-.0044.0353-.0057.0535C43.53,35.5955,45.7847,37.0555,47.9919,36.84ZM31.2094,41.795a20.3764,20.3764,0,0,1-4.7961.8712c-1.0832.0006-1.5335-.307-1.748-.768-.5643-1.2134,1.4687-2.9677,3.272-4.2263a.6668.6668,0,1,1,.763,1.0938,10.991,10.991,0,0,0-2.7544,2.5318c.3523.0761,1.4964.1245,4.9176-.7913a.6672.6672,0,0,1,.3459,1.2888Zm15.45-16.2541a2.5468,2.5468,0,0,1,2.4726,2.4538,1.6639,1.6639,0,1,0-1.4731,2.4317,1.7278,1.7278,0,0,0,.3088-.0308,2.37,2.37,0,0,1-1.3083.4025,2.6324,2.6324,0,0,1,0-5.2572ZM38.0706,8.4716a1.3336,1.3336,0,0,0,.524,1.8116c.6453.3554,2.0046-.4177,2.8292.7346.4284.5989-.8963-2.7147-1.5417-3.0708A1.3328,1.3328,0,0,0,38.0706,8.4716Zm6.7939.1428c-1.6619.9743-1.97,5.0031-1.5417,4.4043a7.584,7.584,0,0,1,2.8292-2.0682,1.3337,1.3337,0,0,0-1.2875-2.3361Zm-1.6858-4.442c-.85.9831-.2679,3.5325-.1157,3.0651a5.4212,5.4212,0,0,1,1.3687-1.926.8483.8483,0,1,0-1.253-1.1391Z" style="fill:#e12229"/><path d="M2.973,54.2312h8.3535v1.0034H4.1517v6.7232h6.5727v1.0034H4.1517v8.1777H2.973Z" style="fill:#808285"/><path d="M15.7405,54.2312V71.1389H14.5618V54.2312Z" style="fill:#808285"/><path d="M19.8548,54.4573a27.8016,27.8016,0,0,1,4.3145-.3516c3.0854,0,5.4184.8281,6.8232,2.3081A7.9972,7.9972,0,0,1,33.1,62.2585,9.312,9.312,0,0,1,30.8924,68.68c-1.5054,1.6309-4.0391,2.584-7.3,2.584a36.0469,36.0469,0,0,1-3.7378-.15Zm1.1787,15.6782a21.3432,21.3432,0,0,0,2.7344.1255c5.4184,0,8.1025-3.0352,8.1025-7.9273.0254-4.29-2.3579-7.2246-7.7763-7.2246a17.94,17.94,0,0,0-3.0606.251Z" style="fill:#808285"/><path d="M36.0843,54.2312H37.263V70.1355h7.5508v1.0034h-8.73Z" style="fill:#808285"/><path d="M55.2742,62.7351H48.5008v7.4H56.077v1.0034H47.3221V54.2312h8.3535v1.0034H48.5008v6.4971h6.7734Z" style="fill:#808285"/><line x1="68.2129" x2="68.2129" y2="70.6111" style="fill:none;stroke:#d1d3d4;stroke-miterlimit:10;stroke-width:0.25px"/></g></g></svg>
\ No newline at end of file
fidle/img/00-Fidle-titre-01_l.png

12.8 KiB

fidle/img/00-Fidle-titre-01_m.png

9.29 KiB

fidle/img/00-Fidle-titre-01_s.png

5.73 KiB

# See : https://matplotlib.org/users/customizing.html
axes.titlesize : 24
axes.labelsize : 20
axes.edgecolor : dimgrey
axes.labelcolor : dimgrey
axes.linewidth : 2
axes.grid : False
axes.prop_cycle : cycler('color', ['steelblue', 'tomato', '2ca02c', 'd62728', '9467bd', '8c564b', 'e377c2', '7f7f7f', 'bcbd22', '17becf'])
lines.linewidth : 3
lines.markersize : 10
xtick.color : black
xtick.labelsize : 18
ytick.color : black
ytick.labelsize : 18
axes.spines.left : True
axes.spines.bottom : True
axes.spines.top : False
axes.spines.right : False
savefig.dpi : 300 # figure dots per inch or 'figure'
savefig.facecolor : white # figure facecolor when saving
savefig.edgecolor : white # figure edgecolor when saving
savefig.format : svg
savefig.bbox : tight
savefig.pad_inches : 0.1
savefig.transparent : True
savefig.jpeg_quality: 95
# ==================================================================
# ____ _ _ _ __ __ _
# | _ \ _ __ __ _ ___| |_(_) ___ __ _| | \ \ / /__ _ __| | __
# | |_) | '__/ _` |/ __| __| |/ __/ _` | | \ \ /\ / / _ \| '__| |/ /
# | __/| | | (_| | (__| |_| | (_| (_| | | \ V V / (_) | | | <
# |_| |_| \__,_|\___|\__|_|\___\__,_|_| \_/\_/ \___/|_| |_|\_\
# module pwk
# ==================================================================
# A simple module to host some common functions for practical work
# Jean-Luc Parouty 2020
import os
import glob
from datetime import datetime
import itertools
import datetime, time
import math
import numpy as np
from collections.abc import Iterable
import tensorflow as tf
from tensorflow import keras
from sklearn.metrics import confusion_matrix
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
# import seaborn as sn #IDRIS : module en cours d'installation
from IPython.display import display,Markdown,HTML
VERSION='0.2.9'
# -------------------------------------------------------------
# init_all
# -------------------------------------------------------------
#
def init(mplstyle='../fidle/mplstyles/custom.mplstyle', cssfile='../fidle/css/custom.css'):
global VERSION
# ---- matplotlib and css
matplotlib.style.use(mplstyle)
load_cssfile(cssfile)
# ---- Hello world
# now = datetime.datetime.now()
print('\nFIDLE 2020 - Practical Work Module')
print('Version :', VERSION)
print('Run time : {}'.format(time.strftime("%A %-d %B %Y, %H:%M:%S")))
print('TensorFlow version :',tf.__version__)
print('Keras version :',tf.keras.__version__)
# -------------------------------------------------------------
# Folder cooking
# -------------------------------------------------------------
#
def tag_now():
return datetime.datetime.now().strftime("%Y-%m-%d_%Hh%Mm%Ss")
def mkdir(path):
os.makedirs(path, mode=0o750, exist_ok=True)
def get_directory_size(path):
"""
Return the directory size, but only 1 level
args:
path : directory path
return:
size in Mo
"""
size=0
for f in os.listdir(path):
if os.path.isfile(path+'/'+f):
size+=os.path.getsize(path+'/'+f)
return size/(1024*1024)
# -------------------------------------------------------------
# shuffle_dataset
# -------------------------------------------------------------
#
def shuffle_np_dataset(x, y):
"""
Shuffle a dataset (x,y)
args:
x,y : dataset
return:
x,y mixed
"""
assert (len(x) == len(y)), "x and y must have same size"
p = np.random.permutation(len(x))
return x[p], y[p]
def update_progress(what,i,imax, redraw=False):
"""
Display a text progress bar, as :
My progress bar : ############# 34%
args:
what : Progress bas name
i : Current progress
imax : Max value for i
return:
nothing
"""
bar_length = min(40,imax)
if (i%int(imax/bar_length))!=0 and i<imax and not redraw:
return
progress = float(i/imax)
block = int(round(bar_length * progress))
endofline = '\r' if progress<1 else '\n'
text = "{:16s} [{}] {:>5.1f}% of {}".format( what, "#"*block+"-"*(bar_length-block), progress*100, imax)
print(text, end=endofline)
def rmax(l):
"""
Recursive max() for a given iterable of iterables
Should be np.array of np.array or list of list, etc.
args:
l : Iterable of iterables
return:
max value
"""
maxi = float('-inf')
for item in l:
if isinstance(item, Iterable):
t = rmax(item)
else:
t = item
if t > maxi:
maxi = t
return maxi
def rmin(l):
"""
Recursive min() for a given iterable of iterables
Should be np.array of np.array or list of list, etc.
args:
l : Iterable of iterables
return:
min value
"""
mini = float('inf')
for item in l:
if isinstance(item, Iterable):
t = rmin(item)
else:
t = item
if t < mini:
mini = t
return mini
# -------------------------------------------------------------
# show_images
# -------------------------------------------------------------
#
def plot_images(x,y=None, indices='all', columns=12, x_size=1, y_size=1,
colorbar=False, y_pred=None, cm='binary',y_padding=0.35, spines_alpha=1,
fontsize=20):
"""
Show some images in a grid, with legends
args:
x: images - Shapes must be (-1,lx,ly) (-1,lx,ly,1) or (-1,lx,ly,3)
y: real classes or labels or None (None)
indices: indices of images to show or None for all (None)
columns: number of columns (12)
x_size,y_size: figure size (1), (1)
colorbar: show colorbar (False)
y_pred: predicted classes (None)
cm: Matplotlib color map (binary)
returns:
nothing
"""
if indices=='all': indices=range(len(x))
draw_labels = (y is not None)
draw_pred = (y_pred is not None)
rows = math.ceil(len(indices)/columns)
fig=plt.figure(figsize=(columns*x_size, rows*(y_size+y_padding)))
n=1
for i in indices:
axs=fig.add_subplot(rows, columns, n)
n+=1
# ---- Shape is (lx,ly)
if len(x[i].shape)==2:
xx=x[i]
# ---- Shape is (lx,ly,n)
if len(x[i].shape)==3:
(lx,ly,lz)=x[i].shape
if lz==1:
xx=x[i].reshape(lx,ly)
else:
xx=x[i]
img=axs.imshow(xx, cmap = cm, interpolation='lanczos')
axs.spines['right'].set_visible(True)
axs.spines['left'].set_visible(True)
axs.spines['top'].set_visible(True)
axs.spines['bottom'].set_visible(True)
axs.spines['right'].set_alpha(spines_alpha)
axs.spines['left'].set_alpha(spines_alpha)
axs.spines['top'].set_alpha(spines_alpha)
axs.spines['bottom'].set_alpha(spines_alpha)
axs.set_yticks([])
axs.set_xticks([])
if draw_labels and not draw_pred:
axs.set_xlabel(y[i],fontsize=fontsize)
if draw_labels and draw_pred:
if y[i]!=y_pred[i]:
axs.set_xlabel(f'{y_pred[i]} ({y[i]})',fontsize=fontsize)
axs.xaxis.label.set_color('red')
else:
axs.set_xlabel(y[i],fontsize=fontsize)
if colorbar:
fig.colorbar(img,orientation="vertical", shrink=0.65)
plt.show()
def plot_image(x,cm='binary', figsize=(4,4)):
"""
Draw a single image.
Image shape can be (lx,ly), (lx,ly,1) or (lx,ly,n)
args:
x : image as np array
cm : color map ('binary')
figsize : fig size (4,4)
"""
# ---- Shape is (lx,ly)
if len(x.shape)==2:
xx=x
# ---- Shape is (lx,ly,n)
if len(x.shape)==3:
(lx,ly,lz)=x.shape
if lz==1:
xx=x.reshape(lx,ly)
else:
xx=x
# ---- Draw it
plt.figure(figsize=figsize)
plt.imshow(xx, cmap = cm, interpolation='lanczos')
plt.show()
# -------------------------------------------------------------
# show_history
# -------------------------------------------------------------
#
def plot_history(history, figsize=(8,6),
plot={"Accuracy":['accuracy','val_accuracy'], 'Loss':['loss', 'val_loss']}):
"""
Show history
args:
history: history
figsize: fig size
plot: list of data to plot : {<title>:[<metrics>,...], ...}
"""
for title,curves in plot.items():
plt.figure(figsize=figsize)
plt.title(title)
plt.ylabel(title)
plt.xlabel('Epoch')
for c in curves:
plt.plot(history.history[c])
plt.legend(curves, loc='upper left')
plt.show()
# -------------------------------------------------------------
# plot_confusion_matrix
# -------------------------------------------------------------
# Bug in Matplotlib 3.1.1
#
def plot_confusion_matrix(cm,
title='Confusion matrix',
figsize=(12,8),
cmap="gist_heat_r",
vmin=0,
vmax=1,
xticks=5,yticks=5):
"""
given a sklearn confusion matrix (cm), make a nice plot
Note:bug in matplotlib 3.1.1
Args:
cm: confusion matrix from sklearn.metrics.confusion_matrix
title: the text to display at the top of the matrix
figsize: Figure size (12,8)
cmap: color map (gist_heat_r)
vmi,vmax: Min/max 0 and 1
"""
accuracy = np.trace(cm) / float(np.sum(cm))
misclass = 1 - accuracy
plt.figure(figsize=figsize)
sn.heatmap(cm, linewidths=1, linecolor="#ffffff",square=True,
cmap=cmap, xticklabels=xticks, yticklabels=yticks,
vmin=vmin,vmax=vmax,annot=True)
plt.ylabel('True label')
plt.xlabel('Predicted label\naccuracy={:0.4f}; misclass={:0.4f}'.format(accuracy, misclass))
plt.show()
def display_confusion_matrix(y_true,y_pred,labels=None,color='green',
font_size='12pt', title="#### Confusion matrix is :"):
"""
Show a confusion matrix for a predictions.
see : sklearn.metrics.confusion_matrix
Args:
y_true Real classes
y_pred Predicted classes
labels List of classes to show in the cm
color: Color for the palette (green)
font_size: Values font size
title: the text to display at the top of the matrix
"""
assert (labels!=None),"Label must be set"
if title != None : display(Markdown(title))
cm = confusion_matrix( y_true,y_pred, normalize="true", labels=labels)
df=pd.DataFrame(cm)
cmap = sn.light_palette(color, as_cmap=True)
df.style.set_properties(**{'font-size': '20pt'})
display(df.style.format('{:.2f}') \
.background_gradient(cmap=cmap)
.set_properties(**{'font-size': font_size}))
def plot_donut(values, labels, colors=["lightsteelblue","coral"], figsize=(6,6), title=None):
"""
Draw a donut
args:
values : list of values
labels : list of labels
colors : list of color (["lightsteelblue","coral"])
figsize : size of figure ( (6,6) )
return:
nothing
"""
# ---- Title or not
if title != None : display(Markdown(title))
# ---- Donut
plt.figure(figsize=figsize)
# ---- Draw a pie chart..
plt.pie(values, labels=labels,
colors = colors, autopct='%1.1f%%', startangle=70, pctdistance=0.85,
textprops={'fontsize': 18},
wedgeprops={"edgecolor":"w",'linewidth': 5, 'linestyle': 'solid', 'antialiased': True})
# ---- ..with a white circle
circle = plt.Circle((0,0),0.70,fc='white')
ax = plt.gca()
ax.add_artist(circle)
# Equal aspect ratio ensures that pie is drawn as a circle
plt.axis('equal')
plt.tight_layout()
plt.show()
def display_md(md_text):
display(Markdown(md_text))
def hdelay(sec):
return str(datetime.timedelta(seconds=int(sec)))
def hsize(num, suffix='o'):
for unit in ['','K','M','G','T','P','E','Z']:
if abs(num) < 1024.0:
return f'{num:3.1f} {unit}{suffix}'
num /= 1024.0
return f'{num:.1f} Y{suffix}'
def load_cssfile(cssfile):
if cssfile is None: return
styles = open(cssfile, "r").read()
display(HTML(styles))
def good_place( places={'SOMEWHERE':'/tmp'} ):
for place_name, place_dir in places.items():
if os.path.isdir(place_dir):
print(f'Well, we should be at {place_name} !')
print(f'We are going to use: {place_dir}')
return place_name,place_dir
print('** Attention : No expected folder exists in this environment..')
assert False, 'No expected folder exists in this environment..'