From 33a1fed6bf16c61516dd7ef7ecc7598f30ccd689 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 1 Dec 2018 22:47:30 +0000 Subject: pst-fractal (1dec18) git-svn-id: svn://tug.org/texlive/trunk@49295 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/generic/pst-fractal/Changes | 2 + Master/texmf-dist/doc/generic/pst-fractal/README | 6 +- .../doc/generic/pst-fractal/pst-fractal-doc.pdf | Bin 11285757 -> 31954522 bytes .../doc/generic/pst-fractal/pst-fractal-doc.tex | 192 ++++++++++++++++++++- .../texmf-dist/dvips/pst-fractal/pst-fractal.pro | 83 ++++++++- .../tex/generic/pst-fractal/pst-fractal.tex | 137 ++++++++++++++- .../tex/latex/pst-fractal/pst-fractal.sty | 2 +- 7 files changed, 404 insertions(+), 18 deletions(-) (limited to 'Master/texmf-dist') diff --git a/Master/texmf-dist/doc/generic/pst-fractal/Changes b/Master/texmf-dist/doc/generic/pst-fractal/Changes index 9452a519d83..a6f08b3fac8 100644 --- a/Master/texmf-dist/doc/generic/pst-fractal/Changes +++ b/Master/texmf-dist/doc/generic/pst-fractal/Changes @@ -1,4 +1,5 @@ pst-fractal.pro -------- +0.06 2017-12-04 added Hilbert fractal 0.05 2017-12-02 added fibinacci curves 0.04 2017-11-26 add sierpinski curve 0.03 2011-02-10 cometic changes @@ -7,6 +8,7 @@ pst-fractal.pro -------- pst-fractal.tex -------- +0.10 2018-11-10 - added Cantor set 0.09 2017-12-02 - added fibinacci curves 0.08 2017-11-26 - added sierpinski curve 0.07 2013-06-17 - allow level 0 for sierpinski diff --git a/Master/texmf-dist/doc/generic/pst-fractal/README b/Master/texmf-dist/doc/generic/pst-fractal/README index 8685dbfa7ba..9bbab9f8cda 100644 --- a/Master/texmf-dist/doc/generic/pst-fractal/README +++ b/Master/texmf-dist/doc/generic/pst-fractal/README @@ -4,14 +4,12 @@ Save the files pst-fractal.sty|tex in a directory, which is part of your local TeX tree. The pro file should go into $TEXMF/dvips/pstricks/ Then do not forget to run texhash to update this tree. For more information see the documentation of your LATEX distribution -on installing packages into your local TeX system or read the -TeX Frequently Asked Questions: -(http://www.tex.ac.uk/FAQ-install-where.html). +on installing packages into your local TeX system. PSTricks is PostScript Tricks, the documentation cannot be run with pdftex, use the sequence latex->dvips->ps2pdf. -To get the documentation of this document you have to run +To gett he documentation of this document you have to run pst2pdf pst-fractal-doc --Iext=.jpg %% This program can be redistributed and/or modified under the terms diff --git a/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.pdf b/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.pdf index df9353720e4..28dfccc6a08 100644 Binary files a/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.pdf and b/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.pdf differ diff --git a/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.tex b/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.tex index 3016fa2987b..884b7d5079f 100644 --- a/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.tex +++ b/Master/texmf-dist/doc/generic/pst-fractal/pst-fractal-doc.tex @@ -1,10 +1,10 @@ -%% $Id: pst-fractal-doc.tex 677 2017-12-03 09:51:54Z herbert $ +%% $Id: pst-fractal-doc.tex 846 2018-11-30 21:44:45Z herbert $ \documentclass[fontsize=11pt,english,BCOR=10mm,DIV=13,toc=bibliography,parskip=false, headings=small, headinclude=false,footinclude=false,oneside]{pst-doc} \usepackage[utf8]{inputenc} \usepackage{pst-fractal} \let\pstFV\fileversion -\renewcommand\bgImage{\includegraphics[scale=1.5]{images/pst-fractal-doc-tmp-1}} +\renewcommand\bgImage{\includegraphics[scale=0.75]{images/demo}} \def\PSLenv{\Lenv{pspicture}} \usepackage{animate} @@ -80,6 +80,33 @@ resolution. Run the examples as single documents to see how it will be in high quality. +\section{Cantor set} + +The set is always plotted from the origin down to into negative $y$ values. + +\begin{BDef} +\Lcs{psCantor}\OptArgs\\ +\end{BDef} + +Possible optional arguments are \Lkeyword{linewidth}, \Lkeyword{linecolor}, +\Lkeyword{n} (recursion depth), \Lkeyword{xWidth}, and \Lkeyword{yWidth} (vertical increment). +The defaults are 2mm, black, 5, 10cm, and 5mm. + +\begin{LTXexample}[pos=l] +\begin{pspicture}(10,-2) + \psCantor +\end{pspicture} +\end{LTXexample} + + +\begin{LTXexample}[pos=l] +\begin{pspicture}(10,-2) + \psCantor[linewidth=3mm,linecolor=red, + n=7,xWidth=11,yWidth=4mm] +\end{pspicture} +\end{LTXexample} + + \section{Sierpinski triangle and curve} The triangle must be given by three mandatory arguments. Depending to the kind of @@ -1388,6 +1415,167 @@ colored, activate the \texttt{fillstyle=solid} option in a pre-command. \end{LTXexample} +\section{The Hilbert fractal} + +\begin{BDef} +\Lcs{psHilbert}\OptArgs\\ +\end{BDef} + + + +\begin{itemize} + \item \texttt{n=4} : Number of iterations; + \item \Lkeyset{N=all} : number of points to place, by default all. This option allows you to create an animation in +placing and connecting the successive points to the indicated number. + \item \Lkeyset{dotcolor=red} : color of the points, the size of the points is fixed with the option + \Lkeyword{dotsize} of PSTricks; + \item \Lkeyset{showpoints=false} : boolean of PSTricks to display the points. +\end{itemize} + +The color and the thickness of the lines are adjusted with the usual PSTricks options: + \Lkeyword{linecolor} and \Lkeyword{linewidth}. +The scale of the drawing is defined with the unit option. We can use the option \Lkeyset{linestyle=none}, as well as +\Lkeyset{fillstyle=solid}, \Lkeyword{fillcolor} but, in the latter case only, if all the points are kept +(\Lkeyset{N=all}). + + +\clearpage + + +\subsection{Examples} +\begin{LTXexample} +\begin{pspicture}(0,-1)(1,1) +\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt](1,1) +\psHilbert[linecolor=red,n=0,linejoin=1,fillstyle=solid,fillcolor=blue] +\rput(0.5,-0.5){n=0} +\end{pspicture} +\qquad +\begin{pspicture}(0,-1)(3,3) +\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt](3,3) +\psHilbert[linecolor=red,n=1,linejoin=1,fillstyle=solid,fillcolor=blue] +\rput(1.5,-0.5){n=1} +\end{pspicture} +\qquad +\begin{pspicture}(0,-1)(7,7) +\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt](7,7) +\psHilbert[linecolor=blue,n=2,showpoints=false,dotsize=0.2,fillstyle=solid,fillcolor=red] +\rput(3.5,-0.5){n=2} +\end{pspicture} +\end{LTXexample} + + +Draw the first 220 of 256 points (n=3): + + +\begin{LTXexample} +\begin{pspicture}(0,0)(15,16) +% 4^(n+1)=4^4=256 +\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt](15,15) +\psHilbert[unit=1,linecolor=blue,linewidth=0.1,n=3,showpoints=true,dotsize=0.25,N=220] +\end{pspicture} +\end{LTXexample} + + +\begin{LTXexample} +\begin{pspicture}(0,0)(16,16) +\psgrid[subgriddiv=0,gridcolor=lightgray,griddots=10,gridlabels=0pt](16,16) +\psHilbert[unit=0.5,linecolor=red,linewidth=0.1,showpoints] +\end{pspicture} +\end{LTXexample} + + + + +\begin{LTXexample} +\begin{pspicture}(0,0)(16,16) +\psframe*(0,0)(15.75,15.75) +\psHilbert[unit=0.25,linecolor=-red,n=5,linewidth=0.2,linejoin=1,fillstyle=solid,fillcolor=-blue] +\end{pspicture} +\end{LTXexample} + + +\section{The Henon Sttractor} + +\begin{LTXexample} +\begin{pspicture}(-5,-6)(5,6) +\psclip{\psframe(-5,-5)(5,5)} +\psHenon +\endpsclip +\psgrid[unit=5,subgriddiv=10](-1,-1)(1,1) +\end{pspicture} +\end{LTXexample} + + + + +\subsection{En noir et blanc} +\begin{minipage}{10cm} +\begin{pspicture}(-5,-5)(5,5) +\psclip{\psframe(-5,-5)(5,5)} +\psHenon[pixelscolor=false] +\endpsclip +\psgrid[unit=5,subgriddiv=10](-1,-1)(1,1) +\end{pspicture} +\end{minipage} +\begin{minipage}{6cm} +\begin{verbatim} +\begin{pspicture}(-5,-5)(5,5) +\psclip{\psframe(-5,-5)(5,5)} +\psHenon[pixelscolor=false] +\endpsclip +\psgrid[unit=5,subgriddiv=10](-1,-1)(1,1) +\end{pspicture} +\end{verbatim} +\end{minipage} +\section{Animation pour illustrer le principe de l'attracteur de Hénon} +En fonction du tableau des points initiaux, la figure obtenue dépend de l'angle $a$. +Les commentaires de Robert Dony correspondent à la premiére figure pour $a=1.32837$ rd, les voici : +\begin{center} +\begin{pspicture}(-5,-5)(5,5) +\psclip{\psframe(-5,-5)(5,5)} +\psHenon[pixelscolor=false] +\endpsclip +%\psgrid[unit=5,subgriddiv=10](-1,-1)(1,1) +\psline{->}(-1,4)(-0.1,3)\uput[ul](-1,4){$S_1$} +\psline{->}(4,3.5)(3,2.5)\uput[ur](4,3.5){$S_2$} +\psline{->}(4,-1.5)(3,-.75)\uput[dr](4,-1.5){$S_3$} +\psline{->}(1.25,-3.75)(0.5,-3)\uput[dr](1.25,-3.75){$S_4$} +\psline{->}(-4,0.75)(-3,0.75)\uput[l](-4,0.75){$S_5$} +\psline{->}(2,4)(1.5,2.6)\uput[ur](2,4){$C_1$} +\psline{->}(4,1)(3,0.8)\uput[ur](4,1){$C_2$} +\psline{->}(2.5,-3)(1.5,-2.25)\uput[dr](2.5,-3){$C_3$} +\psline{->}(-3,-2)(-1.75,-1.4)\uput[l](-3,-2){$C_4$} +\psline{->}(-2.5,3)(-1.75,2)\uput[ul](-2.5,3){$C_5$} +\end{pspicture} +\end{center} + + +\subsection{Animation} + +\begin{center} +\begin{animateinline}[controls,palindrome, + begin={\begin{pspicture}(-1,-1)(16,16)}, + end={\end{pspicture}}]{5}% 5 image/s +\multiframe{256}{i=1+1}{% +\psframe*[linecolor=yellow!20](0,0)(15,15) +\psgrid[subgriddiv=1,gridcolor=red!30,gridlabels=0pt](0,0)(15,15) +\psHilbert[linecolor=blue,linewidth=0.05,n=3,showpoints,dotsize=0.2,N=\i]} +\end{animateinline} +\end{center} +\begin{verbatim} +\begin{animateinline}[controls,palindrome, + begin={\begin{pspicture}(-1,-1)(16,16)}, + end={\end{pspicture}}]{5}% 5 image/s +\multiframe{256}{i=1+1}{% +\psframe*[linecolor=yellow!20](0,0)(15,15) +\psgrid[subgriddiv=1,gridcolor=red!30,gridlabels=0pt](0,0)(15,15) +\psHilbert[linecolor=blue,linewidth=0.05,n=3,showpoints,dotsize=0.2,N=\i]} +\end{animateinline} +\end{verbatim} + + +\clearpage%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \section{List of all optional arguments for \texttt{pst-fractal}} diff --git a/Master/texmf-dist/dvips/pst-fractal/pst-fractal.pro b/Master/texmf-dist/dvips/pst-fractal/pst-fractal.pro index f0f0de007e9..fcdc69bb99a 100644 --- a/Master/texmf-dist/dvips/pst-fractal/pst-fractal.pro +++ b/Master/texmf-dist/dvips/pst-fractal/pst-fractal.pro @@ -1,4 +1,4 @@ -%% $Id: pst-fractal.pro 673 2017-12-02 22:04:41Z herbert $ +%% $Id: pst-fractal.pro 679 2017-12-04 21:41:23Z herbert $ %% %% This is file `pst-fractal.pro', %% @@ -16,7 +16,7 @@ %% `pst-fractal' is a PSTricks package to draw fractal objects %% %% -%% version 0.05 / 2017-12-02 Herbert Voss +%% version 0.06 / 2017-12-04 Herbert Voss % /tx@fractalDict 100 dict def tx@fractalDict begin @@ -150,7 +150,7 @@ tx@fractalDict begin P0 [ 0 2 Pi length 2 sub {/i exch def - Pi i get Pi i 1 add get Rot-90 + Pi i get Pi i 1 add get exch neg % Rot-90 } for ] /Pi exch def P0 Pi concatarray /P0 exch def @@ -167,7 +167,7 @@ tx@fractalDict begin /P2 {[ 0 2 P0 length 2 sub { /i exch def - P0 i get P0 i 1 add get Rot-90 + P0 i get P0 i 1 add get exch neg % Rot-90 2 cmunit coefficient mul add exch -2 cmunit coefficient mul add exch } for ] @@ -176,7 +176,7 @@ tx@fractalDict begin /P3 {[ 0 2 P0 length 2 sub { /i exch def - P0 i get P0 i 1 add get Rot-90 Rot-90 + P0 i get P0 i 1 add get neg exch neg exch % Rot-90 Rot-90 2 cmunit coefficient mul add exch 2 cmunit coefficient mul add exch } for @@ -184,7 +184,7 @@ tx@fractalDict begin % /P4 {[ 0 2 P0 length 2 sub {/i exch def - P0 i get P0 i 1 add get Rot-90 Rot-90 Rot-90 + P0 i get P0 i 1 add get neg exch % Rot-90 Rot-90 Rot-90 -2 cmunit coefficient mul add exch 2 cmunit coefficient mul add exch } for @@ -879,6 +879,75 @@ end grestore end } def - +% +/Rot2 { % Rot-90+translation + 2 dict begin + /y exch neg def /x exch def + y 2 n@ 1 add exp 1 sub add + x neg 2 n@ exp 1 sub add + end + } def +/Trans1 { + 2 dict begin + /y exch def /x exch def + x + y 2 n@ exp add + end +} def +/Trans2 { + 2 dict begin + /y exch def /x exch def + x 2 n@ exp add + y 2 n@ exp add + end +} def +% +/HilbertFractal { + /M0 [[0 0] [0 1] [1 1] [1 0]] def + /n@ 1 def + N@ { + /M1 [] def + /M2 [] def + /M3 [] def + /M4 [] def + 0 1 M0 length 1 sub {/i exch def + /M M0 i get def + /Mt [ + 0 2 M length 2 sub { + /k exch def + M k 2 getinterval + } for + ] def + M1 [Mt {aload pop exch } forall] concatarray /M1 exch def + M2 [Mt {aload pop Trans1} forall] concatarray /M2 exch def + M3 [Mt {aload pop Trans2} forall] concatarray /M3 exch def + M4 [Mt {aload pop Rot2 } forall] concatarray /M4 exch def + } for + /n@ n@ 1 add def + /M0 [M1 M2 M3 M4] def + } repeat +% tableau des points + /HilbertCurve [ + 0 1 M0 length 1 sub { + /i exch def + /lePt M0 i get def + 0 2 lePt length 2 sub { + /j exch def + lePt j get cmunit + lePt j 1 add get cmunit + } for + } for + ] def +% le dessin de la courbe + newpath + 0 0 moveto + 0 2 HilbertCurve length 2 sub { + /i exch def + i 2 div Npts ge {exit} if + HilbertCurve i get + HilbertCurve i 1 add get + lineto + } for +} def % end \ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/pst-fractal/pst-fractal.tex b/Master/texmf-dist/tex/generic/pst-fractal/pst-fractal.tex index 926173f4f10..b60dcaf3dae 100644 --- a/Master/texmf-dist/tex/generic/pst-fractal/pst-fractal.tex +++ b/Master/texmf-dist/tex/generic/pst-fractal/pst-fractal.tex @@ -1,4 +1,4 @@ -%% $Id: pst-fractal.tex 673 2017-12-02 22:04:41Z herbert $ +%% $Id: pst-fractal.tex 846 2018-11-30 21:44:45Z herbert $ %% %% This is file `pst-fractal.tex', %% @@ -22,8 +22,8 @@ \ifx\PSTricksAddLoaded\endinput\else\input pstricks-add.tex\fi \ifx\PSTXKeyLoaded\endinput\else \input pst-xkey \fi % -\def\fileversion{0.09} -\def\filedate{2017/12/02} +\def\fileversion{0.10} +\def\filedate{2018/11/30} \message{`PST-fractal' v\fileversion, \filedate\space (hv)} % \edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax @@ -79,9 +79,67 @@ \define@boolkey[psset]{pst-fractal}[Pst@]{juxtaposition}[true]{} % \define@key[psset]{pst-fractal}{colorF}{\pst@getcolor{#1}\pscolorF} \psset[pst-fractal]{morphism=(0) (1) (2),juxtaposition=false,colorF=red,i=6} - +% %=========================================================== % +\def\psCantor{\pst@object{psCantor}} +\def\psCantor@i{% + \addbefore@par{n=5,xWidth=10cm,yWidth=5mm,linewidth=2mm} + \begin@SpecialObj + \addto@pscode{ + /N@ \pst@fractal@n def +% \pst@number\psunit dup scale + /v 0 def + /deltaV \pst@number\pst@fractal@yWidth def + 0 0 moveto + /cantor_set { % x0 x1 v n + 4 dict begin + /n exch def + /v exch def + /x1 exch def + /x0 exch def + x0 v moveto + x1 v lineto \pst@usecolor\pslinecolor \pst@number\pslinewidth stroke + n 1 gt { + x0 dup dup add x1 add 3 div v deltaV sub n 1 sub cantor_set + x0 x1 dup add add 3 div x1 v deltaV sub n 1 sub cantor_set + } if + end + } def + 0 \pst@number\pst@fractal@xWidth 0 N@ cantor_set + }% + \showpointsfalse + \end@SpecialObj + \ignorespaces} +% +\def\psHilbert{\pst@object{psHilbert}} +\def\psHilbert@i{% + \addbefore@par{n=4,N=all,dotcolor=red} + \begin@SpecialObj + \addto@pscode{ + /N@ \pst@fractal@n def + /NbrePts (\pst@fractal@N) def + NbrePts (all) eq {/Npts 4 N@ 1 add exp cvi def}{/Npts NbrePts cvi def Npts 4 N@ 1 add exp gt {/Npts 4 N@ 1 add exp cvi def} if } ifelse + /dotcolor {\pst@usecolor\psdotcolor } def + /cmunit {\pst@number\psunit mul} bind def + tx@fractalDict begin HilbertFractal + \psls@solid + \ifshowpoints + 0 2 HilbertCurve length 2 sub { + /i exch def + i 2 div Npts ge {exit} if + HilbertCurve i get + HilbertCurve i 1 add get + \psk@dotsize DS + 0 360 arc dotcolor fill + } for + \fi + end + }% + \showpointsfalse + \end@SpecialObj + \ignorespaces} +% \def\psFibonacci{\pst@object{psFibonacci}} \def\psFibonacci@i{% \addbefore@par{n=10, angle=90}% @@ -601,6 +659,77 @@ \end@SpecialObj% }} % +\define@key[psset]{pst-fractal}{NbrIter}{\def\pst@fractal@NbrIter{#1 }} % nombre d'itérations +\define@key[psset]{pst-fractal}{tabPts}{\def\pst@fractal@tabPts{#1 }} % tableau de points +\define@key[psset]{pst-fractal}{angleH}{\def\pst@fractal@angleH{#1 }} % angle en radians +\define@key[psset]{pst-fractal}{zoom}{\def\pst@fractal@zoom{#1 }} % grossissement +\psset[pst-fractal]{NbrIter=500,angleH=1.32837,zoom=5,tabPts=0.05 0.05 +0.1 0.1 +0.2 0.2 +0.3 0.2 +0.3 0.3 +0.4 0.3 +0.4 0.324 +0.4 0.326 +0.4 0.5 +0.5 0.3 +0.5 0.5 +0.6 0.5 +0.6 0.6 +0.57 0.575 +0.7 0.7 +0.7 0.9} +\define@boolkey[psset]{pst-fractal}[Pst@]{pixelscolor}[true]{} +\psset[pst-fractal]{pixelscolor=true} % pixels en couleurs + +\def\psHenon{\pst@object{psHenon}} +\def\psHenon@i{% + \addbefore@par{dotsize=0.75pt}% + \begin@SpecialObj + \addto@pscode{ +% échelle 2=> 10 cm pour zoom=5 + /zoom \pst@fractal@zoom def + /cm {\pst@number\psunit mul zoom mul} bind def + /NbreIter \pst@fractal@NbrIter def + /Angle \pst@fractal@angleH RadtoDeg def + /CosA Angle cos def + /SinA Angle sin def + /TabPts [\pst@fractal@tabPts] def + \ifPst@pixelscolor /pixelscolor true def \else /pixelscolor false def \fi + /AttracteurHenon { + 5 dict begin + /Y exch def /X exch def /Aux X def + NbreIter { + /Aux X def + /X X CosA mul Y X X mul sub SinA mul sub def + /Y Aux SinA mul Y Aux Aux mul sub CosA mul add def + X abs 1e12 ge Y abs 1e10 ge or { exit }{ + newpath + X cm \psk@@dotsize sub Y cm \psk@@dotsize sub moveto + \psk@@dotsize 0 rlineto % bottom of square + 0 \psk@@dotsize rlineto % right side of square + -\psk@@dotsize 0 rlineto % top of square + closepath + fill + }ifelse + } repeat + end + } def + /Hsb 0 def + 0 2 TabPts length 2 sub { + /i exch def + % 0 setgray + %TabPts i get TabPts i 1 add get 2 copy + %exch 200 mul exch 200 mul 2 0 360 arc fill + pixelscolor {Hsb 1 1 sethsbcolor}{0 setgray}ifelse + TabPts i get TabPts i 1 add get + AttracteurHenon + /Hsb i TabPts length div def + } for + }% + \showpointsfalse + \end@SpecialObj + \ignorespaces} % \catcode`\@=\PstAtCode\relax % diff --git a/Master/texmf-dist/tex/latex/pst-fractal/pst-fractal.sty b/Master/texmf-dist/tex/latex/pst-fractal/pst-fractal.sty index bddc0e2c169..17833d134ce 100644 --- a/Master/texmf-dist/tex/latex/pst-fractal/pst-fractal.sty +++ b/Master/texmf-dist/tex/latex/pst-fractal/pst-fractal.sty @@ -5,7 +5,7 @@ \input{pst-fractal.tex} \IfFileExists{pst-fractal.pro}{% \ProvidesFile{pst-fractal.pro} - [2017/12/02 v. 0.05, PostScript prologue file (hv)] + [2017/12/04 v. 0.06, PostScript prologue file (hv)] \@addtofilelist{pst-fractal.pro}}{}% \ProvidesFile{pst-fractal.tex} [\filedate\space v\fileversion\space `PST-fractal' (hv)] -- cgit v1.2.3