Commit ecc60942 authored by Alexandre Gondran's avatar Alexandre Gondran
Browse files

separation de la partie du cours sur le couplage du fichier Graphe-Slides.tex + ajout d'images

parent e9f32d53
% ----------------------------------------------------------------
\ifflot
\begin{frame}{\bf Problème d'affectation ou de couplage}
\begin{block}{Bataille d'Angleterre (1941)}
Au cours de la bataille d'Angleterre, les escadrilles étaient composées d'avions biplaces. Cependant, certains pilotes ne pouvaient pas faire équipe ensemble pour des différences de langues ou d'habitude. Le problème étaient alors de faire voler le maximum d'avion simultanément.
\end{block}
\begin{block}{Affectation de tâches}
On doit affecter un certain nombre de tâches (projets informatiques) à un certain nombre
de travailleurs (étudiant-es).
\begin{itemize}
\item Chaque travailleur n'est qualifié que pour certaines tâches.
\item On désire attribuer un travailleur à chaque tâche de tel façon
qu'une même tâche ne soit pas affecté à deux travailleurs différents, et vice-versa.
\item S'il n'est pas possible de satisfaire tous les tâches, on veut
satisfaire le maximum d'entre elles.
\end{itemize}
\end{block}
\end{frame}
%----------------------------------------------------------------
% \begin{frame}{\bf Couplage}
%
% On doit affecter un certain nombre de pilotes à un certain nombre
% de vols à longue distance.
% \begin{block}{}
% \begin{itemize}
% \item Chaque pilote est qualifié pour certains appareils (A318-321,A340,A380,etc).
% \item On désire attribuer un pilote à chaque vol de tel façon
% qu'un même vol ne soit pas affecté à deux pilotes différents, et vice-versa.
% \item S'il n'est pas possible de satisfaire tous les vols, on veut
% satisfaire le maximum d'entre eux.
% \end{itemize}
% \end{block}
%
% \end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Graphe biparti}
\begin{defin}[Graphe biparti]
Un graphe non orienté $G=(S,A)$ est biparti si $S=S_1 \cup S_2$, $S_1 \cap S_2 = \emptyset$, s'il
n'existe pas d'arête entre les sommets de $S_1$ et s'il
n'existe pas d'arête entre les sommets de $S_2$.
\end{defin}
\begin{center}
\includegraphics{bigraphe}
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Couplage}
\begin{defin}
Étant donné un graphe non orienté $G=(S,A)$, un {\bf couplage} sur $G$ est formé
d'un ensemble d'arêtes $C$ tel qu'aucune paire d'arêtes de $C$ ne partage
un sommet commun. \\[4mm]
La {\bf taille} du couplage est le nombre d'arêtes de $C$. \\[4mm]
Le couplage est \textbf{parfait} si tous les sommets du graphe sont
couverts par le couplage.
\end{defin}
Objectif~: trouver un couplage de taille maximum ($\leq \lfloor\frac{|S|}{2}\rfloor$)
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.35\textwidth]{graphebiparti}
{Un graphe biparti}
\end{center}
\end{frame}
%----------------------------------------------------------------
\ifimprime
\else
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.35\textwidth]{couplagemaximum1}
{Un graphe biparti et un couplage maximum (et parfait)\label{coup}}
\end{center}
Un couplage est \textbf{maximum} si il n'en existe pas de strictement plus grand.
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.35\textwidth]{couplagemaximal}
{Un couplage maximal mais sous-optimal (non parfait)\label{coupbad}}
\end{center}
Un couplage est \textbf{maximal} s'il n'est pas possible de l'augmenter.\\
Question: quelle modélisation mathématique du problème ?
\end{frame}
\fi
%----------------------------------------------------------------
\begin{frame}{Comment passer d'un couplage maximal à maximum ?}
\begin{center}
\includegraphics[width=0.3\textwidth]{couplagemaximal}~~~
%\includegraphics[width=0.3\textwidth]{chainealterneeaugmentante}~~
%\includegraphics[width=0.3\textwidth]{couplagemaximum2}
\end{center}
\end{frame}
\begin{frame}{\bf Terminologie}
Soit $C \subset A$ un couplage de $G$. \\[5mm]
\begin{itemize}
\item un sommet $s\in S$ est \textbf{saturé} si c'est l'extrémité d'une
arête de $C$. Sinon, \textbf{insaturé}.
\item Une chaîne dans laquelle une arête sur deux est dans $C$ et
les autres dans $A-C$ est dite \textbf{alternée}.
\item Une chaîne alternée est dite \textbf{améliorante} si elle relie
deux sommets insaturés à ses extrémités (longueur impaire).
\end{itemize}
\begin{center}
\includegraphics[width=0.2\textwidth]{couplagemaximal}~~~
\includegraphics[width=0.2\textwidth]{chainealterneeaugmentante}~~~
\includegraphics[width=0.2\textwidth]{couplagemaximum2}
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Théorème de Berge 1957}
\begin{theor}
Un couplage $C$ est maximum si et seulement s'il n'existe pas de chaîne alternée améliorante relativement à $C$.
\end{theor}
~\\[4mm]
Dans ce cours, recherche de couplage maximum sur un graphe biparti, mais les résultats sont similaires pour un graphe quelconque.
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Chaîne améliorante: suffisant}
À partir d'un couplage $C$ et d'une chaîne améliorante $C_A$ :\\
on améliore le couplage (de 1) par
``ou exclusif'' $\oplus$ (suppression dans $C$ des arêtes noires $C \cap C_A$ et ajout des arêtes grises $C_A \backslash (C \cap C_A)$).
\begin{center}
\includegraphics[width=0.3\textwidth]{couplagemaximal}~~~
\includegraphics[width=0.3\textwidth]{chainealterneeaugmentante}~~
\includegraphics[width=0.3\textwidth]{couplagemaximum2}
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Chaîne améliorante~: nécessaire}
Soit $C$ et $D$, 2 couplages de $G$, $|C|<|D|$ et $G'=(S,C\oplus D)$.\\[2mm]
$C$ et $D$ sont deux couplages: chaque sommet de $S$ est l'extrémité
d'au plus une arête de $C$ et d'au plus une arête de $D$.\\[2mm]
Une composante connexe de $G'$ est une chaîne simple (évent. un
cycle) dont une arête sur deux est dans $C$ et les autres dans $D$.\\[2mm]
Comme $|C|<|D|$, $C\oplus D$ contient plus d'arêtes de $D$ que de $C$.
Les cycles: autant d'arêtes de $C$ que de $D \Rightarrow G'$ a une chaîne qui
n'est pas un cycle, avec plus d'arêtes de $D$ que de $C$~:
c'est une chaîne améliorante.
\end{frame}
%% chaine ameliorante e1 c4 e5 c6 e2 c2!
%----------------------------------------------------------------
\begin{frame}{\bf Algorithme des chaînes améliorantes}
On peut chercher les chaînes améliorantes en parcourant le graphe biparti en alternant le parcours d'arêtes hors et dans $C$ à partir des sommets insaturés de $S_1$.\\[2mm]
$\implies$ Construction de chaînes améliorantes par un parcours en largeur (plus court chemin) sur le graphe orienté de $S_1$ vers $S_2$, excepté pour $C$ dans l'ordre inverse.\\[2mm]
%%% similaire a la recherche des plus courts chemins et de l'arbre des plus courts chemins mais ici multi-sources
Au plus il y a $\lfloor\frac{|S|}{2}\rfloor$ chaînes améliorantes.\\[2mm]
Complexité (majorant) de l'algorithme en $O(|S|.|A|)$\\[2mm]
Graphe biparti~:\\algorithme d'Hopcroft-Karp (1973) en $O(\sqrt{|S|}.|A|)$\\[2mm]
Graphe quelconque~:\\ algorithme de blossom (Edmonds 1961) en $O(|S|^2.|A|)$ puis Micali\&Vazirani (1980) en $O(\sqrt{|S|}.|A|)$
\end{frame}
%----------------------------------------------------------------
\shrink{
\begin{frame}{\bf Construction du graphe des chaînes améliorantes}
\begin{algorithm}[H]
\Function{\CGCA{$G=(S_1 \cup S_2, A),C$}}{
$G' \gets \varnothing$; $S \gets \varnothing$; $S[0] \gets insatures_C(S_1)$; $i \gets 1$\;
\Tq{$S[i-1] \neq \emptyset$}{
\PourCh{sommet $u \in S[i-1]$}{
\Si{$i$ impair}{
\PourCh{$v \in \mathit{Adj}[u]$ et $v \not\in \bigcup^{i-1}_0 S[j]$ et $(u,v) \not\in C$}{
Ajoute $v$ à $S[i]$; Ajoute $(u,v)$ à $G'$\;
\lSi{$v \in insatures_C(S_2)$}{\Retour{G'}\;}
}
}
\Sinon{
\PourCh{$v \in \mathit{Adj}[u]$ et $v \not\in \bigcup^{i-1}_0 S[j]$ et $(u,v) \in C$}{
Ajoute $v$ à $S[i]$; Ajoute $(u,v)$ à $G'$\;
}
}
}
$i \gets i + 1$\;
}
\Retour{Faux}\;
}
\end{algorithm}
\end{frame}
}
%----------------------------------------------------------------
\begin{frame}{\bf Algorithme d'Hopcroft-Karp}
Entrée: $C$, un couplage quelconque (même vide)\\
Sortie: $C$, un couplage maximum
\begin{algorithm}[H]
\Function{Hopcroft-Karp{$(G=(S_1 \cup S_2, A), C)$}}{
$anciennetaille \gets -1$\;
%$C\gets \emptyset$\;
\Tq{$anciennetaille \neq |C|$}{
$anciennetaille \gets |C|$\;
Orienter le graphe $G$ de $S_1$ vers $S_2$, excepté pour $C$ (sens inverse)\;
\PourCh{$u \in S_1\backslash C$}{
\Si{$\exists$ $v \in S_2\backslash C$ connecté à $u$ par un chemin}{
$chemin \gets$ plus court chemin améliorant de $u$ vers $v$\;
$C \gets C \oplus chemin$ (ajout des arcs de $S_1$ à $S_2$ et retrait des arcs $S_2$ à $S_1$)
}
}
}
\Retour{$C$}\;
}
\end{algorithm}
\end{frame}
%----------------------------------------------------------------
\ifanim
\begin{frame}{\bf Algorithme d'Hopcroft-Karp}
\centering
\begin{pspicture}(2,3.25)
\psset{unit=0.75}
\cnodeput(0.25,2){A}{{\scriptsize {\visible<2,3,4>{\red} $A$}}}
\cnodeput(0.25,1.25){B}{{\scriptsize {\visible<5,6,12,13,14,15,16>{\red} $B$}}}
\cnodeput(0.25,0.5){C}{{\scriptsize {\visible<7,8,9>{\red} $C$}}}
\ncbox[nodesep=.1cm,boxsize=.5,linearc=.2]{A}{C}
\cnodeput(2.75,2.50){D}{{\scriptsize $D$}}
\cnodeput(2.75,1.75){E}{{\scriptsize $E$}}
\cnodeput(2.75,1.00){F}{{\scriptsize $F$}}
\cnodeput(2.75,0.25){G}{{\scriptsize $G$}}
\ncbox[nodesep=.1cm,boxsize=.5,linearc=.2]{D}{G}
\ncline{A}{D}
\ncline{A}{E}
\ncline{B}{D}
\ncline{C}{F}
\ncline{C}{G}
\visible<2-9>{
\ncline[arrows=->]{A}{D}
\ncline[arrows=->]{A}{E}
\ncline[arrows=->]{B}{D}
\ncline[arrows=->]{C}{F}
\ncline[arrows=->]{C}{G}
}
\visible<10>{
\ncline[linewidth=2pt]{A}{D}
\ncline[linewidth=2pt]{C}{F}
}
\visible<11-16>{
\ncline[arrows=<-]{A}{D}
\ncline[arrows=->]{A}{E}
\ncline[arrows=->]{B}{D}
\ncline[arrows=<-]{C}{F}
\ncline[arrows=->]{C}{G}
}
\visible<17>{
\ncline[linewidth=2pt]{A}{E}
\ncline[linewidth=2pt]{B}{D}
\ncline[linewidth=2pt]{C}{F}
}
\end{pspicture}
\vfill
{\white .}
{\small C=\{\visible<4-14>{(A,D)} \visible<9->{(C,F)} \visible<14->{(B,D)} \visible<16->{(A,E)}\}}
\vfill
\begin{pspicture}(2,3.5)
\visible<2,3,4> {
\psset{arrows=->}
\cnodeput(1,3){A1bfs}{{\scriptsize $A$}}
\cnodeput(0,2){D1bfs}{{\scriptsize $D$}}
\cnodeput(2,2){E1bfs}{{\scriptsize $E$}}
\ncline{A1bfs}{E1bfs}
\ncline{A1bfs}{D1bfs}
\visible<3,4> {
\ncline[linewidth=2pt,linecolor=red]{A1bfs}{D1bfs}
}
}
\visible<5,6>{
\psset{arrows=->}
\cnodeput(1,3){B2bfs}{{\scriptsize $B$}}
\cnodeput(1,2){D2bfs}{{\scriptsize $D$}}
\ncline{B2bfs}{D2bfs}
}
\visible<7-9>{
\psset{arrows=->}
\cnodeput(1,3){C3bfs}{{\scriptsize $C$}}
\cnodeput(0,2){F3bfs}{{\scriptsize $F$}}
\cnodeput(2,2){G3bfs}{{\scriptsize $G$}}
\ncline{C3bfs}{F3bfs}
\ncline{C3bfs}{G3bfs}
\visible<8,9> {
\ncline[linewidth=2pt,linecolor=red]{C3bfs}{F3bfs}
}
}
\visible<12-16>{
\psset{arrows=->}
\cnodeput(1,3){B4bfs}{{\scriptsize $B$}}
\cnodeput(1,2){D4bfs}{{\scriptsize $D$}}
\cnodeput(1,1){A4bfs}{{\scriptsize $A$}}
\cnodeput(1,0){E4bfs}{{\scriptsize $E$}}
\ncline{B4bfs}{D4bfs}
\ncline{D4bfs}{A4bfs}
\ncline{A4bfs}{E4bfs}
\visible<13-16> {
\ncline[linewidth=2pt,linecolor=red]{B4bfs}{D4bfs}
\ncline[linewidth=2pt,linecolor=red]{D4bfs}{A4bfs}
\ncline[linewidth=2pt,linecolor=red]{A4bfs}{E4bfs}
}
}
\end{pspicture}
\end{frame}
\fi
%}
%----------------------------------------------------------------
\ifimprime
\else
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm0}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm0oriented}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm1}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm2}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm3}\\[4mm]
\end{center}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.7\textwidth]{cm4}\\[4mm]
\end{center}
\end{frame}
\fi
%----------------------------------------------------------------
\shrink{
\ifimprime
\else
\begin{frame}{\bf Exemple}
\begin{center}
\includegraphics[width=0.9\textwidth]{cmap}\\[4mm]
{ Un couplage, cha{\^\i}ne am{\'e}liorante, couplage am{\'e}lior{\'e}}
\end{center}
\end{frame}
\fi
%----------------------------------------------------------------
\begin{frame}{\bf Finalement\ldots}
A chaque itération, la taille du plus court chemin augmente de 1.\\[2mm]
A l'itération $\sqrt{|S|}$, il y a au plus $\sqrt{|S|}$ chemins améliorants de taille supérieure à $\sqrt{|S|}$.\\[2mm]
Algorithme de Hopcroft et Karp : complexité en $O(\sqrt{|S|}.|A|)$\\[8mm]
Extensions possibles~: couplages pondérés, graphes quelconques
%%%: Gabow (RNA-2d)
\end{frame}
}
%----------------------------------------------------------------
\begin{frame}{\bf Couplage, filtrage des domaines et Sudoku}
\begin{center}
\includegraphics[width=0.7\textwidth]{sudoku_hard}
\end{center}
\end{frame}
%----------------------------------------------------------------
\ifimprime
\else
\begin{frame}{\bf Couplage et filtrage des domaines}
\small\begin{block}{Corrolaire du théorème de Berge}
Une arête est \textbf{libre} si elle appartient à un couplage maximum mais pas tous. Une arête est libre ssi pour un couple maxmium $C$ donné, elle appartient, soit à une chaîne alternée paire commençant par un sommet insaturé, soit à un cycle alterné pair.
\end{block}
$\Longrightarrow$ On peut éliminer les arêtes non libres
\begin{center}
\includegraphics[width=0.55\textwidth]{alldifferent}
\end{center}
Couplage couvrant l'ensemble des variables et résultat du filtrage.\\
Contrainte {\em AllDifferent} implémentée dans les outils de programmation par contraintes ({\em gecode}, {\em choco}, {\em or-tools}, {\em toulbar2}).
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Solution~: problème du Sudoku}
Problème Sudoku NP-complet.\\[2mm]
Modélisation par 27 graphes bipartis.\\[2mm]
Test si aucune solution n'existe:
taille d'un couplage maximum $< |X|$\\[2mm]
Suppression des valeurs n'appartenant à aucune solution:
retrait des sommets $x_i$,$a$ %% Why??? au contraire, forcer l arete
et test d'existence d'un couplage couvrant $X-{x_i}$.
$\implies$ complexité $O(|A|^2)$\\[3mm]
Possibilité d'améliorer la complexité en $O(|A|)$ (Régin, 1994). %% How? chercher composantes connexes..
\end{frame}
\begin{frame}{Applications}
\begin{block}{Problème de couplage pondéré - algorithme hongrois}
Il faut affecter $n$ tâches à $n$ machines connaissant le coût d'affectation $c_{ij}$ de chaque tâche $i$ avec la machine $j$. L'objectif est de minimiser la somme des coûts d'affectation pour un couplage parfait.
\end{block}
\begin{center}
\begin{tabular}{cc|c|c|c|c|c|c}
\multicolumn{2}{c}{}&\multicolumn{6}{c}{$machine$}\\
&\multicolumn{1}{c}{}&\multicolumn{1}{c}{1}&\multicolumn{1}{c}{2}&\multicolumn{1}{c}{3}&\multicolumn{1}{c}{4}&\multicolumn{1}{c}{5}\\\cline{3-7}
\multirow{5}{*}{tâche}&1&15&40& 5&20&20\\\cline{3-7}
&2&22&33& 9&16&20\\\cline{3-7}
&3&50&16&38&10&36\\\cline{3-7}
&4&13& 5&12&30&65\\\cline{3-7}
&5&10&10&60&15& 5\\\cline{3-7}
\end{tabular}
\end{center}
\end{frame}
\begin{frame}{Applications}
\begin{block}{TSP et algorithme glouton de couplage}
On construit une tournée en résolvant itérativement un problème de couplage pondéré.
\end{block}
\begin{block}{Problème du postier chinois}
Dans un graphe dont les arêtes représentent les routes et les sommets les carrefours, déterminer un parcours tel que chaque rue soit parcourue au moins une fois et de longueur totale minimale. de travailleurs (étudiant-es).
\end{block}
\end{frame}
%----------------------------------------------------------------
\begin{frame}{\bf Logiciels, lectures}
\begin{block}{Langages de programmation par contraintes}
Minizinc \url{https://www.minizinc.org}\\
XCSP3 \url{http://xcsp.org}
\end{block}
\begin{block}{Solvers CP-SAT}
Google OR-tools C++/python/.NET\\
\url{https://developers.google.com/optimization}\\
{\small Choco Java \url{https://choco-solver.org}}
\end{block}
\begin{block}{Livre}
\begin{minipage}{0.79\textwidth}
Francesca Rossi, Peter van Beek, Toby Walsh. {\em Handbook of Constraint Programming.} Elsevier, 2006.
\end{minipage}
\begin{minipage}{0.19\textwidth}
\begin{center}
\includegraphics[width=0.9\textwidth]{RossiBeekWalsh2006}
\end{center}
\end{minipage}
\end{block}
\end{frame}
\fi % utilisation du couplage pour le filtrage des domaines
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 264 397
%%Pages: 0
%%Creator: LibreOffice 6.1
%%Title: none
%%CreationDate: none
%%LanguageLevel: 2
%%EndComments
%%BeginProlog
%%BeginResource: procset SDRes-Prolog 1.0 0
/b4_inc_state save def
/dict_count countdictstack def
/op_count count 1 sub def
userdict begin
0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath
/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if
/bdef {bind def} bind def
/c {setgray} bdef
/l {neg lineto} bdef
/rl {neg rlineto} bdef
/lc {setlinecap} bdef
/lj {setlinejoin} bdef
/lw {setlinewidth} bdef
/ml {setmiterlimit} bdef
/ld {setdash} bdef
/m {neg moveto} bdef
/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef
/r {rotate} bdef
/t {neg translate} bdef
/s {scale} bdef
/sw {show} bdef
/gs {gsave} bdef
/gr {grestore} bdef
/f {findfont dup length dict begin
{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def
currentdict end /NFont exch definefont pop /NFont findfont} bdef
/p {closepath} bdef
/sf {scalefont setfont} bdef
/ef {eofill}bdef
/pc {closepath stroke}bdef
/ps {stroke}bdef
/pum {matrix currentmatrix}bdef
/pom {setmatrix}bdef
/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef
%%EndResource
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%BeginPageSetup
%%EndPageSetup
pum
0.02832 0.02831 s
0 -14021 t
/tm matrix currentmatrix def
tm setmatrix
-3390 -4389 t
1 1 s
gs
19.9975 lw 1 lj 0.000 c 4149 4399 m 4574 4399 4899 4724 4899 5149 ct 4899 5574 4574 5899 4149 5899 ct
3724 5899 3399 5574 3399 5149 ct 3399 4724 3724 4399 4149 4399 ct pc
gr
pum
3798 5370 t
0.000 c 86 -156 m 86 -118 94 -88 109 -67 ct 125 -46 149 -36 179 -36 ct 203 -36 223 -41 237 -50 ct
252 -60 262 -72 267 -87 ct 316 -73 l 296 -20 250 6 179 6 ct 130 6 92 -9 66 -38 ct
40 -68 27 -112 27 -170 ct 27 -226 40 -268 66 -298 ct 92 -327 129 -342 177 -342 ct
276 -342 325 -283 325 -164 ct 325 -156 l 86 -156 l p
267 -199 m 264 -234 255 -260 240 -277 ct 225 -293 204 -301 176 -301 ct 149 -301 128 -292 112 -274 ct
96 -256 87 -231 86 -199 ct 267 -199 l p ef
399 0 m 399 -47 l 511 -47 l 511 -384 l 412 -314 l 412 -366 l 515 -438 l
567 -438 l 567 -47 l 673 -47 l 673 0 l 399 0 l p ef
pom
gs
19.9975 lw 1 lj 4149 6899 m 4574 6899 4899 7223 4899 7648 ct 4899 8073 4574 8398 4149 8398 ct
3724 8398 3399 8073 3399 7648 ct 3399 7223 3724 6899 4149 6899 ct pc
gr
pum
3798 7870 t
86 -156 m 86 -118 94 -88 109 -67 ct 125 -46 149 -36 179 -36 ct 203 -36 223 -41 237 -50 ct
252 -60 262 -72 267 -87 ct 316 -73 l 296 -20 250 6 179 6 ct 130 6 92 -9 66 -38 ct
40 -68 27 -112 27 -170 ct 27 -226 40 -268 66 -298 ct 92 -327 129 -342 177 -342 ct
276 -342 325 -283 325 -164 ct 325 -156 l 86 -156 l p
267 -199 m 264 -234 255 -260 240 -277 ct 225 -293 204 -301 176 -301 ct 149 -301 128 -292 112 -274 ct
96 -256 87 -231 86 -199 ct 267 -199 l p ef
383 0 m 383 -39 l 393 -64 406 -85 422 -104 ct 437 -122 453 -139 469 -154 ct
486 -169 503 -183 519 -196 ct 536 -208 550 -221 564 -234 ct 577 -247 588 -260 596 -274 ct
604 -289 608 -304 608 -322 ct 608 -346 601 -365 587 -378 ct 573 -391 553 -398 528 -398 ct
505 -398 485 -392 470 -379 ct 454 -366 445 -348 442 -324 ct 385 -329 l 390 -364 404 -392 430 -413 ct
455 -434 488 -444 528 -444 ct 572 -444 606 -434 630 -413 ct 654 -392 665 -362 665 -324 ct
665 -307 662 -290 654 -274 ct 646 -257 634 -240 619 -223 ct 604 -206 575 -180 531 -145 ct