From 7695ccfb5113467f042a902767065f311a976cd0 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 6 Feb 2022 21:14:12 +0000 Subject: scratch3 (6feb22) git-svn-id: svn://tug.org/texlive/trunk@61921 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/scratch3/scratch3.sty | 131 +++++++++++----------- 1 file changed, 67 insertions(+), 64 deletions(-) (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/latex/scratch3/scratch3.sty b/Master/texmf-dist/tex/latex/scratch3/scratch3.sty index d28a8a3e2e2..56869a8b3a2 100644 --- a/Master/texmf-dist/tex/latex/scratch3/scratch3.sty +++ b/Master/texmf-dist/tex/latex/scratch3/scratch3.sty @@ -1,13 +1,12 @@ -% !BIB TS-program = -% !TeX encoding = ISO-8859-1 +% !TeX encoding = UTF-8 % Ce fichier contient le code de l'extension "scratch3" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\scrname {scratch3} % -\def\scrver {0.18} % +\def\scrver {0.19} % % % -\def\scrdate {2020/09/03} % +\def\scrdate {2022/02/06} % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @@ -15,9 +14,6 @@ % Author : Christian Tellechea % Status : Maintained % Email : unbonpetit@netc.fr -% Package URL: https://www.ctan.org/pkg/scratch3 -% Bug tracker: https://framagit.org/unbonpetit/scratch3/issues -% Repository : https://framagit.org/unbonpetit/scratch3/tree/master % Copyright : Christian Tellechea 2020 % Licence : Released under the LaTeX Project Public License v1.3c % or later, see http://www.latex-project.org/lppl.txtf @@ -121,6 +117,7 @@ \fi \useKV[\scrname]{pre text}% \_inpicturetrue + \def\scr_scale{1}% bugfix 0.19 #2% \scr_blockstrut }% @@ -188,7 +185,7 @@ } \newcommand*\blockspace[1][1]{% \advance\scr_yoffset#1\dimexpr-\scr_blockstruttotht-\scr_ysepsup-\scr_ysepinf-\scr_corner-\scr_linewidth\relax - \gdef\scr_blockstop{1}% + \gdef\scr_blockstop{0}% bugfix 0.19 } \newcommand*\blockstop[1]{% #1=texte \def\scr_current_blockcolor{scrcontrol}% @@ -257,7 +254,7 @@ \gdef\scr_blockstop{1}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% dessine un bloc de départ % +% dessine un bloc de départ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\scr_initblock#1#2{% \def\scr_current_blockcolor{#1}% @@ -328,7 +325,7 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% dessine un bloc de définition % +% dessine un bloc de définition % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand*\initmoreblocks[1]{% \def\scr_currentstuff{% @@ -403,18 +400,18 @@ \begin{tikzpicture} \setscratch{num blocks=false}% \scr_xoffset0pt \scr_yoffset\dimexpr\scr_corner+\scr_ysepsup\relax% bugfix 0.18 - \definecolor{scrmoreblocks}{HTML}{ff4d6a}% choix couleur foncée pour tracé du bloc qui suit + \definecolor{scrmoreblocks}{HTML}{ff4d6a}% choix couleur foncée pour tracé du bloc qui suit \scr_normalblock{scrmoreblocks}{% - \definecolor{scrmoreblocks}{HTML}{ff6680}% rétablir couleur claire par défaut + \definecolor{scrmoreblocks}{HTML}{ff6680}% rétablir couleur claire par défaut #1% }% \end{tikzpicture}% }% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% dessine un bloc de répétition ou test % +% dessine un bloc de répétition ou test % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\scr_blockloop#1#2#3#4#5{% #1=texte #2=instructions sup #3=instructions inf #4=boucle infinie (1 ou 0) #5=fleche de répétition (1 ou 0) +\def\scr_blockloop#1#2#3#4#5{% #1=texte #2=instructions sup #3=instructions inf #4=boucle infinie (1 ou 0) #5=fleche de répétition (1 ou 0) \def\scr_current_blockcolor{scrcontrol}% BUGFIX 0.11 \edef\scr_blocminheight{\dimexpr\scr_loopblockheight+\scr_ysepinf+\scr_ysepsup+\scr_corner\relax}% hauteur minimale d'un bloc normal \setbox\scr_box\hbox{% @@ -428,7 +425,7 @@ \scr_csedef{scr_txtloopwd\number\scr_loopnest}{\scr_maxdim(\wd\scr_box,\scr_minwd+\scr_corner*2+\scr_notch*2)}% \scr_csedef{scr_txtloopht\number\scr_loopnest}{\the\ht\scr_box}% \scr_csedef{scr_txtlooptotht\number\scr_loopnest}{\the\dimexpr\ht\scr_box+\dp\scr_box\relax}% - \scr_csedef{toploopx\number\scr_loopnest}{\the\scr_xoffset}% coordonnées du point nord-west + \scr_csedef{toploopx\number\scr_loopnest}{\the\scr_xoffset}% coordonnées du point nord-west \scr_csedef{toploopy\number\scr_loopnest}{\the\scr_yoffset}% \scr_csedef{blocnum\number\scr_loopnest}{\number\scr_blocknum}% \advance\scr_xoffset\scr_loopblockwidth @@ -456,7 +453,7 @@ \scr_csedef{bottomifx\number\scr_loopnest}{\the\scr_xoffset}% \scr_csedef{bottomify\number\scr_loopnest}{\the\scr_yoffset}% \ifcat\relax\detokenize{#3}\relax\else% si instruction #3 - \advance\scr_yoffset\dimexpr-\scr_blocminheight\relax% épaisseur théorique de la branche "sinon" + \advance\scr_yoffset\dimexpr-\scr_blocminheight\relax% épaisseur théorique de la branche "sinon" \scr_csedef{blocelsenum\number\scr_loopnest}{\number\scr_blocknum}% \ifboolKV[\scrname]{num blocks} {\scr_csdef{scr_numblockelse\number\scr_loopnest}{% @@ -479,7 +476,7 @@ \scr_csedef{bottomelsex\number\scr_loopnest}{\the\scr_xoffset}% \scr_csedef{bottomelsey\number\scr_loopnest}{\the\scr_yoffset}% \fi - \advance\scr_yoffset by \dimexpr-\scr_blocminheight\relax% épaisseur de la branche du bas + \advance\scr_yoffset by \dimexpr-\scr_blocminheight\relax% épaisseur de la branche du bas \def\scr_current_blockcolor{scrcontrol}% % ############## dessin du corps ############## \edef\scr_current_linecolor{\ifboolKV[\scrname]{print}{scr_linegray!\scr_contrast!black}{\scr_current_blockcolor dd}}% @@ -500,7 +497,7 @@ --++(0,-\csname scr_txtlooptotht\number\scr_loopnest\endcsname-\scr_ysepsup-\scr_ysepinf-\scr_corner)% ligne est "|" --++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*2+\scr_notch*1.66666+\scr_loopblockwidth,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_notch,0)--++(-\scr_corner,\scr_corner)--++(-\scr_notch*.66666,0)% ligne sud "--\__/---------" --(\csname bottomifx\number\scr_loopnest\endcsname,\csname bottomify\number\scr_loopnest\endcsname)% descente gauche bloc "if" - \ifcat\relax\detokenize{#3}\relax\else% tracé de la branche du else + \ifcat\relax\detokenize{#3}\relax\else% tracé de la branche du else \ifnum\csname scr_blockstopif_\number\scr_loopnest\endcsname=1 --++(\csname scr_txtloopwd\number\scr_loopnest\endcsname+2*\scr_xsep-\scr_loopblockwidth,0)% ligne haut de la barre else "-----------------" \else @@ -521,9 +518,9 @@ \else --++(-\csname scr_txtloopwd\number\scr_loopnest\endcsname-2*\scr_xsep+\scr_corner*2+\scr_notch*1.66666,0)--++(-\scr_corner,-\scr_corner)--++(-\scr_notch,0)--++(-\scr_corner,\scr_corner)--++(-.66666*\scr_notch,0)% ligne Sud "\--\__/---------" \fi - --cycle;% remontée tout en haut et cycle ## bugfix 0.14 + --cycle;% remontée tout en haut et cycle ## bugfix 0.14 \advance\scr_xoffset\dimexpr-\scr_loopblockwidth\relax - \csname scr_numblockif\number\scr_loopnest\endcsname% numérote ou pas le texte dans le bandeau du haut + \csname scr_numblockif\number\scr_loopnest\endcsname% numérote ou pas le texte dans le bandeau du haut \node[ at=(origin), draw=none, @@ -561,7 +558,7 @@ \useKV[\scrname]{pre text}% \useKV[\scrname]{else word}% }; - \csname scr_numblockelse\number\scr_loopnest\endcsname% numérotation bloc else ou pas + \csname scr_numblockelse\number\scr_loopnest\endcsname% numérotation bloc else ou pas \fi \ifnum#5=1 %fleche \edef\scr_arrowcolor{\ifboolKV[\scrname]{print}{scr_flaggray}{scrcontrol}!80!black}% couleur ded l'ombre @@ -572,7 +569,7 @@ rounded corners=1pt*\scr_scale ] (\scr_xoffset+\scr_xsep*2+\csname scr_txtloopwd\number\scr_loopnest\endcsname-\scr_ex*3.5+1pt,\scr_yoffset+\scr_linewidth+\scr_ysepinf-1.25pt)--++(\scr_loopblockheight,0)--++(0,\scr_loopblockheight+\scr_corner*0.5); - \edef\scr_arrowcolor{\ifboolKV[\scrname]{print}{scr_flaggray}{white}}% colmeur de la flèche + \edef\scr_arrowcolor{\ifboolKV[\scrname]{print}{scr_flaggray}{white}}% colmeur de la flèche \draw[ \scr_arrowcolor, line width=\scr_scale*1.5pt, @@ -604,8 +601,7 @@ baseline=(x.base), x=1ex, y=1ex, - inner ysep=0.25ex, - inner xsep=0.1ex, + inner sep=0.1ex,% bugfix 0.19 : 0.25ex pour inner ysep donne un résultat étrange, on met 0.1ex pour les 2 line width={\the\dimexpr\useKV[\scrname]{line width}\relax}, scale=\scr_scale, every node/.style={scale=\scr_scale} @@ -640,7 +636,7 @@ \_inpicturetrue #3% \relax% pour contourner bug dans XeLaTeX - \if1#1% si triangle de sélection + \if1#1% si triangle de sélection \kern1ex \scr_menuselectarrow \fi @@ -653,7 +649,7 @@ \kern\scr_ovalsentinel sp } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% dessine un triangle de sélection % +% dessine un triangle de sélection % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\scr_menuselectarrow{% \tikz[ @@ -671,7 +667,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dessine un menu % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\newcommand*\selectmenu[1]{% #1=texte du menu (sera composé et suivi du triangle de sélection) +\newcommand*\selectmenu[1]{% #1=texte du menu (sera composé et suivi du triangle de sélection) \if_inpicture\def\scr_scale{1}\else\scr_normalizedec\scr_scale scale[0.2,5]\fi \begin{tikzpicture}[ anchor=base west, @@ -709,6 +705,7 @@ {% \useKV[\scrname]{pre text}% \_inpicturetrue + \hskip.33333em \ignorespaces% bugfix 0.19 #1% \scr_ovalstrut \hskip.6666em @@ -822,7 +819,7 @@ \definecolor{scrpend} {HTML}{0da57a}% \definecolor{scrpendd} {HTML}{0b8e69}% \definecolor{scrvariable} {HTML}{ff8c1a}% -\definecolor{scrvariabled} {HTML}{ff0000}% il n'existe pas d'ovale avec triangle sélection pour variable +\definecolor{scrvariabled} {HTML}{ff0000}% il n'existe pas d'ovale avec triangle sélection pour variable \definecolor{scrvariabledd} {HTML}{db6e00}% \definecolor{scrlist} {HTML}{ff661a}% \definecolor{scrlistd} {HTML}{ff0000}% idem @@ -851,47 +848,47 @@ \definecolor{boolemptyd} {HTML}{cf8b17}% new 0.14 \definecolor{boolemptydd} {HTML}{cf8b17}% new 0.14 -% Les réglages par défaut (modifiables avec \setdefaultscratch) +% Les réglages par défaut (modifiables avec \setdefaultscratch) \setKVdefault[\scrname]{ pre text = \sffamily ,% choix de la police else word = sinon ,% mot dans branche "else" - x sep = 0.33333em ,% séparation entre côtés droits et gauche du bloc et le texte - y sepsup = 3pt ,% séparation entre côté sup (insert) et haut texte - y sepinf = 5pt ,% séparation entre côté inf et bas texte - line width = .4pt ,% épaisseur des lignes de relief - loop width = 3ex ,% épaisseur de la barre verticale à gauche d'un bloc de boucle + x sep = 0.33333em ,% séparation entre côtés droits et gauche du bloc et le texte + y sepsup = 3pt ,% séparation entre côté sup (insert) et haut texte + y sepinf = 5pt ,% séparation entre côté inf et bas texte + line width = .4pt ,% épaisseur des lignes de relief + loop width = 3ex ,% épaisseur de la barre verticale à gauche d'un bloc de boucle loop height = 1.75ex ,% hauteur de la barre du else et la barre finale corner = 0.66667ex ,% valeur du chanfrein notch = 1em ,% longueur des encoches - scale = 1 ,% échelle du dessin - init arcangle = 30 ,% angle début et fin de l'arc + scale = 1 ,% échelle du dessin + init arcangle = 30 ,% angle début et fin de l'arc init arclength = 5em ,% longueur de l'arc contrast = 20 ,% contraste des lignes de relief print = false ,% impression noir et blanc ? fill blocks = false ,% remplissage des blocks lorsque l'option "print" est vraie fill gray = 0.85 ,% taux de gris pour le remplissage si fill blocks est vraie text color = black ,% couleur du texte lorsque l'option "print" est vraie - flag gray = 0.33 ,% taux de gris pour le drapeau et la flèche de répétition lorsque l'option "print" est vraie + flag gray = 0.33 ,% taux de gris pour le drapeau et la flèche de répétition lorsque l'option "print" est vraie line gray = 0.4 ,% taux de gris pour les lignes lorsque l'option "print" est vraie - bool sep = 1.25pt ,% séparation entre les blocs booléens imbriqués - num blocks = false ,% numérotation des blocs - num sep = 3pt ,% séparation entre bord gauche et numérotation - num start = 1 ,% numéro de départ + bool sep = 1.25pt ,% séparation entre les blocs booléens imbriqués + num blocks = false ,% numérotation des blocs + num sep = 3pt ,% séparation entre bord gauche et numérotation + num start = 1 ,% numéro de départ baseline = 1 ,% alignement sur le 1er bloc (en partant du haut) } \newenvironment{scratch}[1][] {\scr_ifempty{#1}{}{\setscratch{#1}}% \sffamily - \edef\scr_ex{\the\dimexpr1ex\relax}% valeur d'1ex pour le tracé de la flèche + \edef\scr_ex{\the\dimexpr1ex\relax}% valeur d'1ex pour le tracé de la flèche \edef\scr_em{\the\dimexpr1em\relax}% \scr_normalizedim\scr_corner corner [\scr_ex/3,\scr_ex]% \scr_normalizedim\scr_notch notch [\scr_em/3,\scr_em*3]% - \scr_normalizedec\scr_scale scale [0.2,5]% échelle + \scr_normalizedec\scr_scale scale [0.2,5]% échelle \scr_normalizedim\scr_xsep x sep [0pt,\scr_em]% \scr_normalizedim\scr_ysepsup y sepsup [1pt,\scr_ex*3]% \scr_normalizedim\scr_ysepinf y sepinf [1pt,\scr_ex*3]% - \scr_normalizedim\scr_linewidth line width [0pt,5pt]% épaisseur des lignes soumises à l'échelle + \scr_normalizedim\scr_linewidth line width [0pt,5pt]% épaisseur des lignes soumises à l'échelle \scr_normalizedim\scr_loopblockwidth loop width [3pt,\scr_em*3]% \scr_normalizedim\scr_loopblockheight loop height [3pt,\scr_ex*3]% \scr_normalizedec\scr_initarcangle init arcangle [20,40]% @@ -947,7 +944,7 @@ {% \end{tikzpicture}% \scr_scratchend - \_inpicturefalse% par pure sécurité + \_inpicturefalse% par pure sécurité } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1106,7 +1103,7 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% menu données % +% menu données % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\scr_blockvariable{\scr_normalblock{scrvariable}} \def\scr_blocklist{\scr_normalblock{scrlist}} @@ -1131,7 +1128,7 @@ \_boolemptyfalse \newcommand*\boolempty[1][2em]{\_boolemptytrue\scr_boolbox{boolempty}{#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% menu événement % +% menu événement % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\scr_blockevent{\scr_normalblock{screvent}} \def\scr_blockinit{\scr_initblock{screvent}} @@ -1164,7 +1161,7 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% menu contrôle % +% menu contrôle % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\scr_blockrepeat#1#2{\scr_blockloop{#1}{#2}{}01} \def\scr_blockinfloop#1#2{\scr_blockloop{#1}{#2}{}11}% 1= texte #2=instructions dans la boucle @@ -1190,7 +1187,7 @@ \newcommand*\boolsensing{\scr_boolbox{scrsensing}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% menu opérateur % +% menu opérateur % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand*\ovaloperator{% \scr_ifstar @@ -1222,35 +1219,41 @@ Versions : _____________________________________________________________________________ | Version | Date | Changements | |---------+------------+------------------------------------------------------| -| 0.1 | 19/02/2019 | Première version | +| 0.1 | 19/02/2019 | Première version | |---------+------------+------------------------------------------------------| -| 0.11 | 10/03/2019 | * \scr_current_blockcolor est désormais défini dans | +| 0.11 | 10/03/2019 | * \scr_current_blockcolor est désormais défini dans | | | | \scr_blockloop | -| | | * \boolmoreblocks n'est plus bugguée | +| | | * \boolmoreblocks n'est plus bugguée | |---------+------------+------------------------------------------------------| -| 0.12 | 18/05/2019 | * bug corrigé dans \ovalnum | -| | | * bug corrigé dans \scr_ovalbox | +| 0.12 | 18/05/2019 | * bug corrigé dans \ovalnum | +| | | * bug corrigé dans \scr_ovalbox | |---------+------------+------------------------------------------------------| -| 0.13 | 01/07/2019 | * \relax ajoutés pour éviter le bug de XeLaTeX | +| 0.13 | 01/07/2019 | * \relax ajoutés pour éviter le bug de XeLaTeX | | | | concernant \lastkern | |---------+------------+------------------------------------------------------| -| 0.14 | 01/10/2019 | * gestion de l'échelle (via clé "scale") améliorée | +| 0.14 | 01/10/2019 | * gestion de l'échelle (via clé "scale") améliorée | | | | * hors de l'environnement, les ovales et les losanges| -| | | sont affectés par la clé scale si elle est | -| | | spécifiée via \setscratch | -| | | * erreur de tracé corrigée dans \scr_blockloop | +| | | sont affectés par la clé scale si elle est | +| | | spécifiée via \setscratch | +| | | * erreur de tracé corrigée dans \scr_blockloop | | | | * nouveau losange vide : \boolempty[] | |---------+------------+------------------------------------------------------| -| 0.15 | 05/03/2020 | * l'échelle n'était pas initialisée dans les blocs | +| 0.15 | 05/03/2020 | * l'échelle n'était pas initialisée dans les blocs | | | | normaux | |---------+------------+------------------------------------------------------| -| 0.16 | 20/03/2020 | * regression 0.15 --> l'échelle est désormais | -| | | initialisée dans \initmoreblocks | +| 0.16 | 20/03/2020 | * regression 0.15 --> l'échelle est désormais | +| | | initialisée dans \initmoreblocks | |---------+------------+------------------------------------------------------| | 0.17 | 27/04/2020 | * 2 ou 3 modifs en rapport avec la v0.2 de simplekv | |---------+------------+------------------------------------------------------| -| 0.18 | xx/xx/xxxx | * initialisation de \scr_yoffset et \scr_xoffset dans| +| 0.18 | 03/09/2020 | * initialisation de \scr_yoffset et \scr_xoffset dans| | | | \scr_namemoreblocks | -| | | * \scr_linewidth est désormais définie dans | +| | | * \scr_linewidth est désormais définie dans | | | | \greenflag | +|---------+------------+------------------------------------------------------| +| 0.19 | 06/02/2022 | * échelle initialisée dans les blocs normaux | +| | | * espace de 0.3333em en début de texte \selectmenu | +| | | * bug fix dans \scr_ovalbox : 0.1 de séparation | +| | | * \scr_blockstop vaut 0 après \blockspace | +| | | * encodage package UTF-8 | |---------+------------+------------------------------------------------------| \ No newline at end of file -- cgit v1.2.3